ZGlmZiAtLWdpdCBhL2F2YnRvb2wgYi9hdmJ0b29sCmluZGV4IDdiZTcwMjcuLmU5NTE3NzUgMTAwNzU1Ci0tLSBhL2F2YnRvb2wKKysrIGIvYXZidG9vbApAQCAtMzIyNCw3ICszMjI0LDcgQEAKIAogICBkZWYgbWFrZV9hdHhfY2VydGlmaWNhdGUoc2VsZiwgb3V0cHV0LCBhdXRob3JpdHlfa2V5X3BhdGgsIHN1YmplY3Rfa2V5X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJqZWN0X2tleV92ZXJzaW9uLCBzdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW50ZXJtZWRpYXRlX2F1dGhvcml0eSwgc2lnbmluZ19oZWxwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5LCB1c2FnZSwgc2lnbmluZ19oZWxwZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduaW5nX2hlbHBlcl93aXRoX2ZpbGVzKToKICAgICAiIiJJbXBsZW1lbnRzIHRoZSAnbWFrZV9hdHhfY2VydGlmaWNhdGUnIGNvbW1hbmQuCiAKQEAgLTMyNDYsNiArMzI0Niw3IEBACiAgICAgICAgICAgICAgICBzaG91bGQgYmUgdGhlIHNhbWUgUHJvZHVjdCBJRCBmb3VuZCBpbiB0aGUgcGVybWFuZW50IGF0dHJpYnV0ZXMuCiAgICAgICBpc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5OiBUcnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBmb3IgYW4gaW50ZXJtZWRpYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkuCisgICAgICB1c2FnZTogSWYgbm90IGVtcHR5LCBvdmVycmlkZXMgdGhlIGNlcnQgdXNhZ2Ugd2l0aCBhIGhhc2ggb2YgdGhpcyB2YWx1ZS4KICAgICAgIHNpZ25pbmdfaGVscGVyOiBQcm9ncmFtIHdoaWNoIHNpZ25zIGEgaGFzaCBhbmQgcmV0dXJucyB0aGUgc2lnbmF0dXJlLgogICAgICAgc2lnbmluZ19oZWxwZXJfd2l0aF9maWxlczogU2FtZSBhcyBzaWduaW5nX2hlbHBlciBidXQgdXNlcyBmaWxlcyBpbnN0ZWFkLgogICAgICIiIgpAQCAtMzI1NSw5ICszMjU2LDEwIEBACiAgICAgaGFzaGVyID0gaGFzaGxpYi5zaGEyNTYoKQogICAgIGhhc2hlci51cGRhdGUoc3ViamVjdCkKICAgICBzaWduZWRfZGF0YS5leHRlbmQoaGFzaGVyLmRpZ2VzdCgpKQotICAgIHVzYWdlID0gJ2NvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MudmJvb3QnCi0gICAgaWYgaXNfaW50ZXJtZWRpYXRlX2F1dGhvcml0eToKLSAgICAgIHVzYWdlICs9ICcuY2EnCisgICAgaWYgbm90IHVzYWdlOgorICAgICAgdXNhZ2UgPSAnY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy52Ym9vdCcKKyAgICAgIGlmIGlzX2ludGVybWVkaWF0ZV9hdXRob3JpdHk6CisgICAgICAgIHVzYWdlICs9ICcuY2EnCiAgICAgaGFzaGVyID0gaGFzaGxpYi5zaGEyNTYoKQogICAgIGhhc2hlci51cGRhdGUodXNhZ2UpCiAgICAgc2lnbmVkX2RhdGEuZXh0ZW5kKGhhc2hlci5kaWdlc3QoKSkKQEAgLTMzMzMsNiArMzMzNSw2NyBAQAogICAgIG91dHB1dC53cml0ZShpbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlKQogICAgIG91dHB1dC53cml0ZShwcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZSkKIAorICBkZWYgbWFrZV9hdHhfdW5sb2NrX2NyZWRlbnRpYWwoc2VsZiwgb3V0cHV0LCBpbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrX2tleV9jZXJ0aWZpY2F0ZSwgY2hhbGxlbmdlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxvY2tfa2V5X3BhdGgsIHNpZ25pbmdfaGVscGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmluZ19oZWxwZXJfd2l0aF9maWxlcyk6CisgICAgIiIiSW1wbGVtZW50cyB0aGUgJ21ha2VfYXR4X3VubG9ja19jcmVkZW50aWFsJyBjb21tYW5kLgorCisgICAgQW5kcm9pZCBUaGluZ3MgdW5sb2NrIGNyZWRlbnRpYWxzIGNhbiBiZSB1c2VkIHRvIGF1dGhvcml6ZSB0aGUgdW5sb2NrIG9mIEFWQgorICAgIG9uIGEgZGV2aWNlLiBUaGVzZSBjcmVkZW50aWFscyBhcmUgcHJlc2VudGVkIHRvIGFuIEFuZHJvaWQgVGhpbmdzIGJvb3Rsb2FkZXIKKyAgICB2aWEgdGhlIGZhc3Rib290IGludGVyZmFjZSBpbiByZXNwb25zZSB0byBhIDE2LWJ5dGUgY2hhbGxlbmdlLiBUaGlzIG1ldGhvZAorICAgIGNyZWF0ZXMgYWxsIGZpZWxkcyBvZiB0aGUgY3JlZGVudGlhbCBleGNlcHQgdGhlIGNoYWxsZW5nZSBzaWduYXR1cmUgZmllbGQKKyAgICAod2hpY2ggaXMgdGhlIGxhc3QgZmllbGQpIGFuZCBjYW4gb3B0aW9uYWxseSBjcmVhdGUgdGhlIGNoYWxsZW5nZSBzaWduYXR1cmUKKyAgICBmaWVsZCBhcyB3ZWxsIGlmIGEgY2hhbGxlbmdlIGFuZCB0aGUgdW5sb2NrX2tleV9wYXRoIGlzIHByb3ZpZGVkLgorCisgICAgQXJndW1lbnRzOgorICAgICAgb3V0cHV0OiBUaGUgY3JlZGVudGlhbCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlIG9uIHN1Y2Nlc3MuCisgICAgICBpbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlOiBBIGNlcnRpZmljYXRlIGZpbGUgYXMgb3V0cHV0IGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX2F0eF9jZXJ0aWZpY2F0ZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5IHNldCB0byB0cnVlLgorICAgICAgdW5sb2NrX2tleV9jZXJ0aWZpY2F0ZTogQSBjZXJ0aWZpY2F0ZSBmaWxlIGFzIG91dHB1dCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9hdHhfY2VydGlmaWNhdGUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW50ZXJtZWRpYXRlX2F1dGhvcml0eSBzZXQgdG8gZmFsc2UgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2Ugc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy52Ym9vdC51bmxvY2snLgorICAgICAgY2hhbGxlbmdlX3BhdGg6IFtvcHRpb25hbF0gQSBwYXRoIHRvIHRoZSBjaGFsbGVuZ2UgdG8gc2lnbi4KKyAgICAgIHVubG9ja19rZXlfcGF0aDogW29wdGlvbmFsXSBBIFBFTSBmaWxlIHBhdGggd2l0aCB0aGUgdW5sb2NrIHByaXZhdGUga2V5LgorICAgICAgc2lnbmluZ19oZWxwZXI6IFByb2dyYW0gd2hpY2ggc2lnbnMgYSBoYXNoIGFuZCByZXR1cm5zIHRoZSBzaWduYXR1cmUuCisgICAgICBzaWduaW5nX2hlbHBlcl93aXRoX2ZpbGVzOiBTYW1lIGFzIHNpZ25pbmdfaGVscGVyIGJ1dCB1c2VzIGZpbGVzIGluc3RlYWQuCisKKyAgICBSYWlzZXM6CisgICAgICBBdmJFcnJvcjogSWYgYW4gYXJndW1lbnQgaXMgaW5jb3JyZWN0LgorICAgICIiIgorICAgIEVYUEVDVEVEX0NFUlRJRklDQVRFX1NJWkUgPSAxNjIwCisgICAgRVhQRUNURURfQ0hBTExFTkdFX1NJWkUgPSAxNgorICAgIGlmIGxlbihpbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlKSAhPSBFWFBFQ1RFRF9DRVJUSUZJQ0FURV9TSVpFOgorICAgICAgcmFpc2UgQXZiRXJyb3IoJ0ludmFsaWQgaW50ZXJtZWRpYXRlIGtleSBjZXJ0aWZpY2F0ZSBsZW5ndGguJykKKyAgICBpZiBsZW4odW5sb2NrX2tleV9jZXJ0aWZpY2F0ZSkgIT0gRVhQRUNURURfQ0VSVElGSUNBVEVfU0laRToKKyAgICAgIHJhaXNlIEF2YkVycm9yKCdJbnZhbGlkIHByb2R1Y3Qga2V5IGNlcnRpZmljYXRlIGxlbmd0aC4nKQorICAgIGNoYWxsZW5nZSA9IGJ5dGVhcnJheSgpCisgICAgaWYgY2hhbGxlbmdlX3BhdGg6CisgICAgICB3aXRoIG9wZW4oY2hhbGxlbmdlX3BhdGgsICdyJykgYXMgZjoKKyAgICAgICAgY2hhbGxlbmdlID0gZi5yZWFkKCkKKyAgICAgIGlmIGxlbihjaGFsbGVuZ2UpICE9IEVYUEVDVEVEX0NIQUxMRU5HRV9TSVpFOgorICAgICAgICByYWlzZSBBdmJFcnJvcignSW52YWxpZCB1bmxvY2sgY2hhbGxlbmdlIGxlbmd0aC4nKQorICAgIG91dHB1dC53cml0ZShzdHJ1Y3QucGFjaygnPEknLCAxKSkgICMgRm9ybWF0IFZlcnNpb24KKyAgICBvdXRwdXQud3JpdGUoaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZSkKKyAgICBvdXRwdXQud3JpdGUodW5sb2NrX2tleV9jZXJ0aWZpY2F0ZSkKKyAgICBpZiBjaGFsbGVuZ2VfcGF0aCBhbmQgdW5sb2NrX2tleV9wYXRoOgorICAgICAgc2lnbmF0dXJlID0gYnl0ZWFycmF5KCkKKyAgICAgIHBhZGRpbmdfYW5kX2hhc2ggPSBieXRlYXJyYXkoKQorICAgICAgYWxnb3JpdGhtX25hbWUgPSAnU0hBNTEyX1JTQTQwOTYnCisgICAgICBhbGcgPSBBTEdPUklUSE1TW2FsZ29yaXRobV9uYW1lXQorICAgICAgaGFzaGVyID0gaGFzaGxpYi5zaGE1MTIoKQorICAgICAgcGFkZGluZ19hbmRfaGFzaC5leHRlbmQoYWxnLnBhZGRpbmcpCisgICAgICBoYXNoZXIudXBkYXRlKGNoYWxsZW5nZSkKKyAgICAgIHBhZGRpbmdfYW5kX2hhc2guZXh0ZW5kKGhhc2hlci5kaWdlc3QoKSkKKyAgICAgIHNpZ25hdHVyZS5leHRlbmQocmF3X3NpZ24oc2lnbmluZ19oZWxwZXIsIHNpZ25pbmdfaGVscGVyX3dpdGhfZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGcuc2lnbmF0dXJlX251bV9ieXRlcywgdW5sb2NrX2tleV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2FuZF9oYXNoKSkKKyAgICAgIG91dHB1dC53cml0ZShzaWduYXR1cmUpCisKIAogZGVmIGNhbGNfaGFzaF9sZXZlbF9vZmZzZXRzKGltYWdlX3NpemUsIGJsb2NrX3NpemUsIGRpZ2VzdF9zaXplKToKICAgIiIiQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIG9mIGFsbCB0aGUgaGFzaC1sZXZlbHMgaW4gYSBNZXJrbGUtdHJlZS4KQEAgLTM4NDYsNiArMzkwOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdHZW5lcmF0ZSBhbiBpbnRlcm1lZGlhdGUgYXV0aG9yaXR5ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2VydGlmaWNhdGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXVzYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnT3ZlcnJpZGUgdXNhZ2Ugd2l0aCBhIGhhc2ggb2YgdGhlIHByb3ZpZGVkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKICAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdXRob3JpdHlfa2V5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGF1dGhvcml0eSBSU0EgcHJpdmF0ZSBrZXkgZmlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UpCkBAIC0zODk1LDYgKzM5NjIsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQogICAgIHN1Yl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9c2VsZi5tYWtlX2F0eF9tZXRhZGF0YSkKIAorICAgIHN1Yl9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoCisgICAgICAgICdtYWtlX2F0eF91bmxvY2tfY3JlZGVudGlhbCcsCisgICAgICAgIGhlbHA9J0NyZWF0ZSBhbiBBbmRyb2lkIFRoaW5ncyBlWHRlbnNpb24gKEFUWCkgdW5sb2NrIGNyZWRlbnRpYWwuJykKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1dyaXRlIGNyZWRlbnRpYWwgdG8gZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgnd2InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PXN5cy5zdGRvdXQpCisgICAgc3ViX3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBpbnRlcm1lZGlhdGUga2V5IGNlcnRpZmljYXRlIGZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS11bmxvY2tfa2V5X2NlcnRpZmljYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIHVubG9jayBrZXkgY2VydGlmaWNhdGUgZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNoYWxsZW5nZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byB0aGUgY2hhbGxlbmdlIHRvIHNpZ24gKG9wdGlvbmFsKS4gSWYgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgbm90IHByb3ZpZGVkIHRoZSBjaGFsbGVuZ2Ugc2lnbmF0dXJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWVsZCBpcyBvbWl0dGVkIGFuZCBjYW4gYmUgY29uY2F0ZW5hdGVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYXRlci4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXVubG9ja19rZXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gdW5sb2NrIGtleSAob3B0aW9uYWwpLiBNdXN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm92aWRlZCBpZiB1c2luZyAtLWNoYWxsZW5nZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIHN1Yl9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNpZ25pbmdfaGVscGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGhlbHBlciB1c2VkIGZvciBzaWduaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdBUFAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zaWduaW5nX2hlbHBlcl93aXRoX2ZpbGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIGhlbHBlciB1c2VkIGZvciBzaWduaW5nIHVzaW5nIGZpbGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSdBUFAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBzdWJfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXNlbGYubWFrZV9hdHhfdW5sb2NrX2NyZWRlbnRpYWwpCisKICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndlsxOl0pCiAgICAgdHJ5OgogICAgICAgYXJncy5mdW5jKGFyZ3MpCkBAIC00MDE3LDYgKzQxMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3ViamVjdF9rZXlfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN1YmplY3QucmVhZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3ViamVjdF9pc19pbnRlcm1lZGlhdGVfYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MudXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zaWduaW5nX2hlbHBlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNpZ25pbmdfaGVscGVyX3dpdGhfZmlsZXMpCiAKQEAgLTQwMzIsNiArNDEzNywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5yZWFkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5wcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZS5yZWFkKCkpCiAKKyAgZGVmIG1ha2VfYXR4X3VubG9ja19jcmVkZW50aWFsKHNlbGYsIGFyZ3MpOgorICAgICIiIkltcGxlbWVudHMgdGhlICdtYWtlX2F0eF91bmxvY2tfY3JlZGVudGlhbCcgc3ViLWNvbW1hbmQuIiIiCisgICAgc2VsZi5hdmIubWFrZV9hdHhfdW5sb2NrX2NyZWRlbnRpYWwoCisgICAgICAgIGFyZ3Mub3V0cHV0LAorICAgICAgICBhcmdzLmludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUucmVhZCgpLAorICAgICAgICBhcmdzLnVubG9ja19rZXlfY2VydGlmaWNhdGUucmVhZCgpLAorICAgICAgICBhcmdzLmNoYWxsZW5nZSwKKyAgICAgICAgYXJncy51bmxvY2tfa2V5LAorICAgICAgICBhcmdzLnNpZ25pbmdfaGVscGVyLAorICAgICAgICBhcmdzLnNpZ25pbmdfaGVscGVyX3dpdGhfZmlsZXMpCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgdG9vbCA9IEF2YlRvb2woKQpkaWZmIC0tZ2l0IGEvbGliYXZiX2F0eC9hdmJfYXR4X29wcy5oIGIvbGliYXZiX2F0eC9hdmJfYXR4X29wcy5oCmluZGV4IDE4MjUxN2YuLjUzYzg5OGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Yl9hdHgvYXZiX2F0eF9vcHMuaAorKysgYi9saWJhdmJfYXR4L2F2Yl9hdHhfb3BzLmgKQEAgLTY2LDYgKzY2LDE1IEBACiAgIHZvaWQgKCpzZXRfa2V5X3ZlcnNpb24pKEF2YkF0eE9wcyogYXR4X29wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXlfdmVyc2lvbik7CisKKyAgLyogR2VuZXJhdGVzIHxudW1fYnl0ZXN8IHJhbmRvbSBieXRlcyBhbmQgc3RvcmVzIHRoZW0gaW4gfG91dHB1dHwsCisgICAqIHdoaWNoIG11c3QgcG9pbnQgdG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHRoZSBieXRlcy4KKyAgICoKKyAgICogUmV0dXJucyBBVkJfSU9fUkVTVUxUX09LIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgQXZiSU9SZXN1bHQgKCpnZXRfcmFuZG9tKShBdmJBdHhPcHMqIGF0eF9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQpOwogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9saWJhdmJfYXR4L2F2Yl9hdHhfdHlwZXMuaCBiL2xpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oCmluZGV4IDZkNjk4NTkuLmU3OGJiZmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oCisrKyBiL2xpYmF2Yl9hdHgvYXZiX2F0eF90eXBlcy5oCkBAIC0zOSw2ICszOSw5IEBACiAvKiBTaXplIGluIGJ5dGVzIG9mIGFuIEFuZHJvaWQgVGhpbmdzIHByb2R1Y3QgSUQuICovCiAjZGVmaW5lIEFWQl9BVFhfUFJPRFVDVF9JRF9TSVpFIDE2CiAKKy8qIFNpemUgaW4gYnl0ZXMgb2YgYW4gQW5kcm9pZCBUaGluZ3MgdW5sb2NrIGNoYWxsZW5nZS4gKi8KKyNkZWZpbmUgQVZCX0FUWF9VTkxPQ0tfQ0hBTExFTkdFX1NJWkUgMTYKKwogLyogU2l6ZSBpbiBieXRlcyBvZiBhIHNlcmlhbGl6ZWQgcHVibGljIGtleSB3aXRoIGEgNDA5Ni1iaXQgbW9kdWx1cy4gKi8KICNkZWZpbmUgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkUgKHNpemVvZihBdmJSU0FQdWJsaWNLZXlIZWFkZXIpICsgMTAyNCkKIApAQCAtNzEsNiArNzQsMjEgQEAKICAgQXZiQXR4Q2VydGlmaWNhdGUgcHJvZHVjdF9zaWduaW5nX2tleV9jZXJ0aWZpY2F0ZTsKIH0gQVZCX0FUVFJfUEFDS0VEIEF2YkF0eFB1YmxpY0tleU1ldGFkYXRhOwogCisvKiBEYXRhIHN0cnVjdHVyZSBvZiBhbiBBbmRyb2lkIFRoaW5ncyB1bmxvY2sgY2hhbGxlbmdlLiAqLwordHlwZWRlZiBzdHJ1Y3QgQXZiQXR4VW5sb2NrQ2hhbGxlbmdlIHsKKyAgdWludDMyX3QgdmVyc2lvbjsKKyAgdWludDhfdCBwcm9kdWN0X2lkX2hhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CisgIHVpbnQ4X3QgY2hhbGxlbmdlW0FWQl9BVFhfVU5MT0NLX0NIQUxMRU5HRV9TSVpFXTsKK30gQVZCX0FUVFJfUEFDS0VEIEF2YkF0eFVubG9ja0NoYWxsZW5nZTsKKworLyogRGF0YSBzdHJ1Y3R1cmUgb2YgYW4gQW5kcm9pZCBUaGluZ3MgdW5sb2NrIGNyZWRlbnRpYWwuICovCit0eXBlZGVmIHN0cnVjdCBBdmJBdHhVbmxvY2tDcmVkZW50aWFsIHsKKyAgdWludDMyX3QgdmVyc2lvbjsKKyAgQXZiQXR4Q2VydGlmaWNhdGUgcHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlOworICBBdmJBdHhDZXJ0aWZpY2F0ZSBwcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGU7CisgIHVpbnQ4X3QgY2hhbGxlbmdlX3NpZ25hdHVyZVtBVkJfUlNBNDA5Nl9OVU1fQllURVNdOworfSBBVkJfQVRUUl9QQUNLRUQgQXZiQXR4VW5sb2NrQ3JlZGVudGlhbDsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5jIGIvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmMKaW5kZXggNzhjZjc3NC4uZjNjMWQ5NiAxMDA2NDQKLS0tIGEvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmMKKysrIGIvbGliYXZiX2F0eC9hdmJfYXR4X3ZhbGlkYXRlLmMKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlIDxsaWJhdmIvYXZiX3N5c2RlcHMuaD4KICNpbmNsdWRlIDxsaWJhdmIvYXZiX3V0aWwuaD4KIAorLyogVGhlIG1vc3QgcmVjZW50IHVubG9jayBjaGFsbGVuZ2UgZ2VuZXJhdGVkLiAqLworc3RhdGljIHVpbnQ4X3QgbGFzdF91bmxvY2tfY2hhbGxlbmdlW0FWQl9BVFhfVU5MT0NLX0NIQUxMRU5HRV9TSVpFXTsKKwogLyogQ29tcHV0ZXMgdGhlIFNIQTI1NiB8aGFzaHwgb2YgfGxlbmd0aHwgYnl0ZXMgb2YgfGRhdGF8LiAqLwogc3RhdGljIHZvaWQgc2hhMjU2KGNvbnN0IHVpbnQ4X3QqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoLApAQCAtNTksNyArNjIsNyBAQAogLyogVmVyaWZpZXMgc3RydWN0dXJlIGFuZCB8ZXhwZWN0ZWRfaGFzaHwgb2YgcGVybWFuZW50IHxhdHRyaWJ1dGVzfC4gKi8KIHN0YXRpYyBib29sIHZlcmlmeV9wZXJtYW5lbnRfYXR0cmlidXRlcygKICAgICBjb25zdCBBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKiBhdHRyaWJ1dGVzLAotICAgIHVpbnQ4X3QgZXhwZWN0ZWRfaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgeworICAgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRfaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXSkgewogICB1aW50OF90IGhhc2hbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CiAKICAgaWYgKGF0dHJpYnV0ZXMtPnZlcnNpb24gIT0gMSkgewpAQCAtNzUsMTAgKzc4LDExIEBACiB9CiAKIC8qIFZlcmlmaWVzIHRoZSBmb3JtYXQsIGtleSB2ZXJzaW9uLCB1c2FnZSwgYW5kIHNpZ25hdHVyZSBvZiBhIGNlcnRpZmljYXRlLiAqLwotc3RhdGljIGJvb2wgdmVyaWZ5X2NlcnRpZmljYXRlKEF2YkF0eENlcnRpZmljYXRlKiBjZXJ0aWZpY2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF1dGhvcml0eVtBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWluaW11bV9rZXlfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGV4cGVjdGVkX3VzYWdlW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdKSB7CitzdGF0aWMgYm9vbCB2ZXJpZnlfY2VydGlmaWNhdGUoCisgICAgY29uc3QgQXZiQXR4Q2VydGlmaWNhdGUqIGNlcnRpZmljYXRlLAorICAgIGNvbnN0IHVpbnQ4X3QgYXV0aG9yaXR5W0FWQl9BVFhfUFVCTElDX0tFWV9TSVpFXSwKKyAgICB1aW50NjRfdCBtaW5pbXVtX2tleV92ZXJzaW9uLAorICAgIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRfdXNhZ2VbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV0pIHsKICAgY29uc3QgQXZiQWxnb3JpdGhtRGF0YSogYWxnb3JpdGhtX2RhdGE7CiAgIHVpbnQ4X3QgY2VydGlmaWNhdGVfaGFzaFtBVkJfU0hBNTEyX0RJR0VTVF9TSVpFXTsKIApAQCAtMTE1LDkgKzExOSwxMCBAQAogfQogCiAvKiBWZXJpZmllcyBzaWduYXR1cmUgYW5kIGZpZWxkcyBvZiBhIFBJSyBjZXJ0aWZpY2F0ZS4gKi8KLXN0YXRpYyBib29sIHZlcmlmeV9waWtfY2VydGlmaWNhdGUoQXZiQXR4Q2VydGlmaWNhdGUqIGNlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGF1dGhvcml0eVtBVkJfQVRYX1BVQkxJQ19LRVlfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG1pbmltdW1fdmVyc2lvbikgeworc3RhdGljIGJvb2wgdmVyaWZ5X3Bpa19jZXJ0aWZpY2F0ZSgKKyAgICBjb25zdCBBdmJBdHhDZXJ0aWZpY2F0ZSogY2VydGlmaWNhdGUsCisgICAgY29uc3QgdWludDhfdCBhdXRob3JpdHlbQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVdLAorICAgIHVpbnQ2NF90IG1pbmltdW1fdmVyc2lvbikgewogICB1aW50OF90IGV4cGVjdGVkX3VzYWdlW0FWQl9TSEEyNTZfRElHRVNUX1NJWkVdOwogCiAgIHNoYTI1Nl9zdHIoImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MudmJvb3QuY2EiLCBleHBlY3RlZF91c2FnZSk7CkBAIC0xMzEsMTAgKzEzNiwxMCBAQAogCiAvKiBWZXJpZmllcyBzaWduYXR1cmUgYW5kIGZpZWxkcyBvZiBhIFBTSyBjZXJ0aWZpY2F0ZS4gKi8KIHN0YXRpYyBib29sIHZlcmlmeV9wc2tfY2VydGlmaWNhdGUoCi0gICAgQXZiQXR4Q2VydGlmaWNhdGUqIGNlcnRpZmljYXRlLAotICAgIHVpbnQ4X3QgYXV0aG9yaXR5W0FWQl9BVFhfUFVCTElDX0tFWV9TSVpFXSwKKyAgICBjb25zdCBBdmJBdHhDZXJ0aWZpY2F0ZSogY2VydGlmaWNhdGUsCisgICAgY29uc3QgdWludDhfdCBhdXRob3JpdHlbQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVdLAogICAgIHVpbnQ2NF90IG1pbmltdW1fdmVyc2lvbiwKLSAgICB1aW50OF90IHByb2R1Y3RfaWRbQVZCX0FUWF9QUk9EVUNUX0lEX1NJWkVdKSB7CisgICAgY29uc3QgdWludDhfdCBwcm9kdWN0X2lkW0FWQl9BVFhfUFJPRFVDVF9JRF9TSVpFXSkgewogICB1aW50OF90IGV4cGVjdGVkX3N1YmplY3RbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CiAgIHVpbnQ4X3QgZXhwZWN0ZWRfdXNhZ2VbQVZCX1NIQTI1Nl9ESUdFU1RfU0laRV07CiAKQEAgLTE0OCw3ICsxNTMsMzIgQEAKICAgaWYgKDAgIT0gYXZiX3NhZmVfbWVtY21wKGNlcnRpZmljYXRlLT5zaWduZWRfZGF0YS5zdWJqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfc3ViamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQl9TSEEyNTZfRElHRVNUX1NJWkUpKSB7Ci0gICAgYXZiX2Vycm9yKCJQcm9kdWN0IElEIG1pc21hdGNoLlxuIik7CisgICAgYXZiX2Vycm9yKCJQU0s6IFByb2R1Y3QgSUQgbWlzbWF0Y2guXG4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIFZlcmlmaWVzIHNpZ25hdHVyZSBhbmQgZmllbGRzIG9mIGEgUFVLIGNlcnRpZmljYXRlLiAqLworc3RhdGljIGJvb2wgdmVyaWZ5X3B1a19jZXJ0aWZpY2F0ZSgKKyAgICBjb25zdCBBdmJBdHhDZXJ0aWZpY2F0ZSogY2VydGlmaWNhdGUsCisgICAgY29uc3QgdWludDhfdCBhdXRob3JpdHlbQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkVdLAorICAgIHVpbnQ2NF90IG1pbmltdW1fdmVyc2lvbiwKKyAgICBjb25zdCB1aW50OF90IHByb2R1Y3RfaWRbQVZCX0FUWF9QUk9EVUNUX0lEX1NJWkVdKSB7CisgIHVpbnQ4X3QgZXhwZWN0ZWRfc3ViamVjdFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKyAgdWludDhfdCBleHBlY3RlZF91c2FnZVtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKworICBzaGEyNTZfc3RyKCJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnZib290LnVubG9jayIsIGV4cGVjdGVkX3VzYWdlKTsKKyAgaWYgKCF2ZXJpZnlfY2VydGlmaWNhdGUoCisgICAgICAgICAgY2VydGlmaWNhdGUsIGF1dGhvcml0eSwgbWluaW11bV92ZXJzaW9uLCBleHBlY3RlZF91c2FnZSkpIHsKKyAgICBhdmJfZXJyb3IoIkludmFsaWQgUFVLIGNlcnRpZmljYXRlLlxuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNoYTI1Nihwcm9kdWN0X2lkLCBBVkJfQVRYX1BST0RVQ1RfSURfU0laRSwgZXhwZWN0ZWRfc3ViamVjdCk7CisgIGlmICgwICE9IGF2Yl9zYWZlX21lbWNtcChjZXJ0aWZpY2F0ZS0+c2lnbmVkX2RhdGEuc3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJfU0hBMjU2X0RJR0VTVF9TSVpFKSkgeworICAgIGF2Yl9lcnJvcigiUFVLOiBQcm9kdWN0IElEIG1pc21hdGNoLlxuIik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwpAQCAtMjU0LDMgKzI4NCwxMTggQEAKICAgKm91dF9pc190cnVzdGVkID0gdHJ1ZTsKICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7CiB9CisKK0F2YklPUmVzdWx0IGF2Yl9hdHhfZ2VuZXJhdGVfdW5sb2NrX2NoYWxsZW5nZSgKKyAgICBBdmJBdHhPcHMqIGF0eF9vcHMsIEF2YkF0eFVubG9ja0NoYWxsZW5nZSogb3V0X3VubG9ja19jaGFsbGVuZ2UpIHsKKyAgQXZiSU9SZXN1bHQgcmVzdWx0ID0gQVZCX0lPX1JFU1VMVF9PSzsKKyAgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyBwZXJtYW5lbnRfYXR0cmlidXRlczsKKworICAvKiBXZSBuZWVkIHRoZSBwZXJtYW5lbnQgYXR0cmlidXRlcyB0byBjb21wdXRlIHRoZSBwcm9kdWN0X2lkX2hhc2guICovCisgIHJlc3VsdCA9IGF0eF9vcHMtPnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXMoYXR4X29wcywgJnBlcm1hbmVudF9hdHRyaWJ1dGVzKTsKKyAgaWYgKHJlc3VsdCAhPSBBVkJfSU9fUkVTVUxUX09LKSB7CisgICAgYXZiX2Vycm9yKCJGYWlsZWQgdG8gcmVhZCBwZXJtYW5lbnQgYXR0cmlidXRlcy5cbiIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmVzdWx0ID0gYXR4X29wcy0+Z2V0X3JhbmRvbSgKKyAgICAgIGF0eF9vcHMsIEFWQl9BVFhfVU5MT0NLX0NIQUxMRU5HRV9TSVpFLCBsYXN0X3VubG9ja19jaGFsbGVuZ2UpOworICBpZiAocmVzdWx0ICE9IEFWQl9JT19SRVNVTFRfT0spIHsKKyAgICBhdmJfZXJyb3IoIkZhaWxlZCB0byBnZW5lcmF0ZSByYW5kb20gY2hhbGxlbmdlLlxuIik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBvdXRfdW5sb2NrX2NoYWxsZW5nZS0+dmVyc2lvbiA9IDE7CisgIHNoYTI1NihwZXJtYW5lbnRfYXR0cmlidXRlcy5wcm9kdWN0X2lkLAorICAgICAgICAgQVZCX0FUWF9QUk9EVUNUX0lEX1NJWkUsCisgICAgICAgICBvdXRfdW5sb2NrX2NoYWxsZW5nZS0+cHJvZHVjdF9pZF9oYXNoKTsKKyAgYXZiX21lbWNweShvdXRfdW5sb2NrX2NoYWxsZW5nZS0+Y2hhbGxlbmdlLAorICAgICAgICAgICAgIGxhc3RfdW5sb2NrX2NoYWxsZW5nZSwKKyAgICAgICAgICAgICBBVkJfQVRYX1VOTE9DS19DSEFMTEVOR0VfU0laRSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0F2YklPUmVzdWx0IGF2Yl9hdHhfdmFsaWRhdGVfdW5sb2NrX2NyZWRlbnRpYWwoCisgICAgQXZiQXR4T3BzKiBhdHhfb3BzLAorICAgIGNvbnN0IEF2YkF0eFVubG9ja0NyZWRlbnRpYWwqIHVubG9ja19jcmVkZW50aWFsLAorICAgIGJvb2wqIG91dF9pc190cnVzdGVkKSB7CisgIEF2YklPUmVzdWx0IHJlc3VsdCA9IEFWQl9JT19SRVNVTFRfT0s7CisgIEF2YkF0eFBlcm1hbmVudEF0dHJpYnV0ZXMgcGVybWFuZW50X2F0dHJpYnV0ZXM7CisgIHVpbnQ4X3QgcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKyAgdWludDY0X3QgbWluaW11bV92ZXJzaW9uOworICBjb25zdCBBdmJBbGdvcml0aG1EYXRhKiBhbGdvcml0aG1fZGF0YTsKKyAgdWludDhfdCBjaGFsbGVuZ2VfaGFzaFtBVkJfU0hBNTEyX0RJR0VTVF9TSVpFXTsKKworICAvKiBCZSBwZXNzaW1pc3RpYyBzbyB3ZSBjYW4gZXhpdCBlYXJseSB3aXRob3V0IGhhdmluZyB0byByZW1lbWJlciB0byBjbGVhci4KKyAgICovCisgICpvdXRfaXNfdHJ1c3RlZCA9IGZhbHNlOworCisgIC8qIFNhbml0eSBjaGVjayB0aGUgY3JlZGVudGlhbC4gKi8KKyAgaWYgKHVubG9ja19jcmVkZW50aWFsLT52ZXJzaW9uICE9IDEpIHsKKyAgICBhdmJfZXJyb3IoIlVuc3VwcG9ydGVkIHVubG9jayBjcmVkZW50aWFsIGZvcm1hdC5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisKKyAgLyogUmVhZCBhbmQgdmVyaWZ5IHBlcm1hbmVudCBhdHRyaWJ1dGVzLiAqLworICByZXN1bHQgPSBhdHhfb3BzLT5yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzKGF0eF9vcHMsICZwZXJtYW5lbnRfYXR0cmlidXRlcyk7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgcGVybWFuZW50IGF0dHJpYnV0ZXMuXG4iKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJlc3VsdCA9IGF0eF9vcHMtPnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaChhdHhfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaCk7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgcGVybWFuZW50IGF0dHJpYnV0ZXMgaGFzaC5cbiIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKCF2ZXJpZnlfcGVybWFuZW50X2F0dHJpYnV0ZXMoJnBlcm1hbmVudF9hdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKSkgeworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisKKyAgLyogVmVyaWZ5IHRoZSBQSUsgY2VydGlmaWNhdGUuICovCisgIHJlc3VsdCA9IGF0eF9vcHMtPm9wcy0+cmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgIGF0eF9vcHMtPm9wcywgQVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgJm1pbmltdW1fdmVyc2lvbik7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgUElLIG1pbmltdW0gdmVyc2lvbi5cbiIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKCF2ZXJpZnlfcGlrX2NlcnRpZmljYXRlKAorICAgICAgICAgICZ1bmxvY2tfY3JlZGVudGlhbC0+cHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLAorICAgICAgICAgIHBlcm1hbmVudF9hdHRyaWJ1dGVzLnByb2R1Y3Rfcm9vdF9wdWJsaWNfa2V5LAorICAgICAgICAgIG1pbmltdW1fdmVyc2lvbikpIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKKyAgfQorCisgIC8qIFZlcmlmeSB0aGUgUFVLIGNlcnRpZmljYXRlLiBUaGUgbWluaW11bSB2ZXJzaW9uIGlzIHNoYXJlZCB3aXRoIHRoZSBQU0suICovCisgIHJlc3VsdCA9IGF0eF9vcHMtPm9wcy0+cmVhZF9yb2xsYmFja19pbmRleCgKKyAgICAgIGF0eF9vcHMtPm9wcywgQVZCX0FUWF9QU0tfVkVSU0lPTl9MT0NBVElPTiwgJm1pbmltdW1fdmVyc2lvbik7CisgIGlmIChyZXN1bHQgIT0gQVZCX0lPX1JFU1VMVF9PSykgeworICAgIGF2Yl9lcnJvcigiRmFpbGVkIHRvIHJlYWQgUFNLIG1pbmltdW0gdmVyc2lvbi5cbiIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgaWYgKCF2ZXJpZnlfcHVrX2NlcnRpZmljYXRlKAorICAgICAgICAgICZ1bmxvY2tfY3JlZGVudGlhbC0+cHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLAorICAgICAgICAgIHVubG9ja19jcmVkZW50aWFsLT5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEKKyAgICAgICAgICAgICAgLnB1YmxpY19rZXksCisgICAgICAgICAgbWluaW11bV92ZXJzaW9uLAorICAgICAgICAgIHBlcm1hbmVudF9hdHRyaWJ1dGVzLnByb2R1Y3RfaWQpKSB7CisgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7CisgIH0KKworICAvKiBWZXJpZnkgdGhlIGNoYWxsZW5nZSBzaWduYXR1cmUuICovCisgIGFsZ29yaXRobV9kYXRhID0gYXZiX2dldF9hbGdvcml0aG1fZGF0YShBVkJfQUxHT1JJVEhNX1RZUEVfU0hBNTEyX1JTQTQwOTYpOworICBzaGE1MTIobGFzdF91bmxvY2tfY2hhbGxlbmdlLCBBVkJfQVRYX1VOTE9DS19DSEFMTEVOR0VfU0laRSwgY2hhbGxlbmdlX2hhc2gpOworICBpZiAoIWF2Yl9yc2FfdmVyaWZ5KHVubG9ja19jcmVkZW50aWFsLT5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpZ25lZF9kYXRhLnB1YmxpY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgQVZCX0FUWF9QVUJMSUNfS0VZX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrX2NyZWRlbnRpYWwtPmNoYWxsZW5nZV9zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgQVZCX1JTQTQwOTZfTlVNX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZV9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgIEFWQl9TSEE1MTJfRElHRVNUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtX2RhdGEtPnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtX2RhdGEtPnBhZGRpbmdfbGVuKSkgeworICAgIGF2Yl9lcnJvcigiSW52YWxpZCB1bmxvY2sgY2hhbGxlbmdlIHNpZ25hdHVyZS5cbiIpOworICAgIHJldHVybiBBVkJfSU9fUkVTVUxUX09LOworICB9CisKKyAgKm91dF9pc190cnVzdGVkID0gdHJ1ZTsKKyAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7Cit9CmRpZmYgLS1naXQgYS9saWJhdmJfYXR4L2F2Yl9hdHhfdmFsaWRhdGUuaCBiL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5oCmluZGV4IGQ3NWU1Y2YuLjFhMDY5MGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5oCisrKyBiL2xpYmF2Yl9hdHgvYXZiX2F0eF92YWxpZGF0ZS5oCkBAIC03MCw2ICs3MCwyMCBAQAogICAgIHNpemVfdCBwdWJsaWNfa2V5X21ldGFkYXRhX2xlbmd0aCwKICAgICBib29sKiBvdXRfaXNfdHJ1c3RlZCk7CiAKKy8qIEdlbmVyYXRlcyBhIGNoYWxsZW5nZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gdW5sb2NrIGNyZWRlbnRpYWwuICovCitBdmJJT1Jlc3VsdCBhdmJfYXR4X2dlbmVyYXRlX3VubG9ja19jaGFsbGVuZ2UoCisgICAgQXZiQXR4T3BzKiBhdHhfb3BzLCBBdmJBdHhVbmxvY2tDaGFsbGVuZ2UqIG91dF91bmxvY2tfY2hhbGxlbmdlKTsKKworLyogVmFsaWRhdGVzIGFuIHVubG9jayBjcmVkZW50aWFsLiBUaGUgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8KKyAqIHRoZSB2YWxpZGF0aW9uIG9mIHB1YmxpYyBrZXkgbWV0YWRhdGEgZXhjZXB0IGluIHBsYWNlIG9mIHRoZSBQU0sgaXMgYSBQcm9kdWN0CisgKiBVbmxvY2sgS2V5IChQVUspIGFuZCB0aGUgY2VydGlmaWNhdGUgdXNhZ2UgZmllbGQgaWRlbnRpZmllcyBpdCBhcyBzdWNoLiBUaGUKKyAqIGNoYWxsZW5nZSBzaWduYXR1cmUgZmllbGQgaXMgdmVyaWZpZWQgYWdhaW5zdCB0aGlzIFBVSy4KKyAqLworQXZiSU9SZXN1bHQgYXZiX2F0eF92YWxpZGF0ZV91bmxvY2tfY3JlZGVudGlhbCgKKyAgICBBdmJBdHhPcHMqIGF0eF9vcHMsCisgICAgY29uc3QgQXZiQXR4VW5sb2NrQ3JlZGVudGlhbCogdW5sb2NrX2NyZWRlbnRpYWwsCisgICAgYm9vbCogb3V0X2lzX3RydXN0ZWQpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdC9hdmJfYXR4X2dlbmVyYXRlX3Rlc3RfZGF0YSBiL3Rlc3QvYXZiX2F0eF9nZW5lcmF0ZV90ZXN0X2RhdGEKaW5kZXggNTQyZjFiOC4uMWI4YmIyYiAxMDA3NTUKLS0tIGEvdGVzdC9hdmJfYXR4X2dlbmVyYXRlX3Rlc3RfZGF0YQorKysgYi90ZXN0L2F2Yl9hdHhfZ2VuZXJhdGVfdGVzdF9kYXRhCkBAIC02Myw2ICs2MywxMCBAQAogICBvcGVuc3NsIGdlbnBrZXkgLWFsZ29yaXRobSBSU0EgLXBrZXlvcHQgcnNhX2tleWdlbl9iaXRzOjQwOTYgLW91dGZvcm0gUEVNIFwKICAgICAtb3V0IHRlc3RrZXlfYXR4X3Bzay5wZW0KIGZpCitpZiBbICEgLWYgdGVzdGtleV9hdHhfcHVrLnBlbSBdOyB0aGVuCisgIG9wZW5zc2wgZ2VucGtleSAtYWxnb3JpdGhtIFJTQSAtcGtleW9wdCByc2Ffa2V5Z2VuX2JpdHM6NDA5NiAtb3V0Zm9ybSBQRU0gXAorICAgIC1vdXQgdGVzdGtleV9hdHhfcHVrLnBlbQorZmkKIAogIyBDb25zdHJ1Y3QgcGVybWFuZW50IGF0dHJpYnV0ZXMuCiAke0FWQlRPT0x9IG1ha2VfYXR4X3Blcm1hbmVudF9hdHRyaWJ1dGVzIC0tb3V0cHV0PWF0eF9wZXJtYW5lbnRfYXR0cmlidXRlcy5iaW4gXApAQCAtODUsMyArODksMTcgQEAKICAgLS1pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlPWF0eF9waWtfY2VydGlmaWNhdGUuYmluIFwKICAgLS1wcm9kdWN0X2tleV9jZXJ0aWZpY2F0ZT1hdHhfcHNrX2NlcnRpZmljYXRlLmJpbgogCisjIEdlbmVyYXRlIGEgcmFuZG9tIHVubG9jayBjaGFsbGVuZ2UuCitoZWFkIC1jIDE2IC9kZXYvdXJhbmRvbSA+IGF0eF91bmxvY2tfY2hhbGxlbmdlLmJpbgorCisjIENvbnN0cnVjdCBhIFBVSyBjZXJ0aWZpY2F0ZS4KKyR7QVZCVE9PTH0gbWFrZV9hdHhfY2VydGlmaWNhdGUgLS1vdXRwdXQ9YXR4X3B1a19jZXJ0aWZpY2F0ZS5iaW4gXAorICAtLXN1YmplY3Q9YXR4X3Byb2R1Y3RfaWQuYmluIC0tc3ViamVjdF9rZXk9dGVzdGtleV9hdHhfcHVrLnBlbSBcCisgIC0tdXNhZ2U9Y29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy52Ym9vdC51bmxvY2sgLS1zdWJqZWN0X2tleV92ZXJzaW9uIDQyIFwKKyAgLS1hdXRob3JpdHlfa2V5PXRlc3RrZXlfYXR4X3Bpay5wZW0KKworIyBDb25zdHJ1Y3QgYW4gdW5sb2NrIGNyZWRlbnRpYWwuCiske0FWQlRPT0x9IG1ha2VfYXR4X3VubG9ja19jcmVkZW50aWFsIC0tb3V0cHV0PWF0eF91bmxvY2tfY3JlZGVudGlhbC5iaW4gXAorICAtLWludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGU9YXR4X3Bpa19jZXJ0aWZpY2F0ZS5iaW4gXAorICAtLXVubG9ja19rZXlfY2VydGlmaWNhdGU9YXR4X3B1a19jZXJ0aWZpY2F0ZS5iaW4gXAorICAtLWNoYWxsZW5nZT1hdHhfdW5sb2NrX2NoYWxsZW5nZS5iaW4gLS11bmxvY2tfa2V5PXRlc3RrZXlfYXR4X3B1ay5wZW0KZGlmZiAtLWdpdCBhL3Rlc3QvYXZiX2F0eF9zbG90X3ZlcmlmeV91bml0dGVzdC5jYyBiL3Rlc3QvYXZiX2F0eF9zbG90X3ZlcmlmeV91bml0dGVzdC5jYwppbmRleCA4OTkyYzcyLi5mZjBhYmRhIDEwMDY0NAotLS0gYS90ZXN0L2F2Yl9hdHhfc2xvdF92ZXJpZnlfdW5pdHRlc3QuY2MKKysrIGIvdGVzdC9hdmJfYXR4X3Nsb3RfdmVyaWZ5X3VuaXR0ZXN0LmNjCkBAIC05Myw2ICs5MywxMCBAQAogICAgIHJldHVybiBvcHNfLnNldF9rZXlfdmVyc2lvbihyb2xsYmFja19pbmRleF9sb2NhdGlvbiwga2V5X3ZlcnNpb24pOwogICB9CiAKKyAgQXZiSU9SZXN1bHQgZ2V0X3JhbmRvbShzaXplX3QgbnVtX2J5dGVzLCB1aW50OF90KiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3BzXy5nZXRfcmFuZG9tKG51bV9ieXRlcywgb3V0cHV0KTsKKyAgfQorCiAgIHZvaWQgUnVuU2xvdFZlcmlmeSgpIHsKICAgICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKICAgICAgICAge3swLCBpbml0aWFsX3JvbGxiYWNrX3ZhbHVlX30sCmRpZmYgLS1naXQgYS90ZXN0L2F2Yl9hdHhfdmFsaWRhdGVfdW5pdHRlc3QuY2MgYi90ZXN0L2F2Yl9hdHhfdmFsaWRhdGVfdW5pdHRlc3QuY2MKaW5kZXggYzMyZWNmOC4uMjk2MDQ1YyAxMDA2NDQKLS0tIGEvdGVzdC9hdmJfYXR4X3ZhbGlkYXRlX3VuaXR0ZXN0LmNjCisrKyBiL3Rlc3QvYXZiX2F0eF92YWxpZGF0ZV91bml0dGVzdC5jYwpAQCAtNDQsNiArNDQsMTAgQEAKICAgICAidGVzdC9kYXRhL2F0eF9wZXJtYW5lbnRfYXR0cmlidXRlcy5iaW4iOwogY29uc3QgY2hhciBrUFJLUHJpdmF0ZUtleVBhdGhbXSA9ICJ0ZXN0L2RhdGEvdGVzdGtleV9hdHhfcHJrLnBlbSI7CiBjb25zdCBjaGFyIGtQSUtQcml2YXRlS2V5UGF0aFtdID0gInRlc3QvZGF0YS90ZXN0a2V5X2F0eF9waWsucGVtIjsKK2NvbnN0IGNoYXIga1BTS1ByaXZhdGVLZXlQYXRoW10gPSAidGVzdC9kYXRhL3Rlc3RrZXlfYXR4X3Bzay5wZW0iOworY29uc3QgY2hhciBrUFVLUHJpdmF0ZUtleVBhdGhbXSA9ICJ0ZXN0L2RhdGEvdGVzdGtleV9hdHhfcHVrLnBlbSI7Citjb25zdCBjaGFyIGtVbmxvY2tDaGFsbGVuZ2VQYXRoW10gPSAidGVzdC9kYXRhL2F0eF91bmxvY2tfY2hhbGxlbmdlLmJpbiI7Citjb25zdCBjaGFyIGtVbmxvY2tDcmVkZW50aWFsUGF0aFtdID0gInRlc3QvZGF0YS9hdHhfdW5sb2NrX2NyZWRlbnRpYWwuYmluIjsKIAogY2xhc3MgU2NvcGVkUlNBIHsKICBwdWJsaWM6CkBAIC0yMDQsNiArMjA4LDIyIEBACiAgICAgcmV0dXJuIG9wc18ucmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoKGhhc2gpOwogICB9CiAKKyAgdm9pZCBzZXRfa2V5X3ZlcnNpb24oc2l6ZV90IHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXlfdmVyc2lvbikgb3ZlcnJpZGUgeworICAgIG9wc18uc2V0X2tleV92ZXJzaW9uKHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLCBrZXlfdmVyc2lvbik7CisgIH0KKworICBBdmJJT1Jlc3VsdCBnZXRfcmFuZG9tKHNpemVfdCBudW1fYnl0ZXMsIHVpbnQ4X3QqIG91dHB1dCkgb3ZlcnJpZGUgeworICAgIGlmIChmYWlsX2dldF9yYW5kb21fKSB7CisgICAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgICB9CisgICAgaWYgKGZha2VfcmFuZG9tXy5zaXplKCkgPj0gbnVtX2J5dGVzKSB7CisgICAgICBtZW1jcHkob3V0cHV0LCBmYWtlX3JhbmRvbV8uZGF0YSgpLCBudW1fYnl0ZXMpOworICAgICAgcmV0dXJuIEFWQl9JT19SRVNVTFRfT0s7CisgICAgfQorICAgIHJldHVybiBvcHNfLmdldF9yYW5kb20obnVtX2J5dGVzLCBvdXRwdXQpOworICB9CisKICBwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgQXZiSU9SZXN1bHQgVmFsaWRhdGUoYm9vbCogaXNfdHJ1c3RlZCkgewogICAgIHJldHVybiBhdmJfYXR4X3ZhbGlkYXRlX3ZibWV0YV9wdWJsaWNfa2V5KApAQCAtMjE1LDYgKzIzNSwxMSBAQAogICAgICAgICBpc190cnVzdGVkKTsKICAgfQogCisgIEF2YklPUmVzdWx0IFZhbGlkYXRlVW5sb2NrKGJvb2wqIGlzX3RydXN0ZWQpIHsKKyAgICByZXR1cm4gYXZiX2F0eF92YWxpZGF0ZV91bmxvY2tfY3JlZGVudGlhbCgKKyAgICAgICAgb3BzXy5hdmJfYXR4X29wcygpLCAmdW5sb2NrX2NyZWRlbnRpYWxfLCBpc190cnVzdGVkKTsKKyAgfQorCiAgIHZvaWQgU2lnblBJS0NlcnRpZmljYXRlKCkgewogICAgIG1lbXNldChtZXRhZGF0YV8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSwKICAgICAgICAgICAgMCwKQEAgLTIzNiwxMiArMjYxLDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfLnByb2R1Y3Rfc2lnbmluZ19rZXlfY2VydGlmaWNhdGUuc2lnbmF0dXJlKSk7CiAgIH0KIAorICB2b2lkIFNpZ25VbmxvY2tDcmVkZW50aWFsUElLQ2VydGlmaWNhdGUoKSB7CisgICAgbWVtc2V0KHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmF0dXJlLAorICAgICAgICAgICAwLAorICAgICAgICAgICBBVkJfUlNBNDA5Nl9OVU1fQllURVMpOworICAgIFNjb3BlZFJTQSBrZXkoa1BSS1ByaXZhdGVLZXlQYXRoKTsKKyAgICBBU1NFUlRfVFJVRShrZXkuU2lnbigKKyAgICAgICAgJnVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEsCisgICAgICAgIHNpemVvZihBdmJBdHhDZXJ0aWZpY2F0ZVNpZ25lZERhdGEpLAorICAgICAgICB1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF9pbnRlcm1lZGlhdGVfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSkpOworICB9CisKKyAgdm9pZCBTaWduVW5sb2NrQ3JlZGVudGlhbFBVS0NlcnRpZmljYXRlKCkgeworICAgIG1lbXNldCh1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLnNpZ25hdHVyZSwKKyAgICAgICAgICAgMCwKKyAgICAgICAgICAgQVZCX1JTQTQwOTZfTlVNX0JZVEVTKTsKKyAgICBTY29wZWRSU0Ega2V5KGtQSUtQcml2YXRlS2V5UGF0aCk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgIGtleS5TaWduKCZ1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLAorICAgICAgICAgICAgICAgICBzaXplb2YoQXZiQXR4Q2VydGlmaWNhdGVTaWduZWREYXRhKSwKKyAgICAgICAgICAgICAgICAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfdW5sb2NrX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmUpKTsKKyAgfQorCisgIHZvaWQgU2lnblVubG9ja0NyZWRlbnRpYWxDaGFsbGVuZ2UoY29uc3QgY2hhcioga2V5X3BhdGgpIHsKKyAgICBtZW1zZXQodW5sb2NrX2NyZWRlbnRpYWxfLmNoYWxsZW5nZV9zaWduYXR1cmUsIDAsIEFWQl9SU0E0MDk2X05VTV9CWVRFUyk7CisgICAgU2NvcGVkUlNBIGtleShrZXlfcGF0aCk7CisgICAgQVNTRVJUX1RSVUUoa2V5LlNpZ24odW5sb2NrX2NoYWxsZW5nZV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVubG9ja19jaGFsbGVuZ2VfLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bmxvY2tfY3JlZGVudGlhbF8uY2hhbGxlbmdlX3NpZ25hdHVyZSkpOworICB9CisKKyAgYm9vbCBQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpIHsKKyAgICAvLyBTdGFnZSBhIGNoYWxsZW5nZSB0byBiZSByZW1lbWJlcmVkIGFzIHRoZSAnbW9zdCByZWNlbnQgY2hhbGxlbmdlJy4gVGhlbgorICAgIC8vIHRoZSBuZXh0IGNhbGwgdG8gdW5sb2NrIHdpdGggfHVubG9ja19jcmVkZW50aWFsX3wgaXMgZXhwZWN0ZWQgdG8gc3VjY2VlZC4KKyAgICBmYWtlX3JhbmRvbV8gPSB1bmxvY2tfY2hhbGxlbmdlXzsKKyAgICBBdmJBdHhVbmxvY2tDaGFsbGVuZ2UgY2hhbGxlbmdlOworICAgIHJldHVybiAoQVZCX0lPX1JFU1VMVF9PSyA9PQorICAgICAgICAgICAgYXZiX2F0eF9nZW5lcmF0ZV91bmxvY2tfY2hhbGxlbmdlKG9wc18uYXZiX2F0eF9vcHMoKSwgJmNoYWxsZW5nZSkpOworICB9CisKICAgQXZiQXR4UGVybWFuZW50QXR0cmlidXRlcyBhdHRyaWJ1dGVzXzsKICAgQXZiQXR4UHVibGljS2V5TWV0YWRhdGEgbWV0YWRhdGFfOwogICBib29sIGZhaWxfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc197ZmFsc2V9OwogICBib29sIGZhaWxfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoX3tmYWxzZX07CiAgIGJvb2wgZmFpbF9yZWFkX3Bpa19yb2xsYmFja19pbmRleF97ZmFsc2V9OwogICBib29sIGZhaWxfcmVhZF9wc2tfcm9sbGJhY2tfaW5kZXhfe2ZhbHNlfTsKKyAgYm9vbCBmYWlsX2dldF9yYW5kb21fe2ZhbHNlfTsKKyAgc3RkOjpzdHJpbmcgZmFrZV9yYW5kb21fOworICBBdmJBdHhVbmxvY2tDcmVkZW50aWFsIHVubG9ja19jcmVkZW50aWFsXzsKKyAgc3RkOjpzdHJpbmcgdW5sb2NrX2NoYWxsZW5nZV87CiAKICBwcml2YXRlOgogICB2b2lkIFJlYWREZWZhdWx0RGF0YSgpIHsKQEAgLTI1Myw2ICszMjEsMTMgQEAKICAgICAgICAgYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhiYXNlOjpGaWxlUGF0aChrUGVybWFuZW50QXR0cmlidXRlc1BhdGgpLCAmdG1wKSk7CiAgICAgQVNTRVJUX0VRKHRtcC5zaXplKCksIHNpemVvZihBdmJBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKSk7CiAgICAgbWVtY3B5KCZhdHRyaWJ1dGVzXywgdG1wLmRhdGEoKSwgdG1wLnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUoYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhiYXNlOjpGaWxlUGF0aChrVW5sb2NrQ2hhbGxlbmdlUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5sb2NrX2NoYWxsZW5nZV8pKTsKKyAgICBBU1NFUlRfRVEoc2l6ZV90KEFWQl9BVFhfVU5MT0NLX0NIQUxMRU5HRV9TSVpFKSwgdW5sb2NrX2NoYWxsZW5nZV8uc2l6ZSgpKTsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgYmFzZTo6UmVhZEZpbGVUb1N0cmluZyhiYXNlOjpGaWxlUGF0aChrVW5sb2NrQ3JlZGVudGlhbFBhdGgpLCAmdG1wKSk7CisgICAgQVNTRVJUX0VRKHRtcC5zaXplKCksIHNpemVvZihBdmJBdHhVbmxvY2tDcmVkZW50aWFsKSk7CisgICAgbWVtY3B5KCZ1bmxvY2tfY3JlZGVudGlhbF8sIHRtcC5kYXRhKCksIHRtcC5zaXplKCkpOwogICB9CiB9OwogCkBAIC01NjMsNiArNjM4LDMxMCBAQAogICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7CiB9CiAKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIEdlbmVyYXRlVW5sb2NrQ2hhbGxlbmdlKSB7CisgIGZha2VfcmFuZG9tXyA9IHN0ZDo6c3RyaW5nKEFWQl9BVFhfVU5MT0NLX0NIQUxMRU5HRV9TSVpFLCAnQycpOworICBBdmJBdHhVbmxvY2tDaGFsbGVuZ2UgY2hhbGxlbmdlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywKKyAgICAgICAgICAgIGF2Yl9hdHhfZ2VuZXJhdGVfdW5sb2NrX2NoYWxsZW5nZShvcHNfLmF2Yl9hdHhfb3BzKCksICZjaGFsbGVuZ2UpKTsKKyAgRVhQRUNUX0VRKDFVTCwgY2hhbGxlbmdlLnZlcnNpb24pOworICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgIG1lbWNtcChmYWtlX3JhbmRvbV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZS5jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgQVZCX0FUWF9VTkxPQ0tfQ0hBTExFTkdFX1NJWkUpKTsKKyAgdWludDhfdCBleHBlY3RlZF9waWRfaGFzaFtBVkJfU0hBMjU2X0RJR0VTVF9TSVpFXTsKKyAgU0hBMjU2KGF0dHJpYnV0ZXNfLnByb2R1Y3RfaWQsIEFWQl9BVFhfUFJPRFVDVF9JRF9TSVpFLCBleHBlY3RlZF9waWRfaGFzaCk7CisgIEVYUEVDVF9FUSgwLAorICAgICAgICAgICAgbWVtY21wKGV4cGVjdGVkX3BpZF9oYXNoLAorICAgICAgICAgICAgICAgICAgIGNoYWxsZW5nZS5wcm9kdWN0X2lkX2hhc2gsCisgICAgICAgICAgICAgICAgICAgQVZCX1NIQTI1Nl9ESUdFU1RfU0laRSkpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBHZW5lcmF0ZVVubG9ja0NoYWxsZW5nZV9Ob0F0dHJpYnV0ZXMpIHsKKyAgZmFpbF9yZWFkX3Blcm1hbmVudF9hdHRyaWJ1dGVzXyA9IHRydWU7CisgIEF2YkF0eFVubG9ja0NoYWxsZW5nZSBjaGFsbGVuZ2U7CisgIEVYUEVDVF9ORShBVkJfSU9fUkVTVUxUX09LLAorICAgICAgICAgICAgYXZiX2F0eF9nZW5lcmF0ZV91bmxvY2tfY2hhbGxlbmdlKG9wc18uYXZiX2F0eF9vcHMoKSwgJmNoYWxsZW5nZSkpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBHZW5lcmF0ZVVubG9ja0NoYWxsZW5nZV9Ob1JORykgeworICBmYWlsX2dldF9yYW5kb21fID0gdHJ1ZTsKKyAgQXZiQXR4VW5sb2NrQ2hhbGxlbmdlIGNoYWxsZW5nZTsKKyAgRVhQRUNUX05FKEFWQl9JT19SRVNVTFRfT0ssCisgICAgICAgICAgICBhdmJfYXR4X2dlbmVyYXRlX3VubG9ja19jaGFsbGVuZ2Uob3BzXy5hdmJfYXR4X29wcygpLCAmY2hhbGxlbmdlKSk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbCkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9UUlVFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfVW5zdXBwb3J0ZWRWZXJzaW9uKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICB1bmxvY2tfY3JlZGVudGlhbF8udmVyc2lvbisrOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfTm9BdHRyaWJ1dGVzKSB7CisgIFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCk7CisgIGZhaWxfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc18gPSB0cnVlOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9FUlJPUl9JTywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfTm9BdHRyaWJ1dGVzSGFzaCkgeworICBQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpOworICBmYWlsX3JlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaF8gPSB0cnVlOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9FUlJPUl9JTywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LAorICAgICAgIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9VbnN1cHBvcnRlZEF0dHJpYnV0ZXNWZXJzaW9uKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICBhdHRyaWJ1dGVzXy52ZXJzaW9uID0gMjU7CisgIG9wc18uc2V0X3Blcm1hbmVudF9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX0F0dHJpYnV0ZXNIYXNoTWlzbWF0Y2gpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIG9wc18uc2V0X3Blcm1hbmVudF9hdHRyaWJ1dGVzX2hhc2goImJhZF9oYXNoIik7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9GYWlsUmVhZFBJS1JvbGxiYWNrSW5kZXgpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIGZhaWxfcmVhZF9waWtfcm9sbGJhY2tfaW5kZXhfID0gdHJ1ZTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfRVJST1JfSU8sIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwKKyAgICAgICBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfVW5zdXBwb3J0ZWRQSUtDZXJ0aWZpY2F0ZVZlcnNpb24pIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEudmVyc2lvbiA9CisgICAgICAyNTsKKyAgU2lnblVubG9ja0NyZWRlbnRpYWxQSUtDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LAorICAgICAgIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9CYWRQSUtDZXJ0X01vZGlmaWVkU3ViamVjdFB1YmxpY0tleSkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YQorICAgICAgLnB1YmxpY19rZXlbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwKKyAgICAgICBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfQmFkUElLQ2VydF9Nb2RpZmllZFN1YmplY3QpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEKKyAgICAgIC5zdWJqZWN0WzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9CYWRQSUtDZXJ0X01vZGlmaWVkVXNhZ2UpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X2ludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEKKyAgICAgIC51c2FnZVswXSBePSAxOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LAorICAgICAgIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9CYWRQSUtDZXJ0X01vZGlmaWVkS2V5VmVyc2lvbikgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YQorICAgICAgLmtleV92ZXJzaW9uIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9CYWRQSUtDZXJ0X0JhZFNpZ25hdHVyZSkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduYXR1cmVbMF0gXj0gMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX1BJS0NlcnRTdWJqZWN0SWdub3JlZCkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YQorICAgICAgLnN1YmplY3RbMF0gXj0gMTsKKyAgU2lnblVubG9ja0NyZWRlbnRpYWxQSUtDZXJ0aWZpY2F0ZSgpOworICBib29sIGlzX3RydXN0ZWQgPSBmYWxzZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9UUlVFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfUElLQ2VydFVuZXhwZWN0ZWRVc2FnZSkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YQorICAgICAgLnVzYWdlWzBdIF49IDE7CisgIFNpZ25VbmxvY2tDcmVkZW50aWFsUElLQ2VydGlmaWNhdGUoKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX1BJS1JvbGxiYWNrKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIHt7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwKKyAgICAgICAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfaW50ZXJtZWRpYXRlX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YQorICAgICAgICAgICAgICAgIC5rZXlfdmVyc2lvbiArCisgICAgICAgICAgICAxfSwKKyAgICAgICB7QVZCX0FUWF9QU0tfVkVSU0lPTl9MT0NBVElPTiwgMH19KTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX0ZhaWxSZWFkUFNLUm9sbGJhY2tJbmRleCkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgZmFpbF9yZWFkX3Bza19yb2xsYmFja19pbmRleF8gPSB0cnVlOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9FUlJPUl9JTywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LAorICAgICAgIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9VbnN1cHBvcnRlZFBVS0NlcnRpZmljYXRlVmVyc2lvbikgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLnByb2R1Y3RfdW5sb2NrX2tleV9jZXJ0aWZpY2F0ZS5zaWduZWRfZGF0YS52ZXJzaW9uID0gMjU7CisgIFNpZ25VbmxvY2tDcmVkZW50aWFsUFVLQ2VydGlmaWNhdGUoKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwKKyAgICAgICBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfQmFkUFVLQ2VydF9Nb2RpZmllZFN1YmplY3RQdWJsaWNLZXkpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEucHVibGljX2tleVswXSBePQorICAgICAgMTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwKKyAgICAgICBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfQmFkUFVLQ2VydF9Nb2RpZmllZFN1YmplY3QpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEuc3ViamVjdFswXSBePSAxOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfQmFkUFVLQ2VydF9Nb2RpZmllZFVzYWdlKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICB1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnVzYWdlWzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsCisgICAgICAgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX0JhZFBVS0NlcnRfTW9kaWZpZWRLZXlWZXJzaW9uKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICB1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLmtleV92ZXJzaW9uIF49CisgICAgICAxOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCitURVNUX0YoQXZiQXR4VmFsaWRhdGVUZXN0LCBWYWxpZGF0ZVVubG9ja0NyZWRlbnRpYWxfQmFkUFVLQ2VydF9CYWRTaWduYXR1cmUpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUuc2lnbmF0dXJlWzBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9QVUtDZXJ0VW5leHBlY3RlZFN1YmplY3QpIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEuc3ViamVjdFswXSBePSAxOworICBTaWduVW5sb2NrQ3JlZGVudGlhbFBVS0NlcnRpZmljYXRlKCk7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9QVUtDZXJ0VW5leHBlY3RlZFVzYWdlKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICB1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLnNpZ25lZF9kYXRhLnVzYWdlWzBdIF49IDE7CisgIFNpZ25VbmxvY2tDcmVkZW50aWFsUFVLQ2VydGlmaWNhdGUoKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX1BVS1JvbGxiYWNrKSB7CisgIEFTU0VSVF9UUlVFKFByZXBhcmVVbmxvY2tDcmVkZW50aWFsKCkpOworICBvcHNfLnNldF9zdG9yZWRfcm9sbGJhY2tfaW5kZXhlcygKKyAgICAgIHt7QVZCX0FUWF9QSUtfVkVSU0lPTl9MT0NBVElPTiwgMH0sCisgICAgICAge0FWQl9BVFhfUFNLX1ZFUlNJT05fTE9DQVRJT04sCisgICAgICAgIHVubG9ja19jcmVkZW50aWFsXy5wcm9kdWN0X3VubG9ja19rZXlfY2VydGlmaWNhdGUuc2lnbmVkX2RhdGEKKyAgICAgICAgICAgICAgICAua2V5X3ZlcnNpb24gKworICAgICAgICAgICAgMX19KTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX0JhZENoYWxsZW5nZVNpZ25hdHVyZSkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NyZWRlbnRpYWxfLmNoYWxsZW5nZV9zaWduYXR1cmVbMTBdIF49IDE7CisgIGJvb2wgaXNfdHJ1c3RlZCA9IHRydWU7CisgIEVYUEVDVF9FUShBVkJfSU9fUkVTVUxUX09LLCBWYWxpZGF0ZVVubG9jaygmaXNfdHJ1c3RlZCkpOworICBFWFBFQ1RfRkFMU0UoaXNfdHJ1c3RlZCk7Cit9CisKK1RFU1RfRihBdmJBdHhWYWxpZGF0ZVRlc3QsIFZhbGlkYXRlVW5sb2NrQ3JlZGVudGlhbF9DaGFsbGVuZ2VNaXNtYXRjaCkgeworICBBU1NFUlRfVFJVRShQcmVwYXJlVW5sb2NrQ3JlZGVudGlhbCgpKTsKKyAgdW5sb2NrX2NoYWxsZW5nZV8gPSAiYmFkIjsKKyAgU2lnblVubG9ja0NyZWRlbnRpYWxDaGFsbGVuZ2Uoa1BVS1ByaXZhdGVLZXlQYXRoKTsKKyAgYm9vbCBpc190cnVzdGVkID0gdHJ1ZTsKKyAgRVhQRUNUX0VRKEFWQl9JT19SRVNVTFRfT0ssIFZhbGlkYXRlVW5sb2NrKCZpc190cnVzdGVkKSk7CisgIEVYUEVDVF9GQUxTRShpc190cnVzdGVkKTsKK30KKworVEVTVF9GKEF2YkF0eFZhbGlkYXRlVGVzdCwgVmFsaWRhdGVVbmxvY2tDcmVkZW50aWFsX1VubG9ja1dpdGhQU0spIHsKKyAgQVNTRVJUX1RSVUUoUHJlcGFyZVVubG9ja0NyZWRlbnRpYWwoKSk7CisgIC8vIENvcHkgdGhlIFBTSyBjZXJ0IGFzIHRoZSBQVUsgY2VydC4KKyAgbWVtY3B5KCZ1bmxvY2tfY3JlZGVudGlhbF8ucHJvZHVjdF91bmxvY2tfa2V5X2NlcnRpZmljYXRlLAorICAgICAgICAgJm1ldGFkYXRhXy5wcm9kdWN0X3NpZ25pbmdfa2V5X2NlcnRpZmljYXRlLAorICAgICAgICAgc2l6ZW9mKEF2YkF0eENlcnRpZmljYXRlKSk7CisgIC8vIFNpZ24gdGhlIGNoYWxsZW5nZSB3aXRoIHRoZSBQU0sgaW5zdGVhZCBvZiB0aGUgUFVLLgorICBTaWduVW5sb2NrQ3JlZGVudGlhbENoYWxsZW5nZShrUFNLUHJpdmF0ZUtleVBhdGgpOworICBib29sIGlzX3RydXN0ZWQgPSB0cnVlOworICBFWFBFQ1RfRVEoQVZCX0lPX1JFU1VMVF9PSywgVmFsaWRhdGVVbmxvY2soJmlzX3RydXN0ZWQpKTsKKyAgRVhQRUNUX0ZBTFNFKGlzX3RydXN0ZWQpOworfQorCiAvLyBBIGZpeHR1cmUgZm9yIHRlc3RpbmcgYXZiX3Nsb3RfdmVyaWZ5KCkgd2l0aCBBVFguCiBjbGFzcyBBdmJBdHhTbG90VmVyaWZ5VGVzdCA6IHB1YmxpYyBCYXNlQXZiVG9vbFRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBGYWtlQXZiT3BzRGVsZWdhdGVXaXRoRGVmYXVsdHMgewpkaWZmIC0tZ2l0IGEvdGVzdC9hdmJ0b29sX3VuaXR0ZXN0LmNjIGIvdGVzdC9hdmJ0b29sX3VuaXR0ZXN0LmNjCmluZGV4IGZlN2QzYmEuLmJhN2Y0NzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvYXZidG9vbF91bml0dGVzdC5jYworKysgYi90ZXN0L2F2YnRvb2xfdW5pdHRlc3QuY2MKQEAgLTIzOTYsNiArMjM5NiwzMCBAQAogICAgICAgICAgICAgICAgICBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOwogfQogCitURVNUX0YoQXZiVG9vbFRlc3QsIE1ha2VBdHhQdWtDZXJ0aWZpY2F0ZSkgeworICBiYXNlOjpGaWxlUGF0aCBwdWJrZXlfcGF0aCA9IHRlc3RkaXJfLkFwcGVuZCgidG1wX3B1YmtleS5wZW0iKTsKKyAgRVhQRUNUX0NPTU1BTkQoCisgICAgICAwLAorICAgICAgIm9wZW5zc2wgcGtleSAtcHVib3V0IC1pbiB0ZXN0L2RhdGEvdGVzdGtleV9hdHhfcHVrLnBlbSAtb3V0ICVzIiwKKyAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgYmFzZTo6RmlsZVBhdGggb3V0cHV0X3BhdGggPSB0ZXN0ZGlyXy5BcHBlbmQoInRtcF9jZXJ0aWZpY2F0ZS5iaW4iKTsKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgIi4vYXZidG9vbCBtYWtlX2F0eF9jZXJ0aWZpY2F0ZSIKKyAgICAgICAgICAgICAgICAgIiAtLXN1YmplY3QgdGVzdC9kYXRhL2F0eF9wcm9kdWN0X2lkLmJpbiIKKyAgICAgICAgICAgICAgICAgIiAtLXN1YmplY3Rfa2V5ICVzIgorICAgICAgICAgICAgICAgICAiIC0tc3ViamVjdF9rZXlfdmVyc2lvbiA0MiIKKyAgICAgICAgICAgICAgICAgIiAtLXVzYWdlIGNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MudmJvb3QudW5sb2NrIgorICAgICAgICAgICAgICAgICAiIC0tYXV0aG9yaXR5X2tleSB0ZXN0L2RhdGEvdGVzdGtleV9hdHhfcGlrLnBlbSIKKyAgICAgICAgICAgICAgICAgIiAtLW91dHB1dCAlcyIsCisgICAgICAgICAgICAgICAgIHB1YmtleV9wYXRoLnZhbHVlKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgb3V0cHV0X3BhdGgudmFsdWUoKS5jX3N0cigpKTsKKworICBFWFBFQ1RfQ09NTUFORCgwLAorICAgICAgICAgICAgICAgICAiZGlmZiB0ZXN0L2RhdGEvYXR4X3B1a19jZXJ0aWZpY2F0ZS5iaW4gJXMiLAorICAgICAgICAgICAgICAgICBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworfQorCiBURVNUX0YoQXZiVG9vbFRlc3QsIE1ha2VBdHhQZXJtYW5lbnRBdHRyaWJ1dGVzKSB7CiAgIGJhc2U6OkZpbGVQYXRoIHB1YmtleV9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ0bXBfcHVia2V5LnBlbSIpOwogICBFWFBFQ1RfQ09NTUFORCgKQEAgLTI0MzIsNCArMjQ1NiwyMiBAQAogICAgICAgMCwgImRpZmYgdGVzdC9kYXRhL2F0eF9tZXRhZGF0YS5iaW4gJXMiLCBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOwogfQogCitURVNUX0YoQXZiVG9vbFRlc3QsIE1ha2VBdHhVbmxvY2tDcmVkZW50aWFsKSB7CisgIGJhc2U6OkZpbGVQYXRoIG91dHB1dF9wYXRoID0gdGVzdGRpcl8uQXBwZW5kKCJ0bXBfY3JlZGVudGlhbC5iaW4iKTsKKworICBFWFBFQ1RfQ09NTUFORCgKKyAgICAgIDAsCisgICAgICAiLi9hdmJ0b29sIG1ha2VfYXR4X3VubG9ja19jcmVkZW50aWFsIgorICAgICAgIiAtLWludGVybWVkaWF0ZV9rZXlfY2VydGlmaWNhdGUgdGVzdC9kYXRhL2F0eF9waWtfY2VydGlmaWNhdGUuYmluIgorICAgICAgIiAtLXVubG9ja19rZXlfY2VydGlmaWNhdGUgdGVzdC9kYXRhL2F0eF9wdWtfY2VydGlmaWNhdGUuYmluIgorICAgICAgIiAtLWNoYWxsZW5nZSB0ZXN0L2RhdGEvYXR4X3VubG9ja19jaGFsbGVuZ2UuYmluIgorICAgICAgIiAtLXVubG9ja19rZXkgdGVzdC9kYXRhL3Rlc3RrZXlfYXR4X3B1ay5wZW0iCisgICAgICAiIC0tb3V0cHV0ICVzIiwKKyAgICAgIG91dHB1dF9wYXRoLnZhbHVlKCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX0NPTU1BTkQoMCwKKyAgICAgICAgICAgICAgICAgImRpZmYgdGVzdC9kYXRhL2F0eF91bmxvY2tfY3JlZGVudGlhbC5iaW4gJXMiLAorICAgICAgICAgICAgICAgICBvdXRwdXRfcGF0aC52YWx1ZSgpLmNfc3RyKCkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYXZiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXR4X3B1a19jZXJ0aWZpY2F0ZS5iaW4gYi90ZXN0L2RhdGEvYXR4X3B1a19jZXJ0aWZpY2F0ZS5iaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwMmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9hdHhfcHVrX2NlcnRpZmljYXRlLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvYXR4X3VubG9ja19jaGFsbGVuZ2UuYmluIGIvdGVzdC9kYXRhL2F0eF91bmxvY2tfY2hhbGxlbmdlLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzQ5NGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F0eF91bmxvY2tfY2hhbGxlbmdlLmJpbgpAQCAtMCwwICsxIEBACit6Z2N2ZRnQDx/P0ZA17P2NClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2F0eF91bmxvY2tfY3JlZGVudGlhbC5iaW4gYi90ZXN0L2RhdGEvYXR4X3VubG9ja19jcmVkZW50aWFsLmJpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI0NmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2F0eF91bmxvY2tfY3JlZGVudGlhbC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3Rlc3RrZXlfYXR4X3B1ay5wZW0gYi90ZXN0L2RhdGEvdGVzdGtleV9hdHhfcHVrLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA1M2JlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL3Rlc3RrZXlfYXR4X3B1ay5wZW0KQEAgLTAsMCArMSw1MiBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlKUXdJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0NTMHdnZ2twQWdFQUFvSUNBUURLalNIRTFMeXExU2FrCitUYk1XSWZTeURjYk1laDFUdlFiYVVQcm1KTzBOTGFVNmNtYkxLOGM0SHdoZGJ6ZGJLc2pWQy82QXd1Qm1FTStGCitUKzZPb1h6eDhVdEs0T2tNU2RyT2Y4TGRoZEVkWmtGTVFTaURlWStEQ0R5cE5KNWVkY08xcWxqd21Sd09uanZpCis4Y1A3SlpOZ1lnWVFQU0NseUhOVVB1TFMwVklwemNmQXR2L2tselZpamhqOGFLWmhla1VyQmFQMndTUDJDSDg1CiticFZiaFNVYmxlWHNkM252TXVlQlA3a2FNRWcxYndudGEyTzRlV3JPK0RDeVptT2k2MEV0ajJuMzlCZmpGQ1g3CitMeWhwY1ZzOXh1UzJpcllrbmhZNnNWTlh1ekdkYWxUcmwrNVdCb1NoOW12eVNhNXB1U2hXZUk2OElWTDJtN2dQCitlN3JFVmswcGRjV05IOCtoWEIraHJnSkwrWWZxcUNIWlhaNzdQWk5WNnUrVHl4clFTRGtPbGo3YmxHUjhzM3VwCitRUkJFdTZHZnRXajNISFlXTVRFQ2ZvL0MzaStlcUhQa3hYaDdoazJheWNlL1p2cVh1SWpMckpoZkRGcXNTckVaCitkcmI4aEVRUWVML2o5WDc4RFhBM2RNYklVNVBDNit6anhUVXZRd2w4cWNudHhWb01qQkpBRVJHOWczL2Y1MWhJCitLSlFuMFZ3NE0vMmp4SEhleXZMSHpCYlNCa1pQMGdZL2gvNXE4MDVNZldCSVZwRzFiajQrVnNMbWdIL1FMeXJmCitlSkorSkhsNjdiTVlWQjhVRTZUWjc5Q1lrS1NOMFVWVkdjMUg5NC84aUV4NHFrQjBwRWgxaVhNVnNnc1NpNVR4CitqWHB1cU9MVEdEVjN5elJxVE0wKy9EWlhCVXpHeFFJREFRQUJBb0lDQVFDVFNaMU1yQVdsaytuTmdGTEJ2VjlhCitPbnBkSms4OUhTOW1nWXh3M2xraVJCYnFNVlplVnk4K3VCSTFIeko1c05ycFVSZDRPajFDK3Vac1ludHViQytYCitINGRJbzlQVGc4RUFlQmNUVHNPSlJWb21RUnRjdjRDRUgvRThlVzdQOFlLbkQ0QXROS2thV0NYa0dUb1IzbmtVCitsVE1qaTgrNXZkRmZhWHMzSWM5RlpzWGlkVEFPNFlXSWJSdnVMNHNOUndRVkRMejJLZXdrZEhsUElnS3AwbC94CitkMGNDZEw3T0dZNE9obS9yZzBCKzJvZTFoV20yTTFSZnZFcHM3OWQwR080RVcwMExhUXdWckFrU1puQlVmSUdFCitvcVNkdUxCS1lFcDUwNGh2TzBnUTE4bDRwN3BBQSsxZWVQcDE3TzVQSXIwYVpBQW0vWFIrcnkxZzFQQXk1UzZsCitzL0dyRExUbWFZcnhGam54L3JxV3R4a081MFN0MWVXaklOZ1ZjYVhUd3c0UUNzYTFHaEIvR3FpTllpRjBPTGplCis1YVJ2WitJRUZjeUNSQ0dveENSb1RNUkZ5a296SlJkR2lVdDBBcU5rRllYQ3Z2Z1hsNXMyNUljblQxTDlEZ21DCitldWFyeXZoa0dvTTBXakJQc3AxcDdaYW8yTzlBVHJ1VTJ6cVBrcGR3Z0VpdE5qZVlZS1ZMZllESjF2TlNoeVNuCiszVTJ0REV5RWxxZWZvVEZ2K1NDc2REeWlXQ0JuK3lvQjVOcnBpNmNDcldlMjBtYTlFbUExcS9VLzJ6WjEvOE15CitkQnh3UnBQTllaL0FTczJPb0RWMG8zdFJiajVXTjR0dFYrYlc0ak94anhrMmpLWDh3cVJNU2dJbmN4STN6cnI2CitnaG1SWkYvcmlJVUdUMU9MbTJmUkFRS0NBUUVBN1U4RVB5QUg0aFI3My83OVZvNWF4RTFZQjdrOWE0dklMbzEyCis0dW9Mdy9PeWxIMXdYZzlBMElrN2I0YWdXRkFFWEV3eFFCcUdFUmVsNnpOZWZ3MDhCdG15WEtxd0lyZWhoWU9JCitPRWNYMmp0T2JEN0toTjY4MTQ5WVdUcXVBMVRYTWRSNGE3bU16MkZWMzVWaWZCSmtVVmx3MFZaRUFQVXhXOStuCitkTHBkMktGU0QwRUlSQ3NZYXFqeHRBakpZeXFPSlB1Y3J4RVZWcnlnSGYxT2VGOXc2d0NCYksxbTYwdndzQVJyCitrZE1kSzZ5RWhoUmMxNHN2d1k2RnBmZTE2dXFoUkJWRUIwRHc5RmYraDU0V2s5Q0dZZ2xiZElocTNEZUk5bXBHCitNU0RLcDZxd0JvVTNHWmhiYzd6RkJEZTcrMjEwaXd6dXhwQ1UzYkxiaUtYaFhSQm9PUUtDQVFFQTJvRklvNm1GCisrWC9FU2ZwL0JiKzdYd29sK0R5RjJvVVR2UzY1ZEZBeUx1blppQVBidHpvUlV4ellRSmNsSU5wRXJSd2s1Y0x3CitUYndtTlpHeWd1ZUhkRWhSQTl0Q1k3Nm10WlIydFk4UVdDQThTcEFKYkFJY093OTRNZ1BlUDVQbVd2Q0tnNXAzCitBVmF5cXlEQnFiVzdNclA5UDBwdlZINllHMEJMZkxpWFV2L3JlajlWRVo1Zll5Mk95K0pYZEk4Q3RHNDVwM0RFCit5Njl3VFllbTBwMWxwUUhzN0dxVnlEbGh5Q0lSNzVaV0pDeGVjSStEU3pNUmp0dUF6RmJnSzllNUxXejhqU0xLCitGN1dJYzhUZkt5MEw1aG8ydEVTMTkrSHhycjExMmcrSFA0NVFNNzdaQVdMekFrZU9jb1NiQ1ZMRW9jT25xNHZsCit1Qkl2eGNQTWJicWE3UUtDQVFBTVo4OFBCYnVqdy9KZDJWU2hDN3dPK3dRWkUwUDB0VS8zcndtQi96NHlOakVsCit0aEVEdWNSbm9tVHJCWnlvUVRhWkpKcUdnVngwMUVtbUsvOUtvUVI4VHpFVnl3NStJaDlkZld6SGxGL1kxclRZCit6OGVDZnFwY2ttL0o2bGxpYnpMNHRlUzlyT3VCZzlNYlp4SEk3cVV6NDNzVVZuQWpwSzI1NGMwOU91amhCRDNuCis4anhlWStwWTJSQVptMFA3M1NPbEowb2ZsTU1LejcySEU5RGdWZ3p2SEEyb0FzQ1ltRld5dmVocHJTR2ZRTnVFCitydGZUcE1FUVcwVDlVaCsrY2htUUY1U0ExSkpFRTcySWxXa1V2UmZwVkJmbDFhUFFjMDdEb3ZhY1p0eHhPMmtNCitUalo5TGd2SjF4cHRpQVJadG5VYk44ZmJ0WDh5djhEZU9kMjRJYjF4QW9JQkFDN0VXeExFZHV0bTRGRmhMd3pBCis4ODZzc21IR09uUUI1YTZwTUlKbm84WU13VVZ1WmZsNmtUaXp4TWxXVUZrT3ZvSTZzdDhHY1Q2Q0ZiK0RkcXl6Cis5M2I0LzNZTzJNL1dmNEgveThTaVlVSXJiQndkWmhiYkFNWFhVc2VKc21qek0rdWs3bENxbit3R2JXbFpNbm9yCitibXkwdjNCcmN4YW5uZEMvV3lqUHJYdlRVTWd5Zy9lb2FRd21OUmtJVWVXZHNsdUIrQThSZ04yRHFFcS96UUhwCitORmN6NlV6VXAwaGFsOFlwSEtPbURydmhUemxTVGl5ck9vZlVEV1l1OWY0TVJ4TWs3NDBadEIyTStpNmxKWXJ0CitNazNHc0l5MjVDZXhFWFJ3RXFoZ2lIY2U4NldQcEl5NmEvN0I2QWcwdjZZb00vUFhsNnlNM2RjZTlXQ2p2cjZCCitvU1VDZ2dFQkFObzY3VWJLSWp0RUU2aXI2S3FrcHJlTjlXT3cvUzJzMVRVUG0xaEFmaHF6Q0ZaV25sVzlQeHlnCitHQ3FOSHlJNFdHcS9GUkxHWmpHNTlLbDhjMEs2aEVvL3BLTHZSc3ZsL0k2MURJc0VENWk4b0ZESWRYRWc2TUhtCisvVFFGWHAxSXlBa3dkeDY1ZlVjYjVpSUhiSVd1RUhVQ2d5UEdZeWU5TThxVktGVVMwUnNWUDhZTktLcTJqaTN0CitHYWFzMTJ4eWtFYm80VkVMdUJoUlF4amkxMTBuZUhJRkZQNFJKNHpEZ2hFWWlNQnF2OGxqSklJR2kyYis4NWhkCitpRm9EVDNVUEx6bE9DanBYTk5VMWJsbnVJelk5ek5xczZTUFRqRXRQSWFsUG5WVC90SDZBQUpONURSTnBCQW1MCitMM202YzZWZXBXcU8wV1dXbGh6SmFyV3l4RGlSYTJRPQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9mYWtlX2F2Yl9vcHMuY2MgYi90ZXN0L2Zha2VfYXZiX29wcy5jYwppbmRleCA2ZWUxMjhhLi5jNWZjZGZmIDEwMDY0NAotLS0gYS90ZXN0L2Zha2VfYXZiX29wcy5jYworKysgYi90ZXN0L2Zha2VfYXZiX29wcy5jYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGJhc2UvZmlsZXMvZmlsZV91dGlsLmg+CiAjaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ191dGlsLmg+CiAjaW5jbHVkZSA8YmFzZS9zdHJpbmdzL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CiAKICNpbmNsdWRlICJmYWtlX2F2Yl9vcHMuaCIKQEAgLTM2Miw2ICszNjMsMTMgQEAKICAgdmVyaWZpZWRfcm9sbGJhY2tfaW5kZXhlc19bcm9sbGJhY2tfaW5kZXhfbG9jYXRpb25dID0ga2V5X3ZlcnNpb247CiB9CiAKK0F2YklPUmVzdWx0IEZha2VBdmJPcHM6OmdldF9yYW5kb20oc2l6ZV90IG51bV9ieXRlcywgdWludDhfdCogb3V0cHV0KSB7CisgIGlmICghUkFORF9ieXRlcyhvdXRwdXQsIG51bV9ieXRlcykpIHsKKyAgICByZXR1cm4gQVZCX0lPX1JFU1VMVF9FUlJPUl9JTzsKKyAgfQorICByZXR1cm4gQVZCX0lPX1JFU1VMVF9PSzsKK30KKwogc3RhdGljIEF2YklPUmVzdWx0IG15X29wc19yZWFkX2Zyb21fcGFydGl0aW9uKEF2Yk9wcyogb3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwKQEAgLTQ5Myw2ICs1MDEsMTQgQEAKICAgICAgIC0+c2V0X2tleV92ZXJzaW9uKHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLCBrZXlfdmVyc2lvbik7CiB9CiAKK3N0YXRpYyBBdmJJT1Jlc3VsdCBteV9vcHNfZ2V0X3JhbmRvbShBdmJBdHhPcHMqIGF0eF9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQpIHsKKyAgcmV0dXJuIEZha2VBdmJPcHM6OkdldEluc3RhbmNlRnJvbUF2Yk9wcyhhdHhfb3BzLT5vcHMpCisgICAgICAtPmRlbGVnYXRlKCkKKyAgICAgIC0+Z2V0X3JhbmRvbShudW1fYnl0ZXMsIG91dHB1dCk7Cit9CisKIEZha2VBdmJPcHM6OkZha2VBdmJPcHMoKSB7CiAgIG1lbXNldCgmYXZiX29wc18sIDAsIHNpemVvZihhdmJfb3BzXykpOwogICBhdmJfb3BzXy5hYl9vcHMgPSAmYXZiX2FiX29wc187CkBAIC01MTksNiArNTM1LDcgQEAKICAgYXZiX2F0eF9vcHNfLnJlYWRfcGVybWFuZW50X2F0dHJpYnV0ZXNfaGFzaCA9CiAgICAgICBteV9vcHNfcmVhZF9wZXJtYW5lbnRfYXR0cmlidXRlc19oYXNoOwogICBhdmJfYXR4X29wc18uc2V0X2tleV92ZXJzaW9uID0gbXlfb3BzX3NldF9rZXlfdmVyc2lvbjsKKyAgYXZiX2F0eF9vcHNfLmdldF9yYW5kb20gPSBteV9vcHNfZ2V0X3JhbmRvbTsKIAogICBkZWxlZ2F0ZV8gPSB0aGlzOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9mYWtlX2F2Yl9vcHMuaCBiL3Rlc3QvZmFrZV9hdmJfb3BzLmgKaW5kZXggNzY5ZjNjYy4uN2JlZWFkNiAxMDA2NDQKLS0tIGEvdGVzdC9mYWtlX2F2Yl9vcHMuaAorKysgYi90ZXN0L2Zha2VfYXZiX29wcy5oCkBAIC0xMDMsNiArMTAzLDggQEAKIAogICB2aXJ0dWFsIHZvaWQgc2V0X2tleV92ZXJzaW9uKHNpemVfdCByb2xsYmFja19pbmRleF9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXlfdmVyc2lvbikgPSAwOworCisgIHZpcnR1YWwgQXZiSU9SZXN1bHQgZ2V0X3JhbmRvbShzaXplX3QgbnVtX2J5dGVzLCB1aW50OF90KiBvdXRwdXQpID0gMDsKIH07CiAKIC8vIFByb3ZpZGVzIGZha2UgaW1wbGVtZW50YXRpb25zIG9mIEFWQiBvcHMuIEFsbCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlCkBAIC0yNDksNiArMjUxLDggQEAKICAgdm9pZCBzZXRfa2V5X3ZlcnNpb24oc2l6ZV90IHJvbGxiYWNrX2luZGV4X2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBrZXlfdmVyc2lvbikgb3ZlcnJpZGU7CiAKKyAgQXZiSU9SZXN1bHQgZ2V0X3JhbmRvbShzaXplX3QgbnVtX2J5dGVzLCB1aW50OF90KiBvdXRwdXQpIG92ZXJyaWRlOworCiAgcHJpdmF0ZToKICAgQXZiT3BzIGF2Yl9vcHNfOwogICBBdmJBQk9wcyBhdmJfYWJfb3BzXzsKQEAgLTM3OCw2ICszODIsMTAgQEAKICAgICBvcHNfLnNldF9rZXlfdmVyc2lvbihyb2xsYmFja19pbmRleF9sb2NhdGlvbiwga2V5X3ZlcnNpb24pOwogICB9CiAKKyAgQXZiSU9SZXN1bHQgZ2V0X3JhbmRvbShzaXplX3QgbnVtX2J5dGVzLCB1aW50OF90KiBvdXRwdXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3BzXy5nZXRfcmFuZG9tKG51bV9ieXRlcywgb3V0cHV0KTsKKyAgfQorCiAgcHJvdGVjdGVkOgogICBGYWtlQXZiT3BzIG9wc187CiB9Owo=