ZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCBhOWZhZDU1Li5mYWRlNmM1IDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMDIsMTEgKzEwMiw3IEBACiAgICAgICAgICJzaWduX3ZpcnRfYXBleC5weSIsCiAgICAgXSwKICAgICB2ZXJzaW9uOiB7Ci0gICAgICAgIHB5MjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCiAgICAgICAgIHB5MzogewotICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAogICAgICAgICB9LAogICAgIH0sCkBAIC0xNzAsMTEgKzE2Niw3IEBACiAgICAgICAgICJyZXBsYWNlX2J5dGVzLnB5IiwKICAgICBdLAogICAgIHZlcnNpb246IHsKLSAgICAgICAgcHkyOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKICAgICAgICAgcHkzOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgZW1iZWRkZWRfbGF1bmNoZXI6IHRydWUsCiAgICAgICAgIH0sCiAgICAgfSwKZGlmZiAtLWdpdCBhL2F1dGhmcy9mZF9zZXJ2ZXIvc3JjL21haW4ucnMgYi9hdXRoZnMvZmRfc2VydmVyL3NyYy9tYWluLnJzCmluZGV4IDViN2E0ZjQuLjkzYTc4OGIgMTAwNjQ0Ci0tLSBhL2F1dGhmcy9mZF9zZXJ2ZXIvc3JjL21haW4ucnMKKysrIGIvYXV0aGZzL2ZkX3NlcnZlci9zcmMvbWFpbi5ycwpAQCAtMjYsMTIgKzI2LDEzIEBACiBtb2QgZnN2ZXJpdHk7CiAKIHVzZSBhbnlob3c6OntiYWlsLCBSZXN1bHR9OwordXNlIGNsYXA6OlBhcnNlcjsKIHVzZSBsb2c6OmRlYnVnOwogdXNlIG5peDo6c3lzOjpzdGF0Ojp7dW1hc2ssIE1vZGV9OwogdXNlIHJwY2JpbmRlcjo6cnVuX3JwY19zZXJ2ZXI7CiB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA7CiB1c2Ugc3RkOjpmczo6RmlsZTsKLXVzZSBzdGQ6Om9zOjp1bml4Ojppbzo6RnJvbVJhd0ZkOwordXNlIHN0ZDo6b3M6OnVuaXg6OmlvOjp7RnJvbVJhd0ZkLCBPd25lZEZkfTsKIAogdXNlIGFpZGw6OntGZENvbmZpZywgRmRTZXJ2aWNlfTsKIHVzZSBhdXRoZnNfZnN2ZXJpdHlfbWV0YWRhdGE6OnBhcnNlX2ZzdmVyaXR5X21ldGFkYXRhOwpAQCAtNzIsODYgKzczLDUyIEBACiAgICAgKSkKIH0KIAotZm4gcGFyc2VfYXJnX3J3X2Zkcyhhcmc6ICZzdHIpIC0+IFJlc3VsdDwoaTMyLCBGZENvbmZpZyk+IHsKLSAgICBsZXQgZmQgPSBhcmcucGFyc2U6OjxpMzI+KCk/OwotICAgIGxldCBmaWxlID0gZmRfdG9fb3duZWQ6OjxGaWxlPihmZCk/OwotICAgIGlmIGZpbGUubWV0YWRhdGEoKT8ubGVuKCkgPiAwIHsKLSAgICAgICAgYmFpbCEoIkZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgZW1wdHkiKTsKLSAgICB9Ci0gICAgT2soKGZkLCBGZENvbmZpZzo6UmVhZFdyaXRlKGZpbGUpKSkKLX0KLQotZm4gcGFyc2VfYXJnX3JvX2RpcnMoYXJnOiAmc3RyKSAtPiBSZXN1bHQ8KGkzMiwgRmRDb25maWcpPiB7Ci0gICAgbGV0IGZkID0gYXJnLnBhcnNlOjo8aTMyPigpPzsKLSAgICBPaygoZmQsIEZkQ29uZmlnOjpJbnB1dERpcihmZF90b19vd25lZChmZCk/KSkpCi19Ci0KLWZuIHBhcnNlX2FyZ19yd19kaXJzKGFyZzogJnN0cikgLT4gUmVzdWx0PChpMzIsIEZkQ29uZmlnKT4gewotICAgIGxldCBmZCA9IGFyZy5wYXJzZTo6PGkzMj4oKT87Ci0gICAgT2soKGZkLCBGZENvbmZpZzo6T3V0cHV0RGlyKGZkX3RvX293bmVkKGZkKT8pKSkKLX0KLQorI1tkZXJpdmUoUGFyc2VyKV0KIHN0cnVjdCBBcmdzIHsKLSAgICBmZF9wb29sOiBCVHJlZU1hcDxpMzIsIEZkQ29uZmlnPiwKLSAgICByZWFkeV9mZDogT3B0aW9uPEZpbGU+LAorICAgIC8vLyBSZWFkLW9ubHkgRkQgb2YgZmlsZSwgd2l0aCBvcHRpb25hbCBGRCBvZiBjb3JyZXNwb25kaW5nIC5mc3ZfbWV0YSwgam9pbmVkIHdpdGggYSAnOicuCisgICAgLy8vIEV4YW1wbGU6ICIxOjIiLCAiMyIuCisgICAgI1tjbGFwKGxvbmcpXQorICAgIHJvX2ZkczogVmVjPFN0cmluZz4sCisKKyAgICAvLy8gUmVhZC13cml0YWJsZSBGRCBvZiBmaWxlCisgICAgI1tjbGFwKGxvbmcpXQorICAgIHJ3X2ZkczogVmVjPGkzMj4sCisKKyAgICAvLy8gUmVhZC1vbmx5IEZEIG9mIGRpcmVjdG9yeQorICAgICNbY2xhcChsb25nKV0KKyAgICByb19kaXJzOiBWZWM8aTMyPiwKKworICAgIC8vLyBSZWFkLXdyaXRhYmxlIEZEIG9mIGRpcmVjdG9yeQorICAgICNbY2xhcChsb25nKV0KKyAgICByd19kaXJzOiBWZWM8aTMyPiwKKworICAgIC8vLyBBIHBpcGUgRkQgZm9yIHNpZ25hbGluZyB0aGUgb3RoZXIgZW5kIG9uY2UgcmVhZHkKKyAgICAjW2NsYXAobG9uZyldCisgICAgcmVhZHlfZmQ6IE9wdGlvbjxpMzI+LAogfQogCi1mbiBwYXJzZV9hcmdzKCkgLT4gUmVzdWx0PEFyZ3M+IHsKLSAgICAjW3J1c3RmbXQ6OnNraXBdCi0gICAgbGV0IG1hdGNoZXMgPSBjbGFwOjpBcHA6Om5ldygiZmRfc2VydmVyIikKLSAgICAgICAgLmFyZyhjbGFwOjpBcmc6OndpdGhfbmFtZSgicm8tZmRzIikKLSAgICAgICAgICAgICAubG9uZygicm8tZmRzIikKLSAgICAgICAgICAgICAubXVsdGlwbGUodHJ1ZSkKLSAgICAgICAgICAgICAubnVtYmVyX29mX3ZhbHVlcygxKSkKLSAgICAgICAgLmFyZyhjbGFwOjpBcmc6OndpdGhfbmFtZSgicnctZmRzIikKLSAgICAgICAgICAgICAubG9uZygicnctZmRzIikKLSAgICAgICAgICAgICAubXVsdGlwbGUodHJ1ZSkKLSAgICAgICAgICAgICAubnVtYmVyX29mX3ZhbHVlcygxKSkKLSAgICAgICAgLmFyZyhjbGFwOjpBcmc6OndpdGhfbmFtZSgicm8tZGlycyIpCi0gICAgICAgICAgICAgLmxvbmcoInJvLWRpcnMiKQotICAgICAgICAgICAgIC5tdWx0aXBsZSh0cnVlKQotICAgICAgICAgICAgIC5udW1iZXJfb2ZfdmFsdWVzKDEpKQotICAgICAgICAuYXJnKGNsYXA6OkFyZzo6d2l0aF9uYW1lKCJydy1kaXJzIikKLSAgICAgICAgICAgICAubG9uZygicnctZGlycyIpCi0gICAgICAgICAgICAgLm11bHRpcGxlKHRydWUpCi0gICAgICAgICAgICAgLm51bWJlcl9vZl92YWx1ZXMoMSkpCi0gICAgICAgIC5hcmcoY2xhcDo6QXJnOjp3aXRoX25hbWUoInJlYWR5LWZkIikKLSAgICAgICAgICAgIC5sb25nKCJyZWFkeS1mZCIpCi0gICAgICAgICAgICAudGFrZXNfdmFsdWUodHJ1ZSkpCi0gICAgICAgIC5nZXRfbWF0Y2hlcygpOwotCisvLy8gQ29udmVydCBhcmd1bWVudCBzdHJpbmdzIGFuZCBpbnRlZ2VycyB0byBhIGZvcm0gdGhhdCBpcyBlYXNpZXIgdG8gdXNlIGFuZCBoYW5kbGVzIG93bmVyc2hpcC4KK2ZuIGNvbnZlcnRfYXJncyhhcmdzOiBBcmdzKSAtPiBSZXN1bHQ8KEJUcmVlTWFwPGkzMiwgRmRDb25maWc+LCBPcHRpb248T3duZWRGZD4pPiB7CiAgICAgbGV0IG11dCBmZF9wb29sID0gQlRyZWVNYXA6Om5ldygpOwotICAgIGlmIGxldCBTb21lKGFyZ3MpID0gbWF0Y2hlcy52YWx1ZXNfb2YoInJvLWZkcyIpIHsKLSAgICAgICAgZm9yIGFyZyBpbiBhcmdzIHsKLSAgICAgICAgICAgIGxldCAoZmQsIGNvbmZpZykgPSBwYXJzZV9hcmdfcm9fZmRzKGFyZyk/OwotICAgICAgICAgICAgZmRfcG9vbC5pbnNlcnQoZmQsIGNvbmZpZyk7Ci0gICAgICAgIH0KKyAgICBmb3IgYXJnIGluIGFyZ3Mucm9fZmRzIHsKKyAgICAgICAgbGV0IChmZCwgY29uZmlnKSA9IHBhcnNlX2FyZ19yb19mZHMoJmFyZyk/OworICAgICAgICBmZF9wb29sLmluc2VydChmZCwgY29uZmlnKTsKICAgICB9Ci0gICAgaWYgbGV0IFNvbWUoYXJncykgPSBtYXRjaGVzLnZhbHVlc19vZigicnctZmRzIikgewotICAgICAgICBmb3IgYXJnIGluIGFyZ3MgewotICAgICAgICAgICAgbGV0IChmZCwgY29uZmlnKSA9IHBhcnNlX2FyZ19yd19mZHMoYXJnKT87Ci0gICAgICAgICAgICBmZF9wb29sLmluc2VydChmZCwgY29uZmlnKTsKKyAgICBmb3IgZmQgaW4gYXJncy5yd19mZHMgeworICAgICAgICBsZXQgZmlsZSA9IGZkX3RvX293bmVkOjo8RmlsZT4oZmQpPzsKKyAgICAgICAgaWYgZmlsZS5tZXRhZGF0YSgpPy5sZW4oKSA+IDAgeworICAgICAgICAgICAgYmFpbCEoIkZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgZW1wdHkiKTsKICAgICAgICAgfQorICAgICAgICBmZF9wb29sLmluc2VydChmZCwgRmRDb25maWc6OlJlYWRXcml0ZShmaWxlKSk7CiAgICAgfQotICAgIGlmIGxldCBTb21lKGFyZ3MpID0gbWF0Y2hlcy52YWx1ZXNfb2YoInJvLWRpcnMiKSB7Ci0gICAgICAgIGZvciBhcmcgaW4gYXJncyB7Ci0gICAgICAgICAgICBsZXQgKGZkLCBjb25maWcpID0gcGFyc2VfYXJnX3JvX2RpcnMoYXJnKT87Ci0gICAgICAgICAgICBmZF9wb29sLmluc2VydChmZCwgY29uZmlnKTsKLSAgICAgICAgfQorICAgIGZvciBmZCBpbiBhcmdzLnJvX2RpcnMgeworICAgICAgICBmZF9wb29sLmluc2VydChmZCwgRmRDb25maWc6OklucHV0RGlyKGZkX3RvX293bmVkKGZkKT8pKTsKICAgICB9Ci0gICAgaWYgbGV0IFNvbWUoYXJncykgPSBtYXRjaGVzLnZhbHVlc19vZigicnctZGlycyIpIHsKLSAgICAgICAgZm9yIGFyZyBpbiBhcmdzIHsKLSAgICAgICAgICAgIGxldCAoZmQsIGNvbmZpZykgPSBwYXJzZV9hcmdfcndfZGlycyhhcmcpPzsKLSAgICAgICAgICAgIGZkX3Bvb2wuaW5zZXJ0KGZkLCBjb25maWcpOwotICAgICAgICB9CisgICAgZm9yIGZkIGluIGFyZ3MucndfZGlycyB7CisgICAgICAgIGZkX3Bvb2wuaW5zZXJ0KGZkLCBGZENvbmZpZzo6T3V0cHV0RGlyKGZkX3RvX293bmVkKGZkKT8pKTsKICAgICB9Ci0gICAgbGV0IHJlYWR5X2ZkID0gaWYgbGV0IFNvbWUoYXJnKSA9IG1hdGNoZXMudmFsdWVfb2YoInJlYWR5LWZkIikgewotICAgICAgICBsZXQgZmQgPSBhcmcucGFyc2U6OjxpMzI+KCk/OwotICAgICAgICBTb21lKGZkX3RvX293bmVkKGZkKT8pCi0gICAgfSBlbHNlIHsKLSAgICAgICAgTm9uZQotICAgIH07Ci0gICAgT2soQXJncyB7IGZkX3Bvb2wsIHJlYWR5X2ZkIH0pCisgICAgbGV0IHJlYWR5X2ZkID0gYXJncy5yZWFkeV9mZC5tYXAoZmRfdG9fb3duZWQpLnRyYW5zcG9zZSgpPzsKKyAgICBPaygoZmRfcG9vbCwgcmVhZHlfZmQpKQogfQogCiBmbiBtYWluKCkgLT4gUmVzdWx0PCgpPiB7CkBAIC0xNTksNyArMTI2LDggQEAKICAgICAgICAgYW5kcm9pZF9sb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpLndpdGhfdGFnKCJmZF9zZXJ2ZXIiKS53aXRoX21pbl9sZXZlbChsb2c6OkxldmVsOjpEZWJ1ZyksCiAgICAgKTsKIAotICAgIGxldCBhcmdzID0gcGFyc2VfYXJncygpPzsKKyAgICBsZXQgYXJncyA9IEFyZ3M6OnBhcnNlKCk7CisgICAgbGV0IChmZF9wb29sLCBtdXQgcmVhZHlfZmQpID0gY29udmVydF9hcmdzKGFyZ3MpPzsKIAogICAgIC8vIEFsbG93IG9wZW4vY3JlYXRlL21rZGlyIGZyb20gYXV0aGZzIHRvIGNyZWF0ZSB3aXRoIGV4cGVjdGluZyBtb2RlLiBJdCdzIHBvc3NpYmxlIHRvIHN0aWxsCiAgICAgLy8gdXNlIGEgY3VzdG9tIG1hc2sgb24gY3JlYXRpb24sIHRoZW4gcmVwb3J0IHRoZSBhY3R1YWwgZmlsZSBtb2RlIGJhY2sgdG8gYXV0aGZzLiBCdXQgdGhlcmUKQEAgLTE2Nyw5ICsxMzUsOCBAQAogICAgIGxldCBvbGRfdW1hc2sgPSB1bWFzayhNb2RlOjplbXB0eSgpKTsKICAgICBkZWJ1ZyEoIlNldHRpbmcgdW1hc2sgdG8gMCAob2xkOiB7OjAzb30pIiwgb2xkX3VtYXNrLmJpdHMoKSk7CiAKLSAgICBsZXQgc2VydmljZSA9IEZkU2VydmljZTo6bmV3X2JpbmRlcihhcmdzLmZkX3Bvb2wpLmFzX2JpbmRlcigpOworICAgIGxldCBzZXJ2aWNlID0gRmRTZXJ2aWNlOjpuZXdfYmluZGVyKGZkX3Bvb2wpLmFzX2JpbmRlcigpOwogICAgIGRlYnVnISgiZmRfc2VydmVyIGlzIHN0YXJ0aW5nIGFzIGEgcnBjIHNlcnZpY2UuIik7Ci0gICAgbGV0IG11dCByZWFkeV9mZCA9IGFyZ3MucmVhZHlfZmQ7CiAgICAgbGV0IHJldHZhbCA9IHJ1bl9ycGNfc2VydmVyKHNlcnZpY2UsIFJQQ19TRVJWSUNFX1BPUlQsIHx8IHsKICAgICAgICAgZGVidWchKCJmZF9zZXJ2ZXIgaXMgcmVhZHkiKTsKICAgICAgICAgLy8gQ2xvc2UgdGhlIHJlYWR5LWZkIGlmIHdlIHdlcmUgZ2l2ZW4gb25lIHRvIHNpZ25hbCBvdXIgcmVhZGluZXNzLgpkaWZmIC0tZ2l0IGEvYXZtZC9BbmRyb2lkLmJwIGIvYXZtZC9BbmRyb2lkLmJwCmluZGV4IGRjNmE4OTYuLjZkOTFiNTkgMTAwNjQ0Ci0tLSBhL2F2bWQvQW5kcm9pZC5icAorKysgYi9hdm1kL0FuZHJvaWQuYnAKQEAgLTExLDYgKzExLDcgQEAKICAgICBydXN0bGliczogWwogICAgICAgICAibGlic2VyZGUiLAogICAgICAgICAibGliYXBleHV0aWxfcnVzdCIsIC8vIFRPRE8oYi8yMzk0MTM0MTYpOiBSZW1vdmUgdGhpcyBhZnRlciBhZGRpbmcgaGV4CisgICAgICAgICJsaWJhcGt2ZXJpZnkiLAogICAgIF0sCiB9CiAKQEAgLTQwLDYgKzQxLDkgQEAKICAgICBuYW1lOiAiYXZtZHRvb2xfdGVzdHMiLAogICAgIHNyY3M6IFsidGVzdHMvKl90ZXN0LnJzIl0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorICAgIHJ1c3RsaWJzOiBbCisgICAgICAgICJsaWJ0ZW1wZmlsZSIsCisgICAgXSwKICAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAogICAgIGRhdGFfYmluczogWyJhdm1kdG9vbCJdLAogICAgIGRhdGE6IFsidGVzdHMvZGF0YS8qIl0sCmRpZmYgLS1naXQgYS9hdm1kL3NyYy9hdm1kLnJzIGIvYXZtZC9zcmMvYXZtZC5ycwppbmRleCA1MGNkZmRmLi4wNWZjMjAxIDEwMDY0NAotLS0gYS9hdm1kL3NyYy9hdm1kLnJzCisrKyBiL2F2bWQvc3JjL2F2bWQucnMKQEAgLTE5LDYgKzE5LDcgQEAKICAgICB2ZWM6OlZlYywKIH07CiB1c2UgYXBleHV0aWw6OnRvX2hleF9zdHJpbmc7Cit1c2UgYXBrdmVyaWZ5OjpTaWduYXR1cmVBbGdvcml0aG1JRDsKIHVzZSBjb3JlOjpmbXQ7CiB1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKIApAQCAtMTIwLDcgKzEyMSw3IEBACiAgICAgLy8vIEl0IHNob3VsZCBiZSBvbmUgb2YgdGhlIGFsZ29yaXRobXMgaW4gdGhlIFtsaXN0XVtdLgogICAgIC8vLwogICAgIC8vLyBbbGlzdF06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL3NlY3VyaXR5L2Fwa3NpZ25pbmcvdjIjc2lnbmF0dXJlLWFsZ29yaXRobS1pZHMKLSAgICBwdWIgc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogdTMyLAorICAgIHB1YiBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JRCwKICAgICAvLy8gRGlnZXN0IG9mIHRoZSBBUEsncyB2MyBzaWduaW5nIGJsb2NrLiBUT0RPOiBmaXgKICAgICBwdWIgYXBrX2RpZ2VzdDogVmVjPHU4PiwKIH0KQEAgLTEzMCw3ICsxMzEsNyBAQAogICAgICAgICB3cml0ZWxuIShmLCAiICBBUEsgZGVzY3JpcHRvcjoiKT87CiAgICAgICAgIHdyaXRlbG4hKGYsICIgICAgbmFtZXNwYWNlOiAgICAgICAgICAgICB7fSIsIHNlbGYucmVzb3VyY2UubmFtZXNwYWNlKT87CiAgICAgICAgIHdyaXRlbG4hKGYsICIgICAgbmFtZTogICAgICAgICAgICAgICAgICB7fSIsIHNlbGYucmVzb3VyY2UubmFtZSk/OwotICAgICAgICB3cml0ZWxuIShmLCAiICAgIFNpZ25pbmcgYWxnb3JpdGhtIElEOiAgezojeH0iLCBzZWxmLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpPzsKKyAgICAgICAgd3JpdGVsbiEoZiwgIiAgICBTaWduaW5nIGFsZ29yaXRobSBJRDogIHs6IzA0eH0iLCBzZWxmLnNpZ25hdHVyZV9hbGdvcml0aG1faWQudG9fdTMyKCkpPzsKICAgICAgICAgd3JpdGVsbiEoZiwgIiAgICBBUEsgZGlnZXN0OiAgICAgICAgICAgIHt9IiwgdG9faGV4X3N0cmluZygmc2VsZi5hcGtfZGlnZXN0KSk/OwogICAgICAgICBPaygoKSkKICAgICB9CmRpZmYgLS1naXQgYS9hdm1kL3Rlc3RzL2F2bWR0b29sX3Rlc3QucnMgYi9hdm1kL3Rlc3RzL2F2bWR0b29sX3Rlc3QucnMKaW5kZXggZDkzY2I2Zi4uNDY0N2YwNiAxMDA2NDQKLS0tIGEvYXZtZC90ZXN0cy9hdm1kdG9vbF90ZXN0LnJzCisrKyBiL2F2bWQvdGVzdHMvYXZtZHRvb2xfdGVzdC5ycwpAQCAtMTYsMTkgKzE2LDUwIEBACiAKIHVzZSBzdGQ6OmZzOwogdXNlIHN0ZDo6cHJvY2Vzczo6Q29tbWFuZDsKK3VzZSB0ZW1wZmlsZTo6VGVtcERpcjsKIAogI1t0ZXN0XQogZm4gdGVzdF9kdW1wKCkgewotICAgIC8vIHRlc3QuYXZtZCBpcyBnZW5lcmF0ZWQgd2l0aAotICAgIC8vIGBgYAotICAgIC8vIGF2bWR0b29sIGNyZWF0ZSAvdG1wL3Rlc3QuYW12ZCBcCi0gICAgLy8gLS1hcGV4LXBheWxvYWQgbWljcm9kcm9pZCB2Ym1ldGEgLi9saWJzL2FwZXh1dGlsL3Rlc3RzL2RhdGEvdGVzdC5hcGV4IFwKLSAgICAvLyAtLWFwayBtaWNyb2Ryb2lkX21hbmFnZXIgYXBrIFwKLSAgICAvLyAuL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsgXAotICAgIC8vIC0tYXBrIG1pY3JvZHJvaWRfbWFuYWdlciBleHRyYS1hcGsgLi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsKLSAgICAvL2BgYAotICAgIGxldCBvdXRwdXQgPQotICAgICAgICBDb21tYW5kOjpuZXcoIi4vYXZtZHRvb2wiKS5hcmdzKFsiZHVtcCIsICJ0ZXN0cy9kYXRhL3Rlc3QuYXZtZCJdKS5vdXRwdXQoKS51bndyYXAoKTsKKyAgICBsZXQgZmlsZW5hbWUgPSAidGVzdHMvZGF0YS90ZXN0LmF2bWQiOworICAgIGFzc2VydCEoCisgICAgICAgIGZzOjptZXRhZGF0YShmaWxlbmFtZSkuaXNfb2soKSwKKyAgICAgICAgIkZpbGUgJ3t9JyBkb2VzIG5vdCBleGlzdC4gWW91IGNhbiByZS1jcmVhdGUgaXQgd2l0aDoKKyAgICBhdm1kdG9vbCBjcmVhdGUge30gXFwKKyAgICAtLWFwZXgtcGF5bG9hZCBtaWNyb2Ryb2lkIHZibWV0YSB0ZXN0cy9kYXRhL3Rlc3QuYXBleCBcXAorICAgIC0tYXBrIG1pY3JvZHJvaWRfbWFuYWdlciBhcGsgXFwKKyAgICB0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrIFxcCisgICAgLS1hcGsgbWljcm9kcm9pZF9tYW5hZ2VyIGV4dHJhLWFwayB0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsiLAorICAgICAgICBmaWxlbmFtZSwKKyAgICAgICAgZmlsZW5hbWUKKyAgICApOworICAgIGxldCBvdXRwdXQgPSBDb21tYW5kOjpuZXcoIi4vYXZtZHRvb2wiKS5hcmdzKFsiZHVtcCIsIGZpbGVuYW1lXSkub3V0cHV0KCkudW53cmFwKCk7CiAgICAgYXNzZXJ0IShvdXRwdXQuc3RhdHVzLnN1Y2Nlc3MoKSk7CiAgICAgYXNzZXJ0X2VxIShvdXRwdXQuc3Rkb3V0LCBmczo6cmVhZCgidGVzdHMvZGF0YS90ZXN0LmF2bWQuZHVtcCIpLnVud3JhcCgpKTsKIH0KKworI1t0ZXN0XQorZm4gdGVzdF9jcmVhdGUoKSB7CisgICAgbGV0IHRlc3RfZGlyID0gVGVtcERpcjo6bmV3KCkudW53cmFwKCk7CisgICAgbGV0IHRlc3RfZmlsZV9wYXRoID0gdGVzdF9kaXIucGF0aCgpLmpvaW4oInRtcF90ZXN0LmFtdmQiKTsKKyAgICBsZXQgb3V0cHV0ID0gQ29tbWFuZDo6bmV3KCIuL2F2bWR0b29sIikKKyAgICAgICAgLmFyZ3MoWworICAgICAgICAgICAgImNyZWF0ZSIsCisgICAgICAgICAgICB0ZXN0X2ZpbGVfcGF0aC50b19zdHIoKS51bndyYXAoKSwKKyAgICAgICAgICAgICItLWFwZXgtcGF5bG9hZCIsCisgICAgICAgICAgICAibWljcm9kcm9pZCIsCisgICAgICAgICAgICAidmJtZXRhIiwKKyAgICAgICAgICAgICJ0ZXN0cy9kYXRhL3Rlc3QuYXBleCIsCisgICAgICAgICAgICAiLS1hcGsiLAorICAgICAgICAgICAgIm1pY3JvZHJvaWRfbWFuYWdlciIsCisgICAgICAgICAgICAiYXBrIiwKKyAgICAgICAgICAgICJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTQwOTYuYXBrIiwKKyAgICAgICAgICAgICItLWFwayIsCisgICAgICAgICAgICAibWljcm9kcm9pZF9tYW5hZ2VyIiwKKyAgICAgICAgICAgICJleHRyYS1hcGsiLAorICAgICAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwayIsCisgICAgICAgIF0pCisgICAgICAgIC5vdXRwdXQoKQorICAgICAgICAudW53cmFwKCk7CisgICAgYXNzZXJ0IShvdXRwdXQuc3RhdHVzLnN1Y2Nlc3MoKSk7CisgICAgYXNzZXJ0X2VxIShmczo6cmVhZCh0ZXN0X2ZpbGVfcGF0aCkudW53cmFwKCksIGZzOjpyZWFkKCJ0ZXN0cy9kYXRhL3Rlc3QuYXZtZCIpLnVud3JhcCgpKTsKK30KZGlmZiAtLWdpdCBhL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmFwZXggYi9hdm1kL3Rlc3RzL2RhdGEvdGVzdC5hcGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzkzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hdm1kL3Rlc3RzL2RhdGEvdGVzdC5hcGV4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmF2bWQgYi9hdm1kL3Rlc3RzL2RhdGEvdGVzdC5hdm1kCmluZGV4IDUyZTYzNGYuLmU1NjcxMjUgMTAwNjQ0Ci0tLSBhL2F2bWQvdGVzdHMvZGF0YS90ZXN0LmF2bWQKKysrIGIvYXZtZC90ZXN0cy9kYXRhL3Rlc3QuYXZtZApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdm1kL3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsgYi9hdm1kL3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5MzkxYwotLS0gL2Rldi9udWxsCisrKyBiL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hdm1kL3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwayBiL2F2bWQvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hdm1kL3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwawpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21wb3MvYmVuY2htYXJrL0FuZHJvaWQuYnAgYi9jb21wb3MvYmVuY2htYXJrL0FuZHJvaWQuYnAKaW5kZXggMzdhZjg3ZS4uM2Q0NmEzOSAxMDA2NDQKLS0tIGEvY29tcG9zL2JlbmNobWFyay9BbmRyb2lkLmJwCisrKyBiL2NvbXBvcy9iZW5jaG1hcmsvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAogICAgICAgICAiYW5kcm9pZHgudGVzdC5leHQuanVuaXQiLAogICAgICAgICAiTWljcm9kcm9pZERldmljZVRlc3RIZWxwZXIiLAorICAgICAgICAiTWljcm9kcm9pZFRlc3RIZWxwZXIiLAogICAgICAgICAidHJ1dGgtcHJlYnVpbHQiLAogICAgIF0sCiAgICAgcGxhdGZvcm1fYXBpczogdHJ1ZSwKZGlmZiAtLWdpdCBhL2NvbXBvcy9iZW5jaG1hcmsvc3JjL2phdmEvY29tL2FuZHJvaWQvY29tcG9zL2JlbmNobWFyay9Db21wb3NCZW5jaG1hcmsuamF2YSBiL2NvbXBvcy9iZW5jaG1hcmsvc3JjL2phdmEvY29tL2FuZHJvaWQvY29tcG9zL2JlbmNobWFyay9Db21wb3NCZW5jaG1hcmsuamF2YQppbmRleCAyMWIyZWNkLi45OTZkMzJhIDEwMDY0NAotLS0gYS9jb21wb3MvYmVuY2htYXJrL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2NvbXBvcy9iZW5jaG1hcmsvQ29tcG9zQmVuY2htYXJrLmphdmEKKysrIGIvY29tcG9zL2JlbmNobWFyay9zcmMvamF2YS9jb20vYW5kcm9pZC9jb21wb3MvYmVuY2htYXJrL0NvbXBvc0JlbmNobWFyay5qYXZhCkBAIC0yNiw4ICsyNiwxMSBAQAogaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGNvbS5hbmRyb2lkLm1pY3JvZHJvaWQudGVzdC5jb21tb24uTWV0cmljc1Byb2Nlc3NvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5taWNyb2Ryb2lkLnRlc3QuY29tbW9uLlByb2Nlc3NVdGlsOwogaW1wb3J0IGNvbS5hbmRyb2lkLm1pY3JvZHJvaWQudGVzdC5kZXZpY2UuTWljcm9kcm9pZERldmljZVRlc3RCYXNlOwogCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNDAsMTEgKzQzLDE1IEBACiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAotCiBAUnVuV2l0aChKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQ29tcG9zQmVuY2htYXJrIGV4dGVuZHMgTWljcm9kcm9pZERldmljZVRlc3RCYXNlIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbXBvc0JlbmNobWFyayI7CkBAIC01MywxMDAgKzYwLDEwNiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBOQU5PU19JTl9TRUMgPSAxXzAwMF8wMDBfMDAwLjA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVFJJQ19QUkVGSVggPSAiYXZmX3BlcmYvY29tcG9zLyI7CiAKKyAgICBwcml2YXRlIGZpbmFsIE1ldHJpY3NQcm9jZXNzb3IgbU1ldHJpY3NQcm9jZXNzb3IgPSBuZXcgTWV0cmljc1Byb2Nlc3NvcihNRVRSSUNfUFJFRklYKTsKKwogICAgIHByaXZhdGUgSW5zdHJ1bWVudGF0aW9uIG1JbnN0cnVtZW50YXRpb247CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CiAgICAgICAgIG1JbnN0cnVtZW50YXRpb24gPSBnZXRJbnN0cnVtZW50YXRpb24oKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbi5nZXRVaUF1dG9tYXRpb24oKS5hZG9wdFNoZWxsUGVybWlzc2lvbklkZW50aXR5KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlcG9ydE1ldHJpYyhTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQsIGRvdWJsZVtdIHZhbHVlcykgewotICAgICAgICBkb3VibGUgc3VtID0gMDsKLSAgICAgICAgZG91YmxlIHNxdWFyZVN1bSA9IDA7Ci0gICAgICAgIGRvdWJsZSBtaW4gPSBEb3VibGUuTUFYX1ZBTFVFOwotICAgICAgICBkb3VibGUgbWF4ID0gRG91YmxlLk1JTl9WQUxVRTsKLQotICAgICAgICBmb3IgKGRvdWJsZSB2YWwgOiB2YWx1ZXMpIHsKLSAgICAgICAgICAgIHN1bSArPSB2YWw7Ci0gICAgICAgICAgICBzcXVhcmVTdW0gKz0gdmFsICogdmFsOwotICAgICAgICAgICAgbWluID0gdmFsIDwgbWluID8gdmFsIDogbWluOwotICAgICAgICAgICAgbWF4ID0gdmFsID4gbWF4ID8gdmFsIDogbWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgZG91YmxlIGF2ZXJhZ2UgPSBzdW0gLyB2YWx1ZXMubGVuZ3RoOwotICAgICAgICBkb3VibGUgdmFyaWFuY2UgPSBzcXVhcmVTdW0gLyB2YWx1ZXMubGVuZ3RoIC0gYXZlcmFnZSAqIGF2ZXJhZ2U7Ci0gICAgICAgIGRvdWJsZSBzdGRldiA9IE1hdGguc3FydCh2YXJpYW5jZSk7Ci0KLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dERvdWJsZShNRVRSSUNfUFJFRklYICsgbmFtZSArICJfYXZlcmFnZV8iICsgdW5pdCwgYXZlcmFnZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXREb3VibGUoTUVUUklDX1BSRUZJWCArIG5hbWUgKyAiX21pbl8iICsgdW5pdCwgbWluKTsKLSAgICAgICAgYnVuZGxlLnB1dERvdWJsZShNRVRSSUNfUFJFRklYICsgbmFtZSArICJfbWF4XyIgKyB1bml0LCBtYXgpOwotICAgICAgICBidW5kbGUucHV0RG91YmxlKE1FVFJJQ19QUkVGSVggKyBuYW1lICsgIl9zdGRldl8iICsgdW5pdCwgc3RkZXYpOwotICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnNlbmRTdGF0dXMoMCwgYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGV4ZWN1dGVDb21tYW5kQmxvY2tpbmcoU3RyaW5nIGNvbW1hbmQpIHsKLSAgICAgICAgdHJ5ICgKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IFBhcmNlbEZpbGVEZXNjcmlwdG9yLkF1dG9DbG9zZUlucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRhdGlvbigpLmdldFVpQXV0b21hdGlvbigpLmV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZCkpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQotICAgICAgICApIHsKLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoOwotICAgICAgICAgICAgd2hpbGUgKChsZW5ndGggPSBpcy5yZWFkKGJ1ZikpID49IDApIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBleGVjdXRpbmc6ICIgKyBjb21tYW5kLCBlKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkKLSAgICAgICAgICAgIHRocm93cyAgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQotICAgICAgICAgICAgICAgIC5hZG9wdFNoZWxsUGVybWlzc2lvbklkZW50aXR5KCk7Ci0gICAgICAgIGJ5dGVbXSBvdXRwdXQgPSBleGVjdXRlQ29tbWFuZEJsb2NraW5nKGNvbW1hbmQpOwotICAgICAgICBnZXRJbnN0cnVtZW50YXRpb24oKS5nZXRVaUF1dG9tYXRpb24oKQotICAgICAgICAgICAgICAgIC5kcm9wU2hlbGxQZXJtaXNzaW9uSWRlbnRpdHkoKTsKLQotICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gcnVuIHRoZSBjb21tYW5kLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHN0ZG91dCA9IG5ldyBTdHJpbmcob3V0cHV0LCAiVVRGLTgiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkdldCBzdGRvdXQgOiAiICsgc3Rkb3V0KTsKLSAgICAgICAgICAgIHJldHVybiBzdGRvdXQ7Ci0gICAgICAgIH0KKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLmdldFVpQXV0b21hdGlvbigpLmRyb3BTaGVsbFBlcm1pc3Npb25JZGVudGl0eSgpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEd1ZXN0Q29tcGlsZVRpbWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lKCkud2l0aE1lc3NhZ2UoIlNraXAgb24gQ0Y7IHRvbyBzbG93IikudGhhdChpc0N1dHRsZWZpc2goKSkuaXNGYWxzZSgpOworICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0Q29tcGlsZVRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSAiL2FwZXgvY29tLmFuZHJvaWQuYXJ0L2Jpbi9vZHJlZnJlc2ggLS1mb3JjZS1jb21waWxlIjsKIAotICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5jb21wb3MvYmluL2NvbXBvc2RfY21kIHRlc3QtY29tcGlsZSI7Ci0KLSAgICAgICAgZG91YmxlW10gY29tcGlsZVRpbWUgPSBuZXcgZG91YmxlW1JPVU5EX0NPVU5UXTsKKyAgICAgICAgZmluYWwgTGlzdDxEb3VibGU+IGNvbXBpbGVUaW1lcyA9IG5ldyBBcnJheUxpc3Q8PihST1VORF9DT1VOVCk7CisgICAgICAgIC8vIFRoZSBtYXBwaW5nIGlzIDxtZW1vcnkgbWV0cmljcyBuYW1lPiAtPiA8YWxsIHJvdW5kcyB2YWx1ZSBsaXN0Pi4KKyAgICAgICAgLy8gRVggOiBwc3MgLT4gWzEwLCAyMCwgMzAsIC4uLi4uLi4uXQorICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PExvbmc+PiBwcm9jZXNzTWVtb3J5ID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIGZvciAoaW50IHJvdW5kID0gMDsgcm91bmQgPCBST1VORF9DT1VOVDsgKytyb3VuZCkgeworCisgICAgICAgICAgICBHZXRNZXRyaWNzUnVubmFibGUgZ2V0TWV0cmljc1J1bm5hYmxlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEdldE1ldHJpY3NSdW5uYWJsZSgiZGV4Mm9hdDY0IiwgcHJvY2Vzc01lbW9yeSk7CisgICAgICAgICAgICBUaHJlYWQgdGhyZWFkR2V0TWV0cmljcyA9IG5ldyBUaHJlYWQoZ2V0TWV0cmljc1J1bm5hYmxlKTsKKworICAgICAgICAgICAgdGhyZWFkR2V0TWV0cmljcy5zdGFydCgpOworCisgICAgICAgICAgICBUaW1lc3RhbXAgYmVmb3JlQ29tcGlsZUxhdGVzdFRpbWUgPSBnZXRMYXRlc3REZXgyb2F0U3VjY2Vzc1RpbWUoKTsKKyAgICAgICAgICAgIExvbmcgY29tcGlsZVN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCk7CisgICAgICAgICAgICBMb25nIGNvbXBpbGVFbmRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICBUaW1lc3RhbXAgYWZ0ZXJDb21waWxlTGF0ZXN0VGltZSA9IGdldExhdGVzdERleDJvYXRTdWNjZXNzVGltZSgpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGFmdGVyQ29tcGlsZUxhdGVzdFRpbWUgIT0gbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBiZWZvcmVDb21waWxlTGF0ZXN0VGltZSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYmVmb3JlQ29tcGlsZUxhdGVzdFRpbWUuYmVmb3JlKGFmdGVyQ29tcGlsZUxhdGVzdFRpbWUpKTsKKworICAgICAgICAgICAgZG91YmxlIGVsYXBzZWRTZWMgPSAoY29tcGlsZUVuZFRpbWUgLSBjb21waWxlU3RhcnRUaW1lKSAvIE5BTk9TX0lOX1NFQzsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIkNvbXBpbGUgdGltZSBpbiBob3N0IHRvb2sgIiArIGVsYXBzZWRTZWMgKyAicyIpOworICAgICAgICAgICAgZ2V0TWV0cmljc1J1bm5hYmxlLnN0b3AoKTsKKworICAgICAgICAgICAgTG9nLmkoVEFHLCAiV2FpdHMgZm9yIHRocmVhZCBmaW5pc2giKTsKKyAgICAgICAgICAgIHRocmVhZEdldE1ldHJpY3Muam9pbigpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiVGhyZWFkIGlzIGZpbmlzaCIpOworCisgICAgICAgICAgICBjb21waWxlVGltZXMuYWRkKGVsYXBzZWRTZWMpOworICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0TWV0cmljKCJob3N0X2NvbXBpbGVfdGltZSIsICJzIiwgY29tcGlsZVRpbWVzKTsKKworICAgICAgICByZXBvcnRBZ2dyZWdhdGVkTWV0cmljKHByb2Nlc3NNZW1vcnksICJob3N0X2NvbXBpbGVfZGV4Mm9hdDY0XyIsICJrQiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1ZXN0Q29tcGlsZVRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lKCkud2l0aE1lc3NhZ2UoIlNraXAgb24gQ0Y7IHRvbyBzbG93IikudGhhdChpc0N1dHRsZWZpc2goKSkuaXNGYWxzZSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5jb21wb3MvYmluL2NvbXBvc2RfY21kIHRlc3QtY29tcGlsZSI7CisKKyAgICAgICAgZmluYWwgTGlzdDxEb3VibGU+IGNvbXBpbGVUaW1lcyA9IG5ldyBBcnJheUxpc3Q8PihST1VORF9DT1VOVCk7CisgICAgICAgIC8vIFRoZSBtYXBwaW5nIGlzIDxtZW1vcnkgbWV0cmljcyBuYW1lPiAtPiA8YWxsIHJvdW5kcyB2YWx1ZSBsaXN0Pi4KKyAgICAgICAgLy8gRVggOiBwc3MgLT4gWzEwLCAyMCwgMzAsIC4uLi4uLi4uXQorICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PExvbmc+PiBwcm9jZXNzTWVtb3J5ID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoaW50IHJvdW5kID0gMDsgcm91bmQgPCBST1VORF9DT1VOVDsgKytyb3VuZCkgeworCisgICAgICAgICAgICBHZXRNZXRyaWNzUnVubmFibGUgZ2V0TWV0cmljc1J1bm5hYmxlID0gbmV3IEdldE1ldHJpY3NSdW5uYWJsZSgiY3Jvc3ZtIiwgcHJvY2Vzc01lbW9yeSk7CisgICAgICAgICAgICBUaHJlYWQgdGhyZWFkR2V0TWV0cmljcyA9IG5ldyBUaHJlYWQoZ2V0TWV0cmljc1J1bm5hYmxlKTsKKworICAgICAgICAgICAgdGhyZWFkR2V0TWV0cmljcy5zdGFydCgpOworCiAgICAgICAgICAgICBMb25nIGNvbXBpbGVTdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKICAgICAgICAgICAgIExvbmcgY29tcGlsZUVuZFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLQogICAgICAgICAgICAgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJBbGwgT2siKTsKICAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihvdXRwdXQpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtYXRjaGVyLmZpbmQoKSk7CisgICAgICAgICAgICBkb3VibGUgZWxhcHNlZFNlYyA9IChjb21waWxlRW5kVGltZSAtIGNvbXBpbGVTdGFydFRpbWUpIC8gTkFOT1NfSU5fU0VDOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ29tcGlsZSB0aW1lIGluIGd1ZXN0IHRvb2sgIiArIGVsYXBzZWRTZWMgKyAicyIpOworICAgICAgICAgICAgZ2V0TWV0cmljc1J1bm5hYmxlLnN0b3AoKTsKIAotICAgICAgICAgICAgY29tcGlsZVRpbWVbcm91bmRdID0gKGNvbXBpbGVFbmRUaW1lIC0gY29tcGlsZVN0YXJ0VGltZSkgLyBOQU5PU19JTl9TRUM7CisgICAgICAgICAgICBMb2cuaShUQUcsICJXYWl0cyBmb3IgdGhyZWFkIGZpbmlzaCIpOworICAgICAgICAgICAgdGhyZWFkR2V0TWV0cmljcy5qb2luKCk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJUaHJlYWQgaXMgZmluaXNoIik7CisKKyAgICAgICAgICAgIGNvbXBpbGVUaW1lcy5hZGQoZWxhcHNlZFNlYyk7CiAgICAgICAgIH0KIAotICAgICAgICByZXBvcnRNZXRyaWMoImd1ZXN0X2NvbXBpbGVfdGltZSIsICJzIiwgY29tcGlsZVRpbWUpOworICAgICAgICByZXBvcnRNZXRyaWMoImd1ZXN0X2NvbXBpbGVfdGltZSIsICJzIiwgY29tcGlsZVRpbWVzKTsKKworICAgICAgICByZXBvcnRBZ2dyZWdhdGVkTWV0cmljKHByb2Nlc3NNZW1vcnksICJndWVzdF9jb21waWxlX2Nyb3N2bV8iLCAia0IiKTsKICAgICB9CiAKICAgICBwcml2YXRlIFRpbWVzdGFtcCBnZXRMYXRlc3REZXgyb2F0U3VjY2Vzc1RpbWUoKQotICAgICAgICAgICAgdGhyb3dzICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKLQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWFuZCA9ICJsb2djYXQgLWQgLWUgZGV4Mm9hdCI7CiAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKICAgICAgICAgU3RyaW5nIGxhdGVzdFRpbWUgPSBudWxsOwpAQCAtMTcwLDI5ICsxODMsMTA2IEBACiAgICAgICAgIHJldHVybiB0aW1lU3RhbXBEYXRlOwogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhvc3RDb21waWxlVGltZSgpCi0gICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1hbmQgPSAiL2FwZXgvY29tLmFuZHJvaWQuYXJ0L2Jpbi9vZHJlZnJlc2ggLS1mb3JjZS1jb21waWxlIjsKLQotICAgICAgICBkb3VibGVbXSBjb21waWxlVGltZSA9IG5ldyBkb3VibGVbUk9VTkRfQ09VTlRdOwotCi0gICAgICAgIGZvciAoaW50IHJvdW5kID0gMDsgcm91bmQgPCBST1VORF9DT1VOVDsgKytyb3VuZCkgewotICAgICAgICAgICAgVGltZXN0YW1wIGJlZm9yZUNvbXBpbGVMYXRlc3RUaW1lID0gZ2V0TGF0ZXN0RGV4Mm9hdFN1Y2Nlc3NUaW1lKCk7Ci0gICAgICAgICAgICBMb25nIGNvbXBpbGVTdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgIExvbmcgY29tcGlsZUVuZFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgIFRpbWVzdGFtcCBhZnRlckNvbXBpbGVMYXRlc3RUaW1lID0gZ2V0TGF0ZXN0RGV4Mm9hdFN1Y2Nlc3NUaW1lKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoYWZ0ZXJDb21waWxlTGF0ZXN0VGltZSAhPSBudWxsKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmVmb3JlQ29tcGlsZUxhdGVzdFRpbWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICB8fCBiZWZvcmVDb21waWxlTGF0ZXN0VGltZS5iZWZvcmUoYWZ0ZXJDb21waWxlTGF0ZXN0VGltZSkpOwotCi0gICAgICAgICAgICBjb21waWxlVGltZVtyb3VuZF0gPSAoY29tcGlsZUVuZFRpbWUgLSBjb21waWxlU3RhcnRUaW1lKSAvIE5BTk9TX0lOX1NFQzsKKyAgICBwcml2YXRlIHZvaWQgcmVwb3J0TWV0cmljKFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCwgTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiB2YWx1ZXMpIHsKKyAgICAgICAgTG9nLmQoVEFHLCAiUmVwb3J0IG1ldHJpYyAiICsgbmFtZSArICIoIiArIHVuaXQgKyAiKSA6ICIgKyB2YWx1ZXMudG9TdHJpbmcoKSk7CisgICAgICAgIE1hcDxTdHJpbmcsIERvdWJsZT4gc3RhdHMgPSBtTWV0cmljc1Byb2Nlc3Nvci5jb21wdXRlU3RhdHModmFsdWVzLCBuYW1lLCB1bml0KTsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IGVudHJ5IDogc3RhdHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYnVuZGxlLnB1dERvdWJsZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0KLQotICAgICAgICByZXBvcnRNZXRyaWMoImhvc3RfY29tcGlsZV90aW1lIiwgInMiLCBjb21waWxlVGltZSk7CisgICAgICAgIG1JbnN0cnVtZW50YXRpb24uc2VuZFN0YXR1cygwLCBidW5kbGUpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCByZXBvcnRBZ2dyZWdhdGVkTWV0cmljKAorICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxMb25nPj4gcHJvY2Vzc01lbW9yeSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVuaXQpIHsKKyAgICAgICAgcHJvY2Vzc01lbW9yeS5mb3JFYWNoKChrLCB2KSAtPiByZXBvcnRNZXRyaWMocHJlZml4ICsgaywgdW5pdCwgdikpOworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGV4ZWN1dGVDb21tYW5kQmxvY2tpbmcoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyY2VsRmlsZURlc2NyaXB0b3IuQXV0b0Nsb3NlSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uZ2V0VWlBdXRvbWF0aW9uKCkuZXhlY3V0ZVNoZWxsQ29tbWFuZChjb21tYW5kKSk7CisgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAoKGxlbmd0aCA9IGlzLnJlYWQoYnVmKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIGV4ZWN1dGluZzogIiArIGNvbW1hbmQsIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIG91dHB1dCA9IGV4ZWN1dGVDb21tYW5kQmxvY2tpbmcoY29tbWFuZCk7CisKKyAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gcnVuIHRoZSBjb21tYW5kLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gbmV3IFN0cmluZyhvdXRwdXQsICJVVEYtOCIpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkdldCBzdGRvdXQgOiAiICsgc3Rkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3Rkb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGV4ZWN1dGluZzogIiArIGNvbW1hbmQgKyAiICwgRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEdldE1ldHJpY3NSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVByb2Nlc3NOYW1lOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8TG9uZz4+IG1Qcm9jZXNzTWVtb3J5OworICAgICAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gbVN0b3AgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICAgICAgR2V0TWV0cmljc1J1bm5hYmxlKFN0cmluZyBwcm9jZXNzTmFtZSwgTWFwPFN0cmluZywgTGlzdDxMb25nPj4gcHJvY2Vzc01lbW9yeSkgeworICAgICAgICAgICAgdGhpcy5tUHJvY2Vzc05hbWUgPSBwcm9jZXNzTmFtZTsKKyAgICAgICAgICAgIHRoaXMubVByb2Nlc3NNZW1vcnkgPSBwcm9jZXNzTWVtb3J5OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgbVN0b3Auc2V0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgd2hpbGUgKCFtU3RvcC5nZXQoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVByb2Nlc3NNZW1vcnkobVByb2Nlc3NOYW1lLCBtUHJvY2Vzc01lbW9yeSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJHZXQgZXhjZXB0aW9uIDogIiArIGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUHJvY2Vzc01lbW9yeShTdHJpbmcgcHJvY2Vzc05hbWUsIE1hcDxTdHJpbmcsIExpc3Q8TG9uZz4+IHByb2Nlc3NNZW1vcnkpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBwcm9jZXNzIDoKKyAgICAgICAgICAgICAgICBQcm9jZXNzVXRpbC5nZXRQcm9jZXNzTWFwKHRoaXM6OmV4ZWN1dGVDb21tYW5kKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpbnQgcElkID0gcHJvY2Vzcy5nZXRLZXkoKTsKKyAgICAgICAgICAgIFN0cmluZyBwTmFtZSA9IHByb2Nlc3MuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChwTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHByb2Nlc3NOYW1lKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gc3RhdCA6CisgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzVXRpbC5nZXRQcm9jZXNzU21hcHNSb2xsdXAocElkLCB0aGlzOjpleGVjdXRlQ29tbWFuZCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuaSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldCBydW5uaW5nIHByb2Nlc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1ldHJpY3MgOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0YXQuZ2V0S2V5KCkudG9Mb3dlckNhc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnLScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RhdC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wdXRlSWZBYnNlbnQoc3RhdC5nZXRLZXkoKS50b0xvd2VyQ2FzZSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoc3RhdC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qYXZhbGliL3NyYy9hbmRyb2lkL3N5c3RlbS92aXJ0dWFsbWFjaGluZS9WaXJ0dWFsTWFjaGluZS5qYXZhIGIvamF2YWxpYi9zcmMvYW5kcm9pZC9zeXN0ZW0vdmlydHVhbG1hY2hpbmUvVmlydHVhbE1hY2hpbmUuamF2YQppbmRleCA4MjhhYzlmLi5hZTg0YzA4IDEwMDY0NAotLS0gYS9qYXZhbGliL3NyYy9hbmRyb2lkL3N5c3RlbS92aXJ0dWFsbWFjaGluZS9WaXJ0dWFsTWFjaGluZS5qYXZhCisrKyBiL2phdmFsaWIvc3JjL2FuZHJvaWQvc3lzdGVtL3ZpcnR1YWxtYWNoaW5lL1ZpcnR1YWxNYWNoaW5lLmphdmEKQEAgLTQ1LDExICs0NSwxNSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVBbHJlYWR5RXhpc3RzRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKQEAgLTY1LDYgKzY5LDExIEBACiAgKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgVmlydHVhbE1hY2hpbmUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDb250ZXh0LCBNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPFZpcnR1YWxNYWNoaW5lPj4+IHNJbnN0YW5jZXMgPQorICAgICAgICAgICAgbmV3IFdlYWtIYXNoTWFwPD4oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBzSW5zdGFuY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKKwogICAgIC8qKiBOYW1lIG9mIHRoZSBkaXJlY3RvcnkgdW5kZXIgdGhlIGZpbGVzIGRpcmVjdG9yeSB3aGVyZSBhbGwgVk1zIGNyZWF0ZWQgZm9yIHRoZSBhcHAgZXhpc3QuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNX0RJUiA9ICJ2bSI7CiAKQEAgLTE1OSw2ICsxNjgsOCBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgbUV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CiAKKyAgICBATm9uTnVsbCBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7CisKICAgICBzdGF0aWMgewogICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoInZpcnR1YWxtYWNoaW5lX2puaSIpOwogICAgIH0KQEAgLTE2Niw2ICsxNzcsNyBAQAogICAgIHByaXZhdGUgVmlydHVhbE1hY2hpbmUoCiAgICAgICAgICAgICBATm9uTnVsbCBDb250ZXh0IGNvbnRleHQsIEBOb25OdWxsIFN0cmluZyBuYW1lLCBATm9uTnVsbCBWaXJ0dWFsTWFjaGluZUNvbmZpZyBjb25maWcpCiAgICAgICAgICAgICB0aHJvd3MgVmlydHVhbE1hY2hpbmVFeGNlcHRpb24geworICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIG1QYWNrYWdlTmFtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKTsKICAgICAgICAgbU5hbWUgPSBuYW1lOwogICAgICAgICBtQ29uZmlnID0gY29uZmlnOwpAQCAtMjMxLDYgKzI0MywxOCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFZpcnR1YWxNYWNoaW5lRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIGluc3RhbmNlIHBhcnRpdGlvbiIsIGUpOwogICAgICAgICB9CiAKKyAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VzTG9jaykgeworICAgICAgICAgICAgTWFwPFN0cmluZywgV2Vha1JlZmVyZW5jZTxWaXJ0dWFsTWFjaGluZT4+IGluc3RhbmNlc01hcDsKKyAgICAgICAgICAgIGlmIChzSW5zdGFuY2VzLmNvbnRhaW5zS2V5KGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VzTWFwID0gc0luc3RhbmNlcy5nZXQoY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluc3RhbmNlc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICBzSW5zdGFuY2VzLnB1dChjb250ZXh0LCBpbnN0YW5jZXNNYXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnN0YW5jZXNNYXAucHV0KG5hbWUsIG5ldyBXZWFrUmVmZXJlbmNlPD4odm0pKTsKKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiB2bTsKICAgICB9CiAKQEAgLTI0OSw3ICsyNzMsMjMgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogCi0gICAgICAgIFZpcnR1YWxNYWNoaW5lIHZtID0gbmV3IFZpcnR1YWxNYWNoaW5lKGNvbnRleHQsIG5hbWUsIGNvbmZpZyk7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lIHZtOworICAgICAgICBzeW5jaHJvbml6ZWQgKHNJbnN0YW5jZXNMb2NrKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBXZWFrUmVmZXJlbmNlPFZpcnR1YWxNYWNoaW5lPj4gaW5zdGFuY2VzTWFwOworICAgICAgICAgICAgaWYgKHNJbnN0YW5jZXMuY29udGFpbnNLZXkoY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZXNNYXAgPSBzSW5zdGFuY2VzLmdldChjb250ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIHNJbnN0YW5jZXMucHV0KGNvbnRleHQsIGluc3RhbmNlc01hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZXNNYXAuY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICB2bSA9IGluc3RhbmNlc01hcC5nZXQobmFtZSkuZ2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZtID0gbmV3IFZpcnR1YWxNYWNoaW5lKGNvbnRleHQsIG5hbWUsIGNvbmZpZyk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VzTWFwLnB1dChuYW1lLCBuZXcgV2Vha1JlZmVyZW5jZTw+KHZtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICAvLyBJZiBjb25maWcgZmlsZSBleGlzdHMsIGJ1dCB0aGUgaW5zdGFuY2UgaW1hZ2UgZmlsZSBkb2Vzbid0LCBpdCBtZWFucyB0aGF0IHRoZSBWTSBpcwogICAgICAgICAvLyBjb3JydXB0ZWQuIFRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgY2FzZSB0aGF0IHRoZSBWTSBkb2Vzbid0IGV4aXN0LiBUaHJvdyBhbiBleGNlcHRpb24KQEAgLTU0NCw2ICs1ODQsMTEgQEAKICAgICAgICAgbUluc3RhbmNlRmlsZVBhdGguZGVsZXRlKCk7CiAgICAgICAgIG1JZHNpZ0ZpbGVQYXRoLmRlbGV0ZSgpOwogICAgICAgICB2bVJvb3REaXIuZGVsZXRlKCk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChzSW5zdGFuY2VzTG9jaykgeworICAgICAgICAgICAgTWFwPFN0cmluZywgV2Vha1JlZmVyZW5jZTxWaXJ0dWFsTWFjaGluZT4+IGluc3RhbmNlc01hcCA9IHNJbnN0YW5jZXMuZ2V0KG1Db250ZXh0KTsKKyAgICAgICAgICAgIGlmIChpbnN0YW5jZXNNYXAgIT0gbnVsbCkgaW5zdGFuY2VzTWFwLnJlbW92ZShtTmFtZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L0FuZHJvaWQuYnAgYi9saWJzL2Fwa3ZlcmlmeS9BbmRyb2lkLmJwCmluZGV4IDliYjhmOGUuLjc4MTkyZDIgMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L0FuZHJvaWQuYnAKKysrIGIvbGlicy9hcGt2ZXJpZnkvQW5kcm9pZC5icApAQCAtMTUsNiArMTUsNyBAQAogICAgICAgICAibGlibG9nX3J1c3QiLAogICAgICAgICAibGlibnVtX3RyYWl0cyIsCiAgICAgICAgICJsaWJvcGVuc3NsIiwKKyAgICAgICAgImxpYnNlcmRlIiwKICAgICAgICAgImxpYnppcCIsCiAgICAgXSwKICAgICBwcm9jX21hY3JvczogWyJsaWJudW1fZGVyaXZlIl0sCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvYWxnb3JpdGhtcy5ycyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9hbGdvcml0aG1zLnJzCmluZGV4IGYxNWYwYTQuLmExY2YzNjggMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L3NyYy9hbGdvcml0aG1zLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9hbGdvcml0aG1zLnJzCkBAIC0xNiw1MSArMTYsMTUzIEBACiAKIC8vISBBbGdvcml0aG1zIHVzZWQgZm9yIEFQSyBTaWduYXR1cmUgU2NoZW1lLgogCi11c2UgYW55aG93Ojp7YmFpbCwgUmVzdWx0fTsKLXVzZSBudW1fZGVyaXZlOjpGcm9tUHJpbWl0aXZlOwordXNlIGFueWhvdzo6e2Vuc3VyZSwgUmVzdWx0fTsKK3VzZSBieXRlczo6e0J1ZiwgQnl0ZXN9OwordXNlIG51bV9kZXJpdmU6OntGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZX07Cit1c2UgbnVtX3RyYWl0czo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKIHVzZSBvcGVuc3NsOjpoYXNoOjpNZXNzYWdlRGlnZXN0OwotdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKK3VzZSBvcGVuc3NsOjpwa2V5Ojp7c2VsZiwgUEtleX07Cit1c2Ugb3BlbnNzbDo6cnNhOjpQYWRkaW5nOwordXNlIG9wZW5zc2w6OnNpZ246OlZlcmlmaWVyOwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CisKK3VzZSBjcmF0ZTo6Ynl0ZXNfZXh0OjpSZWFkRnJvbUJ5dGVzOwogCiAvLy8gW1NpZ25hdHVyZSBBbGdvcml0aG0gSURzXTogaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZG9jcy9zZWN1cml0eS9hcGtzaWduaW5nL3YyI3NpZ25hdHVyZS1hbGdvcml0aG0taWRzCisvLy8gW1NpZ25hdHVyZUFsZ29yaXRobS5qYXZhXTogKHRvb2xzL2Fwa3NpZy9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL2Fwa3NpZy9pbnRlcm5hbC9hcGsvU2lnbmF0dXJlQWxnb3JpdGhtLmphdmEpCiAvLy8KIC8vLyBTb21lIG9mIHRoZSBhbGdvcml0aG1zIGFyZSBub3QgaW1wbGVtZW50ZWQuIFNlZSBiLzE5NzA1Mjk4MS4KLSNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEZyb21QcmltaXRpdmUpXQorI1tkZXJpdmUoU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSwgQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxLCBGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZSldCiAjW3JlcHIodTMyKV0KIHB1YiBlbnVtIFNpZ25hdHVyZUFsZ29yaXRobUlEIHsKKyAgICAvLy8gUlNBU1NBLVBTUyB3aXRoIFNIQTItMjU2IGRpZ2VzdCwgU0hBMi0yNTYgTUdGMSwgMzIgYnl0ZXMgb2Ygc2FsdCwgdHJhaWxlcjogMHhiYywgY29udGVudAorICAgIC8vLyBkaWdlc3RlZCB1c2luZyBTSEEyLTI1NiBpbiAxIE1CIGNodW5rcy4KICAgICBSc2FQc3NXaXRoU2hhMjU2ID0gMHgwMTAxLAorCisgICAgLy8vIFJTQVNTQS1QU1Mgd2l0aCBTSEEyLTUxMiBkaWdlc3QsIFNIQTItNTEyIE1HRjEsIDY0IGJ5dGVzIG9mIHNhbHQsIHRyYWlsZXI6IDB4YmMsIGNvbnRlbnQKKyAgICAvLy8gZGlnZXN0ZWQgdXNpbmcgU0hBMi01MTIgaW4gMSBNQiBjaHVua3MuCiAgICAgUnNhUHNzV2l0aFNoYTUxMiA9IDB4MDEwMiwKKworICAgIC8vLyBSU0FTU0EtUEtDUzEtdjFfNSB3aXRoIFNIQTItMjU2IGRpZ2VzdCwgY29udGVudCBkaWdlc3RlZCB1c2luZyBTSEEyLTI1NiBpbiAxIE1CIGNodW5rcy4KICAgICBSc2FQa2NzMVYxNVdpdGhTaGEyNTYgPSAweDAxMDMsCisKKyAgICAvLy8gUlNBU1NBLVBLQ1MxLXYxXzUgd2l0aCBTSEEyLTUxMiBkaWdlc3QsIGNvbnRlbnQgZGlnZXN0ZWQgdXNpbmcgU0hBMi01MTIgaW4gMSBNQiBjaHVua3MuCiAgICAgUnNhUGtjczFWMTVXaXRoU2hhNTEyID0gMHgwMTA0LAorCisgICAgLy8vIEVDRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItMjU2IGluIDEgTUIgY2h1bmtzLgogICAgIEVjZHNhV2l0aFNoYTI1NiA9IDB4MDIwMSwKKworICAgIC8vLyBFQ0RTQSB3aXRoIFNIQTItNTEyIGRpZ2VzdCwgY29udGVudCBkaWdlc3RlZCB1c2luZyBTSEEyLTUxMiBpbiAxIE1CIGNodW5rcy4KICAgICBFY2RzYVdpdGhTaGE1MTIgPSAweDAyMDIsCisKKyAgICAvLy8gRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItMjU2IGluIDEgTUIgY2h1bmtzLgorICAgIC8vLyBTaWduaW5nIGlzIGRvbmUgZGV0ZXJtaW5pc3RpY2FsbHkgYWNjb3JkaW5nIHRvIFJGQyA2OTc5LgogICAgIERzYVdpdGhTaGEyNTYgPSAweDAzMDEsCisKKyAgICAvLy8gUlNBU1NBLVBLQ1MxLXYxXzUgd2l0aCBTSEEyLTI1NiBkaWdlc3QsIGNvbnRlbnQgZGlnZXN0ZWQgdXNpbmcgU0hBMi0yNTYgaW4gNCBLQgorICAgIC8vLyBjaHVua3MsIGluIHRoZSBzYW1lIHdheSBmc3Zlcml0eSBvcGVyYXRlcy4gVGhpcyBkaWdlc3QgYW5kIHRoZSBjb250ZW50IGxlbmd0aAorICAgIC8vLyAoYmVmb3JlIGRpZ2VzdGlvbiwgOCBieXRlcyBpbiBsaXR0bGUgZW5kaWFuKSBjb25zdHJ1Y3QgdGhlIGZpbmFsIGRpZ2VzdC4KICAgICBWZXJpdHlSc2FQa2NzMVYxNVdpdGhTaGEyNTYgPSAweDA0MjEsCisKKyAgICAvLy8gRUNEU0Egd2l0aCBTSEEyLTI1NiBkaWdlc3QsIGNvbnRlbnQgZGlnZXN0ZWQgdXNpbmcgU0hBMi0yNTYgaW4gNCBLQiBjaHVua3MsIGluIHRoZQorICAgIC8vLyBzYW1lIHdheSBmc3Zlcml0eSBvcGVyYXRlcy4gVGhpcyBkaWdlc3QgYW5kIHRoZSBjb250ZW50IGxlbmd0aCAoYmVmb3JlIGRpZ2VzdGlvbiwKKyAgICAvLy8gOCBieXRlcyBpbiBsaXR0bGUgZW5kaWFuKSBjb25zdHJ1Y3QgdGhlIGZpbmFsIGRpZ2VzdC4KICAgICBWZXJpdHlFY2RzYVdpdGhTaGEyNTYgPSAweDA0MjMsCisKKyAgICAvLy8gRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0LCBjb250ZW50IGRpZ2VzdGVkIHVzaW5nIFNIQTItMjU2IGluIDQgS0IgY2h1bmtzLCBpbiB0aGUKKyAgICAvLy8gc2FtZSB3YXkgZnN2ZXJpdHkgb3BlcmF0ZXMuIFRoaXMgZGlnZXN0IGFuZCB0aGUgY29udGVudCBsZW5ndGggKGJlZm9yZSBkaWdlc3Rpb24sCisgICAgLy8vIDggYnl0ZXMgaW4gbGl0dGxlIGVuZGlhbikgY29uc3RydWN0IHRoZSBmaW5hbCBkaWdlc3QuCiAgICAgVmVyaXR5RHNhV2l0aFNoYTI1NiA9IDB4MDQyNSwKIH0KIAotaW1wbCBPcmQgZm9yIFNpZ25hdHVyZUFsZ29yaXRobUlEIHsKLSAgICAvLy8gUmFua3MgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gYWNjb3JkaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQKLSAgICAvLy8gZGlnZXN0IGFsZ29yaXRobSdzIHJhbmsuCi0gICAgZm4gY21wKCZzZWxmLCBvdGhlcjogJlNlbGYpIC0+IE9yZGVyaW5nIHsKLSAgICAgICAgc2VsZi50b19jb250ZW50X2RpZ2VzdF9hbGdvcml0aG0oKS5jbXAoJm90aGVyLnRvX2NvbnRlbnRfZGlnZXN0X2FsZ29yaXRobSgpKQoraW1wbCBEZWZhdWx0IGZvciBTaWduYXR1cmVBbGdvcml0aG1JRCB7CisgICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgeworICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6RHNhV2l0aFNoYTI1NgogICAgIH0KIH0KIAotaW1wbCBQYXJ0aWFsT3JkIGZvciBTaWduYXR1cmVBbGdvcml0aG1JRCB7Ci0gICAgZm4gcGFydGlhbF9jbXAoJnNlbGYsIG90aGVyOiAmU2VsZikgLT4gT3B0aW9uPE9yZGVyaW5nPiB7Ci0gICAgICAgIFNvbWUoc2VsZi5jbXAob3RoZXIpKQotICAgIH0KLX0KLQotaW1wbCBQYXJ0aWFsRXEgZm9yIFNpZ25hdHVyZUFsZ29yaXRobUlEIHsKLSAgICBmbiBlcSgmc2VsZiwgb3RoZXI6ICZTZWxmKSAtPiBib29sIHsKLSAgICAgICAgc2VsZi5jbXAob3RoZXIpID09IE9yZGVyaW5nOjpFcXVhbAoraW1wbCBSZWFkRnJvbUJ5dGVzIGZvciBPcHRpb248U2lnbmF0dXJlQWxnb3JpdGhtSUQ+IHsKKyAgICBmbiByZWFkX2Zyb21fYnl0ZXMoYnVmOiAmbXV0IEJ5dGVzKSAtPiBSZXN1bHQ8U2VsZj4geworICAgICAgICBPayhTaWduYXR1cmVBbGdvcml0aG1JRDo6ZnJvbV91MzIoYnVmLmdldF91MzJfbGUoKSkpCiAgICAgfQogfQogCiBpbXBsIFNpZ25hdHVyZUFsZ29yaXRobUlEIHsKLSAgICBwdWIoY3JhdGUpIGZuIHRvX2NvbnRlbnRfZGlnZXN0X2FsZ29yaXRobSgmc2VsZikgLT4gQ29udGVudERpZ2VzdEFsZ29yaXRobSB7CisgICAgLy8vIENvbnZlcnRzIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIElEIHRvIHRoZSBjb3JyZXNwb25kaW5nIHUzMi4KKyAgICBwdWIgZm4gdG9fdTMyKCZzZWxmKSAtPiB1MzIgeworICAgICAgICBUb1ByaW1pdGl2ZTo6dG9fdTMyKHNlbGYpLmV4cGVjdCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIGZvciB0b191MzIuIikKKyAgICB9CisKKyAgICBwdWIoY3JhdGUpIGZuIG5ld192ZXJpZmllcjwnYT4oCisgICAgICAgICZzZWxmLAorICAgICAgICBwdWJsaWNfa2V5OiAmJ2EgUEtleTxwa2V5OjpQdWJsaWM+LAorICAgICkgLT4gUmVzdWx0PFZlcmlmaWVyPCdhPj4geworICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgIW1hdGNoZXMhKAorICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkRzYVdpdGhTaGEyNTYgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5RHNhV2l0aFNoYTI1NgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICJUT0RPKGIvMTk3MDUyOTgxKTogQWxnb3JpdGhtICd7Oj99JyBpcyBub3QgaW1wbGVtZW50ZWQuIiwKKyAgICAgICAgICAgIHNlbGYKKyAgICAgICAgKTsKKyAgICAgICAgZW5zdXJlIShwdWJsaWNfa2V5LmlkKCkgPT0gc2VsZi5wa2V5X2lkKCksICJQdWJsaWMga2V5IGhhcyB0aGUgd3JvbmcgSUQiKTsKKyAgICAgICAgbGV0IG11dCB2ZXJpZmllciA9IFZlcmlmaWVyOjpuZXcoc2VsZi5uZXdfbWVzc2FnZV9kaWdlc3QoKSwgcHVibGljX2tleSk/OworICAgICAgICBpZiBwdWJsaWNfa2V5LmlkKCkgPT0gcGtleTo6SWQ6OlJTQSB7CisgICAgICAgICAgICB2ZXJpZmllci5zZXRfcnNhX3BhZGRpbmcoc2VsZi5yc2FfcGFkZGluZygpKT87CisgICAgICAgIH0KKyAgICAgICAgT2sodmVyaWZpZXIpCisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0KKyAgICAvLy8gYWNjb3JkaW5nIHRvIHRoZSBzcGVjIFtTaWduYXR1cmUgQWxnb3JpdGhtIElEc10uCisgICAgcHViKGNyYXRlKSBmbiBuZXdfbWVzc2FnZV9kaWdlc3QoJnNlbGYpIC0+IE1lc3NhZ2VEaWdlc3QgeworICAgICAgICBtYXRjaCBzZWxmIHsKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQc3NXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6RHNhV2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5UnNhUGtjczFWMTVXaXRoU2hhMjU2CisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlFY2RzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eURzYVdpdGhTaGEyNTYgPT4gTWVzc2FnZURpZ2VzdDo6c2hhMjU2KCksCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhNTEyCisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGE1MTIgPT4gTWVzc2FnZURpZ2VzdDo6c2hhNTEyKCksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBwa2V5X2lkKCZzZWxmKSAtPiBwa2V5OjpJZCB7CisgICAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBzc1dpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBzc1dpdGhTaGE1MTIKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhNTEyCisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlSc2FQa2NzMVYxNVdpdGhTaGEyNTYgPT4gcGtleTo6SWQ6OlJTQSwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTUxMgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6VmVyaXR5RWNkc2FXaXRoU2hhMjU2ID0+IHBrZXk6OklkOjpFQywKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2IHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eURzYVdpdGhTaGEyNTYgPT4geworICAgICAgICAgICAgICAgIHBrZXk6OklkOjpEU0EKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJzYV9wYWRkaW5nKCZzZWxmKSAtPiBQYWRkaW5nIHsKKyAgICAgICAgbWF0Y2ggc2VsZiB7CisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTI1NiB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQc3NXaXRoU2hhNTEyID0+IHsKKyAgICAgICAgICAgICAgICBQYWRkaW5nOjpQS0NTMV9QU1MKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eVJzYVBrY3MxVjE1V2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhNTEyID0+IFBhZGRpbmc6OlBLQ1MxLAorICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTI1NgorICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhNTEyCisgICAgICAgICAgICB8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpWZXJpdHlFY2RzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkRzYVdpdGhTaGEyNTYKKyAgICAgICAgICAgIHwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlZlcml0eURzYVdpdGhTaGEyNTYgPT4gUGFkZGluZzo6Tk9ORSwKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YihjcmF0ZSkgZm4gY29udGVudF9kaWdlc3RfYWxnb3JpdGhtKCZzZWxmKSAtPiBDb250ZW50RGlnZXN0QWxnb3JpdGhtIHsKICAgICAgICAgbWF0Y2ggc2VsZiB7CiAgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUHNzV2l0aFNoYTI1NgogICAgICAgICAgICAgfCBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2CkBAIC05MywxNSArMTk1LDMgQEAKICAgICBWZXJpdHlDaHVua2VkU2hhMjU2LAogICAgIENodW5rZWRTaGE1MTIsCiB9Ci0KLWltcGwgQ29udGVudERpZ2VzdEFsZ29yaXRobSB7Ci0gICAgcHViKGNyYXRlKSBmbiBuZXdfbWVzc2FnZV9kaWdlc3QoJnNlbGYpIC0+IFJlc3VsdDxNZXNzYWdlRGlnZXN0PiB7Ci0gICAgICAgIG1hdGNoIHNlbGYgewotICAgICAgICAgICAgQ29udGVudERpZ2VzdEFsZ29yaXRobTo6Q2h1bmtlZFNoYTI1NiA9PiBPayhNZXNzYWdlRGlnZXN0OjpzaGEyNTYoKSksCi0gICAgICAgICAgICBDb250ZW50RGlnZXN0QWxnb3JpdGhtOjpDaHVua2VkU2hhNTEyID0+IE9rKE1lc3NhZ2VEaWdlc3Q6OnNoYTUxMigpKSwKLSAgICAgICAgICAgIENvbnRlbnREaWdlc3RBbGdvcml0aG06OlZlcml0eUNodW5rZWRTaGEyNTYgPT4gewotICAgICAgICAgICAgICAgIGJhaWwhKCJUT0RPKGIvMTk3MDUyOTgxKTogQ09OVEVOVF9ESUdFU1RfVkVSSVRZX0NIVU5LRURfU0hBMjU2IGlzIG5vdCBpbXBsZW1lbnRlZCIpCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvYnl0ZXNfZXh0LnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL2J5dGVzX2V4dC5ycwppbmRleCAyMmEzMDg1Li44ZmIzNmVlIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS9zcmMvYnl0ZXNfZXh0LnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9ieXRlc19leHQucnMKQEAgLTE2LDcgKzE2LDcgQEAKIAogLy8hIFByb3ZpZGVzIGV4dGVuc2lvbiBtZXRob2RzIEJ5dGVzOjpyZWFkPFQ+KCksIHdoaWNoIGNhbGxzIGJhY2sgUmVhZEZyb21CeXRlczo6cmVhZF9mcm9tX2J5dGUoKQogCi11c2UgYW55aG93Ojp7YmFpbCwgUmVzdWx0fTsKK3VzZSBhbnlob3c6OntlbnN1cmUsIFJlc3VsdH07CiB1c2UgYnl0ZXM6OntCdWYsIEJ5dGVzfTsKIHVzZSBzdGQ6Om9wczo6RGVyZWY7CiAKQEAgLTc5LDIwICs3OSwxOCBAQAogfQogCiBmbiByZWFkX2xlbmd0aF9wcmVmaXhlZF9zbGljZShidWY6ICZtdXQgQnl0ZXMpIC0+IFJlc3VsdDxCeXRlcz4gewotICAgIGlmIGJ1Zi5yZW1haW5pbmcoKSA8IDQgewotICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICJSZW1haW5pbmcgYnVmZmVyIHRvbyBzaG9ydCB0byBjb250YWluIGxlbmd0aCBvZiBsZW5ndGgtcHJlZml4ZWQgZmllbGQuIFJlbWFpbmluZzoge30iLAotICAgICAgICAgICAgYnVmLnJlbWFpbmluZygpCi0gICAgICAgICk7Ci0gICAgfQorICAgIGVuc3VyZSEoCisgICAgICAgIGJ1Zi5yZW1haW5pbmcoKSA+PSA0LAorICAgICAgICAiUmVtYWluaW5nIGJ1ZmZlciB0b28gc2hvcnQgdG8gY29udGFpbiBsZW5ndGggb2YgbGVuZ3RoLXByZWZpeGVkIGZpZWxkLiBSZW1haW5pbmc6IHt9IiwKKyAgICAgICAgYnVmLnJlbWFpbmluZygpCisgICAgKTsKICAgICBsZXQgbGVuID0gYnVmLmdldF91MzJfbGUoKSBhcyB1c2l6ZTsKLSAgICBpZiBsZW4gPiBidWYucmVtYWluaW5nKCkgewotICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICJsZW5ndGgtcHJlZml4ZWQgZmllbGQgbG9uZ2VyIHRoYW4gcmVtYWluaW5nIGJ1ZmZlci4gRmllbGQgbGVuZ3RoOiB7fSwgcmVtYWluaW5nOiB7fSIsCi0gICAgICAgICAgICBsZW4sCi0gICAgICAgICAgICBidWYucmVtYWluaW5nKCkKLSAgICAgICAgKTsKLSAgICB9CisgICAgZW5zdXJlISgKKyAgICAgICAgYnVmLnJlbWFpbmluZygpID49IGxlbiwKKyAgICAgICAgImxlbmd0aC1wcmVmaXhlZCBmaWVsZCBsb25nZXIgdGhhbiByZW1haW5pbmcgYnVmZmVyLiBGaWVsZCBsZW5ndGg6IHt9LCByZW1haW5pbmc6IHt9IiwKKyAgICAgICAgbGVuLAorICAgICAgICBidWYucmVtYWluaW5nKCkKKyAgICApOwogICAgIE9rKGJ1Zi5zcGxpdF90byhsZW4pKQogfQogCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvbGliLnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL2xpYi5ycwppbmRleCBmNmMxYTIxLi4wODRhOTEwIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS9zcmMvbGliLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy9saWIucnMKQEAgLTI0LDUgKzI0LDYgQEAKIG1vZCB2MzsKIG1vZCB6aXB1dGlsOwogCi0vLyBUT0RPKGpvb3l1bmcpIGZhbGxiYWNrIHRvIHYyIHdoZW4gdjMgbm90IGZvdW5kCisvLyBUT0RPKGIvMTk3MDUyOTgxKSBmYWxsYmFjayB0byB2MiB3aGVuIHYzIG5vdCBmb3VuZAorcHViIHVzZSBhbGdvcml0aG1zOjpTaWduYXR1cmVBbGdvcml0aG1JRDsKIHB1YiB1c2UgdjM6OntnZXRfcHVibGljX2tleV9kZXIsIHBpY2tfdjRfYXBrX2RpZ2VzdCwgdmVyaWZ5fTsKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3NyYy9zaWd1dGlsLnJzIGIvbGlicy9hcGt2ZXJpZnkvc3JjL3NpZ3V0aWwucnMKaW5kZXggZWE2ZDYzYS4uYmZhNTFjMSAxMDA2NDQKLS0tIGEvbGlicy9hcGt2ZXJpZnkvc3JjL3NpZ3V0aWwucnMKKysrIGIvbGlicy9hcGt2ZXJpZnkvc3JjL3NpZ3V0aWwucnMKQEAgLTE5LDcgKzE5LDYgQEAKIHVzZSBhbnlob3c6Onthbnlob3csIGVuc3VyZSwgRXJyb3IsIFJlc3VsdH07CiB1c2UgYnl0ZW9yZGVyOjp7TGl0dGxlRW5kaWFuLCBSZWFkQnl0ZXNFeHR9OwogdXNlIGJ5dGVzOjp7QnVmLCBCdWZNdXQsIEJ5dGVzLCBCeXRlc011dH07Ci11c2UgbnVtX3RyYWl0czo6RnJvbVByaW1pdGl2ZTsKIHVzZSBvcGVuc3NsOjpoYXNoOjp7RGlnZXN0Qnl0ZXMsIEhhc2hlciwgTWVzc2FnZURpZ2VzdH07CiB1c2Ugc3RkOjpjbXA6Om1pbjsKIHVzZSBzdGQ6OmlvOjp7c2VsZiwgQ3Vyc29yLCBFcnJvcktpbmQsIFJlYWQsIFNlZWssIFNlZWtGcm9tLCBUYWtlfTsKQEAgLTMwLDE5ICsyOSw5IEBACiBjb25zdCBBUEtfU0lHX0JMT0NLX01JTl9TSVpFOiB1MzIgPSAzMjsKIGNvbnN0IEFQS19TSUdfQkxPQ0tfTUFHSUM6IHUxMjggPSAweDMyMzQyMDZiNjM2ZjZjNDIyMDY3Njk1MzIwNGI1MDQxOwogCi0vLyBUT0RPKGIvMjQ2MjU0MzU1KTogTWlncmF0ZXMgdXNhZ2VzIG9mIHJhdyBzaWduYXR1cmUgYWxnb3JpdGhtIGlkIHRvIHRoZSBlbnVtLgotcHViIGNvbnN0IFNJR05BVFVSRV9SU0FfUFNTX1dJVEhfU0hBMjU2OiB1MzIgPSAweDAxMDE7Ci1wdWIgY29uc3QgU0lHTkFUVVJFX1JTQV9QU1NfV0lUSF9TSEE1MTI6IHUzMiA9IDB4MDEwMjsKLXB1YiBjb25zdCBTSUdOQVRVUkVfUlNBX1BLQ1MxX1YxXzVfV0lUSF9TSEEyNTY6IHUzMiA9IDB4MDEwMzsKLXB1YiBjb25zdCBTSUdOQVRVUkVfUlNBX1BLQ1MxX1YxXzVfV0lUSF9TSEE1MTI6IHUzMiA9IDB4MDEwNDsKLXB1YiBjb25zdCBTSUdOQVRVUkVfRUNEU0FfV0lUSF9TSEEyNTY6IHUzMiA9IDB4MDIwMTsKLXB1YiBjb25zdCBTSUdOQVRVUkVfRUNEU0FfV0lUSF9TSEE1MTI6IHUzMiA9IDB4MDIwMjsKLXB1YiBjb25zdCBTSUdOQVRVUkVfRFNBX1dJVEhfU0hBMjU2OiB1MzIgPSAweDAzMDE7Ci1wdWIgY29uc3QgU0lHTkFUVVJFX1ZFUklUWV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTI1NjogdTMyID0gMHgwNDIxOwotcHViIGNvbnN0IFNJR05BVFVSRV9WRVJJVFlfRUNEU0FfV0lUSF9TSEEyNTY6IHUzMiA9IDB4MDQyMzsKLXB1YiBjb25zdCBTSUdOQVRVUkVfVkVSSVRZX0RTQV9XSVRIX1NIQTI1NjogdTMyID0gMHgwNDI1OwotCiBjb25zdCBDSFVOS19TSVpFX0JZVEVTOiB1NjQgPSAxMDI0ICogMTAyNDsKK2NvbnN0IENIVU5LX0hFQURFUl9UT1A6ICZbdThdID0gJlsweDVhXTsKK2NvbnN0IENIVU5LX0hFQURFUl9NSUQ6ICZbdThdID0gJlsweGE1XTsKIAogLy8vIFRoZSBbQVBLIHN0cnVjdHVyZV0gaGFzIGZvdXIgbWFqb3Igc2VjdGlvbnM6CiAvLy8KQEAgLTkxLDEyICs4MCwxMSBAQAogICAgIC8vLyAgICBjaHVua3MgKGxpdHRsZS1lbmRpYW4gdWludDMyKSwgYW5kIHRoZSBjb25jYXRlbmF0aW9uIG9mIGRpZ2VzdHMgb2YgdGhlIGNodW5rcyBpbiB0aGUKICAgICAvLy8gICAgb3JkZXIgdGhlIGNodW5rcyBhcHBlYXIgaW4gdGhlIEFQSy4KICAgICAvLy8gKHNlZSBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9zZWN1cml0eS9hcGtzaWduaW5nL3YyI2ludGVncml0eS1wcm90ZWN0ZWQtY29udGVudHMpCi0gICAgcHViIGZuIGNvbXB1dGVfZGlnZXN0KCZtdXQgc2VsZiwgc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogdTMyKSAtPiBSZXN1bHQ8VmVjPHU4Pj4gewotICAgICAgICAvLyBUT0RPKGIvMjQ2MjU0MzU1KTogUGFzc2VzIHRoZSBlbnVtIFNpZ25hdHVyZUFsZ29yaXRobUlEIGRpcmVjdGx5IHRvIHRoaXMgbWV0aG9kLgotICAgICAgICBsZXQgc2lnbmF0dXJlX2FsZ29yaXRobV9pZCA9IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpmcm9tX3UzMihzaWduYXR1cmVfYWxnb3JpdGhtX2lkKQotICAgICAgICAgICAgLm9rX29yX2Vsc2UofHwgYW55aG93ISgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIElEOiB7fSIsIHNpZ25hdHVyZV9hbGdvcml0aG1faWQpKT87Ci0gICAgICAgIGxldCBkaWdlc3RlciA9IERpZ2VzdGVyOjpuZXcoc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk/OwotCisgICAgcHViKGNyYXRlKSBmbiBjb21wdXRlX2RpZ2VzdCgKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JRCwKKyAgICApIC0+IFJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBkaWdlc3RlciA9IERpZ2VzdGVyIHsgbWVzc2FnZV9kaWdlc3Q6IHNpZ25hdHVyZV9hbGdvcml0aG1faWQubmV3X21lc3NhZ2VfZGlnZXN0KCkgfTsKICAgICAgICAgbGV0IG11dCBkaWdlc3RzX29mX2NodW5rcyA9IEJ5dGVzTXV0OjpuZXcoKTsKICAgICAgICAgbGV0IG11dCBjaHVua19jb3VudCA9IDB1MzI7CiAgICAgICAgIGxldCBtdXQgY2h1bmsgPSB2ZWMhWzB1ODsgQ0hVTktfU0laRV9CWVRFUyBhcyB1c2l6ZV07CkBAIC0xNjQsMTYgKzE1Miw3IEBACiAgICAgbWVzc2FnZV9kaWdlc3Q6IE1lc3NhZ2VEaWdlc3QsCiB9CiAKLWNvbnN0IENIVU5LX0hFQURFUl9UT1A6ICZbdThdID0gJlsweDVhXTsKLWNvbnN0IENIVU5LX0hFQURFUl9NSUQ6ICZbdThdID0gJlsweGE1XTsKLQogaW1wbCBEaWdlc3RlciB7Ci0gICAgZm4gbmV3KHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlEKSAtPiBSZXN1bHQ8RGlnZXN0ZXI+IHsKLSAgICAgICAgbGV0IG1lc3NhZ2VfZGlnZXN0ID0KLSAgICAgICAgICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQudG9fY29udGVudF9kaWdlc3RfYWxnb3JpdGhtKCkubmV3X21lc3NhZ2VfZGlnZXN0KCk/OwotICAgICAgICBPayhEaWdlc3RlciB7IG1lc3NhZ2VfZGlnZXN0IH0pCi0gICAgfQotCiAgICAgLy8gdjIvdjMgZGlnZXN0cyBhcmUgY29tcHV0ZWQgYWZ0ZXIgcHJlcGVuZGluZyAiaGVhZGVyIiBieXRlIGFuZCAic2l6ZSIgaW5mby4KICAgICBmbiBkaWdlc3QoJnNlbGYsIGRhdGE6ICZbdThdLCBoZWFkZXI6ICZbdThdLCBzaXplOiB1MzIpIC0+IFJlc3VsdDxEaWdlc3RCeXRlcz4gewogICAgICAgICBsZXQgbXV0IGhhc2hlciA9IEhhc2hlcjo6bmV3KHNlbGYubWVzc2FnZV9kaWdlc3QpPzsKQEAgLTI5NSw3ICsyNzQsNyBAQAogICAgIGZuIHRlc3RfYXBrX2RpZ2VzdCgpIHsKICAgICAgICAgbGV0IGFwa19maWxlID0gRmlsZTo6b3BlbigidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni0xMDI0LmFwayIpLnVud3JhcCgpOwogICAgICAgICBsZXQgbXV0IGFwa19zZWN0aW9ucyA9IEFwa1NlY3Rpb25zOjpuZXcoYXBrX2ZpbGUpLnVud3JhcCgpOwotICAgICAgICBsZXQgZGlnZXN0ID0gYXBrX3NlY3Rpb25zLmNvbXB1dGVfZGlnZXN0KFNJR05BVFVSRV9EU0FfV0lUSF9TSEEyNTYpLnVud3JhcCgpOworICAgICAgICBsZXQgZGlnZXN0ID0gYXBrX3NlY3Rpb25zLmNvbXB1dGVfZGlnZXN0KFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2KS51bndyYXAoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKICAgICAgICAgICAgICIwREYyNDI2RUEzM0FFREFGNDk1RDg4RTVCRTBDNkExNjYzRkYwQTgxQzVFRDEyRDVCMjkyOUFFNEI0MzAwRjJGIiwKICAgICAgICAgICAgIHRvX2hleF9zdHJpbmcoJmRpZ2VzdFsuLl0pCmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvdjMucnMgYi9saWJzL2Fwa3ZlcmlmeS9zcmMvdjMucnMKaW5kZXggYzg2Njk2Zi4uMDU2OTRmZiAxMDA2NDQKLS0tIGEvbGlicy9hcGt2ZXJpZnkvc3JjL3YzLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy92My5ycwpAQCAtMTgsMTMgKzE4LDkgQEAKIC8vIQogLy8hIFt2MyB2ZXJpZmljYXRpb25dOiBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9zZWN1cml0eS9hcGtzaWduaW5nL3YzI3ZlcmlmaWNhdGlvbgogCi11c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBlbnN1cmUsIENvbnRleHQsIFJlc3VsdH07Cit1c2UgYW55aG93Ojp7ZW5zdXJlLCBDb250ZXh0LCBSZXN1bHR9OwogdXNlIGJ5dGVzOjpCeXRlczsKLXVzZSBudW1fdHJhaXRzOjpGcm9tUHJpbWl0aXZlOwotdXNlIG9wZW5zc2w6Omhhc2g6Ok1lc3NhZ2VEaWdlc3Q7CiB1c2Ugb3BlbnNzbDo6cGtleTo6e3NlbGYsIFBLZXl9OwotdXNlIG9wZW5zc2w6OnJzYTo6UGFkZGluZzsKLXVzZSBvcGVuc3NsOjpzaWduOjpWZXJpZmllcjsKIHVzZSBvcGVuc3NsOjp4NTA5OjpYNTA5OwogdXNlIHN0ZDo6ZnM6OkZpbGU7CiB1c2Ugc3RkOjppbzo6e1JlYWQsIFNlZWt9OwpAQCAtMzcsNyArMzMsNyBAQAogCiBwdWIgY29uc3QgQVBLX1NJR05BVFVSRV9TQ0hFTUVfVjNfQkxPQ0tfSUQ6IHUzMiA9IDB4ZjA1MzY4YzA7CiAKLS8vIFRPRE8oam9veXVuZyk6IGdldCAicm8uYnVpbGQudmVyc2lvbi5zZGsiCisvLyBUT0RPKGIvMTkwMzQzODQyKTogZ2V0ICJyby5idWlsZC52ZXJzaW9uLnNkayIKIGNvbnN0IFNES19JTlQ6IHUzMiA9IDMxOwogCiB0eXBlIFNpZ25lcnMgPSBMZW5ndGhQcmVmaXhlZDxWZWM8TGVuZ3RoUHJlZml4ZWQ8U2lnbmVyPj4+OwpAQCAtNDcsNyArNDMsNyBAQAogICAgIG1pbl9zZGs6IHUzMiwKICAgICBtYXhfc2RrOiB1MzIsCiAgICAgc2lnbmF0dXJlczogTGVuZ3RoUHJlZml4ZWQ8VmVjPExlbmd0aFByZWZpeGVkPFNpZ25hdHVyZT4+PiwKLSAgICBwdWJsaWNfa2V5OiBMZW5ndGhQcmVmaXhlZDxCeXRlcz4sCisgICAgcHVibGljX2tleTogUEtleTxwa2V5OjpQdWJsaWM+LAogfQogCiBpbXBsIFNpZ25lciB7CkBAIC03MywxMyArNjksMTMgQEAKIAogI1tkZXJpdmUoRGVidWcpXQogc3RydWN0IFNpZ25hdHVyZSB7Ci0gICAgLy8vIFRPRE8oYi8yNDYyNTQzNTUpOiBDaGFuZ2UgdGhlIHR5cGUgb2Ygc2lnbmF0dXJlX2FsZ29yaXRobV9pZCB0byBTaWduYXR1cmVBbGdvcml0aG1JRAotICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IHUzMiwKKyAgICAvLy8gT3B0aW9uIGlzIHVzZWQgaGVyZSB0byBhbGxvdyB1cyB0byBpZ25vcmUgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtLgorICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IE9wdGlvbjxTaWduYXR1cmVBbGdvcml0aG1JRD4sCiAgICAgc2lnbmF0dXJlOiBMZW5ndGhQcmVmaXhlZDxCeXRlcz4sCiB9CiAKIHN0cnVjdCBEaWdlc3QgewotICAgIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IHUzMiwKKyAgICBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBPcHRpb248U2lnbmF0dXJlQWxnb3JpdGhtSUQ+LAogICAgIGRpZ2VzdDogTGVuZ3RoUHJlZml4ZWQ8Qnl0ZXM+LAogfQogCkBAIC04OCw5ICs4NCw5IEBACiAKIC8vLyBWZXJpZmllcyBBUEsgU2lnbmF0dXJlIFNjaGVtZSB2MyBzaWduYXR1cmVzIG9mIHRoZSBwcm92aWRlZCBBUEsgYW5kIHJldHVybnMgdGhlIHB1YmxpYyBrZXkKIC8vLyBhc3NvY2lhdGVkIHdpdGggdGhlIHNpZ25lciBpbiBERVIgZm9ybWF0LgotcHViIGZuIHZlcmlmeTxQOiBBc1JlZjxQYXRoPj4ocGF0aDogUCkgLT4gUmVzdWx0PEJveDxbdThdPj4gewotICAgIGxldCBmID0gRmlsZTo6b3BlbihwYXRoLmFzX3JlZigpKT87Ci0gICAgbGV0IG11dCBzZWN0aW9ucyA9IEFwa1NlY3Rpb25zOjpuZXcoZik/OworcHViIGZuIHZlcmlmeTxQOiBBc1JlZjxQYXRoPj4oYXBrX3BhdGg6IFApIC0+IFJlc3VsdDxCb3g8W3U4XT4+IHsKKyAgICBsZXQgYXBrID0gRmlsZTo6b3BlbihhcGtfcGF0aC5hc19yZWYoKSk/OworICAgIGxldCBtdXQgc2VjdGlvbnMgPSBBcGtTZWN0aW9uczo6bmV3KGFwayk/OwogICAgIGZpbmRfc2lnbmVyX2FuZF90aGVuKCZtdXQgc2VjdGlvbnMsIHwoc2lnbmVyLCBzZWN0aW9ucyl8IHNpZ25lci52ZXJpZnkoc2VjdGlvbnMpKQogfQogCkBAIC0xMDgsMzAgKzEwNCwyOSBAQAogICAgIGxldCBzdXBwb3J0ZWQgPSBzaWduZXJzLml0ZXIoKS5maWx0ZXIofHN8IHMuc2RrX3JhbmdlKCkuY29udGFpbnMoJlNES19JTlQpKS5jb2xsZWN0Ojo8VmVjPF8+PigpOwogCiAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lCi0gICAgaWYgc3VwcG9ydGVkLmxlbigpICE9IDEgewotICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICJBUEsgU2lnbmF0dXJlIFNjaGVtZSBWMyBvbmx5IHN1cHBvcnRzIG9uZSBzaWduZXI6IHt9IHNpZ25lcnMgZm91bmQuIiwKLSAgICAgICAgICAgIHN1cHBvcnRlZC5sZW4oKQotICAgICAgICApCi0gICAgfQorICAgIGVuc3VyZSEoCisgICAgICAgIHN1cHBvcnRlZC5sZW4oKSA9PSAxLAorICAgICAgICAiQVBLIFNpZ25hdHVyZSBTY2hlbWUgVjMgb25seSBzdXBwb3J0cyBvbmUgc2lnbmVyOiB7fSBzaWduZXJzIGZvdW5kLiIsCisgICAgICAgIHN1cHBvcnRlZC5sZW4oKQorICAgICk7CiAKICAgICAvLyBDYWxsIHRoZSBzdXBwbGllZCBmdW5jdGlvbgogICAgIGYoKHN1cHBvcnRlZFswXSwgc2VjdGlvbnMpKQogfQogCiAvLy8gR2V0cyB0aGUgcHVibGljIGtleSAoaW4gREVSIGZvcm1hdCkgdGhhdCB3YXMgdXNlZCB0byBzaWduIHRoZSBnaXZlbiBBUEsvQVBFWCBmaWxlCi1wdWIgZm4gZ2V0X3B1YmxpY19rZXlfZGVyPFA6IEFzUmVmPFBhdGg+PihwYXRoOiBQKSAtPiBSZXN1bHQ8Qm94PFt1OF0+PiB7Ci0gICAgbGV0IGYgPSBGaWxlOjpvcGVuKHBhdGguYXNfcmVmKCkpPzsKLSAgICBsZXQgbXV0IHNlY3Rpb25zID0gQXBrU2VjdGlvbnM6Om5ldyhmKT87CitwdWIgZm4gZ2V0X3B1YmxpY19rZXlfZGVyPFA6IEFzUmVmPFBhdGg+PihhcGtfcGF0aDogUCkgLT4gUmVzdWx0PEJveDxbdThdPj4geworICAgIGxldCBhcGsgPSBGaWxlOjpvcGVuKGFwa19wYXRoLmFzX3JlZigpKT87CisgICAgbGV0IG11dCBzZWN0aW9ucyA9IEFwa1NlY3Rpb25zOjpuZXcoYXBrKT87CiAgICAgZmluZF9zaWduZXJfYW5kX3RoZW4oJm11dCBzZWN0aW9ucywgfChzaWduZXIsIF8pfCB7Ci0gICAgICAgIE9rKHNpZ25lci5wdWJsaWNfa2V5LnRvX3ZlYygpLmludG9fYm94ZWRfc2xpY2UoKSkKKyAgICAgICAgT2soc2lnbmVyLnB1YmxpY19rZXkucHVibGljX2tleV90b19kZXIoKT8uaW50b19ib3hlZF9zbGljZSgpKQogICAgIH0pCiB9CiAKIC8vLyBHZXRzIHRoZSB2NCBbYXBrX2RpZ2VzdF0uCiAvLy8KIC8vLyBbYXBrX2RpZ2VzdF06IGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvYXBrc2lnbmluZy92NCNhcGstZGlnZXN0Ci1wdWIgZm4gcGlja192NF9hcGtfZGlnZXN0PFI6IFJlYWQgKyBTZWVrPihhcGs6IFIpIC0+IFJlc3VsdDwodTMyLCBCb3g8W3U4XT4pPiB7CitwdWIgZm4gcGlja192NF9hcGtfZGlnZXN0PFI6IFJlYWQgKyBTZWVrPihhcGs6IFIpIC0+IFJlc3VsdDwoU2lnbmF0dXJlQWxnb3JpdGhtSUQsIEJveDxbdThdPik+IHsKICAgICBsZXQgbXV0IHNlY3Rpb25zID0gQXBrU2VjdGlvbnM6Om5ldyhhcGspPzsKICAgICBsZXQgbXV0IGJsb2NrID0gc2VjdGlvbnMuZmluZF9zaWduYXR1cmUoQVBLX1NJR05BVFVSRV9TQ0hFTUVfVjNfQkxPQ0tfSUQpPzsKICAgICBsZXQgc2lnbmVycyA9IGJsb2NrLnJlYWQ6OjxTaWduZXJzPigpPzsKQEAgLTE0NiwyMCArMTQxLDM2IEBACiAgICAgICAgIE9rKHNlbGYKICAgICAgICAgICAgIC5zaWduYXR1cmVzCiAgICAgICAgICAgICAuaXRlcigpCi0gICAgICAgICAgICAuZmlsdGVyKHxzaWd8IFNpZ25hdHVyZUFsZ29yaXRobUlEOjpmcm9tX3UzMihzaWcuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkuaXNfc29tZSgpKQotICAgICAgICAgICAgLm1heF9ieV9rZXkofHNpZ3wgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OmZyb21fdTMyKHNpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKS51bndyYXAoKSkKLSAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IGFueWhvdyEoIk5vIHN1cHBvcnRlZCBzaWduYXR1cmVzIGZvdW5kIikpPykKKyAgICAgICAgICAgIC5maWx0ZXIofHNpZ3wgc2lnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQuaXNfc29tZSgpKQorICAgICAgICAgICAgLm1heF9ieV9rZXkofHNpZ3wgc2lnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQudW53cmFwKCkuY29udGVudF9kaWdlc3RfYWxnb3JpdGhtKCkpCisgICAgICAgICAgICAuY29udGV4dCgiTm8gc3VwcG9ydGVkIHNpZ25hdHVyZXMgZm91bmQiKT8pCiAgICAgfQogCi0gICAgZm4gcGlja192NF9hcGtfZGlnZXN0KCZzZWxmKSAtPiBSZXN1bHQ8KHUzMiwgQm94PFt1OF0+KT4geworICAgIGZuIHBpY2tfdjRfYXBrX2RpZ2VzdCgmc2VsZikgLT4gUmVzdWx0PChTaWduYXR1cmVBbGdvcml0aG1JRCwgQm94PFt1OF0+KT4gewogICAgICAgICBsZXQgc3Ryb25nZXN0ID0gc2VsZi5zdHJvbmdlc3Rfc2lnbmF0dXJlKCk/OwogICAgICAgICBsZXQgc2lnbmVkX2RhdGE6IFNpZ25lZERhdGEgPSBzZWxmLnNpZ25lZF9kYXRhLnNsaWNlKC4uKS5yZWFkKCk/OwogICAgICAgICBsZXQgZGlnZXN0ID0gc2lnbmVkX2RhdGEKICAgICAgICAgICAgIC5kaWdlc3RzCiAgICAgICAgICAgICAuaXRlcigpCiAgICAgICAgICAgICAuZmluZCh8JmRpZ3wgZGlnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQgPT0gc3Ryb25nZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQpCi0gICAgICAgICAgICAub2tfb3JfZWxzZSh8fCBhbnlob3chKCJEaWdlc3Qgbm90IGZvdW5kIikpPzsKLSAgICAgICAgT2soKGRpZ2VzdC5zaWduYXR1cmVfYWxnb3JpdGhtX2lkLCBkaWdlc3QuZGlnZXN0LmFzX3JlZigpLnRvX3ZlYygpLmludG9fYm94ZWRfc2xpY2UoKSkpCisgICAgICAgICAgICAuY29udGV4dCgiRGlnZXN0IG5vdCBmb3VuZCIpPzsKKyAgICAgICAgT2soKAorICAgICAgICAgICAgZGlnZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQuY29udGV4dCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik/LAorICAgICAgICAgICAgZGlnZXN0LmRpZ2VzdC5hc19yZWYoKS50b192ZWMoKS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICkpCisgICAgfQorCisgICAgLy8vIFZlcmlmaWVzIHRoZSBzdHJvbmdlc3Qgc2lnbmF0dXJlIGZyb20gc2lnbmF0dXJlcyBhZ2FpbnN0IHNpZ25lZCBkYXRhIHVzaW5nIHB1YmxpYyBrZXkuCisgICAgLy8vIFJldHVybnMgdGhlIHZlcmlmaWVkIHNpZ25lZCBkYXRhLgorICAgIGZuIHZlcmlmeV9zaWduYXR1cmUoJnNlbGYsIHN0cm9uZ2VzdDogJlNpZ25hdHVyZSkgLT4gUmVzdWx0PFNpZ25lZERhdGE+IHsKKyAgICAgICAgbGV0IG11dCB2ZXJpZmllciA9IHN0cm9uZ2VzdAorICAgICAgICAgICAgLnNpZ25hdHVyZV9hbGdvcml0aG1faWQKKyAgICAgICAgICAgIC5jb250ZXh0KCJVbnN1cHBvcnRlZCBhbGdvcml0aG0iKT8KKyAgICAgICAgICAgIC5uZXdfdmVyaWZpZXIoJnNlbGYucHVibGljX2tleSk/OworICAgICAgICB2ZXJpZmllci51cGRhdGUoJnNlbGYuc2lnbmVkX2RhdGEpPzsKKyAgICAgICAgZW5zdXJlISh2ZXJpZmllci52ZXJpZnkoJnN0cm9uZ2VzdC5zaWduYXR1cmUpPywgIlNpZ25hdHVyZSBpcyBpbnZhbGlkLiIpOworICAgICAgICAvLyBJdCBpcyBub3cgc2FmZSB0byBwYXJzZSBzaWduZWQgZGF0YS4KKyAgICAgICAgc2VsZi5zaWduZWRfZGF0YS5zbGljZSguLikucmVhZCgpCiAgICAgfQogCiAgICAgLy8vIFRoZSBzdGVwcyBpbiB0aGlzIG1ldGhvZCBpbXBsZW1lbnRzIEFQSyBTaWduYXR1cmUgU2NoZW1lIHYzIHZlcmlmaWNhdGlvbiBzdGVwIDMuCkBAIC0xNjgsMTAyICsxNzksNjEgQEAKICAgICAgICAgbGV0IHN0cm9uZ2VzdCA9IHNlbGYuc3Ryb25nZXN0X3NpZ25hdHVyZSgpPzsKIAogICAgICAgICAvLyAyLiBWZXJpZnkgdGhlIGNvcnJlc3BvbmRpbmcgc2lnbmF0dXJlIGZyb20gc2lnbmF0dXJlcyBhZ2FpbnN0IHNpZ25lZCBkYXRhIHVzaW5nIHB1YmxpYyBrZXkuCi0gICAgICAgIC8vICAgIChJdCBpcyBub3cgc2FmZSB0byBwYXJzZSBzaWduZWQgZGF0YS4pCi0gICAgICAgIGxldCBwdWJsaWNfa2V5ID0gUEtleTo6cHVibGljX2tleV9mcm9tX2RlcihzZWxmLnB1YmxpY19rZXkuYXNfcmVmKCkpPzsKLSAgICAgICAgdmVyaWZ5X3NpZ25lZF9kYXRhKCZzZWxmLnNpZ25lZF9kYXRhLCBzdHJvbmdlc3QsICZwdWJsaWNfa2V5KT87Ci0KLSAgICAgICAgLy8gSXQgaXMgbm93IHNhZmUgdG8gcGFyc2Ugc2lnbmVkIGRhdGEuCi0gICAgICAgIGxldCBzaWduZWRfZGF0YTogU2lnbmVkRGF0YSA9IHNlbGYuc2lnbmVkX2RhdGEuc2xpY2UoLi4pLnJlYWQoKT87CisgICAgICAgIGxldCB2ZXJpZmllZF9zaWduZWRfZGF0YSA9IHNlbGYudmVyaWZ5X3NpZ25hdHVyZShzdHJvbmdlc3QpPzsKIAogICAgICAgICAvLyAzLiBWZXJpZnkgdGhlIG1pbiBhbmQgbWF4IFNESyB2ZXJzaW9ucyBpbiB0aGUgc2lnbmVkIGRhdGEgbWF0Y2ggdGhvc2Ugc3BlY2lmaWVkIGZvciB0aGUKICAgICAgICAgLy8gICAgc2lnbmVyLgotICAgICAgICBpZiBzZWxmLnNka19yYW5nZSgpICE9IHNpZ25lZF9kYXRhLnNka19yYW5nZSgpIHsKLSAgICAgICAgICAgIGJhaWwhKCJTREsgdmVyc2lvbnMgbWlzbWF0Y2ggYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGluIHYzIHNpZ25lciBibG9jay4iKTsKLSAgICAgICAgfQorICAgICAgICBlbnN1cmUhKAorICAgICAgICAgICAgc2VsZi5zZGtfcmFuZ2UoKSA9PSB2ZXJpZmllZF9zaWduZWRfZGF0YS5zZGtfcmFuZ2UoKSwKKyAgICAgICAgICAgICJTREsgdmVyc2lvbnMgbWlzbWF0Y2ggYmV0d2VlbiBzaWduZWQgYW5kIHVuc2lnbmVkIGluIHYzIHNpZ25lciBibG9jay4iCisgICAgICAgICk7CiAKICAgICAgICAgLy8gNC4gVmVyaWZ5IHRoYXQgdGhlIG9yZGVyZWQgbGlzdCBvZiBzaWduYXR1cmUgYWxnb3JpdGhtIElEcyBpbiBkaWdlc3RzIGFuZCBzaWduYXR1cmVzIGlzCiAgICAgICAgIC8vICAgIGlkZW50aWNhbC4gKFRoaXMgaXMgdG8gcHJldmVudCBzaWduYXR1cmUgc3RyaXBwaW5nL2FkZGl0aW9uLikKLSAgICAgICAgaWYgIXNlbGYKLSAgICAgICAgICAgIC5zaWduYXR1cmVzCi0gICAgICAgICAgICAuaXRlcigpCi0gICAgICAgICAgICAubWFwKHxzaWd8IHNpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKQotICAgICAgICAgICAgLmVxKHNpZ25lZF9kYXRhLmRpZ2VzdHMuaXRlcigpLm1hcCh8ZGlnfCBkaWcuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhaWwhKCJTaWduYXR1cmUgYWxnb3JpdGhtcyBkb24ndCBtYXRjaCBiZXR3ZWVuIGRpZ2VzdHMgYW5kIHNpZ25hdHVyZXMgcmVjb3JkcyIpOwotICAgICAgICB9CisgICAgICAgIGVuc3VyZSEoCisgICAgICAgICAgICBzZWxmLnNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAgICAgLm1hcCh8c2lnfCBzaWcuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCkKKyAgICAgICAgICAgICAgICAuZXEodmVyaWZpZWRfc2lnbmVkX2RhdGEuZGlnZXN0cy5pdGVyKCkubWFwKHxkaWd8IGRpZy5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKSksCisgICAgICAgICAgICAiU2lnbmF0dXJlIGFsZ29yaXRobXMgZG9uJ3QgbWF0Y2ggYmV0d2VlbiBkaWdlc3RzIGFuZCBzaWduYXR1cmVzIHJlY29yZHMiCisgICAgICAgICk7CiAKICAgICAgICAgLy8gNS4gQ29tcHV0ZSB0aGUgZGlnZXN0IG9mIEFQSyBjb250ZW50cyB1c2luZyB0aGUgc2FtZSBkaWdlc3QgYWxnb3JpdGhtIGFzIHRoZSBkaWdlc3QKICAgICAgICAgLy8gICAgYWxnb3JpdGhtIHVzZWQgYnkgdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0uCi0gICAgICAgIGxldCBkaWdlc3QgPSBzaWduZWRfZGF0YQorICAgICAgICBsZXQgZGlnZXN0ID0gdmVyaWZpZWRfc2lnbmVkX2RhdGEKICAgICAgICAgICAgIC5kaWdlc3RzCiAgICAgICAgICAgICAuaXRlcigpCiAgICAgICAgICAgICAuZmluZCh8JmRpZ3wgZGlnLnNpZ25hdHVyZV9hbGdvcml0aG1faWQgPT0gc3Ryb25nZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQpCiAgICAgICAgICAgICAudW53cmFwKCk7IC8vIG9rIHRvIHVud3JhcCBzaW5jZSB3ZSBjaGVjayBpZiB0d28gbGlzdHMgYXJlIHRoZSBzYW1lIGFib3ZlCi0gICAgICAgIGxldCBjb21wdXRlZCA9IHNlY3Rpb25zLmNvbXB1dGVfZGlnZXN0KGRpZ2VzdC5zaWduYXR1cmVfYWxnb3JpdGhtX2lkKT87CisgICAgICAgIGxldCBjb21wdXRlZCA9IHNlY3Rpb25zCisgICAgICAgICAgICAuY29tcHV0ZV9kaWdlc3QoZGlnZXN0LnNpZ25hdHVyZV9hbGdvcml0aG1faWQuY29udGV4dCgiVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIik/KT87CiAKICAgICAgICAgLy8gNi4gVmVyaWZ5IHRoYXQgdGhlIGNvbXB1dGVkIGRpZ2VzdCBpcyBpZGVudGljYWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGlnZXN0IGZyb20gZGlnZXN0cy4KLSAgICAgICAgaWYgY29tcHV0ZWQgIT0gZGlnZXN0LmRpZ2VzdC5hc19yZWYoKSB7Ci0gICAgICAgICAgICBiYWlsISgKLSAgICAgICAgICAgICAgICAiRGlnZXN0IG1pc21hdGNoOiBjb21wdXRlZD17Oj99IHZzIGV4cGVjdGVkPXs6P30iLAotICAgICAgICAgICAgICAgIHRvX2hleF9zdHJpbmcoJmNvbXB1dGVkKSwKLSAgICAgICAgICAgICAgICB0b19oZXhfc3RyaW5nKCZkaWdlc3QuZGlnZXN0KSwKLSAgICAgICAgICAgICk7Ci0gICAgICAgIH0KKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGNvbXB1dGVkID09IGRpZ2VzdC5kaWdlc3QuYXNfcmVmKCksCisgICAgICAgICAgICAiRGlnZXN0IG1pc21hdGNoOiBjb21wdXRlZD17Oj99IHZzIGV4cGVjdGVkPXs6P30iLAorICAgICAgICAgICAgdG9faGV4X3N0cmluZygmY29tcHV0ZWQpLAorICAgICAgICAgICAgdG9faGV4X3N0cmluZygmZGlnZXN0LmRpZ2VzdCksCisgICAgICAgICk7CiAKICAgICAgICAgLy8gNy4gVmVyaWZ5IHRoYXQgcHVibGljIGtleSBvZiB0aGUgZmlyc3QgY2VydGlmaWNhdGUgb2YgY2VydGlmaWNhdGVzIGlzIGlkZW50aWNhbAogICAgICAgICAvLyAgICB0byBwdWJsaWMga2V5LgotICAgICAgICBsZXQgY2VydCA9IHNpZ25lZF9kYXRhLmNlcnRpZmljYXRlcy5maXJzdCgpLmNvbnRleHQoIk5vIGNlcnRpZmljYXRlcyBsaXN0ZWQiKT87CisgICAgICAgIGxldCBjZXJ0ID0gdmVyaWZpZWRfc2lnbmVkX2RhdGEuY2VydGlmaWNhdGVzLmZpcnN0KCkuY29udGV4dCgiTm8gY2VydGlmaWNhdGVzIGxpc3RlZCIpPzsKICAgICAgICAgbGV0IGNlcnQgPSBYNTA5Ojpmcm9tX2RlcihjZXJ0LmFzX3JlZigpKT87Ci0gICAgICAgIGlmICFjZXJ0LnB1YmxpY19rZXkoKT8ucHVibGljX2VxKCZwdWJsaWNfa2V5KSB7Ci0gICAgICAgICAgICBiYWlsISgiUHVibGljIGtleSBtaXNtYXRjaCBiZXR3ZWVuIGNlcnRpZmljYXRlIGFuZCBzaWduYXR1cmUgcmVjb3JkIik7Ci0gICAgICAgIH0KKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGNlcnQucHVibGljX2tleSgpPy5wdWJsaWNfZXEoJnNlbGYucHVibGljX2tleSksCisgICAgICAgICAgICAiUHVibGljIGtleSBtaXNtYXRjaCBiZXR3ZWVuIGNlcnRpZmljYXRlIGFuZCBzaWduYXR1cmUgcmVjb3JkIgorICAgICAgICApOwogCi0gICAgICAgIC8vIFRPRE8oam9veXVuZykgOC4gSWYgdGhlIHByb29mLW9mLXJvdGF0aW9uIGF0dHJpYnV0ZSBleGlzdHMgZm9yIHRoZSBzaWduZXIgdmVyaWZ5IHRoYXQgdGhlIHN0cnVjdCBpcyB2YWxpZCBhbmQgdGhpcyBzaWduZXIgaXMgdGhlIGxhc3QgY2VydGlmaWNhdGUgaW4gdGhlIGxpc3QuCi0gICAgICAgIE9rKHNlbGYucHVibGljX2tleS50b192ZWMoKS5pbnRvX2JveGVkX3NsaWNlKCkpCisgICAgICAgIC8vIFRPRE8oYi8yNDU5MTQxMDQpCisgICAgICAgIC8vIDguIElmIHRoZSBwcm9vZi1vZi1yb3RhdGlvbiBhdHRyaWJ1dGUgZXhpc3RzIGZvciB0aGUgc2lnbmVyIHZlcmlmeSB0aGF0IHRoZQorICAgICAgICAvLyBzdHJ1Y3QgaXMgdmFsaWQgYW5kIHRoaXMgc2lnbmVyIGlzIHRoZSBsYXN0IGNlcnRpZmljYXRlIGluIHRoZSBsaXN0LgorICAgICAgICBPayhzZWxmLnB1YmxpY19rZXkucHVibGljX2tleV90b19kZXIoKT8uaW50b19ib3hlZF9zbGljZSgpKQogICAgIH0KIH0KIAotZm4gdmVyaWZ5X3NpZ25lZF9kYXRhKGRhdGE6ICZCeXRlcywgc2lnbmF0dXJlOiAmU2lnbmF0dXJlLCBrZXk6ICZQS2V5PHBrZXk6OlB1YmxpYz4pIC0+IFJlc3VsdDwoKT4gewotICAgIGxldCAocGtleV9pZCwgcGFkZGluZywgZGlnZXN0KSA9IG1hdGNoIHNpZ25hdHVyZS5zaWduYXR1cmVfYWxnb3JpdGhtX2lkIHsKLSAgICAgICAgU0lHTkFUVVJFX1JTQV9QU1NfV0lUSF9TSEEyNTYgPT4gewotICAgICAgICAgICAgKHBrZXk6OklkOjpSU0EsIFBhZGRpbmc6OlBLQ1MxX1BTUywgTWVzc2FnZURpZ2VzdDo6c2hhMjU2KCkpCi0gICAgICAgIH0KLSAgICAgICAgU0lHTkFUVVJFX1JTQV9QU1NfV0lUSF9TSEE1MTIgPT4gewotICAgICAgICAgICAgKHBrZXk6OklkOjpSU0EsIFBhZGRpbmc6OlBLQ1MxX1BTUywgTWVzc2FnZURpZ2VzdDo6c2hhNTEyKCkpCi0gICAgICAgIH0KLSAgICAgICAgU0lHTkFUVVJFX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBMjU2IHwgU0lHTkFUVVJFX1ZFUklUWV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTI1NiA9PiB7Ci0gICAgICAgICAgICAocGtleTo6SWQ6OlJTQSwgUGFkZGluZzo6UEtDUzEsIE1lc3NhZ2VEaWdlc3Q6OnNoYTI1NigpKQotICAgICAgICB9Ci0gICAgICAgIFNJR05BVFVSRV9SU0FfUEtDUzFfVjFfNV9XSVRIX1NIQTUxMiA9PiB7Ci0gICAgICAgICAgICAocGtleTo6SWQ6OlJTQSwgUGFkZGluZzo6UEtDUzEsIE1lc3NhZ2VEaWdlc3Q6OnNoYTUxMigpKQotICAgICAgICB9Ci0gICAgICAgIFNJR05BVFVSRV9FQ0RTQV9XSVRIX1NIQTI1NiB8IFNJR05BVFVSRV9WRVJJVFlfRUNEU0FfV0lUSF9TSEEyNTYgPT4gewotICAgICAgICAgICAgKHBrZXk6OklkOjpFQywgUGFkZGluZzo6Tk9ORSwgTWVzc2FnZURpZ2VzdDo6c2hhMjU2KCkpCi0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhiLzE5MDM0Mzg0Mikgbm90IGltcGxlbWVudGVkIHNpZ25hdHVyZSBhbGdvcml0aG0KLSAgICAgICAgU0lHTkFUVVJFX0VDRFNBX1dJVEhfU0hBNTEyCi0gICAgICAgIHwgU0lHTkFUVVJFX0RTQV9XSVRIX1NIQTI1NgotICAgICAgICB8IFNJR05BVFVSRV9WRVJJVFlfRFNBX1dJVEhfU0hBMjU2ID0+IHsKLSAgICAgICAgICAgIGJhaWwhKAotICAgICAgICAgICAgICAgICJUT0RPKGIvMTkwMzQzODQyKSBub3QgaW1wbGVtZW50ZWQgc2lnbmF0dXJlIGFsZ29yaXRobTogezojeH0iLAotICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5zaWduYXR1cmVfYWxnb3JpdGhtX2lkCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIF8gPT4gYmFpbCEoIlVuc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG06IHs6I3h9Iiwgc2lnbmF0dXJlLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpLAotICAgIH07Ci0gICAgZW5zdXJlIShrZXkuaWQoKSA9PSBwa2V5X2lkLCAiUHVibGljIGtleSBoYXMgdGhlIHdyb25nIElEIik7Ci0gICAgbGV0IG11dCB2ZXJpZmllciA9IFZlcmlmaWVyOjpuZXcoZGlnZXN0LCBrZXkpPzsKLSAgICBpZiBwa2V5X2lkID09IHBrZXk6OklkOjpSU0EgewotICAgICAgICB2ZXJpZmllci5zZXRfcnNhX3BhZGRpbmcocGFkZGluZyk/OwotICAgIH0KLSAgICB2ZXJpZmllci51cGRhdGUoZGF0YSk/OwotICAgIGxldCB2ZXJpZmllZCA9IHZlcmlmaWVyLnZlcmlmeSgmc2lnbmF0dXJlLnNpZ25hdHVyZSk/OwotICAgIGVuc3VyZSEodmVyaWZpZWQsICJTaWduYXR1cmUgaXMgaW52YWxpZCAiKTsKLSAgICBPaygoKSkKLX0KLQogLy8gUmVhZEZyb21CeXRlcyBpbXBsZW1lbnRhdGlvbnMKLS8vIFRPRE8oam9veXVuZyk6IGFkZCBkZXJpdmUgbWFjcm86ICNbZGVyaXZlKFJlYWRGcm9tQnl0ZXMpXQorLy8gVE9ETyhiLzE5MDM0Mzg0Mik6IGFkZCBkZXJpdmUgbWFjcm86ICNbZGVyaXZlKFJlYWRGcm9tQnl0ZXMpXQogCiBpbXBsIFJlYWRGcm9tQnl0ZXMgZm9yIFNpZ25lciB7CiAgICAgZm4gcmVhZF9mcm9tX2J5dGVzKGJ1ZjogJm11dCBCeXRlcykgLT4gUmVzdWx0PFNlbGY+IHsKQEAgLTMwMSw0MCArMjcxLDE0IEBACiAgICAgfQogfQogCitpbXBsIFJlYWRGcm9tQnl0ZXMgZm9yIFBLZXk8cGtleTo6UHVibGljPiB7CisgICAgZm4gcmVhZF9mcm9tX2J5dGVzKGJ1ZjogJm11dCBCeXRlcykgLT4gUmVzdWx0PFNlbGY+IHsKKyAgICAgICAgbGV0IHJhd19wdWJsaWNfa2V5ID0gYnVmLnJlYWQ6OjxMZW5ndGhQcmVmaXhlZDxCeXRlcz4+KCk/OworICAgICAgICBPayhQS2V5OjpwdWJsaWNfa2V5X2Zyb21fZGVyKHJhd19wdWJsaWNfa2V5LmFzX3JlZigpKT8pCisgICAgfQorfQorCiAjW2lubGluZV0KIHB1YihjcmF0ZSkgZm4gdG9faGV4X3N0cmluZyhidWY6ICZbdThdKSAtPiBTdHJpbmcgewogICAgIGJ1Zi5pdGVyKCkubWFwKHxifCBmb3JtYXQhKCJ7OjAyWH0iLCBiKSkuY29sbGVjdCgpCiB9Ci0KLSNbY2ZnKHRlc3QpXQotbW9kIHRlc3RzIHsKLSAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIHN0ZDo6ZnM6OkZpbGU7Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9waWNrX3Y0X2Fwa19kaWdlc3Rfb25seV93aXRoX3YzX2RzYV9zaGEyNTYoKSB7Ci0gICAgICAgIGNoZWNrX3Y0X2Fwa19kaWdlc3QoCi0gICAgICAgICAgICAidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni0xMDI0LmFwayIsCi0gICAgICAgICAgICBTSUdOQVRVUkVfRFNBX1dJVEhfU0hBMjU2LAotICAgICAgICAgICAgIjBERjI0MjZFQTMzQUVEQUY0OTVEODhFNUJFMEM2QTE2NjNGRjBBODFDNUVEMTJENUIyOTI5QUU0QjQzMDBGMkYiLAotICAgICAgICApOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X3BpY2tfdjRfYXBrX2RpZ2VzdF9vbmx5X3dpdGhfdjNfcGtjczFfc2hhNTEyKCkgewotICAgICAgICBjaGVja192NF9hcGtfZGlnZXN0KAotICAgICAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsiLAotICAgICAgICAgICAgU0lHTkFUVVJFX1JTQV9QS0NTMV9WMV81X1dJVEhfU0hBNTEyLAotICAgICAgICAgICAgIjlCOUFFMDJEQTYwQjE4OTk5QkY1NDE3OTBGMDBEMzgwMDA2RkRGMDY1NUMzQzQ4MkFBMEJCMEFGMTdDRjdBNDJcCi0gICAgICAgICAgICAgRUNGNTZCOTczNTE4NTQ2QzkwODBCMkZFRjgzMDI3RTg5NUVEMjg4MkJGQzg4RUExOTc5MEJCQUIyOUFGNTNCMyIsCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm4gY2hlY2tfdjRfYXBrX2RpZ2VzdChhcGtfZmlsZW5hbWU6ICZzdHIsIGV4cGVjdGVkX2FsZ29yaXRobTogdTMyLCBleHBlY3RlZF9kaWdlc3Q6ICZzdHIpIHsKLSAgICAgICAgbGV0IGFwa19maWxlID0gRmlsZTo6b3BlbihhcGtfZmlsZW5hbWUpLnVud3JhcCgpOwotICAgICAgICBsZXQgKHNpZ25hdHVyZV9hbGdvcml0aG1faWQsIGFwa19kaWdlc3QpID0gcGlja192NF9hcGtfZGlnZXN0KGFwa19maWxlKS51bndyYXAoKTsKLQotICAgICAgICBhc3NlcnRfZXEhKGV4cGVjdGVkX2FsZ29yaXRobSwgc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk7Ci0gICAgICAgIGFzc2VydF9lcSEoZXhwZWN0ZWRfZGlnZXN0LCB0b19oZXhfc3RyaW5nKGFwa19kaWdlc3QuYXNfcmVmKCkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJzL2Fwa3ZlcmlmeS9zcmMvemlwdXRpbC5ycyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy96aXB1dGlsLnJzCmluZGV4IDhiYWRmZjIuLmViMjgyNmEgMTAwNjQ0Ci0tLSBhL2xpYnMvYXBrdmVyaWZ5L3NyYy96aXB1dGlsLnJzCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3NyYy96aXB1dGlsLnJzCkBAIC0xNiw3ICsxNiw3IEBACiAKIC8vISBVdGlsaXRpZXMgZm9yIHppcCBoYW5kbGluZyBvZiBBUEsgZmlsZXMuCiAKLXVzZSBhbnlob3c6OntiYWlsLCBSZXN1bHR9OwordXNlIGFueWhvdzo6e2Vuc3VyZSwgUmVzdWx0fTsKIHVzZSBieXRlczo6e0J1ZiwgQnVmTXV0fTsKIHVzZSBzdGQ6OmlvOjp7UmVhZCwgU2VlaywgU2Vla0Zyb219OwogdXNlIHppcDo6WmlwQXJjaGl2ZTsKQEAgLTQxLDI1ICs0MSwyNiBAQAogICAgIC8vIG9wZW4gYSB6aXAgdG8gcGFyc2UgRU9DRAogICAgIGxldCBhcmNoaXZlID0gWmlwQXJjaGl2ZTo6bmV3KHJlYWRlcik/OwogICAgIGxldCBlb2NkX3NpemUgPSBhcmNoaXZlLmNvbW1lbnQoKS5sZW4oKSArIEVPQ0RfU0laRV9XSVRIT1VUX0NPTU1FTlQ7Ci0gICAgaWYgYXJjaGl2ZS5vZmZzZXQoKSAhPSAwIHsKLSAgICAgICAgYmFpbCEoIkludmFsaWQgWklQOiBvZmZzZXQgc2hvdWxkIGJlIDAsIGJ1dCB7fS4iLCBhcmNoaXZlLm9mZnNldCgpKTsKLSAgICB9CisgICAgZW5zdXJlIShhcmNoaXZlLm9mZnNldCgpID09IDAsICJJbnZhbGlkIFpJUDogb2Zmc2V0IHNob3VsZCBiZSAwLCBidXQge30uIiwgYXJjaGl2ZS5vZmZzZXQoKSk7CiAgICAgLy8gcmV0cmlldmUgcmVhZGVyIGJhY2sKICAgICByZWFkZXIgPSBhcmNoaXZlLmludG9faW5uZXIoKTsKICAgICAvLyB0aGUgY3VycmVudCBwb3NpdGlvbiBzaG91bGQgcG9pbnQgRU9DRCBvZmZzZXQKICAgICBsZXQgZW9jZF9vZmZzZXQgPSByZWFkZXIuc2VlayhTZWVrRnJvbTo6Q3VycmVudCgwKSk/IGFzIHUzMjsKICAgICBsZXQgbXV0IGVvY2QgPSB2ZWMhWzB1ODsgZW9jZF9zaXplIGFzIHVzaXplXTsKICAgICByZWFkZXIucmVhZF9leGFjdCgmbXV0IGVvY2QpPzsKLSAgICBpZiAoJmVvY2RbMC4uXSkuZ2V0X3UzMl9sZSgpICE9IEVPQ0RfU0lHTkFUVVJFIHsKLSAgICAgICAgYmFpbCEoIkludmFsaWQgWklQOiBaaXBBcmNoaXZlOjpuZXcoKSBzaG91bGQgcG9pbnQgRU9DRCBhZnRlciByZWFkaW5nLiIpOwotICAgIH0KKyAgICBlbnN1cmUhKAorICAgICAgICAoJmVvY2RbMC4uXSkuZ2V0X3UzMl9sZSgpID09IEVPQ0RfU0lHTkFUVVJFLAorICAgICAgICAiSW52YWxpZCBaSVA6IFppcEFyY2hpdmU6Om5ldygpIHNob3VsZCBwb2ludCBFT0NEIGFmdGVyIHJlYWRpbmcuIgorICAgICk7CiAgICAgbGV0IChjZW50cmFsX2RpcmVjdG9yeV9zaXplLCBjZW50cmFsX2RpcmVjdG9yeV9vZmZzZXQpID0gZ2V0X2NlbnRyYWxfZGlyZWN0b3J5KCZlb2NkKT87Ci0gICAgaWYgY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0ID09IFpJUDY0X01BUksgfHwgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSA9PSBaSVA2NF9NQVJLIHsKLSAgICAgICAgYmFpbCEoIlVuc3VwcG9ydGVkIFpJUDogWklQNjQgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICB9Ci0gICAgaWYgY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0ICsgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSAhPSBlb2NkX29mZnNldCB7Ci0gICAgICAgIGJhaWwhKCJJbnZhbGlkIFpJUDogRU9DRCBzaG91bGQgZm9sbG93IENEIHdpdGggbm8gZXh0cmEgZGF0YSBvciBvdmVybGFwLiIpOwotICAgIH0KKyAgICBlbnN1cmUhKAorICAgICAgICBjZW50cmFsX2RpcmVjdG9yeV9vZmZzZXQgIT0gWklQNjRfTUFSSyAmJiBjZW50cmFsX2RpcmVjdG9yeV9zaXplICE9IFpJUDY0X01BUkssCisgICAgICAgICJVbnN1cHBvcnRlZCBaSVA6IFpJUDY0IGlzIG5vdCBzdXBwb3J0ZWQuIgorICAgICk7CisgICAgZW5zdXJlISgKKyAgICAgICAgY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0ICsgY2VudHJhbF9kaXJlY3Rvcnlfc2l6ZSA9PSBlb2NkX29mZnNldCwKKyAgICAgICAgIkludmFsaWQgWklQOiBFT0NEIHNob3VsZCBmb2xsb3cgQ0Qgd2l0aCBubyBleHRyYSBkYXRhIG9yIG92ZXJsYXAuIgorICAgICk7CiAKICAgICBPaygoCiAgICAgICAgIHJlYWRlciwKQEAgLTczLDkgKzc0LDcgQEAKIH0KIAogZm4gZ2V0X2NlbnRyYWxfZGlyZWN0b3J5KGJ1ZjogJlt1OF0pIC0+IFJlc3VsdDwodTMyLCB1MzIpPiB7Ci0gICAgaWYgYnVmLmxlbigpIDwgRU9DRF9TSVpFX1dJVEhPVVRfQ09NTUVOVCB7Ci0gICAgICAgIGJhaWwhKCJJbnZhbGlkIEVPQ0Qgc2l6ZToge30iLCBidWYubGVuKCkpOwotICAgIH0KKyAgICBlbnN1cmUhKGJ1Zi5sZW4oKSA+PSBFT0NEX1NJWkVfV0lUSE9VVF9DT01NRU5ULCAiSW52YWxpZCBFT0NEIHNpemU6IHt9IiwgYnVmLmxlbigpKTsKICAgICBsZXQgbXV0IGJ1ZiA9ICZidWZbRU9DRF9DRU5UUkFMX0RJUkVDVE9SWV9TSVpFX0ZJRUxEX09GRlNFVC4uXTsKICAgICBsZXQgc2l6ZSA9IGJ1Zi5nZXRfdTMyX2xlKCk7CiAgICAgbGV0IG9mZnNldCA9IGJ1Zi5nZXRfdTMyX2xlKCk7CkBAIC04NCw5ICs4Myw3IEBACiAKIC8vLyBVcGRhdGUgRU9DRCdzIGNlbnRyYWxfZGlyZWN0b3J5X29mZnNldCBmaWVsZC4KIHB1YiBmbiBzZXRfY2VudHJhbF9kaXJlY3Rvcnlfb2Zmc2V0KGJ1ZjogJm11dCBbdThdLCB2YWx1ZTogdTMyKSAtPiBSZXN1bHQ8KCk+IHsKLSAgICBpZiBidWYubGVuKCkgPCBFT0NEX1NJWkVfV0lUSE9VVF9DT01NRU5UIHsKLSAgICAgICAgYmFpbCEoIkludmFsaWQgRU9DRCBzaXplOiB7fSIsIGJ1Zi5sZW4oKSk7Ci0gICAgfQorICAgIGVuc3VyZSEoYnVmLmxlbigpID49IEVPQ0RfU0laRV9XSVRIT1VUX0NPTU1FTlQsICJJbnZhbGlkIEVPQ0Qgc2l6ZToge30iLCBidWYubGVuKCkpOwogICAgICgmbXV0IGJ1ZltFT0NEX0NFTlRSQUxfRElSRUNUT1JZX09GRlNFVF9GSUVMRF9PRkZTRVQuLl0pLnB1dF91MzJfbGUodmFsdWUpOwogICAgIE9rKCgpKQogfQpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvdGVzdHMvYXBrdmVyaWZ5X3Rlc3QucnMgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9hcGt2ZXJpZnlfdGVzdC5ycwppbmRleCBhNjc0YWQ3Li41YmQ5MDFkIDEwMDY0NAotLS0gYS9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9hcGt2ZXJpZnlfdGVzdC5ycworKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9hcGt2ZXJpZnlfdGVzdC5ycwpAQCAtMTQsOCArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXVzZSBhcGt2ZXJpZnk6Ont0ZXN0aW5nOjphc3NlcnRfY29udGFpbnMsIHZlcmlmeX07Ci11c2Ugc3RkOjptYXRjaGVzOwordXNlIGFwa3ZlcmlmeTo6eworICAgIGdldF9wdWJsaWNfa2V5X2RlciwgcGlja192NF9hcGtfZGlnZXN0LCB0ZXN0aW5nOjphc3NlcnRfY29udGFpbnMsIHZlcmlmeSwgU2lnbmF0dXJlQWxnb3JpdGhtSUQsCit9OwordXNlIHN0ZDo6e2ZzLCBtYXRjaGVzLCBwYXRoOjpQYXRofTsKIAogY29uc3QgS0VZX05BTUVTX0RTQTogJlsmc3RyXSA9ICZbIjEwMjQiLCAiMjA0OCIsICIzMDcyIl07CiBjb25zdCBLRVlfTkFNRVNfRUNEU0E6ICZbJnN0cl0gPSAmWyJwMjU2IiwgInAzODQiLCAicDUyMSJdOwpAQCAtMjUsNyArMjcsNyBAQAogZm4gdGVzdF92ZXJpZnlfdHJ1bmNhdGVkX2NkKCkgewogICAgIHVzZSB6aXA6OnJlc3VsdDo6WmlwRXJyb3I7CiAgICAgbGV0IHJlcyA9IHZlcmlmeSgidGVzdHMvZGF0YS92Mi1vbmx5LXRydW5jYXRlZC1jZC5hcGsiKTsKLSAgICAvLyBUT0RPKGpvb3l1bmcpOiBjb25zaWRlciBtYWtpbmcgYSBoZWxwZXIgZm9yIGVyciBhc3NlcnRpb24KKyAgICAvLyBUT0RPKGIvMTkwMzQzODQyKTogY29uc2lkZXIgbWFraW5nIGEgaGVscGVyIGZvciBlcnIgYXNzZXJ0aW9uCiAgICAgYXNzZXJ0IShtYXRjaGVzISgKICAgICAgICAgcmVzLnVud3JhcF9lcnIoKS5yb290X2NhdXNlKCkuZG93bmNhc3RfcmVmOjo8WmlwRXJyb3I+KCkudW53cmFwKCksCiAgICAgICAgIFppcEVycm9yOjpJbnZhbGlkQXJjaGl2ZShfKSwKQEAgLTMzLDYyICszNSw3MCBAQAogfQogCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92MygpIHsKLSAgICBhc3NlcnQhKHZlcmlmeSgidGVzdHMvZGF0YS90ZXN0LmFwZXgiKS5pc19vaygpKTsKK2ZuIGFwZXhfc2lnbmVkX3dpdGhfdjNfcnNhX3BrY3MxX3NoYTUxMl9pc192YWxpZCgpIHsKKyAgICB2YWxpZGF0ZV9hcGsoInRlc3RzL2RhdGEvdGVzdC5hcGV4IiwgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OlJzYVBrY3MxVjE1V2l0aFNoYTUxMik7CiB9CiAKLS8vIFRPRE8oYi8xOTAzNDM4NDIpCiAjW3Rlc3RdCiBmbiB0ZXN0X3ZlcmlmeV92M19kc2Ffc2hhMjU2KCkgewogICAgIGZvciBrZXlfbmFtZSBpbiBLRVlfTkFNRVNfRFNBLml0ZXIoKSB7CiAgICAgICAgIGxldCByZXMgPSB2ZXJpZnkoZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSkpOwogICAgICAgICBhc3NlcnQhKHJlcy5pc19lcnIoKSk7Ci0gICAgICAgIGFzc2VydF9jb250YWlucygKLSAgICAgICAgICAgICZyZXMudW53cmFwX2VycigpLnRvX3N0cmluZygpLAotICAgICAgICAgICAgIlRPRE8oYi8xOTAzNDM4NDIpIG5vdCBpbXBsZW1lbnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIiwKKyAgICAgICAgYXNzZXJ0X2NvbnRhaW5zKCZyZXMudW53cmFwX2VycigpLnRvX3N0cmluZygpLCAibm90IGltcGxlbWVudGVkIik7CisgICAgfQorfQorCisvLy8gVE9ETyhiLzE5NzA1Mjk4MSk6IERTQSBhbGdvcml0aG0gaXMgbm90IHlldCBzdXBwb3J0ZWQuCisjW3Rlc3RdCitmbiBhcGtzX3NpZ25lZF93aXRoX3YzX2RzYV9zaGEyNTZfaGF2ZV92YWxpZF9hcGtfZGlnZXN0KCkgeworICAgIGZvciBrZXlfbmFtZSBpbiBLRVlfTkFNRVNfRFNBLml0ZXIoKSB7CisgICAgICAgIHZhbGlkYXRlX2Fwa19kaWdlc3QoCisgICAgICAgICAgICBmb3JtYXQhKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1kc2Etc2hhMjU2LXt9LmFwayIsIGtleV9uYW1lKSwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpEc2FXaXRoU2hhMjU2LAogICAgICAgICApOwogICAgIH0KIH0KIAogI1t0ZXN0XQotZm4gdGVzdF92ZXJpZnlfdjNfZWNkc2Ffc2hhMjU2KCkgeworZm4gYXBrc19zaWduZWRfd2l0aF92M19lY2RzYV9zaGEyNTZfYXJlX3ZhbGlkKCkgewogICAgIGZvciBrZXlfbmFtZSBpbiBLRVlfTkFNRVNfRUNEU0EuaXRlcigpIHsKLSAgICAgICAgYXNzZXJ0ISh2ZXJpZnkoZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXt9LmFwayIsIGtleV9uYW1lKSkuaXNfb2soKSk7CisgICAgICAgIHZhbGlkYXRlX2FwaygKKyAgICAgICAgICAgIGZvcm1hdCEoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSksCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6RWNkc2FXaXRoU2hhMjU2LAorICAgICAgICApOwogICAgIH0KIH0KIAotLy8gVE9ETyhiLzE5MDM0Mzg0MikKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX2VjZHNhX3NoYTUxMigpIHsKK2ZuIGFwa3Nfc2lnbmVkX3dpdGhfdjNfZWNkc2Ffc2hhNTEyX2FyZV92YWxpZCgpIHsKICAgICBmb3Iga2V5X25hbWUgaW4gS0VZX05BTUVTX0VDRFNBLml0ZXIoKSB7Ci0gICAgICAgIGxldCByZXMgPSB2ZXJpZnkoZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXt9LmFwayIsIGtleV9uYW1lKSk7Ci0gICAgICAgIGFzc2VydCEocmVzLmlzX2VycigpKTsKLSAgICAgICAgYXNzZXJ0X2NvbnRhaW5zKAotICAgICAgICAgICAgJnJlcy51bndyYXBfZXJyKCkudG9fc3RyaW5nKCksCi0gICAgICAgICAgICAiVE9ETyhiLzE5MDM0Mzg0Mikgbm90IGltcGxlbWVudGVkIHNpZ25hdHVyZSBhbGdvcml0aG0iLAorICAgICAgICB2YWxpZGF0ZV9hcGsoCisgICAgICAgICAgICBmb3JtYXQhKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTIte30uYXBrIiwga2V5X25hbWUpLAorICAgICAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkVjZHNhV2l0aFNoYTUxMiwKICAgICAgICAgKTsKICAgICB9CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX3JzYV9zaGEyNTYoKSB7CitmbiBhcGtzX3NpZ25lZF93aXRoX3YzX3JzYV9wa2NzMV9zaGEyNTZfYXJlX3ZhbGlkKCkgewogICAgIGZvciBrZXlfbmFtZSBpbiBLRVlfTkFNRVNfUlNBLml0ZXIoKSB7Ci0gICAgICAgIGFzc2VydCEoCi0gICAgICAgICAgICB2ZXJpZnkoZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSkpLmlzX29rKCkKKyAgICAgICAgdmFsaWRhdGVfYXBrKAorICAgICAgICAgICAgZm9ybWF0ISgidGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni17fS5hcGsiLCBrZXlfbmFtZSksCisgICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2LAogICAgICAgICApOwogICAgIH0KIH0KIAogI1t0ZXN0XQotZm4gdGVzdF92ZXJpZnlfdjNfcnNhX3NoYTUxMigpIHsKK2ZuIGFwa3Nfc2lnbmVkX3dpdGhfdjNfcnNhX3BrY3MxX3NoYTUxMl9hcmVfdmFsaWQoKSB7CiAgICAgZm9yIGtleV9uYW1lIGluIEtFWV9OQU1FU19SU0EuaXRlcigpIHsKLSAgICAgICAgYXNzZXJ0ISgKLSAgICAgICAgICAgIHZlcmlmeShmb3JtYXQhKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLXt9LmFwayIsIGtleV9uYW1lKSkuaXNfb2soKQorICAgICAgICB2YWxpZGF0ZV9hcGsoCisgICAgICAgICAgICBmb3JtYXQhKCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLXt9LmFwayIsIGtleV9uYW1lKSwKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGE1MTIsCiAgICAgICAgICk7CiAgICAgfQogfQogCi0vLyBUT0RPKGIvMTkwMzQzODQyKQogI1t0ZXN0XQogZm4gdGVzdF92ZXJpZnlfdjNfc2lnX2RvZXNfbm90X3ZlcmlmeSgpIHsKICAgICBsZXQgcGF0aF9saXN0ID0gWwpAQCAtMTAxLDEzICsxMTEsMTEgQEAKICAgICAgICAgYXNzZXJ0IShyZXMuaXNfZXJyKCkpOwogICAgICAgICBsZXQgZXJyb3JfbXNnID0gJnJlcy51bndyYXBfZXJyKCkudG9fc3RyaW5nKCk7CiAgICAgICAgIGFzc2VydCEoCi0gICAgICAgICAgICBlcnJvcl9tc2cuY29udGFpbnMoIlNpZ25hdHVyZSBpcyBpbnZhbGlkIikKLSAgICAgICAgICAgICAgICB8fCBlcnJvcl9tc2cuY29udGFpbnMoIlRPRE8oYi8xOTAzNDM4NDIpIG5vdCBpbXBsZW1lbnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIikKKyAgICAgICAgICAgIGVycm9yX21zZy5jb250YWlucygiU2lnbmF0dXJlIGlzIGludmFsaWQiKSB8fCBlcnJvcl9tc2cuY29udGFpbnMoIm5vdCBpbXBsZW1lbnRlZCIpCiAgICAgICAgICk7CiAgICAgfQogfQogCi0vLyBUT0RPKGIvMTkwMzQzODQyKQogI1t0ZXN0XQogZm4gdGVzdF92ZXJpZnlfdjNfZGlnZXN0X21pc21hdGNoKCkgewogICAgIGxldCBwYXRoX2xpc3QgPSBbCkBAIC0xMTgsMTAgKzEyNiw3IEBACiAgICAgICAgIGxldCByZXMgPSB2ZXJpZnkocGF0aCk7CiAgICAgICAgIGFzc2VydCEocmVzLmlzX2VycigpKTsKICAgICAgICAgbGV0IGVycm9yX21zZyA9ICZyZXMudW53cmFwX2VycigpLnRvX3N0cmluZygpOwotICAgICAgICBhc3NlcnQhKAotICAgICAgICAgICAgZXJyb3JfbXNnLmNvbnRhaW5zKCJEaWdlc3QgbWlzbWF0Y2giKQotICAgICAgICAgICAgICAgIHx8IGVycm9yX21zZy5jb250YWlucygiVE9ETyhiLzE5MDM0Mzg0Mikgbm90IGltcGxlbWVudGVkIHNpZ25hdHVyZSBhbGdvcml0aG0iKQotICAgICAgICApOworICAgICAgICBhc3NlcnQhKGVycm9yX21zZy5jb250YWlucygiRGlnZXN0IG1pc21hdGNoIikgfHwgZXJyb3JfbXNnLmNvbnRhaW5zKCJub3QgaW1wbGVtZW50ZWQiKSk7CiAgICAgfQogfQogCkBAIC0xODIsMjEgKzE4Nyw4OCBAQAogfQogCiAjW3Rlc3RdCi1mbiB0ZXN0X3ZlcmlmeV92M191bmtub3duX2FkZGl0aW9uYWxfYXR0cigpIHsKLSAgICBhc3NlcnQhKHZlcmlmeSgidGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tYWRkaXRpb25hbC1hdHRyLmFwayIpLmlzX29rKCkpOworZm4gYXBrX3NpZ25lZF93aXRoX3YzX3Vua25vd25fYWRkaXRpb25hbF9hdHRyX2lzX3ZhbGlkKCkgeworICAgIHZhbGlkYXRlX2FwaygKKyAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsiLAorICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2LAorICAgICk7CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX3Vua25vd25fcGFpcl9pbl9hcGtfc2lnX2Jsb2NrKCkgewotICAgIGFzc2VydCEodmVyaWZ5KCJ0ZXN0cy9kYXRhL3YzLW9ubHktdW5rbm93bi1wYWlyLWluLWFway1zaWctYmxvY2suYXBrIikuaXNfb2soKSk7CitmbiBhcGtfc2lnbmVkX3dpdGhfdjNfdW5rbm93bl9wYWlyX2luX2Fwa19zaWdfYmxvY2tfaXNfdmFsaWQoKSB7CisgICAgdmFsaWRhdGVfYXBrKAorICAgICAgICAidGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tcGFpci1pbi1hcGstc2lnLWJsb2NrLmFwayIsCisgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpSc2FQa2NzMVYxNVdpdGhTaGEyNTYsCisgICAgKTsKIH0KIAogI1t0ZXN0XQotZm4gdGVzdF92ZXJpZnlfdjNfaWdub3JhYmxlX3Vuc3VwcG9ydGVkX3NpZ19hbGdzKCkgewotICAgIGFzc2VydCEodmVyaWZ5KCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1pZ25vcmFibGUtdW5zdXBwb3J0ZWQtc2lnLWFsZ3MuYXBrIikuaXNfb2soKSk7CitmbiBhcGtfc2lnbmVkX3dpdGhfdjNfaWdub3JhYmxlX3Vuc3VwcG9ydGVkX3NpZ19hbGdzX2lzX3ZhbGlkKCkgeworICAgIHZhbGlkYXRlX2FwaygKKyAgICAgICAgInRlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsiLAorICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JRDo6UnNhUGtjczFWMTVXaXRoU2hhMjU2LAorICAgICk7CiB9CiAKICNbdGVzdF0KLWZuIHRlc3RfdmVyaWZ5X3YzX3N0YW1wKCkgewotICAgIGFzc2VydCEodmVyaWZ5KCJ0ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1zdGFtcC5hcGsiKS5pc19vaygpKTsKK2ZuIGFwa19zaWduZWRfd2l0aF92M19zdGFtcF9pc192YWxpZCgpIHsKKyAgICB2YWxpZGF0ZV9hcGsoInRlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFwayIsIFNpZ25hdHVyZUFsZ29yaXRobUlEOjpFY2RzYVdpdGhTaGEyNTYpOworfQorCitmbiB2YWxpZGF0ZV9hcGs8UDogQXNSZWY8UGF0aD4+KGFwa19wYXRoOiBQLCBleHBlY3RlZF9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlEKSB7CisgICAgdmFsaWRhdGVfYXBrX3B1YmxpY19rZXkoJmFwa19wYXRoKTsKKyAgICB2YWxpZGF0ZV9hcGtfZGlnZXN0KCZhcGtfcGF0aCwgZXhwZWN0ZWRfYWxnb3JpdGhtX2lkKTsKK30KKworLy8vIFZhbGlkYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgcHVibGljIGtleXMgYXJlIGVxdWFsOgorLy8vICogcHVibGljIGtleSBmcm9tIHZlcmlmaWNhdGlvbgorLy8vICogcHVibGljIGtleSBleHRyYWN0ZWQgZnJvbSBhcGsgd2l0aG91dCB2ZXJpZmljYXRpb24KKy8vLyAqIGV4cGVjdGVkIHB1YmxpYyBrZXkgZnJvbSB0aGUgY29ycmVzcG9uZGluZyAuZGVyIGZpbGUKK2ZuIHZhbGlkYXRlX2Fwa19wdWJsaWNfa2V5PFA6IEFzUmVmPFBhdGg+PihhcGtfcGF0aDogUCkgeworICAgIGxldCBwdWJsaWNfa2V5X2Zyb21fdmVyaWZpY2F0aW9uID0gdmVyaWZ5KCZhcGtfcGF0aCk7CisgICAgbGV0IHB1YmxpY19rZXlfZnJvbV92ZXJpZmljYXRpb24gPQorICAgICAgICBwdWJsaWNfa2V5X2Zyb21fdmVyaWZpY2F0aW9uLmV4cGVjdCgiRXJyb3IgaW4gdmVyaWZpY2F0aW9uIHJlc3VsdCIpOworCisgICAgbGV0IGV4cGVjdGVkX3B1YmxpY19rZXlfcGF0aCA9IGZvcm1hdCEoInt9LmRlciIsIGFwa19wYXRoLmFzX3JlZigpLnRvX3N0cigpLnVud3JhcCgpKTsKKyAgICBhc3NlcnRfYnl0ZXNfZXFfdG9fZGF0YV9pbl9maWxlKCZwdWJsaWNfa2V5X2Zyb21fdmVyaWZpY2F0aW9uLCBleHBlY3RlZF9wdWJsaWNfa2V5X3BhdGgpOworCisgICAgbGV0IHB1YmxpY19rZXlfZnJvbV9hcGsgPSBnZXRfcHVibGljX2tleV9kZXIoJmFwa19wYXRoKTsKKyAgICBsZXQgcHVibGljX2tleV9mcm9tX2FwayA9CisgICAgICAgIHB1YmxpY19rZXlfZnJvbV9hcGsuZXhwZWN0KCJFcnJvciB3aGVuIGV4dHJhY3RpbmcgcHVibGljIGtleSBmcm9tIGFwayIpOworICAgIGFzc2VydF9lcSEoCisgICAgICAgIHB1YmxpY19rZXlfZnJvbV92ZXJpZmljYXRpb24sIHB1YmxpY19rZXlfZnJvbV9hcGssCisgICAgICAgICJQdWJsaWMga2V5IGV4dHJhY3RlZCBkaXJlY3RseSBmcm9tIGFwayBkb2VzIG5vdCBtYXRjaCB0aGUgcHVibGljIGtleSBmcm9tIHZlcmlmaWNhdGlvbi4iCisgICAgKTsKK30KKworLy8vIFZhbGlkYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgYXBrX2RpZ2VzdCBhcmUgZXF1YWw6CisvLy8gKiBhcGtfZGlnZXN0IGRpcmVjdGx5IGV4dHJhY3RlZCBmcm9tIGFwayB3aXRob3V0IGNvbXB1dGF0aW9uCisvLy8gKiBleHBlY3RlZCBhcGsgZGlnZXN0IGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgLmFwa19kaWdlc3QgZmlsZQorZm4gdmFsaWRhdGVfYXBrX2RpZ2VzdDxQOiBBc1JlZjxQYXRoPj4oYXBrX3BhdGg6IFAsIGV4cGVjdGVkX2FsZ29yaXRobV9pZDogU2lnbmF0dXJlQWxnb3JpdGhtSUQpIHsKKyAgICBsZXQgYXBrID0gZnM6OkZpbGU6Om9wZW4oJmFwa19wYXRoKS5leHBlY3QoIlVuYWJsZWQgdG8gb3BlbiBhcGsgZmlsZSIpOworCisgICAgbGV0IChzaWduYXR1cmVfYWxnb3JpdGhtX2lkLCBkaWdlc3RfZnJvbV9hcGspID0KKyAgICAgICAgcGlja192NF9hcGtfZGlnZXN0KGFwaykuZXhwZWN0KCJFcnJvciB3aGVuIGV4dHJhY3RpbmcgYXBrIGRpZ2VzdC4iKTsKKworICAgIGFzc2VydF9lcSEoZXhwZWN0ZWRfYWxnb3JpdGhtX2lkLCBzaWduYXR1cmVfYWxnb3JpdGhtX2lkKTsKKyAgICBsZXQgZXhwZWN0ZWRfZGlnZXN0X3BhdGggPSBmb3JtYXQhKCJ7fS5hcGtfZGlnZXN0IiwgYXBrX3BhdGguYXNfcmVmKCkudG9fc3RyKCkudW53cmFwKCkpOworICAgIGFzc2VydF9ieXRlc19lcV90b19kYXRhX2luX2ZpbGUoJmRpZ2VzdF9mcm9tX2FwaywgZXhwZWN0ZWRfZGlnZXN0X3BhdGgpOworfQorCitmbiBhc3NlcnRfYnl0ZXNfZXFfdG9fZGF0YV9pbl9maWxlPFA6IEFzUmVmPFBhdGg+ICsgc3RkOjpmbXQ6OkRpc3BsYXk+KAorICAgIGJ5dGVzX2RhdGE6ICZbdThdLAorICAgIGV4cGVjdGVkX2RhdGFfcGF0aDogUCwKKykgeworICAgIGFzc2VydCEoCisgICAgICAgIGZzOjptZXRhZGF0YSgmZXhwZWN0ZWRfZGF0YV9wYXRoKS5pc19vaygpLAorICAgICAgICAiRmlsZSBkb2VzIG5vdCBleGlzdC4gWW91IGNhbiByZS1jcmVhdGUgaXQgd2l0aDpcbiQgZWNobyAtZW4ge30gPiB7fVxuIiwKKyAgICAgICAgYnl0ZXNfZGF0YS5pdGVyKCkubWFwKHxifCBmb3JtYXQhKCJcXFxceHs6MDJ4fSIsIGIpKS5jb2xsZWN0Ojo8U3RyaW5nPigpLAorICAgICAgICBleHBlY3RlZF9kYXRhX3BhdGgKKyAgICApOworICAgIGxldCBleHBlY3RlZF9kYXRhID0gZnM6OnJlYWQoJmV4cGVjdGVkX2RhdGFfcGF0aCkudW53cmFwKCk7CisgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgZXhwZWN0ZWRfZGF0YSwgYnl0ZXNfZGF0YSwKKyAgICAgICAgIkFjdHVhbCBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBkYXRhIGZyb206IHt9IiwKKyAgICAgICAgZXhwZWN0ZWRfZGF0YV9wYXRoCisgICAgKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvUkVBRE1FLm1kIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS9SRUFETUUubWQKaW5kZXggNzU1NjkyMS4uN2JhNWQ4ZSAxMDA2NDQKLS0tIGEvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS9SRUFETUUubWQKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS9SRUFETUUubWQKQEAgLTEsNiArMSwxMCBAQAorIyBBYm91dCB0ZXN0IGRhdGEKKworIyMgLmFwaworCiB0ZXN0LmFwZXggaXMgY29waWVkIGZyb20gQURCRCBhcGV4IGJ1aWx0IGluIEFPU1AuCiAKLWBgYHNoCitgYGBiYXNoCiAkIGFwa3NpZ25lciB2ZXJpZnkgLXYgdGVzdC5hcGV4CiBWZXJpZmllcwogVmVyaWZpZWQgdXNpbmcgdjEgc2NoZW1lIChKQVIgc2lnbmluZyk6IGZhbHNlCkBAIC0xMSw0ICsxNSwyMCBAQAogTnVtYmVyIG9mIHNpZ25lcnM6IDEKIGBgYAogCi1BUEsgZmlsZXMgYXJlIGNvcGllZCBmcm9tIHRvb2xzL2Fwa3NpZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2FuZHJvaWQvYXBrc2lnLy4KK0FQSyBmaWxlcyBhcmUgY29waWVkIGZyb20gW3Rvb2xzL2Fwa3NpZy9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2FuZHJvaWQvYXBrc2lnL10oaHR0cHM6Ly9jcy5hbmRyb2lkLmNvbS9hbmRyb2lkL3BsYXRmb3JtL3N1cGVycHJvamVjdC8rL21hc3Rlcjp0b29scy9hcGtzaWcvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9hbmRyb2lkL2Fwa3NpZy87bD0xO2RyYz1jMmE4ZGExOTEzZDdmYjM1OWIwMjNiZjIwMGUzMWQ3NWZmMjJhNWMzKS4KKworIyMgLmRlcgorCitgLmRlcmAgZmlsZXMgY29udGFpbiB0aGUgZXhwZWN0ZWQgcHVibGljIGtleXMuIFdoZW4gdmFsaWRhdGluZyB0aGUgcHVibGljIGtleXMgaW4gdGVzdHMsIGlmIHRoZSBjb3JyZXNwb25kaW5nIGAuZGVyYCBmaWxlIGlzIG1pc3NpbmcsIHRoZXJlIHdpbGwgYmUgc29tZSB0ZXh0IGFzIGZvbGxvd3MgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZToKKworYGBgYmFzaAorJCBlY2hvIC1lbiBcXHgzMFxceDU5XFx4MzBcXHgxM1xceDA2XFx4MDdcXHgyYVxceDg2XFx4NDhcXHhjZVxceDNkXFx4MDJcXHgwMVxceDA2XFx4MDhcXHgyYVxceDg2XFx4NDhcXHhjZVxceDNkXFx4MDNcXHgwMVxceDA3XFx4MDNcXHg0MlxceDAwXFx4MDRcXHhhNlxceDVmXFx4MTFcXHgzZFxceDIyXFx4Y2JcXHg0OVxceDEzXFx4OTBcXHg4M1xceDA3XFx4YWNcXHgzMVxceGVlXFx4MmJcXHhhMFxceGU5XFx4MTNcXHg4YlxceDc4XFx4NWZcXHhhY1xceDY1XFx4MzZcXHhkMVxceDRlXFx4YTJcXHhjZVxceDkwXFx4ZDJcXHhiNFxceGJmXFx4ZTFcXHg5NFxceGI1XFx4MGNcXHhkY1xceDhlXFx4MTZcXHg5ZlxceDU0XFx4YTdcXHgzYVxceDk5XFx4MWVcXHhmMFxceGZhXFx4NzZcXHgzMlxceDk4XFx4MjVcXHhiZVxceDA3XFx4OGNcXHhjN1xceDgyXFx4NzRcXHgwN1xceDAzXFx4ZGFcXHg0NFxceGI0XFx4ZDdcXHhlYiA+IHRlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5kZXIKK2BgYAorCitZb3UganVzdCBuZWVkIHRvIGV4ZWN1dGUgdGhpcyBjb21tYW5kIGluIHRoZSBmb2xkZXIgYGxpYnMvYXBrdmVyaWZ5YCB0byBnZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBgLmRlcmAgZmlsZS4gQWZ0ZXIgaXQsIHlvdSBjYW4gcnVuIHRoZSB0ZXN0IGFnYWluLCBhbmQgdGhlIHRlc3Qgd2lsbCBwYXNzLgorCitPdGhlcndpc2UsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGNvbW1hbmQgYGFwa3NpZ25lciB2ZXJpZnkgLS1taW4tc2RrLXZlcnNpb24gMjQgLS1wcmludC1jZXJ0cy1wZW0gdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrYCB0byBnZXQgdGhlIHB1YmxpYyBrZXkgaW4gYC5wZW1gIGZvcm1hdCBhbmQgdGhlbiBjb252ZXJ0IGl0IHRvIGAuZGVyYCB3aXRoIG9wZW5zc2wuCisKKyMjIC5hcGtfZGlnZXN0CisKK2AuYXBrX2RpZ2VzdGAgZmlsZXMgY29udGFpbiB0aGUgZXhwZWN0ZWQgW2Fwa19kaWdlc3RdKGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RvY3Mvc2VjdXJpdHkvZmVhdHVyZXMvYXBrc2lnbmluZy92NCNhcGstZGlnZXN0KS4gVGhleSBhcmUgZ2VuZXJhdGVkIHRoZSBzYW1lIHdheSBhcyBgLmRlcmAgd2hlbiB2YWxpZGF0aW5nIHRoZSBhcGtfZGlnZXN0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdGVzdC5hcGV4LmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3Rlc3QuYXBleC5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTczNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3Rlc3QuYXBleC5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdGVzdC5hcGV4LmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdGVzdC5hcGV4LmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmViMWViCi0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS90ZXN0LmFwZXguZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tYWRkaXRpb25hbC1hdHRyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tYWRkaXRpb25hbC1hdHRyLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1MzVjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLWFkZGl0aW9uYWwtYXR0ci5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tcGFpci1pbi1hcGstc2lnLWJsb2NrLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXVua25vd24tcGFpci1pbi1hcGstc2lnLWJsb2NrLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS11bmtub3duLXBhaXItaW4tYXBrLXNpZy1ibG9jay5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni0xMDI0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni0yMDQ4LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWRzYS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZHNhLXNoYTI1Ni0zMDcyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMjU2LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAyNTYuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMjU2LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMjU2LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDI1Ni5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDI1Ni5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMzg0LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXAzODQuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMzg0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wMzg0LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDM4NC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmFmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDM4NC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wNTIxLmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhMjU2LXA1MjEuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhZWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wNTIxLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTI1Ni1wNTIxLmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDUyMS5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGY5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGEyNTYtcDUyMS5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMjU2LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAyNTYuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMjU2LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMjU2LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDI1Ni5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOTI3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDI1Ni5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMzg0LmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXAzODQuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMzg0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wMzg0LmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDM4NC5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmFmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDM4NC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wNTIxLmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtZWNkc2Etc2hhNTEyLXA1MjEuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wNTIxLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWVjZHNhLXNoYTUxMi1wNTIxLmFway5kZXIgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDUyMS5hcGsuZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGY5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1lY2RzYS1zaGE1MTItcDUyMS5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtaWdub3JhYmxlLXVuc3VwcG9ydGVkLXNpZy1hbGdzLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtaWdub3JhYmxlLXVuc3VwcG9ydGVkLXNpZy1hbGdzLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkYzU0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLWlnbm9yYWJsZS11bnN1cHBvcnRlZC1zaWctYWxncy5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0xMDI0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0xMDI0LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTAyNC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTYzODQuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTE2Mzg0LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWVjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhMjU2LTE2Mzg0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTYzODQuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMTYzODQuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFiZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0xNjM4NC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0yMDQ4LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkYzU0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMjA0OC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0zMDcyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni0zMDcyLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3MGY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtMzA3Mi5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni00MDk2LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtNDA5Ni5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni04MTkyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTI1Ni04MTkyLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGEyNTYtODE5Mi5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0xMDI0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0xMDI0LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhZmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTAyNC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTYzODQuYXBrLmFwa19kaWdlc3QgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTE2Mzg0LmFway5hcGtfZGlnZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZTFiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzL2Fwa3ZlcmlmeS90ZXN0cy9kYXRhL3YzLW9ubHktd2l0aC1yc2EtcGtjczEtc2hhNTEyLTE2Mzg0LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTYzODQuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMTYzODQuYXBrLmRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFiZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0xNjM4NC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0yMDQ4LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0yMDQ4LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkYzU0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMjA0OC5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0zMDcyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi0zMDcyLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3MGY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItMzA3Mi5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi00MDk2LmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi00MDk2LmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItNDA5Ni5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuYXBrX2RpZ2VzdCBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuYXBrX2RpZ2VzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUxYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi04MTkyLmFway5hcGtfZGlnZXN0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuZGVyIGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtcnNhLXBrY3MxLXNoYTUxMi04MTkyLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNWVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXJzYS1wa2NzMS1zaGE1MTItODE5Mi5hcGsuZGVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5hcGtfZGlnZXN0IGIvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrLmFwa19kaWdlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5YzJhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5hcGtfZGlnZXN0CkBAIC0wLDAgKzEgQEAKK2JrtkfACJcXp/+lL9joRflAPV4n96WodS5HszRfuC9cClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGlicy9hcGt2ZXJpZnkvdGVzdHMvZGF0YS92My1vbmx5LXdpdGgtc3RhbXAuYXBrLmRlciBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5kZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5MjdhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvYXBrdmVyaWZ5L3Rlc3RzL2RhdGEvdjMtb25seS13aXRoLXN0YW1wLmFway5kZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicy9pZHNpZy9zcmMvYXBrc2lndjQucnMgYi9saWJzL2lkc2lnL3NyYy9hcGtzaWd2NC5ycwppbmRleCBmOGNhMTg0Li5jMWI2NDk1IDEwMDY0NAotLS0gYS9saWJzL2lkc2lnL3NyYy9hcGtzaWd2NC5ycworKysgYi9saWJzL2lkc2lnL3NyYy9hcGtzaWd2NC5ycwpAQCAtMTUsNyArMTUsNyBAQAogICovCiAKIHVzZSBhbnlob3c6Onthbnlob3csIGJhaWwsIENvbnRleHQsIFJlc3VsdH07Ci11c2UgYXBrdmVyaWZ5OjpwaWNrX3Y0X2Fwa19kaWdlc3Q7Cit1c2UgYXBrdmVyaWZ5Ojp7cGlja192NF9hcGtfZGlnZXN0LCBTaWduYXR1cmVBbGdvcml0aG1JRH07CiB1c2UgYnl0ZW9yZGVyOjp7TGl0dGxlRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwogdXNlIG51bV9kZXJpdmU6OntGcm9tUHJpbWl0aXZlLCBUb1ByaW1pdGl2ZX07CiB1c2UgbnVtX3RyYWl0czo6e0Zyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlfTsKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAvLy8gUHVibGljIGtleSBvZiB0aGUgc2lnbmVyIGluIEFTTi4xIERFUiBmb3JtLiBUaGlzIG11c3QgbWF0Y2ggdGhlIGB4NTA5X2NlcnRpZmljYXRlYCBmaWVsZC4KICAgICBwdWIgcHVibGljX2tleTogQm94PFt1OF0+LAogICAgIC8vLyBTaWduYXR1cmUgYWxnb3JpdGhtIHVzZWQgdG8gc2lnbiB0aGlzIGZpbGUuCi0gICAgcHViIHNpZ25hdHVyZV9hbGdvcml0aG1faWQ6IFNpZ25hdHVyZUFsZ29yaXRobUlkLAorICAgIHB1YiBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JRCwKICAgICAvLy8gVGhlIHNpZ25hdHVyZSBvZiB0aGlzIGZpbGUuCiAgICAgcHViIHNpZ25hdHVyZTogQm94PFt1OF0+LAogfQpAQCAtMTE0LDQwICsxMTQsNiBAQAogICAgIH0KIH0KIAotLy8vIFNpZ25hdHVyZSBhbGdvcml0aG0gdGhhdCBjYW4gYmUgdXNlZCBmb3IgaWRzaWcgZmlsZQotI1tkZXJpdmUoRGVidWcsIFBhcnRpYWxFcSwgRXEsIEZyb21QcmltaXRpdmUsIFRvUHJpbWl0aXZlKV0KLSNbYWxsb3cobm9uX2NhbWVsX2Nhc2VfdHlwZXMpXQotI1tyZXByKHUzMildCi1wdWIgZW51bSBTaWduYXR1cmVBbGdvcml0aG1JZCB7Ci0gICAgLy8vIFJTQVNTQS1QU1Mgd2l0aCBTSEEyLTI1NiBkaWdlc3QsIFNIQTItMjU2IE1HRjEsIDMyIGJ5dGVzIG9mIHNhbHQsIHRyYWlsZXI6IDB4YmMKLSAgICBSU0FTU0FfUFNTX1NIQTJfMjU2ID0gMHgwMTAxLAotICAgIC8vLyBSU0FTU0EtUFNTIHdpdGggU0hBMi01MTIgZGlnZXN0LCBTSEEyLTUxMiBNR0YxLCA2NCBieXRlcyBvZiBzYWx0LCB0cmFpbGVyOiAweGJjCi0gICAgUlNBU1NBX1BTU19TSEEyXzUxMiA9IDB4MDEwMiwKLSAgICAvLy8gUlNBU1NBLVBLQ1MxLXYxXzUgd2l0aCBTSEEyLTI1NiBkaWdlc3QuCi0gICAgUlNBU1NBX1BLQ1MxX1NIQTJfMjU2ID0gMHgwMTAzLAotICAgIC8vLyBSU0FTU0EtUEtDUzEtdjFfNSB3aXRoIFNIQTItNTEyIGRpZ2VzdC4KLSAgICBSU0FTU0FfUEtDUzFfU0hBMl81MTIgPSAweDAxMDQsCi0gICAgLy8vIEVDRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0LgotICAgIEVDRFNBX1NIQTJfMjU2ID0gMHgwMjAxLAotICAgIC8vLyBFQ0RTQSB3aXRoIFNIQTItNTEyIGRpZ2VzdC4KLSAgICBFQ0RTQV9TSEEyXzUxMiA9IDB4MDIwMiwKLSAgICAvLy8gRFNBIHdpdGggU0hBMi0yNTYgZGlnZXN0Ci0gICAgRFNBX1NIQTJfMjU2ID0gMHgwMzAxLAotfQotCi1pbXBsIFNpZ25hdHVyZUFsZ29yaXRobUlkIHsKLSAgICBmbiBmcm9tKHZhbDogdTMyKSAtPiBSZXN1bHQ8U2lnbmF0dXJlQWxnb3JpdGhtSWQ+IHsKLSAgICAgICAgU2VsZjo6ZnJvbV91MzIodmFsKQotICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJ7OiMwNnh9IGlzIGFuIHVuc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG0iLCB2YWwpKQotICAgIH0KLX0KLQotaW1wbCBEZWZhdWx0IGZvciBTaWduYXR1cmVBbGdvcml0aG1JZCB7Ci0gICAgZm4gZGVmYXVsdCgpIC0+IFNlbGYgewotICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JZDo6RFNBX1NIQTJfMjU2Ci0gICAgfQotfQotCiBpbXBsPFI6IFJlYWQgKyBTZWVrPiBWNFNpZ25hdHVyZTxSPiB7CiAgICAgLy8vIENvbnN1bWVzIGEgc3RyZWFtIGZvciBhbiBpZHNpZyBmaWxlIGludG8gYSBgVjRTaWduYXR1cmVgIHN0cnVjdC4KICAgICBwdWIgZm4gZnJvbShtdXQgcjogUikgLT4gUmVzdWx0PFY0U2lnbmF0dXJlPFI+PiB7CkBAIC0xOTMsOCArMTU5LDcgQEAKIAogICAgICAgICBhcGsuc2VlayhTZWVrRnJvbTo6U3RhcnQoc3RhcnQpKT87CiAgICAgICAgIGxldCAoc2lnbmF0dXJlX2FsZ29yaXRobV9pZCwgYXBrX2RpZ2VzdCkgPSBwaWNrX3Y0X2Fwa19kaWdlc3QoYXBrKT87Ci0gICAgICAgIHJldC5zaWduaW5nX2luZm8uc2lnbmF0dXJlX2FsZ29yaXRobV9pZCA9Ci0gICAgICAgICAgICBTaWduYXR1cmVBbGdvcml0aG1JZDo6ZnJvbShzaWduYXR1cmVfYWxnb3JpdGhtX2lkKT87CisgICAgICAgIHJldC5zaWduaW5nX2luZm8uc2lnbmF0dXJlX2FsZ29yaXRobV9pZCA9IHNpZ25hdHVyZV9hbGdvcml0aG1faWQ7CiAgICAgICAgIHJldC5zaWduaW5nX2luZm8uYXBrX2RpZ2VzdCA9IGFwa19kaWdlc3Q7CiAgICAgICAgIC8vIFRPRE8oaml5b25nKTogYWRkIGEgc2lnbmF0dXJlIHRvIHRoZSBzaWduaW5nX2luZm8gc3RydWN0CiAKQEAgLTI3Niw3ICsyNDEsOCBAQAogICAgICAgICAgICAgeDUwOV9jZXJ0aWZpY2F0ZTogcmVhZF9zaXplZF9hcnJheSgmbXV0IHIpPywKICAgICAgICAgICAgIGFkZGl0aW9uYWxfZGF0YTogcmVhZF9zaXplZF9hcnJheSgmbXV0IHIpPywKICAgICAgICAgICAgIHB1YmxpY19rZXk6IHJlYWRfc2l6ZWRfYXJyYXkoJm11dCByKT8sCi0gICAgICAgICAgICBzaWduYXR1cmVfYWxnb3JpdGhtX2lkOiBTaWduYXR1cmVBbGdvcml0aG1JZDo6ZnJvbShyLnJlYWRfdTMyOjo8TGl0dGxlRW5kaWFuPigpPyk/LAorICAgICAgICAgICAgc2lnbmF0dXJlX2FsZ29yaXRobV9pZDogU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OmZyb21fdTMyKHIucmVhZF91MzI6OjxMaXR0bGVFbmRpYW4+KCk/KQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJVbnN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtIik/LAogICAgICAgICAgICAgc2lnbmF0dXJlOiByZWFkX3NpemVkX2FycmF5KCZtdXQgcik/LAogICAgICAgICB9KQogICAgIH0KQEAgLTI5MSw3ICsyNTcsNyBAQAogICAgICAgICB3cml0ZV9zaXplZF9hcnJheSgmbXV0IHcsICZzZWxmLng1MDlfY2VydGlmaWNhdGUpPzsKICAgICAgICAgd3JpdGVfc2l6ZWRfYXJyYXkoJm11dCB3LCAmc2VsZi5hZGRpdGlvbmFsX2RhdGEpPzsKICAgICAgICAgd3JpdGVfc2l6ZWRfYXJyYXkoJm11dCB3LCAmc2VsZi5wdWJsaWNfa2V5KT87Ci0gICAgICAgIHcud3JpdGVfdTMyOjo8TGl0dGxlRW5kaWFuPihzZWxmLnNpZ25hdHVyZV9hbGdvcml0aG1faWQudG9fdTMyKCkudW53cmFwKCkpPzsKKyAgICAgICAgdy53cml0ZV91MzI6OjxMaXR0bGVFbmRpYW4+KHNlbGYuc2lnbmF0dXJlX2FsZ29yaXRobV9pZC50b191MzIoKSk/OwogICAgICAgICB3cml0ZV9zaXplZF9hcnJheSgmbXV0IHcsICZzZWxmLnNpZ25hdHVyZSk/OwogCiAgICAgICAgIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiBzaWduaW5nX2luZm8sIGFuZCB3cml0ZSBpdCBpbiBmcm9udCBvZiB0aGUgc3RydWN0IHdoZXJlIHRoZSB2YWx1ZQpAQCAtMzU4LDcgKzMyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgYTg1ODVjMzhkN2Y2NTQ4MzVlYjIxOWFlOWUxNzZiNDRlODZkY2IyMzE1M2UzZDlkNiIsCiAgICAgICAgICAgICBoZXhzdHJpbmdfZnJvbShzaS5zaWduYXR1cmUuYXNfcmVmKCkpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydF9lcSEoU2lnbmF0dXJlQWxnb3JpdGhtSWQ6OkRTQV9TSEEyXzI1Niwgc2kuc2lnbmF0dXJlX2FsZ29yaXRobV9pZCk7CisgICAgICAgIGFzc2VydF9lcSEoU2lnbmF0dXJlQWxnb3JpdGhtSUQ6OkRzYVdpdGhTaGEyNTYsIHNpLnNpZ25hdHVyZV9hbGdvcml0aG1faWQpOwogCiAgICAgICAgIGFzc2VydF9lcSEoMzY4NjQsIHBhcnNlZC5tZXJrbGVfdHJlZV9zaXplKTsKICAgICAgICAgYXNzZXJ0X2VxISgyMjUxLCBwYXJzZWQubWVya2xlX3RyZWVfb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL21pY3JvZHJvaWQvQW5kcm9pZC5icCBiL21pY3JvZHJvaWQvQW5kcm9pZC5icAppbmRleCBjNmJhMWRiLi43YjI4YWQyIDEwMDY0NAotLS0gYS9taWNyb2Ryb2lkL0FuZHJvaWQuYnAKKysrIGIvbWljcm9kcm9pZC9BbmRyb2lkLmJwCkBAIC01Nyw4ICs1Nyw2IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJzdGRjKysiLAotICAgICAgICAibG9nY2F0Lm1pY3JvZHJvaWQiLAotICAgICAgICAibG9nZC5taWNyb2Ryb2lkIiwKICAgICAgICAgInNlY2lsYyIsCiAKICAgICAgICAgLy8gImNvbS5hbmRyb2lkLmFkYmQiIHJlcXVpcmVzIHRoZXNlLApkaWZmIC0tZ2l0IGEvbWljcm9kcm9pZC9ib290Y29uZmlnLmFwcF9kZWJ1Z2dhYmxlIGIvbWljcm9kcm9pZC9ib290Y29uZmlnLmFwcF9kZWJ1Z2dhYmxlCmluZGV4IDBkODUxODYuLjZlNjYzNzEgMTAwNjQ0Ci0tLSBhL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5hcHBfZGVidWdnYWJsZQorKysgYi9taWNyb2Ryb2lkL2Jvb3Rjb25maWcuYXBwX2RlYnVnZ2FibGUKQEAgLTEzLDcgKzEzLDMgQEAKIAogIyBBREIgaXMgc3VwcG9ydGVkIGJ1dCByb290aW5nIGlzIHByb2hpYml0ZWQuCiBhbmRyb2lkYm9vdC5hZGIuZW5hYmxlZD0xCi0KLSMgbG9nZCBpcyBlbmFibGVkCi0jIFRPRE8oYi8yMDA5MTQ1NjQpIEZpbHRlciBvbmx5IHRoZSBsb2cgZnJvbSB0aGUgYXBwCi1hbmRyb2lkYm9vdC5sb2dkLmVuYWJsZWQ9MQpkaWZmIC0tZ2l0IGEvbWljcm9kcm9pZC9ib290Y29uZmlnLmZ1bGxfZGVidWdnYWJsZSBiL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5mdWxsX2RlYnVnZ2FibGUKaW5kZXggMGJkZDgxMC4uNTgzMDYwYiAxMDA2NDQKLS0tIGEvbWljcm9kcm9pZC9ib290Y29uZmlnLmZ1bGxfZGVidWdnYWJsZQorKysgYi9taWNyb2Ryb2lkL2Jvb3Rjb25maWcuZnVsbF9kZWJ1Z2dhYmxlCkBAIC0xMiw2ICsxMiwzIEBACiAjIHJvLmFkYi5zZWN1cmUgaXMgc3RpbGwgMCAoc2VlIGJ1aWxkLnByb3ApIHdoaWNoIG1lYW5zIHRoYXQgYWRiZCBpcyBzdGFydGVkCiAjIHVucm9vdGVkIGJ5IGRlZmF1bHQuIFRvIHJvb3QsIGRldmVsb3BlciBzaG91bGQgZXhwbGljaXRseSBleGVjdXRlIGBhZGIgcm9vdGAuCiBhbmRyb2lkYm9vdC5hZGIuZW5hYmxlZD0xCi0KLSMgbG9nZCBpcyBlbmFibGVkCi1hbmRyb2lkYm9vdC5sb2dkLmVuYWJsZWQ9MQpkaWZmIC0tZ2l0IGEvbWljcm9kcm9pZC9ib290Y29uZmlnLm5vcm1hbCBiL21pY3JvZHJvaWQvYm9vdGNvbmZpZy5ub3JtYWwKaW5kZXggZWE4MzI4Ny4uZWM4NWYwZCAxMDA2NDQKLS0tIGEvbWljcm9kcm9pZC9ib290Y29uZmlnLm5vcm1hbAorKysgYi9taWNyb2Ryb2lkL2Jvb3Rjb25maWcubm9ybWFsCkBAIC0xMiw2ICsxMiwzIEBACiAKICMgQURCIGlzIG5vdCBlbmFibGVkLgogYW5kcm9pZGJvb3QuYWRiLmVuYWJsZWQ9MAotCi0jIGxvZ2QgaXMgbm90IGVuYWJsZWQKLWFuZHJvaWRib290LmxvZ2QuZW5hYmxlZD0wCmRpZmYgLS1naXQgYS9taWNyb2Ryb2lkL2luaXQucmMgYi9taWNyb2Ryb2lkL2luaXQucmMKaW5kZXggNDJhYTk4My4uY2Q3MzMyYiAxMDA2NDQKLS0tIGEvbWljcm9kcm9pZC9pbml0LnJjCisrKyBiL21pY3JvZHJvaWQvaW5pdC5yYwpAQCAtMTcsNiArMTcsMTQgQEAKIAogICAgIHN0YXJ0IHVldmVudGQKIAorIyBJZiBWTSBpcyBkZWJ1Z2dhYmxlLCBzZW5kIGxvZ3MgdG8gb3V0c2lkZSBvdCB0aGUgVk0gdmlhIHRoZSBzZXJpYWwgY29uc29sZS4KKyMgSWYgbm9uLWRlYnVnZ2FibGUsIGxvZ3MgYXJlIGludGVybmFsbHkgY29uc3VtZWQgYXQgL2Rldi9udWxsCitvbiBlYXJseS1pbml0ICYmIHByb3BlcnR5OnJvLmJvb3QubWljcm9kcm9pZC5hcHBfZGVidWdnYWJsZT0xCisgICAgc2V0cHJvcCByby5sb2cuZmlsZV9sb2dnZXIucGF0aCAvZGV2L2h2YzIKKworb24gZWFybHktaW5pdCAmJiBwcm9wZXJ0eTpyby5ib290Lm1pY3JvZHJvaWQuYXBwX2RlYnVnZ2FibGU9MAorICAgIHNldHByb3Agcm8ubG9nLmZpbGVfbG9nZ2VyLnBhdGggL2Rldi9udWxsCisKIG9uIGluaXQKICAgICAjIE1vdW50IGJpbmRlcmZzCiAgICAgbWtkaXIgL2Rldi9iaW5kZXJmcwpAQCAtNjIsMTIgKzcwLDYgQEAKICAgICBzdGFydCB2ZW5kb3IuZGljZS1taWNyb2Ryb2lkCiAgICAgc3RhcnQgZGljZWQKIAotb24gaW5pdCAmJiBwcm9wZXJ0eTpyby5ib290LmxvZ2QuZW5hYmxlZD0xCi0gICAgIyBTdGFydCBsb2dkIGJlZm9yZSBhbnkgb3RoZXIgc2VydmljZXMgcnVuIHRvIGVuc3VyZSB3ZSBjYXB0dXJlIGFsbCBvZiB0aGVpciBsb2dzLgotICAgICMgVE9ETyhiLzIxNzc5NjIyOSkgc2V0IGZpbHRlcnNwZWMgaWYgZGVidWdfbGV2ZWwgaXMgYXBwX29ubHkKLSAgICBzdGFydCBsb2dkCi0gICAgc3RhcnQgc2VyaWFsbG9nZ2luZwotCiBvbiBpbml0CiAgICAgbWtkaXIgL21udC9hcGsgMDc1NSBzeXN0ZW0gc3lzdGVtCiAgICAgbWtkaXIgL21udC9leHRyYS1hcGsgMDc1NSByb290IHJvb3QKQEAgLTk5LDEwICsxMDEsNiBAQAogb24gaW5pdCAmJiBwcm9wZXJ0eTpyby5ib290LmFkYi5lbmFibGVkPTEKICAgICBzdGFydCBhZGJkCiAKLW9uIGxvYWRfcGVyc2lzdF9wcm9wc19hY3Rpb24gJiYgcHJvcGVydHk6cm8uYm9vdC5sb2dkLmVuYWJsZWQ9MQotICAgIHN0YXJ0IGxvZ2QKLSAgICBzdGFydCBsb2dkLXJlaW5pdAotCiAjIE1vdW50IGZpbGVzeXN0ZW1zIGFuZCBzdGFydCBjb3JlIHN5c3RlbSBzZXJ2aWNlcy4KIG9uIGxhdGUtaW5pdAogICAgIHRyaWdnZXIgZWFybHktZnMKQEAgLTIwNiwxMyArMjA0LDMgQEAKICAgICBzZWNsYWJlbCB1OnI6c2hlbGw6czAKICAgICBzZXRlbnYgSE9TVE5BTUUgY29uc29sZQogCi1zZXJ2aWNlIHNlcmlhbGxvZ2dpbmcgL3N5c3RlbS9iaW4vbG9nY2F0IC1iIGFsbCAtdiB0aHJlYWR0aW1lIC1mIC9kZXYvaHZjMiAqOlYKLSAgICBkaXNhYmxlZAotICAgIHVzZXIgbG9nZAotICAgIGdyb3VwIHJvb3QgbG9nZAotCi1vbiBmcwotICAgIHdyaXRlIC9kZXYvZXZlbnQtbG9nLXRhZ3MgIiMgY29udGVudCBvd25lZCBieSBsb2dkCi0iCi0gICAgY2hvd24gbG9nZCBsb2dkIC9kZXYvZXZlbnQtbG9nLXRhZ3MKLSAgICBjaG1vZCAwNjQ0IC9kZXYvZXZlbnQtbG9nLXRhZ3MKZGlmZiAtLWdpdCBhL21pY3JvZHJvaWQvdWV2ZW50ZC5yYyBiL21pY3JvZHJvaWQvdWV2ZW50ZC5yYwppbmRleCAzNDBhMWY3Li5mYzE2NWM4IDEwMDY0NAotLS0gYS9taWNyb2Ryb2lkL3VldmVudGQucmMKKysrIGIvbWljcm9kcm9pZC91ZXZlbnRkLnJjCkBAIC0yNiw2ICsyNiw2IEBACiAvZGV2L3R0eTAgICAgICAgICAgICAgICAgIDA2NjAgICByb290ICAgICAgIHN5c3RlbQogCiAjIFZpcnR1YWwgY29uc29sZSBmb3IgbG9nY2F0Ci0vZGV2L2h2YzIgICAgICAgICAgICAgICAgIDA2NjAgICBsb2dkICAgICAgIGxvZ2QKKy9kZXYvaHZjMiAgICAgICAgICAgICAgICAgMDY2NiAgIHN5c3RlbSAgICAgc3lzdGVtCiAKIC9kZXYvb3Blbi1kaWNlMCAgICAgICAgICAgMDY2MCAgIGRpY2VkICAgICAgZGljZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2JlbmNobWFya19ob3N0c2lkZS9qYXZhL2FuZHJvaWQvYXZmL3Rlc3QvQVZGSG9zdFRlc3RDYXNlLmphdmEgYi90ZXN0cy9iZW5jaG1hcmtfaG9zdHNpZGUvamF2YS9hbmRyb2lkL2F2Zi90ZXN0L0FWRkhvc3RUZXN0Q2FzZS5qYXZhCmluZGV4IGVlYWRhZTEuLmU1ZWVlMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2JlbmNobWFya19ob3N0c2lkZS9qYXZhL2FuZHJvaWQvYXZmL3Rlc3QvQVZGSG9zdFRlc3RDYXNlLmphdmEKKysrIGIvdGVzdHMvYmVuY2htYXJrX2hvc3RzaWRlL2phdmEvYW5kcm9pZC9hdmYvdGVzdC9BVkZIb3N0VGVzdENhc2UuamF2YQpAQCAtMzksNiArMzksNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKQEAgLTU2LDYgKzU3LDExIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSX1BST1BfTkFNRSA9CiAgICAgICAgICAgICAiZGFsdmlrLnZtLnN5c3RlbXNlcnZlcmNvbXBpbGVyZmlsdGVyIjsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09UTE9BREVSX1RJTUVfUFJPUF9OQU1FID0gInJvLmJvb3QuYm9vdHRpbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09UTE9BREVSX1BSRUZJWCA9ICJib290bG9hZGVyLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RMT0FERVJfVElNRSA9ICJib290bG9hZGVyX3RpbWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09UTE9BREVSX1BIQVNFX1NXID0gIlNXIjsKKwogICAgIC8qKiBCb290IHRpbWUgdGVzdCByZWxhdGVkIHZhcmlhYmxlcyAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUlOU1RBTExfQVBFWF9SRVRSWV9JTlRFUlZBTF9NUyA9IDUgKiAxMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUlOU1RBTExfQVBFWF9USU1FT1VUX1NFQyA9IDE1OwpAQCAtODksNzIgKzk1LDEyNCBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJvb3RFbmFibGVBbmREaXNhYmxlUEtWTSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBza2lwSWZQS1ZNU3RhdHVzU3dpdGNoTm90U3VwcG9ydGVkKCk7Ci0KLSAgICAgICAgTGlzdDxEb3VibGU+IGJvb3RXaXRoUEtWTUVuYWJsZVRpbWUgPSBuZXcgQXJyYXlMaXN0PD4oUk9VTkRfQ09VTlQpOwotICAgICAgICBMaXN0PERvdWJsZT4gYm9vdFdpdGhvdXRQS1ZNRW5hYmxlVGltZSA9IG5ldyBBcnJheUxpc3Q8PihST1VORF9DT1VOVCk7Ci0KLSAgICAgICAgZm9yIChpbnQgcm91bmQgPSAwOyByb3VuZCA8IFJPVU5EX0NPVU5UOyArK3JvdW5kKSB7Ci0KLSAgICAgICAgICAgIHNldFBLVk1TdGF0dXNXaXRoUmVib290VG9Cb290bG9hZGVyKHRydWUpOwotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwotICAgICAgICAgICAgcmVib290RnJvbUJvb3Rsb2FkZXJBbmRXYWl0Qm9vdENvbXBsZXRlZCgpOwotICAgICAgICAgICAgbG9uZyBlbGFwc2VkV2l0aFBLVk1FbmFibGUgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgZG91YmxlIGVsYXBzZWRTZWMgPSBlbGFwc2VkV2l0aFBLVk1FbmFibGUgLyBOQU5PU19JTl9TRUM7Ci0gICAgICAgICAgICBib290V2l0aFBLVk1FbmFibGVUaW1lLmFkZChlbGFwc2VkU2VjKTsKLSAgICAgICAgICAgIENMb2cuaSgiQm9vdCB0aW1lIHdpdGggUEtWTSBlbmFibGUgdG9vayAiICsgZWxhcHNlZFNlYyArICJzIik7Ci0KLSAgICAgICAgICAgIHNldFBLVk1TdGF0dXNXaXRoUmVib290VG9Cb290bG9hZGVyKGZhbHNlKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0gICAgICAgICAgICByZWJvb3RGcm9tQm9vdGxvYWRlckFuZFdhaXRCb290Q29tcGxldGVkKCk7Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWRXaXRob3V0UEtWTUVuYWJsZSA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBlbGFwc2VkU2VjID0gZWxhcHNlZFdpdGhvdXRQS1ZNRW5hYmxlIC8gTkFOT1NfSU5fU0VDOwotICAgICAgICAgICAgYm9vdFdpdGhvdXRQS1ZNRW5hYmxlVGltZS5hZGQoZWxhcHNlZFNlYyk7Ci0gICAgICAgICAgICBDTG9nLmkoIkJvb3QgdGltZSB3aXRoIFBLVk0gZGlzYWJsZSB0b29rICIgKyBlbGFwc2VkU2VjICsgInMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcG9ydE1ldHJpYyhib290V2l0aFBLVk1FbmFibGVUaW1lLCAiYm9vdF90aW1lX3dpdGhfcGt2bV9lbmFibGUiLCAicyIpOwotICAgICAgICByZXBvcnRNZXRyaWMoYm9vdFdpdGhvdXRQS1ZNRW5hYmxlVGltZSwgImJvb3RfdGltZV93aXRoX3Brdm1fZGlzYWJsZSIsICJzIik7CisgICAgcHVibGljIHZvaWQgdGVzdEJvb3RFbmFibGVQS1ZNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGVuYWJsZURpc2FibGVQS1ZNVGVzdEhlbHBlcih0cnVlKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCb290V2l0aEFuZFdpdGhvdXRDb21wT1MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzdW1lRmFsc2UoaXNDdXR0bGVmaXNoKCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RCb290RGlzYWJsZVBLVk0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZW5hYmxlRGlzYWJsZVBLVk1UZXN0SGVscGVyKGZhbHNlKTsKKyAgICB9CiAKLSAgICAgICAgTGlzdDxEb3VibGU+IGJvb3RXaXRoQ29tcE9zVGltZSA9IG5ldyBBcnJheUxpc3Q8PihST1VORF9DT1VOVCk7Ci0gICAgICAgIExpc3Q8RG91YmxlPiBib290V2l0aG91dENvbXBPc1RpbWUgPSBuZXcgQXJyYXlMaXN0PD4oUk9VTkRfQ09VTlQpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb3RXaXRoQ29tcE9TKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbXBvc1Rlc3RIZWxwZXIodHJ1ZSk7CisgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vdFdpdGhvdXRDb21wT1MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29tcG9zVGVzdEhlbHBlcihmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJvb3Rsb2FkZXJUaW1lSW5mbyhNYXA8U3RyaW5nLCBMaXN0PERvdWJsZT4+IGJvb3Rsb2FkZXJUaW1lKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGJvb3RMb2FkZXJWYWwgPSBnZXREZXZpY2UoKS5nZXRQcm9wZXJ0eShCT09UTE9BREVSX1RJTUVfUFJPUF9OQU1FKTsKKyAgICAgICAgLy8gU2FtcGxlIE91dHB1dCA6IDFCTEw6ODksMUJMRTo1OTAsMkJMTDowLDJCTEU6MTM0NCxTVzo2NzM0LEtMOjExOTMKKyAgICAgICAgaWYgKGJvb3RMb2FkZXJWYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gYm9vdExvYWRlclBoYXNlcyA9IGJvb3RMb2FkZXJWYWwuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIGRvdWJsZSBib290TG9hZGVyVG90YWxUaW1lID0gMGQ7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBib290TG9hZGVyUGhhc2UgOiBib290TG9hZGVyUGhhc2VzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gYm9vdEtleVZhbCA9IGJvb3RMb2FkZXJQaGFzZS5zcGxpdCgiOiIpOworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlcyVzIiwgQk9PVExPQURFUl9QUkVGSVgsIGJvb3RLZXlWYWxbMF0pOworCisgICAgICAgICAgICAgICAgYm9vdGxvYWRlclRpbWUuY29tcHV0ZUlmQWJzZW50KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChEb3VibGUucGFyc2VEb3VibGUoYm9vdEtleVZhbFsxXSkpOworICAgICAgICAgICAgICAgIC8vIFNXIGlzIHRoZSB0aW1lIHNwZW50IG9uIHRoZSB3YXJuaW5nIHNjcmVlbi4gU28gaWdub3JlIGl0IGluCisgICAgICAgICAgICAgICAgLy8gZmluYWwgYm9vdCB0aW1lIGNhbGN1bGF0aW9uLgorICAgICAgICAgICAgICAgIGlmIChCT09UTE9BREVSX1BIQVNFX1NXLmVxdWFsc0lnbm9yZUNhc2UoYm9vdEtleVZhbFswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb3RMb2FkZXJUb3RhbFRpbWUgKz0gRG91YmxlLnBhcnNlRG91YmxlKGJvb3RLZXlWYWxbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vdGxvYWRlclRpbWUuY29tcHV0ZUlmQWJzZW50KEJPT1RMT0FERVJfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKGJvb3RMb2FkZXJUb3RhbFRpbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEb3VibGUgZ2V0RG1lc2dCb290VGltZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENvbW1hbmRSdW5uZXIgYW5kcm9pZCA9IG5ldyBDb21tYW5kUnVubmVyKGdldERldmljZSgpKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGFuZHJvaWQucnVuKCJkbWVzZyIpOworICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcWyguKilcXF0uKnN5cy5ib290X2NvbXBsZXRlZD0xLioiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IHJlc3VsdC5zcGxpdCgiW1xyXG5dKyIpKSB7CisgICAgICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobGluZSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YobWF0Y2hlci5ncm91cCgxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmFpbGVkIHRvIGdldCBib290IHRpbWUgaW5mby4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5hYmxlRGlzYWJsZVBLVk1UZXN0SGVscGVyKGJvb2xlYW4gaXNFbmFibGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBza2lwSWZQS1ZNU3RhdHVzU3dpdGNoTm90U3VwcG9ydGVkKCk7CisKKyAgICAgICAgTGlzdDxEb3VibGU+IGJvb3REbWVzZ1RpbWUgPSBuZXcgQXJyYXlMaXN0PD4oUk9VTkRfQ09VTlQpOworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PERvdWJsZT4+IGJvb3Rsb2FkZXJUaW1lID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIHNldFBLVk1TdGF0dXNXaXRoUmVib290VG9Cb290bG9hZGVyKGlzRW5hYmxlKTsKKyAgICAgICAgcmVib290RnJvbUJvb3Rsb2FkZXJBbmRXYWl0Qm9vdENvbXBsZXRlZCgpOwogICAgICAgICBmb3IgKGludCByb3VuZCA9IDA7IHJvdW5kIDwgUk9VTkRfQ09VTlQ7ICsrcm91bmQpIHsKLQotICAgICAgICAgICAgLy8gQm9vdCB0aW1lIHdpdGggY29tcGlsYXRpb24gT1MgdGVzdC4KLSAgICAgICAgICAgIHJlSW5zdGFsbEFwZXgoUkVJTlNUQUxMX0FQRVhfVElNRU9VVF9TRUMpOwotICAgICAgICAgICAgY29tcGlsZVN0YWdlZEFwZXgoQ09NUElMRV9TVEFHRURfQVBFWF9USU1FT1VUX1NFQyk7CiAgICAgICAgICAgICBnZXREZXZpY2UoKS5ub25CbG9ja2luZ1JlYm9vdCgpOwotICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwogICAgICAgICAgICAgd2FpdEZvckJvb3RDb21wbGV0ZWQoKTsKLSAgICAgICAgICAgIGxvbmcgZWxhcHNlZFdpdGhDb21wT1MgPSBTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0OwotICAgICAgICAgICAgZG91YmxlIGVsYXBzZWRTZWMgPSBlbGFwc2VkV2l0aENvbXBPUyAvIE5BTk9TX0lOX1NFQzsKLSAgICAgICAgICAgIGJvb3RXaXRoQ29tcE9zVGltZS5hZGQoZWxhcHNlZFNlYyk7Ci0gICAgICAgICAgICBDTG9nLmkoIkJvb3QgdGltZSB3aXRoIGNvbXBpbGF0aW9uIE9TIHRvb2sgIiArIGVsYXBzZWRTZWMgKyAicyIpOwogCi0gICAgICAgICAgICAvLyBCb290IHRpbWUgd2l0aG91dCBjb21waWxhdGlvbiBPUyB0ZXN0LgotICAgICAgICAgICAgcmVJbnN0YWxsQXBleChSRUlOU1RBTExfQVBFWF9USU1FT1VUX1NFQyk7Ci0gICAgICAgICAgICBnZXREZXZpY2UoKS5ub25CbG9ja2luZ1JlYm9vdCgpOwotICAgICAgICAgICAgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKLSAgICAgICAgICAgIHdhaXRGb3JCb290Q29tcGxldGVkKCk7Ci0gICAgICAgICAgICBsb25nIGVsYXBzZWRXaXRob3V0Q29tcE9TID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKLSAgICAgICAgICAgIGVsYXBzZWRTZWMgPSBlbGFwc2VkV2l0aG91dENvbXBPUyAvIE5BTk9TX0lOX1NFQzsKLSAgICAgICAgICAgIGJvb3RXaXRob3V0Q29tcE9zVGltZS5hZGQoZWxhcHNlZFNlYyk7Ci0gICAgICAgICAgICBDTG9nLmkoIkJvb3QgdGltZSB3aXRob3V0IGNvbXBpbGF0aW9uIE9TIHRvb2sgIiArIGVsYXBzZWRTZWMgKyAicyIpOworICAgICAgICAgICAgdXBkYXRlQm9vdGxvYWRlclRpbWVJbmZvKGJvb3Rsb2FkZXJUaW1lKTsKKworICAgICAgICAgICAgZG91YmxlIGVsYXBzZWRTZWMgPSBnZXREbWVzZ0Jvb3RUaW1lKCk7CisgICAgICAgICAgICBib290RG1lc2dUaW1lLmFkZChlbGFwc2VkU2VjKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlcG9ydE1ldHJpYyhib290V2l0aENvbXBPc1RpbWUsICJib290X3RpbWVfd2l0aF9jb21wb3MiLCAicyIpOwotICAgICAgICByZXBvcnRNZXRyaWMoYm9vdFdpdGhvdXRDb21wT3NUaW1lLCAiYm9vdF90aW1lX3dpdGhvdXRfY29tcG9zIiwgInMiKTsKKyAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICIiOworICAgICAgICBpZiAoaXNFbmFibGUpIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9ICJlbmFibGUiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VmZml4ID0gImRpc2FibGUiOworICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0TWV0cmljKGJvb3REbWVzZ1RpbWUsICJkbWVzZ19ib290X3RpbWVfd2l0aF9wa3ZtXyIgKyBzdWZmaXgsICJzIik7CisgICAgICAgIHJlcG9ydEFnZ3JlZ2F0ZWRNZXRyaWNzKGJvb3Rsb2FkZXJUaW1lLAorICAgICAgICAgICAgICAgICJib290bG9hZGVyX3RpbWVfd2l0aF9wa3ZtXyIgKyBzdWZmaXgsICJtcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb21wb3NUZXN0SGVscGVyKGJvb2xlYW4gaXNXaXRoQ29tcG9zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lRmFsc2UoIlNraXAgb24gQ0Y7IHRvbyBzbG93IiwgaXNDdXR0bGVmaXNoKCkpOworCisgICAgICAgIExpc3Q8RG91YmxlPiBib290RG1lc2dUaW1lID0gbmV3IEFycmF5TGlzdDw+KFJPVU5EX0NPVU5UKTsKKworICAgICAgICBmb3IgKGludCByb3VuZCA9IDA7IHJvdW5kIDwgUk9VTkRfQ09VTlQ7ICsrcm91bmQpIHsKKyAgICAgICAgICAgIHJlSW5zdGFsbEFwZXgoUkVJTlNUQUxMX0FQRVhfVElNRU9VVF9TRUMpOworICAgICAgICAgICAgaWYgKGlzV2l0aENvbXBvcykgeworICAgICAgICAgICAgICAgIGNvbXBpbGVTdGFnZWRBcGV4KENPTVBJTEVfU1RBR0VEX0FQRVhfVElNRU9VVF9TRUMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0RGV2aWNlKCkubm9uQmxvY2tpbmdSZWJvb3QoKTsKKyAgICAgICAgICAgIHdhaXRGb3JCb290Q29tcGxldGVkKCk7CisKKyAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkU2VjID0gZ2V0RG1lc2dCb290VGltZSgpOworICAgICAgICAgICAgYm9vdERtZXNnVGltZS5hZGQoZWxhcHNlZFNlYyk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgc3VmZml4ID0gIiI7CisgICAgICAgIGlmIChpc1dpdGhDb21wb3MpIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9ICJ3aXRoX2NvbXBvcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWZmaXggPSAid2l0aG91dF9jb21wb3MiOworICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0TWV0cmljKGJvb3REbWVzZ1RpbWUsICJkbWVzZ19ib290X3RpbWVfIiArIHN1ZmZpeCwgInMiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2tpcElmUEtWTVN0YXR1c1N3aXRjaE5vdFN1cHBvcnRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3N1bWVGYWxzZShpc0N1dHRsZWZpc2goKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJTa2lwIG9uIENGOyBjYW4ndCByZWJvb3QgdG8gYm9vdGxvYWRlciIsIGlzQ3V0dGxlZmlzaCgpKTsKIAogICAgICAgICBpZiAoIWdldERldmljZSgpLmlzU3RhdGVCb290bG9hZGVyT3JGYXN0Ym9vdGQoKSkgewogICAgICAgICAgICAgZ2V0RGV2aWNlKCkucmVib290SW50b0Jvb3Rsb2FkZXIoKTsKQEAgLTE3MSwxMiArMjI5LDIyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydE1ldHJpYyhMaXN0PERvdWJsZT4gZGF0YSwgU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0KSB7CisgICAgICAgIENMb2cuZCgiUmVwb3J0IG1ldHJpYyAiICsgbmFtZSArICIoIiArIHVuaXQgKyAiKSA6ICIgKyBkYXRhLnRvU3RyaW5nKCkpOwogICAgICAgICBNYXA8U3RyaW5nLCBEb3VibGU+IHN0YXRzID0gbU1ldHJpY3NQcm9jZXNzb3IuY29tcHV0ZVN0YXRzKGRhdGEsIG5hbWUsIHVuaXQpOwogICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gZW50cnkgOiBzdGF0cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBDTG9nLmQoIkFkZCB0ZXN0IG1ldHJpY3MgIiArIGVudHJ5LmdldEtleSgpICsgIiA6ICIgKyBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgbU1ldHJpY3MuYWRkVGVzdE1ldHJpYyhlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCByZXBvcnRBZ2dyZWdhdGVkTWV0cmljcyhNYXA8U3RyaW5nLCBMaXN0PERvdWJsZT4+IGJvb3Rsb2FkZXJUaW1lLAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVuaXQpIHsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8RG91YmxlPj4gZW50cnkgOiBib290bG9hZGVyVGltZS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICByZXBvcnRNZXRyaWMoZW50cnkuZ2V0VmFsdWUoKSwgcHJlZml4ICsgIl8iICsgZW50cnkuZ2V0S2V5KCksIHVuaXQpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNldFBLVk1TdGF0dXNXaXRoUmVib290VG9Cb290bG9hZGVyKGJvb2xlYW4gaXNFbmFibGUpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIGlmICghZ2V0RGV2aWNlKCkuaXNTdGF0ZUJvb3Rsb2FkZXJPckZhc3Rib290ZCgpKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9oZWxwZXIvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2NvbW1vbi9NZXRyaWNzUHJvY2Vzc29yLmphdmEgYi90ZXN0cy9oZWxwZXIvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2NvbW1vbi9NZXRyaWNzUHJvY2Vzc29yLmphdmEKaW5kZXggYzEyYjA3ZC4uNDE1MzRmMSAxMDA2NDQKLS0tIGEvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vTWV0cmljc1Byb2Nlc3Nvci5qYXZhCisrKyBiL3Rlc3RzL2hlbHBlci9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvY29tbW9uL01ldHJpY3NQcm9jZXNzb3IuamF2YQpAQCAtMzMsMTggKzMzLDIxIEBACiAgICAgICogYSB7QGxpbmsgTWFwfSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGtleXMgZXF1YWwgdG8gW21QcmVmaXggKyBuYW1lICsKICAgICAgKiBfW21pbnxtYXh8YXZlcmFnZXxzdGRldl1fICsgdW5pdF0uCiAgICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIERvdWJsZT4gY29tcHV0ZVN0YXRzKExpc3Q8RG91YmxlPiBtZXRyaWNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQpIHsKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgRG91YmxlPiBjb21wdXRlU3RhdHMoTGlzdDw/IGV4dGVuZHMgTnVtYmVyPiBtZXRyaWNzLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgIFN0cmluZyB1bml0KSB7CiAgICAgICAgIGRvdWJsZSBzdW0gPSAwOwogICAgICAgICBkb3VibGUgbWluID0gRG91YmxlLk1BWF9WQUxVRTsKICAgICAgICAgZG91YmxlIG1heCA9IERvdWJsZS5NSU5fVkFMVUU7Ci0gICAgICAgIGZvciAoZG91YmxlIGQgOiBtZXRyaWNzKSB7CisgICAgICAgIGZvciAoTnVtYmVyIG1ldHJpYyA6IG1ldHJpY3MpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gbWV0cmljLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgICAgICBzdW0gKz0gZDsKICAgICAgICAgICAgIGlmIChtaW4gPiBkKSBtaW4gPSBkOwogICAgICAgICAgICAgaWYgKG1heCA8IGQpIG1heCA9IGQ7CiAgICAgICAgIH0KICAgICAgICAgZG91YmxlIGF2ZyA9IHN1bSAvIG1ldHJpY3Muc2l6ZSgpOwogICAgICAgICBkb3VibGUgc3FTdW0gPSAwOwotICAgICAgICBmb3IgKGRvdWJsZSBkIDogbWV0cmljcykgeworICAgICAgICBmb3IgKE51bWJlciBtZXRyaWMgOiBtZXRyaWNzKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IG1ldHJpYy5kb3VibGVWYWx1ZSgpOwogICAgICAgICAgICAgc3FTdW0gKz0gKGQgLSBhdmcpICogKGQgLSBhdmcpOwogICAgICAgICB9CiAgICAgICAgIGRvdWJsZSBzdGREZXYgPSBNYXRoLnNxcnQoc3FTdW0gLyAobWV0cmljcy5zaXplKCkgLSAxKSk7CmRpZmYgLS1naXQgYS90ZXN0cy9oZWxwZXIvc3JjL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2NvbW1vbi9Qcm9jZXNzVXRpbC5qYXZhIGIvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vUHJvY2Vzc1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFhZDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaGVscGVyL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9jb21tb24vUHJvY2Vzc1V0aWwuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5taWNyb2Ryb2lkLnRlc3QuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworLyoqIFRoaXMgY2xhc3MgcHJvdmlkZXMgcHJvY2VzcyB1dGlsaXR5IGZvciBib3RoIGRldmljZSB0ZXN0cyBhbmQgaG9zdCB0ZXN0cy4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm9jZXNzVXRpbCB7CisKKyAgICAvKiogR2V0cyBtZXRyaWNzIGtleSBhbmQgdmFsdWVzIG1hcHBpbmcgb2Ygc3BlY2lmaWVkIHByb2Nlc3MgaWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIExvbmc+IGdldFByb2Nlc3NTbWFwc1JvbGx1cCgKKyAgICAgICAgICAgIGludCBwaWQsIEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPiBzaGVsbEV4ZWN1dG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGF0aCA9ICIvcHJvYy8iICsgcGlkICsgIi9zbWFwc19yb2xsdXAiOworICAgICAgICByZXR1cm4gcGFyc2VNZW1vcnlJbmZvKHNraXBGaXJzdExpbmUoc2hlbGxFeGVjdXRvci5hcHBseSgiY2F0ICIgKyBwYXRoICsgIiB8fCB0cnVlIikpKTsKKyAgICB9CisKKyAgICAvKiogR2V0cyBwcm9jZXNzIGlkIGFuZCBwcm9jZXNzIG5hbWUgbWFwcGluZyBvZiB0aGUgZGV2aWNlICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRQcm9jZXNzTWFwKEZ1bmN0aW9uPFN0cmluZywgU3RyaW5nPiBzaGVsbEV4ZWN1dG9yKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPEludGVnZXIsIFN0cmluZz4gcHJvY2Vzc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcHMgOiBza2lwRmlyc3RMaW5lKHNoZWxsRXhlY3V0b3IuYXBwbHkoInBzIC1BbyBQSUQsTkFNRSIpKS5zcGxpdCgiXG4iKSkgeworICAgICAgICAgICAgLy8gRWFjaCBsaW5lIGlzICc8cGlkPiA8bmFtZT4nLgorICAgICAgICAgICAgLy8gRVggOiAxMTQyNCBkZXgyb2F0NjQKKyAgICAgICAgICAgIHBzID0gcHMudHJpbSgpOworICAgICAgICAgICAgaWYgKHBzLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzcGFjZSA9IHBzLmluZGV4T2YoIiAiKTsKKyAgICAgICAgICAgIFN0cmluZyBwTmFtZSA9IHBzLnN1YnN0cmluZyhzcGFjZSArIDEpOworICAgICAgICAgICAgaW50IHBJZCA9IEludGVnZXIucGFyc2VJbnQocHMuc3Vic3RyaW5nKDAsIHNwYWNlKSk7CisgICAgICAgICAgICBwcm9jZXNzTWFwLnB1dChwSWQsIHBOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9jZXNzTWFwOworICAgIH0KKworICAgIC8vIFRvIGVuc3VyZXMgdGhhdCBvbmx5IG9uZSBvYmplY3QgaXMgY3JlYXRlZCBhdCBhIHRpbWUuCisgICAgcHJpdmF0ZSBQcm9jZXNzVXRpbCgpIHt9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMb25nPiBwYXJzZU1lbW9yeUluZm8oU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gc3RhdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGxpbmUgOiBmaWxlLnNwbGl0KCJbXHJcbl0rIikpIHsKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVhY2ggbGluZSBpcyAnPG1ldHJpY3M+OiAgICAgICAgPG51bWJlcj4ga0InLgorICAgICAgICAgICAgLy8gRVggOiBQc3NfQW5vbjogICAgICAgIDcwNzEyIGtCCisgICAgICAgICAgICBpZiAobGluZS5lbmRzV2l0aCgiIGtCIikpIGxpbmUgPSBsaW5lLnN1YnN0cmluZygwLCBsaW5lLmxlbmd0aCgpIC0gMyk7CisKKyAgICAgICAgICAgIFN0cmluZ1tdIGVsZW1zID0gbGluZS5zcGxpdCgiOiIpOworICAgICAgICAgICAgc3RhdHMucHV0KGVsZW1zWzBdLnRyaW0oKSwgTG9uZy5wYXJzZUxvbmcoZWxlbXNbMV0udHJpbSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBza2lwRmlyc3RMaW5lKFN0cmluZyBzdHIpIHsKKyAgICAgICAgaW50IGluZGV4ID0gc3RyLmluZGV4T2YoIlxuIik7CisgICAgICAgIHJldHVybiAoaW5kZXggPCAwKSA/ICIiIDogc3RyLnN1YnN0cmluZyhpbmRleCArIDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2hvc3RzaWRlL2hlbHBlci9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9ob3N0L01pY3JvZHJvaWRIb3N0VGVzdENhc2VCYXNlLmphdmEgYi90ZXN0cy9ob3N0c2lkZS9oZWxwZXIvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvaG9zdC9NaWNyb2Ryb2lkSG9zdFRlc3RDYXNlQmFzZS5qYXZhCmluZGV4IDdhOWUyZWEuLjg3NWQ4OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2hvc3RzaWRlL2hlbHBlci9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9ob3N0L01pY3JvZHJvaWRIb3N0VGVzdENhc2VCYXNlLmphdmEKKysrIGIvdGVzdHMvaG9zdHNpZGUvaGVscGVyL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L2hvc3QvTWljcm9kcm9pZEhvc3RUZXN0Q2FzZUJhc2UuamF2YQpAQCAtMzY3LDEwICszNjcsMTEgQEAKICAgICAgICAgcnVuT25Ib3N0UmV0cnlpbmdPbkZhaWx1cmUoTUlDUk9EUk9JRF9DT01NQU5EX1RJTUVPVVRfTUlMTElTLAogICAgICAgICAgICAgICAgIE1JQ1JPRFJPSURfQURCX0NPTk5FQ1RfTUFYX0FUVEVNUFRTLCAiYWRiIiwgIi1zIiwgTUlDUk9EUk9JRF9TRVJJQUwsICJyb290Iik7CiAgICAgICAgIC8vIGFkYmQgcmVib290cyBhZnRlciByb290LiBTb21lIGNvbW1hbmRzIChpbmNsdWRpbmcgd2FpdC1mb3ItZGV2aWNlKSBmb2xsb3dpbmcgdGhpcyBmYWlscwotICAgICAgICAvLyB3aXRoIGVycm9yOiBjbG9zZWQuIEhlbmNlLCB3ZSBydW4gYWRiIHNoZWxsIHRydWUgaW4gbWljcm9kcm9pZCB3aXRoIHJldHJpZXMKLSAgICAgICAgLy8gYmVmb3JlIHJldHVybmluZy4KLSAgICAgICAgcnVuT25NaWNyb2Ryb2lkUmV0cnlpbmdPbkZhaWx1cmUoTUlDUk9EUk9JRF9DT01NQU5EX1RJTUVPVVRfTUlMTElTLAotICAgICAgICAgICAgICAgIE1JQ1JPRFJPSURfQURCX0NPTk5FQ1RfTUFYX0FUVEVNUFRTLCAidHJ1ZSIpOworICAgICAgICAvLyB3aXRoIGVycm9yOiBjbG9zZWQuIEhlbmNlLCB3ZSBkaXNjb25uZWN0IGFuZCByZS1jb25uZWN0IHRvIHRoZSBkZXZpY2UgYmVmb3JlIHJldHVybmluZy4KKyAgICAgICAgcnVuT25Ib3N0UmV0cnlpbmdPbkZhaWx1cmUoTUlDUk9EUk9JRF9DT01NQU5EX1RJTUVPVVRfTUlMTElTLAorICAgICAgICAgICAgICAgIE1JQ1JPRFJPSURfQURCX0NPTk5FQ1RfTUFYX0FUVEVNUFRTLCAiYWRiIiwgImRpc2Nvbm5lY3QiLCBNSUNST0RST0lEX1NFUklBTCk7CisgICAgICAgIHJ1bk9uSG9zdFJldHJ5aW5nT25GYWlsdXJlKE1JQ1JPRFJPSURfQ09NTUFORF9USU1FT1VUX01JTExJUywKKyAgICAgICAgICAgICAgICBNSUNST0RST0lEX0FEQl9DT05ORUNUX01BWF9BVFRFTVBUUywgImFkYiIsICJjb25uZWN0IiwgTUlDUk9EUk9JRF9TRVJJQUwpOwogICAgIH0KIAogICAgIC8vIEVzdGFibGlzaCBhbiBhZGIgY29ubmVjdGlvbiB0byBtaWNyb2Ryb2lkIGJ5IGxldHRpbmcgQW5kcm9pZCBmb3J3YXJkIHRoZSBjb25uZWN0aW9uIHRvCmRpZmYgLS1naXQgYS90ZXN0cy9ob3N0c2lkZS9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdENhc2UuamF2YSBiL3Rlc3RzL2hvc3RzaWRlL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L01pY3JvZHJvaWRUZXN0Q2FzZS5qYXZhCmluZGV4IGQwMTZhNjcuLjY5MjE4YTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2hvc3RzaWRlL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L01pY3JvZHJvaWRUZXN0Q2FzZS5qYXZhCisrKyBiL3Rlc3RzL2hvc3RzaWRlL2phdmEvY29tL2FuZHJvaWQvbWljcm9kcm9pZC90ZXN0L01pY3JvZHJvaWRUZXN0Q2FzZS5qYXZhCkBAIC03MDgsNiArNzA4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBUT0RPKGIvNjE4NDU0OCk6IHRvIGJlIHJlcGxhY2VkIGJ5IFByb2Nlc3NVdGlsCisgICAgLyoqCisgICAgKiBAZGVwcmVjYXRlZCB1c2UgUHJvY2Vzc1V0aWwgaW5zdGVhZC4KKyAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb25nPiBwYXJzZU1lbUluZm8oU3RyaW5nIGZpbGUpIHsKICAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gc3RhdHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGZpbGUubGluZXMoKS5mb3JFYWNoKGxpbmUgLT4gewpAQCAtNzIwLDExICs3MjUsMjEgQEAKICAgICAgICAgcmV0dXJuIHN0YXRzOwogICAgIH0KIAorICAgIC8vIFRPRE8oYi82MTg0NTQ4KTogdG8gYmUgcmVwbGFjZWQgYnkgUHJvY2Vzc1V0aWwKKyAgICAvKioKKyAgICAqIEBkZXByZWNhdGVkIHVzZSBQcm9jZXNzVXRpbCBpbnN0ZWFkLgorICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcml2YXRlIFN0cmluZyBza2lwRmlyc3RMaW5lKFN0cmluZyBzdHIpIHsKICAgICAgICAgaW50IGluZGV4ID0gc3RyLmluZGV4T2YoIlxuIik7CiAgICAgICAgIHJldHVybiAoaW5kZXggPCAwKSA/ICIiIDogc3RyLnN1YnN0cmluZyhpbmRleCArIDEpOwogICAgIH0KIAorICAgIC8vIFRPRE8oYi82MTg0NTQ4KTogdG8gYmUgcmVwbGFjZWQgYnkgUHJvY2Vzc1V0aWwKKyAgICAvKioKKyAgICAqIEBkZXByZWNhdGVkIHVzZSBQcm9jZXNzVXRpbCBpbnN0ZWFkLgorICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcml2YXRlIExpc3Q8UHJvY2Vzc0luZm8+IGdldFJ1bm5pbmdQcm9jZXNzZXNMaXN0KCkgewogICAgICAgICBMaXN0PFByb2Nlc3NJbmZvPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxQcm9jZXNzSW5mbz4oKTsKICAgICAgICAgc2tpcEZpcnN0TGluZShydW5Pbk1pY3JvZHJvaWQoInBzIiwgIi1BbyIsICJQSUQsTkFNRSIpKS5saW5lcygpLmZvckVhY2gocHMgLT4gewpAQCAtNzM5LDEwICs3NTQsMjAgQEAKICAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgfQogCisgICAgLy8gVE9ETyhiLzYxODQ1NDgpOiB0byBiZSByZXBsYWNlZCBieSBQcm9jZXNzVXRpbAorICAgIC8qKgorICAgICogQGRlcHJlY2F0ZWQgdXNlIFByb2Nlc3NVdGlsIGluc3RlYWQuCisgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByaXZhdGUgTWFwPFN0cmluZywgTG9uZz4gZ2V0UHJvY01lbUluZm8oKSB7CiAgICAgICAgIHJldHVybiBwYXJzZU1lbUluZm8ocnVuT25NaWNyb2Ryb2lkKCJjYXQiLCAiL3Byb2MvbWVtaW5mbyIpKTsKICAgICB9CiAKKyAgICAvLyBUT0RPKGIvNjE4NDU0OCk6IHRvIGJlIHJlcGxhY2VkIGJ5IFByb2Nlc3NVdGlsCisgICAgLyoqCisgICAgKiBAZGVwcmVjYXRlZCB1c2UgUHJvY2Vzc1V0aWwgaW5zdGVhZC4KKyAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb25nPiBnZXRQcm9jU21hcHNSb2xsdXAoaW50IHBpZCkgewogICAgICAgICBTdHJpbmcgcGF0aCA9ICIvcHJvYy8iICsgcGlkICsgIi9zbWFwc19yb2xsdXAiOwogICAgICAgICByZXR1cm4gIHBhcnNlTWVtSW5mbyhza2lwRmlyc3RMaW5lKHJ1bk9uTWljcm9kcm9pZCgiY2F0IiwgcGF0aCwgInx8IiwgInRydWUiKSkpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdGFway9zcmMvamF2YS9jb20vYW5kcm9pZC9taWNyb2Ryb2lkL3Rlc3QvTWljcm9kcm9pZFRlc3RzLmphdmEgYi90ZXN0cy90ZXN0YXBrL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdHMuamF2YQppbmRleCA5OWFmZTk4Li5jMjA2MGNiIDEwMDY0NAotLS0gYS90ZXN0cy90ZXN0YXBrL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdHMuamF2YQorKysgYi90ZXN0cy90ZXN0YXBrL3NyYy9qYXZhL2NvbS9hbmRyb2lkL21pY3JvZHJvaWQvdGVzdC9NaWNyb2Ryb2lkVGVzdHMuamF2YQpAQCAtNTA0LDQgKzUwNCwyMSBAQAogICAgICAgICBhc3NlcnRUaGF0KGJvb3RSZXN1bHQuZGVhdGhSZWFzb24pLmlzRXF1YWxUbygKICAgICAgICAgICAgICAgICBWaXJ0dWFsTWFjaGluZUNhbGxiYWNrLkRFQVRIX1JFQVNPTl9NSUNST0RST0lEX0lOVkFMSURfUEFZTE9BRF9DT05GSUcpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2FtZUluc3RhbmNlc1NoYXJlVGhlU2FtZVZtT2JqZWN0KCkKKyAgICAgICAgICAgIHRocm93cyBWaXJ0dWFsTWFjaGluZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVmlydHVhbE1hY2hpbmVDb25maWcuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICBtSW5uZXIubmV3Vm1Db25maWdCdWlsZGVyKCJhc3NldHMvdm1fY29uZmlnLmpzb24iKTsKKyAgICAgICAgVmlydHVhbE1hY2hpbmVDb25maWcgbm9ybWFsQ29uZmlnID0gYnVpbGRlci5kZWJ1Z0xldmVsKERlYnVnTGV2ZWwuTk9ORSkuYnVpbGQoKTsKKyAgICAgICAgVmlydHVhbE1hY2hpbmUgdm0gPSBtSW5uZXIuZm9yY2VDcmVhdGVOZXdWaXJ0dWFsTWFjaGluZSgidGVzdF92bSIsIG5vcm1hbENvbmZpZyk7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lIHZtMiA9IG1Jbm5lci5nZXRWaXJ0dWFsTWFjaGluZU1hbmFnZXIoKS5nZXQoInRlc3Rfdm0iKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh2bSkuaXNFcXVhbFRvKHZtMik7CisKKyAgICAgICAgVmlydHVhbE1hY2hpbmUgbmV3Vm0gPSBtSW5uZXIuZm9yY2VDcmVhdGVOZXdWaXJ0dWFsTWFjaGluZSgidGVzdF92bSIsIG5vcm1hbENvbmZpZyk7CisgICAgICAgIFZpcnR1YWxNYWNoaW5lIG5ld1ZtMiA9IG1Jbm5lci5nZXRWaXJ0dWFsTWFjaGluZU1hbmFnZXIoKS5nZXQoInRlc3Rfdm0iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChuZXdWbSkuaXNFcXVhbFRvKG5ld1ZtMik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh2bSkuaXNOb3RFcXVhbFRvKG5ld1ZtKTsKKyAgICB9CiB9Cg==