Name: series-workflowb8vth Phase: Succeeded StartedAt: 2026-09-05 10:49:58 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[0] Phase: Succeeded StartedAt: 2026-09-05 10:49:58 +0000 UTC FinishedAt: 2026-09-05 10:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[0].run-triage Phase: Succeeded StartedAt: 2026-09-05 10:49:58 +0000 UTC FinishedAt: 2026-09-05 10:53:08 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6ebcf5074cff0402730c6981d2397139fee6322d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "INET_PSP", "NETDEVSIM" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6ebcf5074cff0402730c6981d2397139fee6322d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "INET_PSP", "NETDEVSIM" ], "series_id": "f905573f-bb57-4da1-91d6-b3b9c14d31c5" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "psp_sock_assoc_set_tx", "psp_sock_set_tx_key", "psp_dev_tx_key_add", "psp_dev_tx_key_del", "psp_assoc_free", "psp_dev_create", "psp_dev_unregister", "nsim_do_psp" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lORVRfUFNQJiMzNDssCiAgICAmIzM0O05FVERFVlNJTSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BzcF9zb2NrX2Fzc29jX3NldF90eCYjMzQ7LAogICAgJiMzNDtwc3Bfc29ja19zZXRfdHhfa2V5JiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2FkZCYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9kZWwmIzM0OywKICAgICYjMzQ7cHNwX2Fzc29jX2ZyZWUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl9jcmVhdGUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl91bnJlZ2lzdGVyJiMzNDssCiAgICAmIzM0O25zaW1fZG9fcHNwJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbWFrZXMgdGhlIGB0eF9rZXlfYWRkYCBhbmQgYHR4X2tleV9kZWxgIGRyaXZlciBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIFBTUCBkZXZpY2VzIHdpdGhvdXQgU0FEQiBzdXBwb3J0LCByZWZhY3RvcmluZyBUeCBrZXkgYXNzb2NpYXRpb24gbWFuYWdlbWVudCBhbmQgcmVtb3ZpbmcgdW51c2VkIGtleSBoYW5kbGluZyBob29rcyBmcm9tIG5ldGRldnNpbS4gQWxsIGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgY29udGludWUgdG8gYmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYGt6YWxsb2NfZmxleGAsIGBremFsbG9jX29iamAsIG9yIGBrbWVtZHVwYC4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGNoZWNrcywgbGlzdCBtYW5pcHVsYXRpb24sIG9yIGxpZmVjeWNsZSBoYW5kbGluZyBmYWxsIHN0cmljdGx5IHVuZGVyIHRoZSBkb21haW4gb2YgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyNzAyNzkwZGVmOTQxN2ZlMTFmZTcyNDVkODg3NTczZTg3MWFmMzFiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgNSAxMDo1MTo1MCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICYjNDM7MTIyLDYgQEAgc3RydWN0IG5ldGRldnNpbSB7XG4gXHRcdHN0cnVjdCBkZW50cnkgKnJlcmVnO1xuIFx0XHRzdHJ1Y3QgbXV0ZXggcmVyZWdfbG9jaztcbiBcdFx0dTMyIHNwaTtcbi1cdFx0dTMyIGFzc29jX2NudDtcbiBcdH0gcHNwO1xuIFxuIFx0c3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2O1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1xuaW5kZXggNmIzNTMyYjVlMzYwZC4uYjc0NTJjNDliNTgxZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5AQCAtMjMsNyAmIzQzOzIzLDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XG4gXHRzdHJ1Y3QgbmV0ICpuZXQ7XG4gXHRpbnQgcHNwX2xlbjtcbi1cdHZvaWQgKipwdHI7XG4gXG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcbkBAIC0zNywxMiAmIzQzOzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICYjNDM7MTQyLDYgQEAgbnNpbV9yeF9zcGlfYWxsb2Moc3RydWN0IHBzcF9kZXYgKnBzZCwgdTMyIHZlcnNpb24sXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4tXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4te1xuLVx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XG4tXG4tXHQvKiBDb3B5IGRydl9wcml2IGZyb20gcHNkIHRvIGFzc29jICovXG4tXHQqcHRyID0gcHNkLVx1MDAzZWRydl9wcml2O1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudCYjNDM7JiM0Mzs7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSAmIzQzOzE1Nyw2IEBAIHN0YXRpYyBpbnQgbnNpbV9rZXlfcm90YXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XG4tXG4tXHQqcHRyID0gTlVMTDtcbi1cdG5zLVx1MDAzZXBzcC5hc3NvY19jbnQtLTtcbi19XG4tXG4gc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTIwNCw4ICYjNDM7MTc1LDYgQEAgc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxuIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0ge1xuIFx0LnNldF9jb25maWdcdD0gbnNpbV9wc3Bfc2V0X2NvbmZpZyxcbiBcdC5yeF9zcGlfYWxsb2NcdD0gbnNpbV9yeF9zcGlfYWxsb2MsXG4tXHQudHhfa2V5X2FkZFx0PSBuc2ltX2Fzc29jX2FkZCxcbi1cdC50eF9rZXlfZGVsXHQ9IG5zaW1fYXNzb2NfZGVsLFxuIFx0LmtleV9yb3RhdGVcdD0gbnNpbV9rZXlfcm90YXRlLFxuIFx0LmdldF9zdGF0c1x0PSBuc2ltX2dldF9zdGF0cyxcbiB9O1xuQEAgLTIxNSw3ICYjNDM7MTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgJiM0MzsxOTgsNiBAQCBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bilcbiBcdFx0c3luY2hyb25pemVfcmN1KCk7XG4gXHRcdHBzcF9kZXZfdW5yZWdpc3Rlcihwc2QpO1xuIFx0fVxuLVx0V0FSTl9PTihucy1cdTAwM2Vwc3AuYXNzb2NfY250KTtcbiB9XG4gXG4gdm9pZCBuc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oXG5pbmRleCBjNWMyM2E1NDc3NGU2Li5iMjNjMzA4OTgzODljIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbkBAIC0yNCwxMSAmIzQzOzI0LDYgQEAgaW50IHBzcF9kZXZfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHUxNiBkZXZfaWQsIHU4IGdlbmVyYXRpb24sIGJvb2wgc3RyaXBfaWN2KTtcbiAvKiBLZXJuZWwtZmFjaW5nIEFQSSAqL1xuIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHNwX2Fzc29jX2Rydl9kYXRhKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRyZXR1cm4gcGFzLVx1MDAzZWRydl9kYXRhO1xuLX1cbi1cbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG4gdW5zaWduZWQgaW50IHBzcF9rZXlfc2l6ZSh1MzIgdmVyc2lvbik7XG4gdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oIGIvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbmluZGV4IDg3OTkxYTFlYTAyZDAuLmI4OTA1ZWZiZDYwNGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbkBAIC0yMTksMTIgJiM0MzsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbiYjNDM7XHQgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2RlbFxuJiM0MztcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0aW50ICgqdHhfa2V5X2FkZCkoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiBcdC8qKlxuIFx0ICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2VcbiBcdCAqIFJlbW92ZSBhbiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBkZXZpY2UuXG4mIzQzO1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbiYjNDM7XHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdHZvaWQgKCp0eF9rZXlfZGVsKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xuIFxuZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oXG5pbmRleCA4NmVlYmE4MjNjZWQxLi5iYmIzOWUyZjViMGFiIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3AuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaFxuQEAgLTUzLDQgJiM0Mzs1MywxNiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcHNwX2Rldl9pc19yZWdpc3RlcmVkKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4gXHRyZXR1cm4gISFwc2QtXHUwMDNlb3BzO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuJiM0MztcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cGFzLVx1MDAzZXBzZC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbiYjNDM7fVxuJiM0MztcbiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi9cbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcF9tYWluLmMgYi9uZXQvcHNwL3BzcF9tYWluLmNcbmluZGV4IGM5YzFhODgyNmI3ZjkuLjkxNDczZjk2YWQyMTEgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcF9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9wc3AvcHNwX21haW4uY1xuQEAgLTY4LDkgJiM0Mzs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4mIzQzO1x0XHQgICAgIXBzZF9vcHMtXHUwMDNlZ2V0X3N0YXRzIHx8XG4mIzQzO1x0XHQgICAgKCFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXHUwMDNldHhfa2V5X2RlbCkgfHxcbiYjNDM7XHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4gXG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VhY3RpdmVfYXNzb2NzLCBcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MpO1xuIFx0bGlzdF9zcGxpY2VfaW5pdChcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MpO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpXG4tXHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHtcbiYjNDM7XHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuJiM0MztcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuJiM0MztcdFx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbiYjNDM7XHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiAmIzQzOzc4LDMzIEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIH1cbiBcbiBzdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiB7XG4tXHRyZXR1cm4gcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfYWRkKHBzZCwgcGFzLCBleHRhY2spO1xuJiM0MztcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJiMzOTt0XG4mIzQzO1x0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJiMzOTtsbCBuZWVkIHRvXG4mIzQzO1x0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbiYjNDM7XHRpZiAoIWR1bW15KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdG1lbWNweShcdTAwMjZkdW1teS1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuJiM0MztcdGVyciA9IHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spO1xuJiM0MztcdGlmICghZXJyKVxuJiM0MztcdFx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsXG4mIzQzO1x0XHQgICAgICAgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4mIzQzO1xuJiM0MztcdGtmcmVlKGR1bW15KTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuIH1cbiBcbiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuLVx0aWYgKHBhcy1cdTAwM2V0eC5zcGkpXG4tXHRcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4tXHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuJiM0MztcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiBcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXHUwMDNlcHNkO1xuIFxuIFx0bXV0ZXhfbG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4tXHRpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpXG4tXHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4mIzQzO1x0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XG4mIzQzO1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiYjNDM7XHRcdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbiYjNDM7XHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4mIzQzO1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBwc3BfYXNzb2Nfc2V0X3R4KHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuJiM0MztcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xuJiM0MztcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiB7XG4gXHRzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTtcbkBAIC0xNzQsMTIgJiM0MzsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50XG4mIzQzO3BzcF9zb2NrX3NldF90eF9rZXkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4mIzQzO1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjayxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O1NvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IHBzcF9hc3NvY19zZXRfdHgocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuJiM0MztcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XG4mIzQzO1x0cGFzLVx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cdTAwM2VyY3Zfbnh0O1xuJiM0MztcbiYjNDM7XHRpY3NrID0gaW5ldF9jc2soc2spO1xuJiM0MztcdGljc2stXHUwMDNlaWNza19leHRfaGRyX2xlbiAmIzQzOz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbiYjNDM7XHRpY3NrLVx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXG4gXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4gXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xuLVx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7XG4mIzQzO1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICYjNDM7MjcxLDcgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXG4gXHRcdGdvdG8gZXhpdF91bmxvY2s7XG4gXHR9XG4gXG4tXHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xuLVx0aWYgKGVycikge1xuLVx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1NvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcJiMzNDspO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24mIzM5O3Rcbi1cdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0b1xuLVx0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4tXHQgKi9cbi1cdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XG4tXHRpZiAoIWR1bW15KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gZXhpdF91bmxvY2s7XG4tXHR9XG4tXG4tXHRtZW1jcHkoXHUwMDI2ZHVtbXktXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbi1cdGVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBleGl0X2ZyZWVfZHVtbXk7XG4tXG4tXHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSwgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4tXHRtZW1jcHkoXHUwMDI2cGFzLVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXG4tXHRXUklURV9PTkNFKHNrLVx1MDAzZXNrX3ZhbGlkYXRlX3htaXRfc2tiLCBwc3BfdmFsaWRhdGVfeG1pdCk7XG4tXHR0Y3Bfd3JpdGVfY29sbGFwc2VfZmVuY2Uoc2spO1xuLVx0cGFzLVx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cdTAwM2VyY3Zfbnh0O1xuLVxuLVx0aWNzayA9IGluZXRfY3NrKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19leHRfaGRyX2xlbiAmIzQzOz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4mIzQzO1x0ZXJyID0gcHNwX3NvY2tfc2V0X3R4X2tleShzaywgcHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiBleGl0X3VubG9jazpcbiBcdHJlbGVhc2Vfc29jayhzayk7XG4gXHRyZXR1cm4gZXJyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lORVRfUFNQJiMzNDssCiAgICAmIzM0O05FVERFVlNJTSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BzcF9zb2NrX2Fzc29jX3NldF90eCYjMzQ7LAogICAgJiMzNDtwc3Bfc29ja19zZXRfdHhfa2V5JiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2FkZCYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9kZWwmIzM0OywKICAgICYjMzQ7cHNwX2Fzc29jX2ZyZWUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl9jcmVhdGUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl91bnJlZ2lzdGVyJiMzNDssCiAgICAmIzM0O25zaW1fZG9fcHNwJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbmV0d29ya2luZyBQU1AgKFBTUCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtIGxvZ2ljIGFuZCBuZXRkZXZzaW0gZGV2aWNlIGRyaXZlciBjb2RlLiBJdCBtYWtlcyBUeCBrZXkgb2ZmbG9hZCBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIGRldmljZXMgd2l0aG91dCBTQURCLCByZWZhY3RvcnMga2V5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGluIHBzcF9zb2NrLmMsIHVwZGF0ZXMgZGV2aWNlIHJlZ2lzdHJhdGlvbiBjaGVja3MgaW4gcHNwX21haW4uYywgYW5kIHJlbW92ZXMgb2Jzb2xldGUgYXNzb2MgdHJhY2tpbmcgaW4gbmV0ZGV2c2ltLiBUaGVzZSBjb2RlIHBhdGhzIGFyZSBmdWxseSByZWFjaGFibGUgdmlhIG5ldGxpbmsgY29tbWFuZHMgYW5kIG5ldGRldnNpbSBpbnRlcmZhY2VzIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgKaW5kZXggNTVhZWM0MTIzN2I5Yi4uMTgxYjZiYWFiYTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaApAQCAtMTIyLDcgJiM0MzsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHsKIAkJc3RydWN0IGRlbnRyeSAqcmVyZWc7CiAJCXN0cnVjdCBtdXRleCByZXJlZ19sb2NrOwogCQl1MzIgc3BpOwotCQl1MzIgYXNzb2NfY250OwogCX0gcHNwOwogCiAJc3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jCmluZGV4IDZiMzUzMmI1ZTM2MGQuLmI3NDUyYzQ5YjU4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMKQEAgLTIzLDcgJiM0MzsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLAogCXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJaW50IHBzcF9sZW47Ci0Jdm9pZCAqKnB0cjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTsKQEAgLTM3LDEyICYjNDM7MzYsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucywKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCWlmICgqcHRyICE9IG5zKSB7Ci0JCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAluZXQgPSBzb2NrX25ldChza2ItJmd0O3NrKTsKIAlpZiAoIXBzcF9kZXZfZW5jYXBzdWxhdGUobmV0LCBza2IsIHBhcy0mZ3Q7dHguc3BpLCBwYXMtJmd0O3ZlcnNpb24sIDApKSB7CiAJCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7CkBAIC0xNDksMTkgJiM0MzsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbiwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCi0JCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKLXsKLQlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7Ci0Jdm9pZCAqKnB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCi0JLyogQ29weSBkcnZfcHJpdiBmcm9tIHBzZCB0byBhc3NvYyAqLwotCSpwdHIgPSBwc2QtJmd0O2Rydl9wcml2OwotCW5zLSZndDtwc3AuYXNzb2NfY250JiM0MzsmIzQzOzsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiB7CiAJc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwpAQCAtMTc3LDE1ICYjNDM7MTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0Jc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwotCXZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTsKLQotCSpwdHIgPSBOVUxMOwotCW5zLSZndDtwc3AuYXNzb2NfY250LS07Ci19Ci0KIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHsKIAlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7CkBAIC0yMDQsOCAmIzQzOzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0gewogCS5zZXRfY29uZmlnCT0gbnNpbV9wc3Bfc2V0X2NvbmZpZywKIAkucnhfc3BpX2FsbG9jCT0gbnNpbV9yeF9zcGlfYWxsb2MsCi0JLnR4X2tleV9hZGQJPSBuc2ltX2Fzc29jX2FkZCwKLQkudHhfa2V5X2RlbAk9IG5zaW1fYXNzb2NfZGVsLAogCS5rZXlfcm90YXRlCT0gbnNpbV9rZXlfcm90YXRlLAogCS5nZXRfc3RhdHMJPSBuc2ltX2dldF9zdGF0cywKIH07CkBAIC0yMTUsNyAmIzQzOzE4NCw2IEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9jYXBzIG5zaW1fcHNwX2NhcHMgPSB7CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHwKIAkJICAgIDEgJmx0OyZsdDsgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzI1NiB8CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LAotCS5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bikKQEAgLTIzMCw3ICYjNDM7MTk4LDYgQEAgc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTsKIAl9Ci0JV0FSTl9PTihucy0mZ3Q7cHNwLmFzc29jX2NudCk7CiB9CiAKIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oCmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgKQEAgLTI0LDExICYjNDM7MjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpOwogLyogS2VybmVsLWZhY2luZyBBUEkgKi8KIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0JcmV0dXJuIHBhcy0mZ3Q7ZHJ2X2RhdGE7Ci19Ci0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUCkKIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pOwogdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmggYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAppbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaApAQCAtMjE5LDEyICYjNDM7MjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7CiAJICogQHR4X2tleV9hZGQ6IGFkZCBhIFR4IGtleSB0byB0aGUgZGV2aWNlCiAJICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2UKIAkgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuCiYjNDM7CSAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsCiYjNDM7CSAqIGlzIGFsc28gTlVMTC4KIAkgKi8KIAlpbnQgKCp0eF9rZXlfYWRkKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiAJLyoqCiAJICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2UKIAkgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2FkZAomIzQzOwkgKiBpcyBhbHNvIE5VTEwuCiAJICovCiAJdm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7CiAKZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oCmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaApAQCAtNTMsNCAmIzQzOzUzLDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2lzX3JlZ2lzdGVyZWQoc3RydWN0IHBzcF9kZXYgKnBzZCkKIAlyZXR1cm4gISFwc2QtJmd0O29wczsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2hhc19zYWRiKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cHNkLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuICEhcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cGFzLSZndDtwc2QtJmd0O2xvY2spOwomIzQzOwlyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtJmd0O3BzZCkgJmFtcDsmYW1wOyBwYXMtJmd0O3R4LnNwaTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uYwppbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NAotLS0gYS9uZXQvcHNwL3BzcF9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3BfbWFpbi5jCkBAIC02OCw5ICYjNDM7NjgsOSBAQCBwc3BfZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgIXBzZF9vcHMtJmd0O3NldF9jb25maWcgfHwKIAkJICAgICFwc2Rfb3BzLSZndDtrZXlfcm90YXRlIHx8CiAJCSAgICAhcHNkX29wcy0mZ3Q7cnhfc3BpX2FsbG9jIHx8Ci0JCSAgICAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZCB8fAotCQkgICAgIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwgfHwKLQkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMpKQomIzQzOwkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMgfHwKJiM0MzsJCSAgICAoIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQgIT0gIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwpIHx8CiYjNDM7CQkgICAgKHBzZF9jYXBzLSZndDthc3NvY19kcnZfc3BjICZhbXA7JmFtcDsgIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwc2QgPSBremFsbG9jX29iaigqcHNkKTsKQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiAKIAlsaXN0X3NwbGljZV9pbml0KCZhbXA7cHNkLSZndDthY3RpdmVfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7cHJldl9hc3NvY3MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmFtcDtwc2QtJmd0O3ByZXZfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkKLQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgJmFtcDtwc2QtJmd0O3N0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHsKJiM0MzsJCWlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKQomIzQzOwkJCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CQlsaXN0X2RlbCgmYW1wO3Bhcy0mZ3Q7YXNzb2NzX2xpc3QpOwomIzQzOwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgJmFtcDtwc2QtJmd0O2Fzc29jX2Rldl9saXN0LAogCQkJCSBkZXZfbGlzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jCmluZGV4IDFhMmE2Yjc1MTZiMGYuLjZhNGJlY2MzOGI1NWEgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmMKQEAgLTc4LDE2ICYjNDM7NzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB9CiAKIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCQkgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlyZXR1cm4gcHNkLSZndDtvcHMtJmd0O3R4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKmR1bW15OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAomIzQzOwkgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UmIzM5O2xsIG5lZWQgdG8KJiM0MzsJICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuCiYjNDM7CSAqLwomIzQzOwlkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpOwomIzQzOwlpZiAoIWR1bW15KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwomIzQzOwllcnIgPSBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwomIzQzOwlpZiAoIWVycikKJiM0MzsJCW1lbWNweShwYXMtJmd0O2Rydl9kYXRhLCBkdW1teS0mZ3Q7ZHJ2X2RhdGEsCiYjNDM7CQkgICAgICAgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKJiM0MzsKJiM0MzsJa2ZyZWUoZHVtbXkpOwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB7Ci0JaWYgKHBhcy0mZ3Q7dHguc3BpKQotCQlwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7Ci0JbGlzdF9kZWwoJmFtcDtwYXMtJmd0O2Fzc29jc19saXN0KTsKJiM0MzsJcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWwocHNkLCBwYXMpOwogfQogCiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIAlzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLSZndDtwc2Q7CiAKIAltdXRleF9sb2NrKCZhbXA7cHNkLSZndDtsb2NrKTsKLQlpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpCi0JCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CWlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkgewomIzQzOwkJaWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpCiYjNDM7CQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJCWxpc3RfZGVsKCZhbXA7cGFzLSZndDthc3NvY3NfbGlzdCk7CiYjNDM7CX0KIAltdXRleF91bmxvY2soJmFtcDtwc2QtJmd0O2xvY2spOwogCXBzcF9kZXZfcHV0KHBzZCk7CiAJa2ZyZWUocGFzKTsKQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJcmV0dXJuIGVycjsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiYjNDM7CQkJICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LAomIzQzOwkJCSAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAocHNwX2Rldl9oYXNfc2FkYihwc2QpKSB7CiYjNDM7CQllcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcykKIHsKIAlzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTsKQEAgLTE3NCwxMiAmIzQzOzIxMCw0MCBAQCBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50CiYjNDM7cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCSAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCiYjNDM7CQkJICAgICAgICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gcHNwX2Fzc29jX3NldF90eChwc2QsIHBhcywga2V5LCBleHRhY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRShzay0mZ3Q7c2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTsKJiM0MzsJdGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTsKJiM0MzsJcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7CiYjNDM7CiYjNDM7CWljc2sgPSBpbmV0X2Nzayhzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfc3luY19tc3Moc2ssIGljc2stJmd0O2ljc2tfcG10dV9jb29raWUpOwomIzQzOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQkJICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7Ci0Jc3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlpbnQgZXJyOwogCiAJbG9ja19zb2NrKHNrKTsKQEAgLTIwNyw0MCAmIzQzOzI3MSw3IEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAotCWVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7Ci0JaWYgKGVycikgewotCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKLQkJZ290byBleGl0X3VubG9jazsKLQl9Ci0KLQkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAotCSAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0bwotCSAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLgotCSAqLwotCWR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7Ci0JaWYgKCFkdW1teSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfdW5sb2NrOwotCX0KLQotCW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwotCWVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlX2R1bW15OwotCi0JbWVtY3B5KHBhcy0mZ3Q7ZHJ2X2RhdGEsIGR1bW15LSZndDtkcnZfZGF0YSwgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKLQltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7Ci0KLQlXUklURV9PTkNFKHNrLSZndDtza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpOwotCXRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7Ci0JcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7Ci0KLQlpY3NrID0gaW5ldF9jc2soc2spOwotCWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7Ci0JaWNzay0mZ3Q7aWNza19zeW5jX21zcyhzaywgaWNzay0mZ3Q7aWNza19wbXR1X2Nvb2tpZSk7Ci0KLWV4aXRfZnJlZV9kdW1teToKLQlrZnJlZShkdW1teSk7CiYjNDM7CWVyciA9IHBzcF9zb2NrX3NldF90eF9rZXkoc2ssIHBzZCwgcGFzLCBrZXksIGV4dGFjayk7CiBleGl0X3VubG9jazoKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc0NzAKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmaWd1cmUgb3V0IGlmIHRoaXMgcGF0Y2ggaXMgZXZlbiAqd29ydGgqIGZ1enppbmcsIGFuZCBpZiBzbywgd2hhdCB0aGUgYmVzdCBhcHByb2FjaCBpcy4gSSBuZWVkIHRvIG5haWwgZG93biB0aGUgb3B0aW1hbCBjb25maWd1cmF0aW9uIGFuZCBpZGVudGlmeSB0aGUgcmlnaHQgZm9jdXMgc3ltYm9scy4KCkZpcnN0IHN0ZXA6IGdldCBhIGdvb2QgbG9vayBhdCB0aGUgY2hhbmdlcy4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlczoKCiogICBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oYAoqICAgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AKKiAgIGBpbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhgCiogICBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgCiogICBgbmV0L3BzcC9wc3AuaGAKKiAgIGBuZXQvcHNwL3BzcF9tYWluLmNgCiogICBgbmV0L3BzcC9wc3Bfc29jay5jYAoKUmlnaHQsIHNvIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgZGV2aWNlIHNpbXVsYXRvciBhbmQgc29tZSBraW5kIG9mICYjMzQ7cHNwJiMzNDsgKGxpa2VseSBwYWNrZXQgc2NoZWR1bGluZyBvciBwcm9jZXNzaW5nLCBiYXNlZCBvbiB0aGUgaW5jbHVkZSBwYXRocykuIERlZmluaXRlbHkgaW50ZXJlc3RpbmcuIE5leHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZXNlIG1vZGlmaWNhdGlvbnMuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBhbmQgc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgYmVpbmcgY2hhbmdlZC4gVGhhdCYjMzk7bGwgbGV0IG1lIGRlY2lkZSB3aGV0aGVyIHdlJiMzOTtyZSBsb29raW5nIGF0IHNvbWV0aGluZyB0aGF0IGNvdWxkIGJlIGhpdCBieSBmdXp6aW5nLCBhbmQgaWYgc28sIHdoYXQgdGhlIG1vc3QgdnVsbmVyYWJsZSBhcmVhcyBhcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0lORVRfUFNQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L25ldGRldnNpbS9NYWtlZmlsZT0xOT1lbmRpZlxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIwLVxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlOjIxOmlmbmVxICgkKENPTkZJR19JTkVUX1BTUCksKVxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIyLW5ldGRldnNpbS1vYmpzICYjNDM7PSBwc3Aub1xuLS1cbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaD00NDQ9c3RhdGljIGlubGluZSB2b2lkIG5zaW1fbWFjc2VjX3RlYXJkb3duKHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxuLS1cbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaC00NDgtXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmg6NDQ5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaC00NTAtaW50IG5zaW1fcHNwX2luaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpO1xuLS1cbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmg9MjE1OD1zdHJ1Y3QgbmV0X2RldmljZSB7XG4tLVxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaC0yMzg4LSNlbmRpZlxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaDoyMzg5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgtMjM5MC1cdHN0cnVjdCBwc3BfZGV2IF9fcmN1XHQqcHNwX2Rldjtcbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTUwNDM9ZW51bSBza2JfZXh0X2lkIHtcbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTUwNTgtI2VuZGlmXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjUwNTk6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDYwLVx0U0tCX0VYVF9QU1AsXG4tLVxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg9MzM9c3RydWN0IGluZXRfdGltZXdhaXRfc29jayB7XG4tLVxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmgtODQtXHRzdHJ1Y3QgaW5ldF9iaW5kMl9idWNrZXRcdCp0d190YjI7XG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaDo4NTojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04Ni1cdHN0cnVjdCBwc3BfYXNzb2MgX19yY3VcdCAgKnBzcF9hc3NvYztcbi0tXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg9MjU9dm9pZCBwc3BfYXNzb2NfcHV0KHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgtMjYtXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg6Mjc6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oLTI4LXVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuLS1cbmluY2x1ZGUvbmV0L3NvY2suaD0zNjU9c3RydWN0IHNvY2sge1xuLS1cbmluY2x1ZGUvbmV0L3NvY2suaC00NjYtI2VuZGlmXG5pbmNsdWRlL25ldC9zb2NrLmg6NDY3OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmluY2x1ZGUvbmV0L3NvY2suaC00NjgtXHRzdHJ1Y3QgcHNwX2Fzc29jIF9fcmN1XHQqcHNwX2Fzc29jO1xuLS1cbm5ldC9NYWtlZmlsZT0yMD1vYmotJChDT05GSUdfVU5JWClcdFx0JiM0Mzs9IHVuaXgvXG5uZXQvTWFrZWZpbGU6MjE6b2JqLSQoQ09ORklHX0lORVRfUFNQKVx0XHQmIzQzOz0gcHNwL1xubmV0L01ha2VmaWxlLTIyLW9iai15XHRcdFx0XHQmIzQzOz0gaXB2Ni9cbi0tXG5uZXQvY29yZS9za2J1ZmYuYz01MTUwPXN0YXRpYyBjb25zdCB1OCBza2JfZXh0X3R5cGVfbGVuW10gPSB7XG4tLVxubmV0L2NvcmUvc2tidWZmLmMtNTE2NS0jZW5kaWZcbm5ldC9jb3JlL3NrYnVmZi5jOjUxNjY6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxubmV0L2NvcmUvc2tidWZmLmMtNTE2Ny1cdFtTS0JfRVhUX1BTUF0gPSBTS0JfRVhUX0NIVU5LU0laRU9GKHN0cnVjdCBwc3Bfc2tiX2V4dCksXG4tLVxubmV0L2NvcmUvc29jay5jPTI0Nzk9c3RydWN0IHNvY2sgKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHksXG4tLVxubmV0L2NvcmUvc29jay5jLTI0OTYtI2VuZGlmXG5uZXQvY29yZS9zb2NrLmM6MjQ5NzojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG5uZXQvY29yZS9zb2NrLmMtMjQ5OC1cdFJDVV9JTklUX1BPSU5URVIobmV3c2stXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcbi0tXG5uZXQvcHNwL01ha2VmaWxlLTItXG5uZXQvcHNwL01ha2VmaWxlOjM6b2JqLSQoQ09ORklHX0lORVRfUFNQKSAmIzQzOz0gcHNwLm9cbm5ldC9wc3AvTWFrZWZpbGUtNC1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc9Mz1DT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUz1uXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc6NDpDT05GSUdfSU5FVF9QU1A9eVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnLTUtQ09ORklHX0lQVjY9eVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkwNjgKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGFzc3VtZWQga25vd2xlZGdlIHRoZSB1c2VyIGhhczoKCioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIGZvciBOZXR3b3JrIFNpbXVsYXRpb24qKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgYSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBteSB3b3JrIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JraW5nIHNpbXVsYXRpb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGNoZWNrIHRoZSBrZXJuZWwmIzM5O3MgS2NvbmZpZyBzeXN0ZW0uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAgcmVsYXRlIHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbiBmcmFtZXdvcmsuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgbWVudGFsIG1hcCBvZiB0aGUgZ2VuZXJhbCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLCBidXQgdGhlc2UgdHdvLCBpbiB0aGlzIHBhcnRpY3VsYXIgc2NlbmFyaW8sIG5lZWQgYSBjbG9zZXIgbG9vay4gSSBuZWVkIHRvIHF1aWNrbHkgZXN0YWJsaXNoIGlmIG9uZSBkZXBlbmRzIG9uIHRoZSBvdGhlciwgaWYgdGhleSYjMzk7cmUgbXV0dWFsbHkgZXhjbHVzaXZlIGluIHNvbWUgY29tYmluYXRpb25zLCBvciBpZiB0aGV54oCZcmUgaW5kZXBlbmRlbnQgZmVhdHVyZXMgdGhhdCBjYW4gaW50ZXJhY3QuIEl0JiMzOTtzIHRpbWUgdG8gcGFyc2UgdGhlIEtjb25maWcgZmlsZXMgYW5kIHNlZSBleGFjdGx5IGhvdyB0aGVzZSB0aGluZ3MgYXJlIGRlZmluZWQgYW5kIGNvbnN0cmFpbmVkLiBJIGV4cGVjdCB0aGVyZSBtaWdodCBiZSBzb21lIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBvciBkZWZhdWx0IHZhbHVlcyBJIG5lZWQgdG8gaW50ZXJuYWxpemUgdG8gZW5zdXJlIEkgc2V0IHVwIG15IHNpbXVsYXRpb24gZW52aXJvbm1lbnQgY29ycmVjdGx5LiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBzZWxlY3RgIGFuZCBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyB0byBnZXQgYSBmdWxsIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIElORVRfUFNQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wc3AvS2NvbmZpZy00LSNcbm5ldC9wc3AvS2NvbmZpZzo1OmNvbmZpZyBJTkVUX1BTUFxubmV0L3BzcC9LY29uZmlnLTYtXHRib29sIFwmIzM0O1BTUCBTZWN1cml0eSBQcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTQxMwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipFeGFtaW5pbmcgS2NvbmZpZyBGaWxlcyBmb3IgTmV0d29yayBEZXZpY2UgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBjb25maWd1cmF0aW9uIGFzcGVjdHMgb2YgdGhlc2UgbmV0d29yayBkcml2ZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJlcyB0aGVzZSBzcGVjaWZpYyBuZXR3b3JrIGRldmljZXMgd2l0aGluIHRoZSBrZXJuZWwuIFRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50cyBhcmUgdGhlIGBuZXQvcHNwL0tjb25maWdgIGFuZCBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL0tjb25maWdgIGZpbGVzLiBJJiMzOTttIGV4cGVjdGluZyB0aGVzZSB0byBvdXRsaW5lIHRoZSBtZW51IGVudHJpZXMsIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIGFuZCBoZWxwIHRleHQgdGhhdCBndWlkZSB0aGUgdXNlciYjMzk7cyBjaG9pY2VzIGR1cmluZyB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcGhhc2UgKHVzaW5nIGBtYWtlIG1lbnVjb25maWdgLCBgbWFrZSBkZWZjb25maWdgLCBvciBzaW1pbGFyKS4gSeKAmWxsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOgoKKiAgICoqRGVwZW5kZW5jaWVzOioqIFdoYXQgb3RoZXIga2VybmVsIGZlYXR1cmVzIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgdGhlc2UgZGV2aWNlcyBiZWNvbWUgYXZhaWxhYmxlPyBBcmUgdGhlcmUgc3BlY2lmaWMgaGFyZHdhcmUgb3IgZHJpdmVyIHJlcXVpcmVtZW50cz8KKiAgICoqRGVmYXVsdCBWYWx1ZXM6KiogV2hhdCYjMzk7cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29uZmlndXJhdGlvbj8gSXMgdGhlIGRyaXZlciBlbmFibGVkIGJ5IGRlZmF1bHQsIG9yIGRpc2FibGVkPyBXaGF0IGFyZSBhbnkgZGVmYXVsdCBwYXJhbWV0ZXJzIGxpa2UgYnVmZmVyIHNpemVzIG9yIHF1ZXVlIGxlbmd0aHM/CiogICAqKk1lbnUgU3RydWN0dXJlOioqIEhvdyBhcmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBncm91cGVkPyBBcmUgdGhleSBvcmdhbml6ZWQgbG9naWNhbGx5IGJ5IGZlYXR1cmUsIGRldmljZSB0eXBlLCBvciBuZXR3b3JrIHByb3RvY29sPyBIb3cgZGVlcGx5IG5lc3RlZCBhcmUgdGhleT8KKiAgICoqSGVscCBUZXh0OioqIElzIHRoZSBoZWxwIHRleHQgY2xlYXIgYW5kIGluZm9ybWF0aXZlPyBEb2VzIGl0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgZWFjaCBvcHRpb24gYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBEb2VzIGl0IHByb3ZpZGUgZ3VpZGFuY2Ugb24gd2hpY2ggc2V0dGluZ3MgYXJlIHN1aXRhYmxlIGZvciBkaWZmZXJlbnQgdXNlIGNhc2VzPwoqICAgKipDb21wYXRpYmlsaXR5OioqIEFyZSB0aGVyZSBhbnkga25vd24gY29tcGF0aWJpbGl0eSBpc3N1ZXMgb3IgbGltaXRhdGlvbnM/IElzIHRoZXJlIGFueSBpbmRpY2F0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIHZlcnNpb25zIG9yIHNvZnR3YXJlIHZlcnNpb25zIHRoZSBkcml2ZXJzIGFyZSBkZXNpZ25lZCBmb3I/CgpVbmRlcnN0YW5kaW5nIHRoZXNlIGBLY29uZmlnYCBmaWxlcyBpcyBmb3VuZGF0aW9uYWwuIEl0JiMzOTtzIHRoZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZHJpdmVycyBhcmUgaW50ZWdyYXRlZCBhbmQgaG93IGVuZC11c2VycyBpbnRlcmFjdCB3aXRoIHRoZW0gaW4gdGhlIGxhcmdlciBrZXJuZWwgZWNvc3lzdGVtLiBUaGlzIGlzIHdoZXJlIHRoZSBzdG9yeSBiZWdpbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQjXG4gICAzOlx0IyBQU1AgY29uZmlndXJhdGlvblxuICAgNDpcdCNcbiAgIDU6XHRjb25maWcgSU5FVF9QU1BcbiAgIDY6XHRcdGJvb2wgXCYjMzQ7UFNQIFNlY3VyaXR5IFByb3RvY29sIHN1cHBvcnRcJiMzNDtcbiAgIDc6XHRcdGRlcGVuZHMgb24gSU5FVFxuICAgODpcdFx0c2VsZWN0IFNLQl9ERUNSWVBURURcbiAgIDk6XHRcdHNlbGVjdCBTS0JfRVhURU5TSU9OU1xuICAxMDpcdFx0c2VsZWN0IFNPQ0tfVkFMSURBVEVfWE1JVFxuICAxMTpcdFx0aGVscFxuICAxMjpcdFx0RW5hYmxlIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgUFNQIFNlY3VyaXR5IFByb3RvY29sIChQU1ApLlxuICAxMzpcdFx0Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOlxuICAxNDpcdFx0ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZ29vZ2xlL3BzcC9tYWluL2RvYy9QU1BfQXJjaF9TcGVjLnBkZlxuICAxNTpcdFxuICAxNjpcdFx0SWYgdW5zdXJlLCBzYXkgTi5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA0NQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgd2VudDoKCioqRXhhbWluaW5nIEtjb25maWcgZm9yIE5ldGRldnNpbSBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBzb21ldGhpbmcgbmV0d29yay1yZWxhdGVkLCBhbmQgSSYjMzk7bSBwcmV0dHkgc3VyZSBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgbWluZCBpbW1lZGlhdGVseSBnb2VzIHRvIHdoZXJlIHRoZXNlIHRoaW5ncyBhcmUgdXN1YWxseSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgc291cmNlLCBhbmQgdGhhdCYjMzk7cyB0aGUgYEtjb25maWdgIGZpbGVzLiBTaW5jZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRoZSBuZXR3b3JrIGRldmljZSBzaW11bGF0b3IsIGBuZXRkZXZzaW1gLCBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG92ZXJsb29rIGFueXRoaW5nIHNwZWNpZmljIHRvIGl0LiBUbyBlbnN1cmUgSSBjb3ZlciBhbGwgcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUgYnVpbGQsIEkgbmVlZCB0byBvcGVuIGFuZCByZWFkIHRoZSBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL0tjb25maWdgIGZpbGUsIHNpbmNlIHRoYXQmIzM5O3MgbGlrZWx5IHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgYXJlIGRlZmluZWQuIEkgaGF2ZSB0byBtYWtlIHN1cmUgdG8gZXhhbWluZSB0aGlzIGZpbGUgdGhvcm91Z2hseSBhcyBwYXJ0IG9mIG15IGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORVRERVZTSU0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvS2NvbmZpZz02MDI9c291cmNlIFwmIzM0O2RyaXZlcnMvbmV0L2h5cGVydi9LY29uZmlnXCYjMzQ7XG5kcml2ZXJzL25ldC9LY29uZmlnLTYwMy1cbmRyaXZlcnMvbmV0L0tjb25maWc6NjA0OmNvbmZpZyBORVRERVZTSU1cbmRyaXZlcnMvbmV0L0tjb25maWctNjA1LVx0dHJpc3RhdGUgXCYjMzQ7U2ltdWxhdGVkIG5ldHdvcmtpbmcgZGV2aWNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMzQzCgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMTA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoZSBOZXQvUFNQIEltcGxlbWVudGF0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgdW5kZXJzdGFuZCBob3cgdGhpcyBuZXQvcHNwIG1vZHVsZSB3b3JrcywgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCBob3cgaXQmIzM5O3MgaW50ZWdyYXRlZC4gUFNQLCBhcyBJIHJlY2FsbCwgaXMgdGhlIFBTUCBTZWN1cml0eSBQcm90b2NvbCDigJMgdGhhdCBHb29nbGUgaW5pdGlhdGl2ZSBmb3IgSVAvVENQIGNyeXB0byBvZmZsb2FkLiBXZSBrbm93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBzeXN0ZW0gdmlhIG5ldGxpbmsgYW5kIHNvY2tldHMsIGFuZCBJJiMzOTttIHByZXR0eSBzdXJlIGl0IGhhcyBzb21lIG5ldGRldnNpbSBzdXBwb3J0IGJha2VkIGluLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBleGFtaW5pbmcgdGhlIGNvcmUgZmlsZXM6IGBuZXQvcHNwL3BzcF9tYWluLmNgIHNob3VsZCBiZSB0aGUgZW50cnkgcG9pbnQsIGBuZXQvcHNwL3BzcF9zb2NrLmNgIHdpbGwgaG9sZCB0aGUgc29ja2V0LXJlbGF0ZWQgY29kZSwgYW5kIHRoZW4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYG5ldC9wc3AvcHNwX25sLmNgIGZvciBhbnkgTmV0bGluayBpbnRlcmFjdGlvbnMuIExldCYjMzk7cyBzZWUgaWYgdGhlIE5ldGxpbmsgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhhdCBzcGVjaWZpYyBmaWxlLiBUbyBzdGFydCBJJiMzOTtsbCBsaXN0IHRoZSBmaWxlcyBpbiB0aGUgYG5ldC9wc3BgIGRpcmVjdG9yeSB0byBnZXQgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mIHRoZSBhcmNoaXRlY3R1cmUuIExldCYjMzk7cyBzZWUgd2hhdCBnZW1zIHdlIGNhbiBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmNvZGVzZWFyY2gtZGlyLWluZGV4PC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtEaXImIzM0OzogJiMzNDtuZXQvcHNwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGVzJiMzNDs6IFsKICAgICYjMzQ7cHNwLW5sLWdlbi5jJiMzNDssCiAgICAmIzM0O3BzcC1ubC1nZW4uaCYjMzQ7LAogICAgJiMzNDtwc3AuaCYjMzQ7LAogICAgJiMzNDtwc3BfbWFpbi5jJiMzNDssCiAgICAmIzM0O3BzcF9ubC5jJiMzNDssCiAgICAmIzM0O3BzcF9zb2NrLmMmIzM0OwogIF0sCiAgJiMzNDtTdWJkaXJzJiMzNDs6IG51bGwKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDc1OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDEyNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIEZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgKmRlZmluaXRlbHkqIHdvcnRoIGEgZGVlcGVyIGxvb2sgZm9yIGZ1enppbmcgcHVycG9zZXMuIGBuZXRkZXZzaW1gIGlzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nIGJlY2F1c2UgaXQgaXMgZWFzaWx5IGFjY2Vzc2libGUgd2l0aGluIFFFTVUsIG1ha2luZyBpdCBwZXJmZWN0IGZvciBzeXprYWxsZXIuIFRoZSBQU1AgcHJvdG9jb2wgaXRzZWxmLCBsb2NhdGVkIGluIGBuZXQvcHNwL2AsIGlzIGNvcmUgbmV0d29ya2luZyBsb2dpYy4gV2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBjaGFuZ2VzIGludGVyYWN0IGFuZCBzZWUgaWYgdGhleSBpbnRyb2R1Y2UgYW55IG5ldyBhdmVudWVzIGZvciBleHBsb2l0YXRpb24uCgpGaXJzdCwgSSYjMzk7bGwgYW5hbHl6ZSB0aGUgcGF0Y2ggZGlmZi4KMS4gICoqYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AqKjogSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgc2ltcGxpZnlpbmcgbmV0ZGV2c2ltJiMzOTtzIFBTUCBpbXBsZW1lbnRhdGlvbi4gV2UgYXJlIHJlbW92aW5nIHNvbWUgaW50ZXJuYWwgdHJhY2tpbmcgbWVjaGFuaXNtcyAoYGFzc29jX2NudGAsICBgbnNpbV9hc3NvY19hZGRgLCBgbnNpbV9hc3NvY19kZWxgLCBgYXNzb2NfZHJ2X3NwY2ApLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGF0IGBuZXRkZXZzaW1gIGlzbiYjMzk7dCBzdG9yaW5nIFR4IGtleXMgaW4gaGFyZHdhcmUgKFNBREIpLCBzbyBpdCYjMzk7cyBtYWtpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgb3BlcmF0aW9ucyBvcHRpb25hbCB3aXRoaW4gYHN0cnVjdCBwc3BfZGV2X29wc2AuIFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiB3aGljaCBtaWdodCBsZWFkIHRvIGVkZ2UgY2FzZXMuCjIuICAqKmBpbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhgIGFuZCBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgKio6IFdlJiMzOTtyZSBzZWVpbmcgbW9yZSBzaW1wbGlmaWNhdGlvbnMuIFRoZSByZW1vdmFsIG9mIGBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKWAgYW5kIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBvcHRpb25hbCBuYXR1cmUgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnVydGhlciBjbGFyaWZ5IHRoZSBpbnRlbnRpb24gb2YgdGhlIGNoYW5nZXMuCjMuICAqKmBuZXQvcHNwL3BzcC5oYCoqOiBUaGUgaW50cm9kdWN0aW9uIG9mIGBwc3BfZGV2X2hhc19zYWRiYCBhbmQgYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsYCBpcyBjcnVjaWFsLiBUaGV5IGFyZSBkZWZpbmluZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hlbiBUeCBrZXkgb3BlcmF0aW9ucyBhcmUgbmVjZXNzYXJ5LiBXZSYjMzk7cmUgc2VlaW5nIGxvY2tkZXAgYXNzZXJ0aW9ucyAoYGxvY2tkZXBfYXNzZXJ0X2hlbGRgKSB3aGljaCwgaWYgdmlvbGF0ZWQsIGlzIGFuIGluZGljYXRvciBvZiBhIGxvY2tpbmcgaXNzdWUuCjQuICAqKmBuZXQvcHNwL3BzcF9tYWluLmNgKio6IFRoZSB1cGRhdGUgdG8gYHBzcF9kZXZfY3JlYXRlYCBhbGxvd3MgZm9yIE5VTEwgYHR4X2tleV9hZGRgIC8gYHR4X2tleV9kZWxgLCBhZGRpbmcgZmxleGliaWxpdHkgdG8gdGhlIGNvZGUuIEhvd2V2ZXIsIHRoZSBsb2dpYyByZWdhcmRpbmcgYGFzc29jX2Rydl9zcGNgIGFkZHMgYSBjaGVjayB0byBlbnN1cmUgdGhhdCAqYm90aCogY2FuIGJlIG51bGwgb3IgbXVzdCBiZSBzZXQuIGBwc3BfZGV2X3VucmVnaXN0ZXJgIG5vdyBjb25kaXRpb25hbGx5IGNhbGxzIGBwc3BfZGV2X3R4X2tleV9kZWxgIGJhc2VkIG9uIHRoZSBjb25kaXRpb25zLgo1LiAgKipgbmV0L3BzcC9wc3Bfc29jay5jYCoqOiBUaGlzIGlzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIFdlJiMzOTtyZSBzZWVpbmcgbW9kaWZpY2F0aW9ucyB0byBgcHNwX2Rldl90eF9rZXlfYWRkYCBhbmQgYHBzcF9kZXZfdHhfa2V5X2RlbGAgY29uY2VybmluZyBkdW1teSBhc3NvY2lhdGlvbnMsIGNvcHlpbmcgb2YgZHJpdmVyIGRhdGEgYW5kIGNoYW5nZXMgdG8gdGhlIGxpc3QgaGFuZGxpbmcuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgYHBzcF9hc3NvY19zZXRfdHhgLCBgcHNwX3NvY2tfc2V0X3R4X2tleWAgYW5kIHVwZGF0ZXMgdG8gYHBzcF9zb2NrX2Fzc29jX3NldF90eGAgcmVwcmVzZW50IGNoYW5nZXMgaW4ga2V5IG1hbmFnZW1lbnQuCgpNeSBpbnR1aXRpb24gc2F5cyAqdGhpcyBpcyByZWFjaGFibGUgYW5kIHdvcnRoIHRhcmdldGluZy4qCgpIZXJlJiMzOTtzIHdoeToKCiogICAqKkNvcmUgTmV0d29ya2luZyBJbXBhY3QqKjogVGhlIGNoYW5nZXMgYWZmZWN0IHRoZSBQU1Agc3Vic3lzdGVtIChgbmV0L3BzcC9gKSBhbmQgYG5ldGRldnNpbWAsIHdoaWNoIGFyZSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIGNvbXBvbmVudHMuCiogICAqKktleSBMaWZlY3ljbGUgTW9kaWZpY2F0aW9ucyoqOiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIFR4IGtleSBsaWZlY3ljbGUsIHNvY2tldCBhc3NvY2lhdGlvbnMsIGRldmljZSByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24sIGFuZCB0aGUgbmV0bGluayBQU1AgaW50ZXJmYWNlLiBUaGVzZSBhcmUgYWxsIGhpZ2gtdmFsdWUgdGFyZ2V0cyBmb3IgZnV6emluZy4KKiAgICoqQ29uY3VycmVuY3kvTG9ja2luZyoqOiBUaGUgcHJlc2VuY2Ugb2YgYGxvY2tkZXBfYXNzZXJ0X2hlbGRgIHN1Z2dlc3RzIHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMuCiogICAqKkRhdGEgU3RydWN0dXJlIE1hbmlwdWxhdGlvbioqOiBUaGVyZSYjMzk7cyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMgKGxpa2UgYHBzcF9hc3NvY19kdW1teWApLiBNZW1vcnkgY29ycnVwdGlvbiBpcyBhbHdheXMgYSBjb25jZXJuLgoqICAgKipBY2Nlc3NpYmlsaXR5Kio6IEl0JiMzOTtzIGFsbCByZWFjaGFibGUgaW4gUUVNVSwgd2hpY2ggaXMgaWRlYWwgZm9yIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLCBmb2N1c2luZyBvbiBlbnRyeSBwb2ludHMgdGhhdCBjYW4gYmUgZnV6emVkOgoKKiAgICoqTW9kaWZpZWQgRnVuY3Rpb25zKio6IGBwc3BfZGV2X2NyZWF0ZWAsIGBwc3BfZGV2X3VucmVnaXN0ZXJgIGluIGBuZXQvcHNwL3BzcF9tYWluLmNgLCBgcHNwX2Rldl90eF9rZXlfYWRkYCwgYHBzcF9kZXZfdHhfa2V5X2RlbGAsIGBwc3BfYXNzb2NfZnJlZWAsIGFuZCBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCBpbiBgbmV0L3BzcC9wc3Bfc29jay5jYCwgYG5zaW1fZG9fcHNwYCBhbmQgYG5zaW1fcHNwX3VuaW5pdGAgaW4gYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AuCiogICAqKkFkZGVkIFN0YXRpYyBGdW5jdGlvbnMqKjogYHBzcF9hc3NvY19zZXRfdHhgIGFuZCBgcHNwX3NvY2tfc2V0X3R4X2tleWAgaW4gYG5ldC9wc3AvcHNwX3NvY2suY2AuIEkgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZXNlIGFyZSBpbmxpbmVkIG9yIGhhdmUgZW50cnkgcG9pbnRzLgoKSSYjMzk7bGwKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwc3Bfc29ja19hc3NvY19zZXRfdHgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3BzcC9wc3AuaD0yNj1pbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3J4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuLS1cbm5ldC9wc3AvcHNwLmgtMjgtXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xubmV0L3BzcC9wc3AuaDoyOTppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbm5ldC9wc3AvcHNwLmgtMzAtXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4tLVxubmV0L3BzcC9wc3BfbmwuYz04MjY9aW50IHBzcF9ubF90eF9hc3NvY19kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4tLVxubmV0L3BzcC9wc3BfbmwuYy04NTctXG5uZXQvcHNwL3BzcF9ubC5jOjg1ODpcdGVyciA9IHBzcF9zb2NrX2Fzc29jX3NldF90eChzb2NrZXQtXHUwMDNlc2ssIHBzZCwgdmVyc2lvbiwgXHUwMDI2a2V5LFxubmV0L3BzcC9wc3BfbmwuYy04NTktXHRcdFx0XHQgICAgaW5mby1cdTAwM2VleHRhY2spO1xuLS1cbm5ldC9wc3AvcHNwX3NvY2suYz0yMTQ9cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi0tXG5uZXQvcHNwL3BzcF9zb2NrLmMtMjQxLVxubmV0L3BzcC9wc3Bfc29jay5jOjI0MjppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbm5ldC9wc3AvcHNwX3NvY2suYy0yNDMtXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDgxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipEaXZpbmcgaW50byBQU1AgU29ja2V0IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGlzIFBTUCBzb2NrZXQgYXNzb2NpYXRpb24gcHJvY2VzcyB3b3Jrcy4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWFuYWdpbmcgdHJhbnNtaXQga2V5cyBhbmQgYXNzb2NpYXRpb25zLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbG9va2luZyBjbG9zZWx5IGF0IGBwc3BfYXNzb2NfZnJlZWAuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCB3aGVuIGFuIGFzc29jaWF0aW9uIGlzIHRlcm1pbmF0ZWQuIFdoYXQgaGFwcGVucyB0byB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXM/IFdoYXQmIzM5O3MgdGhlIGNvbXBsZXRlIHRlYXJkb3duIHByb2Nlc3M/CgpUaGVuLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGBwc3BfZGV2X3R4X2tleV9hZGRgIGFuZCBgcHNwX2Rldl90eF9rZXlfZGVsYC4gSSBuZWVkIHRvIGVuc3VyZSBJIGhhdmUgYSBzb2xpZCBncmFzcCBvZiBob3cgdHJhbnNtaXQga2V5cyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQgZm9yIHRoZSBhc3NvY2lhdGVkIGRldmljZXMuIFdoYXQgYXJlIHRoZSBrZXkgbWFuYWdlbWVudCBtZWNoYW5pY3M/IEhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIGhhcmR3YXJlPyBBbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBJIHNob3VsZCBiZSBtaW5kZnVsIG9mPyBJIG5lZWQgdG8gbG9vayBhdCB0aGUgbG9ja2luZyBzdHJhdGVneSB3aXRoaW4gdGhlc2UgZnVuY3Rpb25zLgoKRmluYWxseSwgdGhlIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgIGZ1bmN0aW9uLiBUaGlzIGxpa2VseSBvcmNoZXN0cmF0ZXMgdGhlIG92ZXJhbGwgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSB0cmFuc21pdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc29ja2V0IGFzc29jaWF0aW9uLCBzbyBJIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhIGdvb2Qgc2Vuc2Ugb2YgdGhlIGNvbXBsZXRlIGZsb3cgYnkgc3R1ZHlpbmcgdGhlIGZ1bmN0aW9uLiBJIG5lZWQgdG8gYmUgc3VyZSBJIGFtIHZlcnkgY2xlYXIgb24gdGhlIHBhcmFtZXRlcnMgaGVyZSBhbmQgd2hhdCB0aGV5IGFyZSB1c2VkIGZvci4gSSB3aWxsIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyBoZXJlIHRvby4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL3BzcF9zb2NrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDcwOlx0e1xuICA3MTpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gIDcyOlx0XHRzaXplX3Qgc3o7XG4gIDczOlx0XG4gIDc0Olx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAgNzU6XHRcbiAgNzY6XHRcdHN6ID0gc3RydWN0X3NpemUocGFzLCBkcnZfZGF0YSwgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4gIDc3Olx0XHRyZXR1cm4ga21lbWR1cChwYXMsIHN6LCBHRlBfS0VSTkVMKTtcbiAgNzg6XHR9XG4gIDc5Olx0XG4gIDgwOlx0c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuICA4MTpcdFx0XHRcdCAgICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuICA4MjpcdFx0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAgODM6XHR7XG4gIDg0Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpkdW1teTtcbiAgODU6XHRcdGludCBlcnI7XG4gIDg2Olx0XG4gIDg3Olx0XHQvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dFxuICA4ODpcdFx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJiMzOTtsbCBuZWVkIHRvXG4gIDg5Olx0XHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbiAgOTA6XHRcdCAqL1xuICA5MTpcdFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbiAgOTI6XHRcdGlmICghZHVtbXkpXG4gIDkzOlx0XHRcdHJldHVybiAtRU5PTUVNO1xuICA5NDpcdFxuICA5NTpcdFx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4gIDk2Olx0XHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbiAgOTc6XHRcdGlmICghZXJyKVxuICA5ODpcdFx0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbiAgOTk6XHRcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuIDEwMDpcdFxuIDEwMTpcdFx0a2ZyZWUoZHVtbXkpO1xuIDEwMjpcdFx0cmV0dXJuIGVycjtcbiAxMDM6XHR9XG4gMTA0Olx0XG4gMTA1Olx0dm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIDEwNjpcdHtcbiAxMDc6XHRcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gMTA4Olx0fVxuIDEwOTpcdFxuIDExMDpcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiAxMTE6XHR7XG4gMTEyOlx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzcF9hc3NvYywgd29yayk7XG4gMTEzOlx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVx1MDAzZXBzZDtcbiAxMTQ6XHRcbiAxMTU6XHRcdG11dGV4X2xvY2soXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDExNjpcdFx0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XG4gMTE3Olx0XHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuIDExODpcdFx0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gMTE5Olx0XHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4gMTIwOlx0XHR9XG4gMTIxOlx0XHRtdXRleF91bmxvY2soXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDEyMjpcdFx0cHNwX2Rldl9wdXQocHNkKTtcbiAxMjM6XHRcdGtmcmVlKHBhcyk7XG4gMTI0Olx0fVxuIDEyNTpcdFxuIDEyNjpcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlX3F1ZXVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbiAxMjc6XHR7XG4gMTI4Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBzcF9hc3NvYywgcmN1KTtcbiAxMjk6XHRcbiAxMzA6XHRcdElOSVRfV09SSyhcdTAwMjZwYXMtXHUwMDNld29yaywgcHNwX2Fzc29jX2ZyZWUpO1xuIDEzMTpcdFx0c2NoZWR1bGVfd29yayhcdTAwMjZwYXMtXHUwMDNld29yayk7XG4gMTMyOlx0fVxuIDEzMzpcdFxuIDEzNDpcdC8qKlxuIDEzNTpcdCAqIHBzcF9hc3NvY19wdXQoKSAtIHJlbGVhc2UgYSByZWZlcmVuY2Ugb24gYSBQU1AgYXNzb2NpYXRpb25cbiAxMzY6XHQgKiBAcGFzOiBhc3NvY2lhdGlvbiB0byByZWxlYXNlXG4gMTM3Olx0ICovXG4gMTM4Olx0dm9pZCBwc3BfYXNzb2NfcHV0KHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxMzk6XHR7XG4gMTQwOlx0XHRpZiAocGFzIFx1MDAyNlx1MDAyNiByZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2cGFzLVx1MDAzZXJlZmNudCkpXG4gMTQxOlx0XHRcdGNhbGxfcmN1KFx1MDAyNnBhcy1cdTAwM2VyY3UsIHBzcF9hc3NvY19mcmVlX3F1ZXVlKTtcbiAxNDI6XHR9XG4gMTQzOlx0XG4gMTQ0Olx0dm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spXG4gMTQ1Olx0e1xuIDE0NjpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzay1cdTAwM2Vwc3BfYXNzb2MsIDEpO1xuIDE0NzpcdFxuIDE0ODpcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHNrLVx1MDAzZXBzcF9hc3NvYywgTlVMTCk7XG4gMTQ5Olx0XHRwc3BfYXNzb2NfcHV0KHBhcyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MDkwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgcHNwX3NvY2suY2AqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgc3BlY2lmaWMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZSBhZ2Fpbi4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gbGluZXMgMjAwIHRocm91Z2ggMjgwLiBUaGF0IHNlY3Rpb24gbGlrZWx5IGNvbnRhaW5zIHRoZSBzb2NrZXQtc3BlY2lmaWMgZnVuY3Rpb25zIG9yIHN0cnVjdHVyZXMgSSYjMzk7bSBpbnRlcmVzdGVkIGluLCBnaXZlbiB0aGUgY29udGV4dC4gSSYjMzk7bSBob3BpbmcgdG8gcXVpY2tseSBpZGVudGlmeSB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIG9yIGZ1bmN0aW9uIGNhbGxzIHJlbGF0ZWQgdG8gdGhlIGlzc3VlIEkmIzM5O20gaW52ZXN0aWdhdGluZy4gSSBrbm93IEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgY29kZSwgc28gSSBhbnRpY2lwYXRlIGJlaW5nIGFibGUgdG8gZ3Jhc3AgdGhlIGNvcmUgbG9naWMgdGhlcmUgcXVpY2tseSBhbmQgZGV0ZXJtaW5lIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZWl0aGVyIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBoYW5kbGluZyBvZiBzcGVjaWZpYyBzb2NrZXQgb3BlcmF0aW9ucyBvciBwZXJoYXBzIGdldCBhIGhpbnQgYWJvdXQgaG93IHRoaXMgcGFydCBvZiB0aGUgbmV0d29yayBzdGFjayBpbnRlcmFjdHMgd2l0aCBvdGhlciBtb2R1bGVzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3BzcC9wc3Bfc29jay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNzA6XHRcdGVyciA9IDA7XG4gMTcxOlx0XG4gMTcyOlx0ZXhpdF91bmxvY2s6XG4gMTczOlx0XHRyZWxlYXNlX3NvY2soc2spO1xuIDE3NDpcdFxuIDE3NTpcdFx0cmV0dXJuIGVycjtcbiAxNzY6XHR9XG4gMTc3Olx0XG4gMTc4Olx0c3RhdGljIGludCBwc3BfYXNzb2Nfc2V0X3R4KHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAxNzk6XHRcdFx0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4gMTgwOlx0XHRcdFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAxODE6XHR7XG4gMTgyOlx0XHRpbnQgZXJyO1xuIDE4MzpcdFxuIDE4NDpcdFx0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xuIDE4NTpcdFx0XHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiAxODY6XHRcdFx0aWYgKGVycilcbiAxODc6XHRcdFx0XHRyZXR1cm4gZXJyO1xuIDE4ODpcdFx0fVxuIDE4OTpcdFxuIDE5MDpcdFx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuIDE5MTpcdFx0cmV0dXJuIDA7XG4gMTkyOlx0fVxuIDE5MzpcdFxuIDE5NDpcdHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxOTU6XHR7XG4gMTk2Olx0XHRzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTtcbiAxOTc6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4gMTk4Olx0XG4gMTk5Olx0XHRza2JfcmJ0cmVlX3dhbGsoc2tiLCBcdTAwMjZ0Y3Bfc2soc2spLVx1MDAzZW91dF9vZl9vcmRlcl9xdWV1ZSkge1xuIDIwMDpcdFx0XHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XG4gMjAxOlx0XHRcdGlmICghcHNwX3BzZV9tYXRjaGVzX3Bhcyhwc2UsIHBhcykpXG4gMjAyOlx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbiAyMDM6XHRcdH1cbiAyMDQ6XHRcbiAyMDU6XHRcdHNrYl9xdWV1ZV93YWxrKFx1MDAyNnNrLVx1MDAzZXNrX3JlY2VpdmVfcXVldWUsIHNrYikge1xuIDIwNjpcdFx0XHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XG4gMjA3Olx0XHRcdGlmICghcHNwX3BzZV9tYXRjaGVzX3Bhcyhwc2UsIHBhcykpXG4gMjA4Olx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbiAyMDk6XHRcdH1cbiAyMTA6XHRcdHJldHVybiAwO1xuIDIxMTpcdH1cbiAyMTI6XHRcbiAyMTM6XHRzdGF0aWMgaW50XG4gMjE0Olx0cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAyMTU6XHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gMjE2Olx0e1xuIDIxNzpcdFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xuIDIxODpcdFx0aW50IGVycjtcbiAyMTk6XHRcbiAyMjA6XHRcdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4gMjIxOlx0XHRpZiAoZXJyKSB7XG4gMjIyOlx0XHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjayxcbiAyMjM6XHRcdFx0XHQgICAgICAgXCYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVwmIzM0Oyk7XG4gMjI0Olx0XHRcdHJldHVybiBlcnI7XG4gMjI1Olx0XHR9XG4gMjI2Olx0XG4gMjI3Olx0XHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4gMjI4Olx0XHRpZiAoZXJyKVxuIDIyOTpcdFx0XHRyZXR1cm4gZXJyO1xuIDIzMDpcdFxuIDIzMTpcdFx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuIDIzMjpcdFx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbiAyMzM6XHRcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbiAyMzQ6XHRcbiAyMzU6XHRcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4gMjM2Olx0XHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7XG4gMjM3Olx0XHRpY3NrLVx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XG4gMjM4Olx0XG4gMjM5Olx0XHRyZXR1cm4gZXJyO1xuIDI0MDpcdH1cbiAyNDE6XHRcbiAyNDI6XHRpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiAyNDM6XHRcdFx0XHQgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiAyNDQ6XHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAyNDU6XHR7XG4gMjQ2Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XG4gMjQ3Olx0XHRpbnQgZXJyO1xuIDI0ODpcdFxuIDI0OTpcdFx0bG9ja19zb2NrKHNrKTtcbiAyNTA6XHRcbiAyNTE6XHRcdHBhcyA9IHBzcF9za19hc3NvYyhzayk7XG4gMjUyOlx0XHRpZiAoIXBhcykge1xuIDI1MzpcdFx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1NvY2tldCBoYXMgbm8gUngga2V5XCYjMzQ7KTtcbiAyNTQ6XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiAyNTU6XHRcdFx0Z290byBleGl0X3VubG9jaztcbiAyNTY6XHRcdH1cbiAyNTc6XHRcdGlmIChwYXMtXHUwMDNlcHNkICE9IHBzZCkge1xuIDI1ODpcdFx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1J4IGtleSBmcm9tIGRpZmZlcmVudCBkZXZpY2VcJiMzNDspO1xuIDI1OTpcdFx0XHRlcnIgPSAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjcxNAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkludmVzdGlnYXRpbmcgUG90ZW50aWFsIFBTUCBEZXZpY2UgRHJpdmVyIElzc3VlcyoqCgpPa2F5LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoaXMgcHJvYmxlbS4gQmFzZWQgb24gd2hhdCBJJiMzOTt2ZSBzZWVuLCBpdCBzZWVtcyBsaWtlIHRoZSBpc3N1ZSBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvciBkZXN0cnVjdGlvbiBvZiB0aGUgUFNQIGRldmljZSB3aXRoaW4gdGhlIGtlcm5lbC4gTGV0JiMzOTtzIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gYG5ldC9wc3AvcHNwX21haW4uY2AuIE15IGluc3RpbmN0IGlzIHRvIGV4YW1pbmUgdGhlIGFyZWFzIGFyb3VuZCBgcHNwX2Rldl9jcmVhdGVgIGFuZCBgcHNwX2Rldl91bnJlZ2lzdGVyYCBmdW5jdGlvbnMuIFRoZXNlIGFyZSBsaWtlbHkgdGhlIGNvcmUgZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBQU1AgZGV2aWNlLCBzbyBhbnkgaXNzdWVzIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gb3IgY2xlYW51cCB3b3VsZCBtYW5pZmVzdCBhcm91bmQgdGhvc2UgY2FsbHMuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkLCB3aGF0IGNoZWNrcyBhcmUgYmVpbmcgcGVyZm9ybWVkLCBhbmQgaWYgYW55IGVycm9ycyBhcmUgYmVpbmcgaGFuZGxlZCBhcHByb3ByaWF0ZWx5LiBUaGF0JiMzOTtzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGJlZ2luIG15IGRlYnVnZ2luZyBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9wc3AvcHNwX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDExMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDU1Olx0ICpcbiAgNTY6XHQgKiBSZXR1cm46IHBvaW50ZXIgdG8gYWxsb2NhdGVkIFBTUCBkZXZpY2UsIG9yIEVSUl9QVFIuXG4gIDU3Olx0ICovXG4gIDU4Olx0c3RydWN0IHBzcF9kZXYgKlxuICA1OTpcdHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gIDYwOlx0XHQgICAgICAgc3RydWN0IHBzcF9kZXZfb3BzICpwc2Rfb3BzLCBzdHJ1Y3QgcHNwX2Rldl9jYXBzICpwc2RfY2FwcyxcbiAgNjE6XHRcdCAgICAgICB2b2lkICpwcml2X3B0cilcbiAgNjI6XHR7XG4gIDYzOlx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xuICA2NDpcdFx0c3RhdGljIHUzMiBsYXN0X2lkO1xuICA2NTpcdFx0aW50IGVycjtcbiAgNjY6XHRcbiAgNjc6XHRcdGlmIChXQVJOX09OKCFwc2RfY2Fwcy1cdTAwM2V2ZXJzaW9ucyB8fFxuICA2ODpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNlc2V0X2NvbmZpZyB8fFxuICA2OTpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNla2V5X3JvdGF0ZSB8fFxuICA3MDpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNlcnhfc3BpX2FsbG9jIHx8XG4gIDcxOlx0XHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbiAgNzI6XHRcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4gIDczOlx0XHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuICA3NDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiAgNzU6XHRcbiAgNzY6XHRcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuICA3NzpcdFx0aWYgKCFwc2QpXG4gIDc4Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuICA3OTpcdFxuICA4MDpcdFx0cHNkLVx1MDAzZW1haW5fbmV0ZGV2ID0gbmV0ZGV2O1xuICA4MTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0KTtcbiAgODI6XHRcdHBzZC1cdTAwM2VvcHMgPSBwc2Rfb3BzO1xuICA4MzpcdFx0cHNkLVx1MDAzZWNhcHMgPSBwc2RfY2FwcztcbiAgODQ6XHRcdHBzZC1cdTAwM2VkcnZfcHJpdiA9IHByaXZfcHRyO1xuICA4NTpcdFxuICA4NjpcdFx0bXV0ZXhfaW5pdChcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gIDg3Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZwc2QtXHUwMDNlYWN0aXZlX2Fzc29jcyk7XG4gIDg4Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MpO1xuICA4OTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4gIDkwOlx0XHRyZWZjb3VudF9zZXQoXHUwMDI2cHNkLVx1MDAzZXJlZmNudCwgMSk7XG4gIDkxOlx0XG4gIDkyOlx0XHRtdXRleF9sb2NrKFx1MDAyNnBzcF9kZXZzX2xvY2spO1xuICA5MzpcdFx0ZXJyID0geGFfYWxsb2NfY3ljbGljKFx1MDAyNnBzcF9kZXZzLCBcdTAwMjZwc2QtXHUwMDNlaWQsIHBzZCwgeGFfbGltaXRfMTZiLFxuICA5NDpcdFx0XHRcdCAgICAgIFx1MDAyNmxhc3RfaWQsIEdGUF9LRVJORUwpO1xuICA5NTpcdFx0aWYgKGVycikge1xuICA5NjpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2cHNwX2RldnNfbG9jayk7XG4gIDk3Olx0XHRcdGtmcmVlKHBzZCk7XG4gIDk4Olx0XHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4gIDk5Olx0XHR9XG4gMTAwOlx0XHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAxMDE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxMDI6XHRcbiAxMDM6XHRcdC8qIG5vdGlmeSBiZWZvcmUgbmV0ZGV2IGFzc2lnbm1lbnRcbiAxMDQ6XHRcdCAqIFRoZXJlJiMzOTtzIG5vIHN0cm9uZyByZWFzb24gZm9yIGl0LCBidXQgdGhpbmtpbmcgaXMgdG8gYXZvaWQgY3JlYXRpbmdcbiAxMDU6XHRcdCAqIGltcGxpY2l0IGV4cGVjdGF0aW9ucyBhYm91dCB0aGUgUFNQIGRldiBcdTAwM2NcdTAwM2UgbmV0ZGV2IHJlbGF0aW9uc2hpcC5cbiAxMDY6XHRcdCAqL1xuIDEwNzpcdFx0cHNwX25sX25vdGlmeV9kZXYocHNkLCBQU1BfQ01EX0RFVl9BRERfTlRGKTtcbiAxMDg6XHRcbiAxMDk6XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXRkZXYtXHUwMDNlcHNwX2RldiwgcHNkKTtcbiAxMTA6XHRcbiAxMTE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gMTEyOlx0XG4gMTEzOlx0XHRyZXR1cm4gcHNkO1xuIDExNDpcdH1cbiAxMTU6XHRFWFBPUlRfU1lNQk9MKHBzcF9kZXZfY3JlYXRlKTtcbiAxMTY6XHRcbiAxMTc6XHR2b2lkIHBzcF9kZXZfZnJlZShzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIDExODpcdHtcbiAxMTk6XHRcdG11dGV4X2xvY2soXHUwMDI2cHNwX2RldnNfbG9jayk7XG4gMTIwOlx0XHR4YV9lcmFzZShcdTAwMjZwc3BfZGV2cywgcHNkLVx1MDAzZWlkKTtcbiAxMjE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxMjI6XHRcbiAxMjM6XHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDEyNDpcdFx0a2ZyZWVfcmN1KHBzZCwgcmN1KTtcbiAxMjU6XHR9XG4gMTI2Olx0XG4gMTI3Olx0LyoqXG4gMTI4Olx0ICogcHNwX2Rldl91bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIFBTUCBkZXZpY2VcbiAxMjk6XHQgKiBAcHNkOlx0UFNQIGRldmljZSBzdHJ1Y3R1cmVcbiAxMzA6XHQgKi9cbiAxMzE6XHR2b2lkIHBzcF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIDEzMjpcdHtcbiAxMzM6XHRcdHN0cnVjdCBwc3BfYXNzb2NfZGV2ICplbnRyeSwgKmVudHJ5X3RtcDtcbiAxMzQ6XHRcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKm5leHQ7XG4gMTM1Olx0XG4gMTM2Olx0XHRtdXRleF9sb2NrKFx1MDAyNnBzcF9kZXZzX2xvY2spO1xuIDEzNzpcdFx0bXV0ZXhfbG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gMTM4Olx0XG4gMTM5Olx0XHRwc3Bfbmxfbm90aWZ5X2Rldihwc2QsIFBTUF9DTURfREVWX0RFTF9OVEYpO1xuIDE0MDpcdFxuIDE0MTpcdFx0LyogV2FpdCB1bnRpbCBwc3BfZGV2X2ZyZWUoKSB0byBjYWxsIHhhX2VyYXNlKCkgdG8gcHJldmVudCBhXG4gMTQyOlx0XHQgKiBkaWZmZXJlbnQgcHNkIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlIHhhcnJheSB3aXRoIHRoaXMgaWQsIHdoaWxlXG4gMTQzOlx0XHQgKiB0aGVyZSBhcmUgc3RpbGwgcmVmZXJlbmNlcyB0byB0aGlzIHBzZCBiZWluZyBoZWxkLlxuIDE0NDpcdFx0ICovXG4gMTQ1Olx0XHR4YV9zdG9yZShcdTAwMjZwc3BfZGV2cywgcHNkLVx1MDAzZWlkLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiAxNDY6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxNDc6XHRcbiAxNDg6XHRcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gMTQ5Olx0XHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4gMTUwOlx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkge1xuIDE1MTpcdFx0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiAxNTI6XHRcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuIDE1MzpcdFx0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuIDE1NDpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODU3MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBOZXRkZXZzaW0gUFNQIERyaXZlcioqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZSBOZXRkZXZzaW0mIzM5O3MgUFNQIChQYWNrZXQtU2NoZWR1bGluZyBQcm9jZXNzb3IpIGRyaXZlciBvcGVyYXRlcy4gSSYjMzk7bSBnb2luZyB0byBqdW1wIHN0cmFpZ2h0IGludG8gdGhlIGNvZGUgYW5kIHN0YXJ0IHdpdGggYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEZyb20gdGhlcmUsIEkgY2FuIGRlbHZlIGludG8gdGhlIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdFxuICAgMzpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwLmhcdTAwM2VcbiAgIDQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY25ldC9pcDZfY2hlY2tzdW0uaFx1MDAzZVxuICAgNjpcdCNpbmNsdWRlIFx1MDAzY25ldC9wc3AuaFx1MDAzZVxuICAgNzpcdCNpbmNsdWRlIFx1MDAzY25ldC9zb2NrLmhcdTAwM2VcbiAgIDg6XHRcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtuZXRkZXZzaW0uaFwmIzM0O1xuICAxMDpcdFxuICAxMTpcdHZvaWQgbnNpbV9wc3BfaGFuZGxlX2V4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tiX2V4dCAqcHNwX2V4dClcbiAgMTI6XHR7XG4gIDEzOlx0XHRpZiAocHNwX2V4dClcbiAgMTQ6XHRcdFx0X19za2JfZXh0X3NldChza2IsIFNLQl9FWFRfUFNQLCBwc3BfZXh0KTtcbiAgMTU6XHR9XG4gIDE2Olx0XG4gIDE3Olx0ZW51bSBza2JfZHJvcF9yZWFzb25cbiAgMTg6XHRuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucyxcbiAgMTk6XHRcdCAgICBzdHJ1Y3QgbmV0ZGV2c2ltICpwZWVyX25zLCBzdHJ1Y3Qgc2tiX2V4dCAqKnBzcF9leHQpXG4gIDIwOlx0e1xuICAyMTpcdFx0ZW51bSBza2JfZHJvcF9yZWFzb24gcmMgPSAwO1xuICAyMjpcdFx0c3RydWN0IHBzcF9kZXYgKnBlZXJfcHNkO1xuICAyMzpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuICAyNDpcdFx0c3RydWN0IG5ldCAqbmV0O1xuICAyNTpcdFx0aW50IHBzcF9sZW47XG4gIDI2Olx0XG4gIDI3Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDI4Olx0XHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcbiAgMjk6XHRcdGlmICghcGFzKSB7XG4gIDMwOlx0XHRcdHJjID0gU0tCX05PVF9EUk9QUEVEX1lFVDtcbiAgMzE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICAzMjpcdFx0fVxuICAzMzpcdFxuICAzNDpcdFx0aWYgKCFza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpIHtcbiAgMzU6XHRcdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbiAgMzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICAzNzpcdFx0fVxuICAzODpcdFxuICAzOTpcdFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiAgNDA6XHRcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gIDQxOlx0XHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG4gIDQyOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiAgNDM6XHRcdH1cbiAgNDQ6XHRcbiAgNDU6XHRcdHBzcF9sZW4gPSBza2ItXHUwMDNlbGVuIC0gc2tiX2lubmVyX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTtcbiAgNDY6XHRcdGF0b21pYzY0X2luYyhcdTAwMjZucy1cdTAwM2Vwc3AudHhfcGFja2V0cyk7XG4gIDQ3Olx0XHRhdG9taWM2NF9hZGQocHNwX2xlbiwgXHUwMDI2bnMtXHUwMDNlcHNwLnR4X2J5dGVzKTtcbiAgNDg6XHRcbiAgNDk6XHRcdC8qIE5vdyBwcmV0ZW5kIHdlIGp1c3QgcmVjZWl2ZWQgdGhpcyBmcmFtZSAqL1xuICA1MDpcdFx0cGVlcl9wc2QgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9ucy1cdTAwM2Vwc3AuZGV2KTtcbiAgNTE6XHRcdGlmIChwZWVyX3BzZCBcdTAwMjZcdTAwMjYgcGVlcl9wc2QtXHUwMDNlY29uZmlnLnZlcnNpb25zIFx1MDAyNiAoMSBcdTAwM2NcdTAwM2MgcGFzLVx1MDAzZXZlcnNpb24pKSB7XG4gIDUyOlx0XHRcdGJvb2wgc3RyaXBfaWN2ID0gZmFsc2U7XG4gIDUzOlx0XHRcdHU4IGdlbmVyYXRpb247XG4gIDU0Olx0XG4gIDU1Olx0XHRcdC8qIFdlIGNoZWF0IGEgYml0IGFuZCBwdXQgdGhlIGdlbmVyYXRpb24gaW4gdGhlIGtleS5cbiAgNTY6XHRcdFx0ICogSW4gcmVhbCBsaWZlIGlmIGdlbmVyYXRpb24gd2FzIHRvbyBvbGQsIHRoZW4gZGVjcnlwdGlvbiB3b3VsZFxuICA1NzpcdFx0XHQgKiBmYWlsLiBIZXJlLCB3ZSBqdXN0IG1ha2UgaXQgc28gYSBiYWQga2V5IGNhdXNlcyBhIGJhZFxuICA1ODpcdFx0XHQgKiBnZW5lcmF0aW9uIHRvbywgYW5kIHBzcF9za19yeF9wb2xpY3lfY2hlY2soKSB3aWxsIGZhaWwuXG4gIDU5Olx0XHRcdCAqL1xuICA2MDpcdFx0XHRnZW5lcmF0aW9uID0gcGFzLVx1MDAzZXR4LmtleVswXTtcbiAgNjE6XHRcbiAgNjI6XHRcdFx0c2tiX2V4dF9yZXNldChza2IpO1xuICA2MzpcdFx0XHRza2ItXHUwMDNlbWFjX2xlbiA9IEVUSF9ITEVOO1xuICA2NDpcdFx0XHRpZiAocHNwX2Rldl9yY3Yoc2tiLCBwZWVyX3BzZC1cdTAwM2VpZCwgZ2VuZXJhdGlvbiwgc3RyaXBfaWN2KSkge1xuICA2NTpcdFx0XHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG4gIDY2Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICA2NzpcdFx0XHR9XG4gIDY4Olx0XG4gIDY5Olx0XHRcdCpwc3BfZXh0ID0gc2tiLVx1MDAzZWV4dGVuc2lvbnM7XG4gIDcwOlx0XHRcdHJlZmNvdW50X2luYyhcdTAwMjYoKnBzcF9leHQpLVx1MDAzZXJlZmNudCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODEyCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgcHNwLmNgKioKCk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGJlaGF2aW9yIG9mIGBfX25zaW1fcHNwX3VuaW5pdGAuIEkgaW1tZWRpYXRlbHkga25vdyB0aGF0IGl0JiMzOTtzIGxvY2F0ZWQgd2l0aGluIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLCBzbyB0aGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGJlIHN0YXJ0aW5nLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNyaXRpY2FsIGZvciB1bmluaXRpYWxpemluZyBvciBjbGVhbmluZyB1cCBhZnRlciBhIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSwgbGlrZWx5IHBlcnRhaW5pbmcgdG8gdGhlIFBhY2tldCBTd2l0Y2hpbmcgUGF0aCAoUFNQKSBjb21wb25lbnQsIHNpbmNlIHRoYXQgc2VlbXMgdG8gYmUgdGhlIGNvbnRleHQuIEkmIzM5O20gaG9waW5nIEkgY2FuIGdsZWFuIHNvbWUgaW5zaWdodHMgZnJvbSBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCwgc3BlY2lmaWNhbGx5IGFib3V0IHJlc291cmNlIG1hbmFnZW1lbnQgb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTgwOlx0fTtcbiAxODE6XHRcbiAxODI6XHRzdGF0aWMgc3RydWN0IHBzcF9kZXZfY2FwcyBuc2ltX3BzcF9jYXBzID0ge1xuIDE4MzpcdFx0LnZlcnNpb25zID0gMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzEyOCB8XG4gMTg0Olx0XHRcdCAgICAxIFx1MDAzY1x1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HTUFDXzEyOCB8XG4gMTg1Olx0XHRcdCAgICAxIFx1MDAzY1x1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcbiAxODY6XHRcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LFxuIDE4NzpcdH07XG4gMTg4Olx0XG4gMTg5Olx0c3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG4gMTkwOlx0e1xuIDE5MTpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZDtcbiAxOTI6XHRcbiAxOTM6XHRcdHBzZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobnMtXHUwMDNlcHNwLmRldixcbiAxOTQ6XHRcdFx0XHRcdFx0dGVhcmRvd24gfHxcbiAxOTU6XHRcdFx0XHRcdFx0bG9ja2RlcF9pc19oZWxkKFx1MDAyNm5zLVx1MDAzZXBzcC5yZXJlZ19sb2NrKSk7XG4gMTk2Olx0XHRpZiAocHNkKSB7XG4gMTk3Olx0XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihucy1cdTAwM2Vwc3AuZGV2LCBOVUxMKTtcbiAxOTg6XHRcdFx0c3luY2hyb25pemVfcmN1KCk7XG4gMTk5Olx0XHRcdHBzcF9kZXZfdW5yZWdpc3Rlcihwc2QpO1xuIDIwMDpcdFx0fVxuIDIwMTpcdH1cbiAyMDI6XHRcbiAyMDM6XHR2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbiAyMDQ6XHR7XG4gMjA1Olx0XHRkZWJ1Z2ZzX3JlbW92ZShucy1cdTAwM2Vwc3AucmVyZWcpO1xuIDIwNjpcdFx0bXV0ZXhfZGVzdHJveShcdTAwMjZucy1cdTAwM2Vwc3AucmVyZWdfbG9jayk7XG4gMjA3Olx0XHRfX25zaW1fcHNwX3VuaW5pdChucywgdHJ1ZSk7XG4gMjA4Olx0fVxuIDIwOTpcdFxuIDIxMDpcdHN0YXRpYyBzc2l6ZV90XG4gMjExOlx0bnNpbV9wc3BfcmVyZWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsXG4gMjEyOlx0XHRcdCAgICAgbG9mZl90ICpwcG9zKVxuIDIxMzpcdHtcbiAyMTQ6XHRcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gMjE1Olx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xuIDIxNjpcdFx0c3NpemVfdCByZXQ7XG4gMjE3Olx0XG4gMjE4Olx0XHRtdXRleF9sb2NrKFx1MDAyNm5zLVx1MDAzZXBzcC5yZXJlZ19sb2NrKTtcbiAyMTk6XHRcdF9fbnNpbV9wc3BfdW5pbml0KG5zLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNzAwCgkJCQkJCQlvdXRwdXQ6IDIxNwoJCQkJCQkJdGhvdWdodHM6IDUwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQU1AgYW5kIE5ldGRldnNpbSBJbnRlZ3JhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBGaXJzdCwgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBDbGVhcmx5LCBgQ09ORklHX0lORVRfUFNQYCBpcyBlc3NlbnRpYWwgc2luY2UgdGhpcyBwYXRjaCB0YXJnZXRzIHRoZSBgbmV0L3BzcC9gIGRpcmVjdG9yeSBhbmQgZW5hYmxlcyBQU1Agc3VwcG9ydCBpbiB0aGUgYG5ldGRldnNpbWAgZHJpdmVyLiBgQ09ORklHX05FVERFVlNJTWAgaXMgYWxzbyBjcml0aWNhbCwgaXQmIzM5O3MgdGhlIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSBkcml2ZXIgaXRzZWxmLiBJdCYjMzk7cyBvYnZpb3VzIHRoYXQgYElORVRfUFNQYCBoaW5nZXMgb24gYElORVRgIGFuZCBgTkVUREVWU0lNYCBkZXBlbmRzIG9uIGBORVRfQ09SRWAsIGBTWVNGU2AgYW5kIHRoZSBsaWtlLCBhcyBleHBlY3RlZC4KCk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgdGhlIGNyaXRpY2FsIHN5bWJvbHMuIE15IGF0dGVudGlvbiBnb2VzIHRvOiBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCwgYHBzcF9zb2NrX3NldF90eF9rZXlgLCBhbmQgYG5zaW1fZG9fcHNwYC4gQXJlIHRoZXNlIGdlbnVpbmVseSAqc3BlY2lmaWMqIHRvIFBTUCBsb2dpYyB3aXRoaW4gbmV0ZGV2c2ltLCBvciBhcmUgdGhleSBtb3JlIGdlbmVyaWM/IFllcywgY29uZmlybWVkLiBUaGV5IGFyZSBhbGwgZGlyZWN0bHkgdGllZCB0byBQU1AgYW5kIHRoZSBuZXRkZXZzaW0gaW1wbGVtZW50YXRpb24uCgpOb3csIGxldCYjMzk7cyBjcmVhdGUgYSBjbGVhciBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzOgoKKiAgICoqUmVhY2hhYmlsaXR5OioqIFRoZXNlIG1vZGlmaWNhdGlvbnMgaW1wYWN0IGJvdGggdGhlIFBTUCBzdWJzeXN0ZW0gYW5kIHRoZSBzaW11bGF0ZWQgbmV0ZGV2c2ltIGRyaXZlci4gSW4gYSB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGZ1bGx5IGFjY2Vzc2libGUgdGhyb3VnaCBuZXRsaW5rIGNvbW1hbmRzLCBzb2NrZXQgb3BlcmF0aW9ucywgYW5kIG5ldGRldnNpbSB2aXJ0dWFsIGRldmljZXMuCiogICAqKkNoYW5nZXM6KiogVGhpcyBwYXRjaCBtYWtlcyBzb21lIFR4IGtleSBvZmZsb2FkaW5nIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyBsYWNraW5nIFR4IFNBREIsIGFkZHJlc3NlcyBkcml2ZXIgcmVnaXN0cmF0aW9uIHZhbGlkYXRpb24gaW4gYHBzcF9kZXZfY3JlYXRlYCwgcmVmYWN0b3JzIGFzc29jaWF0aW9uIGNsZWFudXAgaW4gYHBzcF9kZXZfdW5yZWdpc3RlcmAgYW5kIGBwc3BfYXNzb2NfZnJlZWAsIGFuZCB1cGRhdGVzIGtleSBhc3NpZ25tZW50IGluIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgLgoqICAgKipDb25maWdzOioqIFdlIGhhdmUgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAuCiogICAqKkZvY3VzIFN5bWJvbHM6KiogVGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBhcmUgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAsIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCwgYW5kIGBuc2ltX2RvX3BzcGAuCgpSaWdodCwgdGhhdCBjb3ZlcnMgdGhlIGVzc2VudGlhbHMuIFRpbWUgZm9yIHRoZSB0b29sIGNhbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJTkVUX1BTUCYjMzQ7LAogICAgJiMzNDtORVRERVZTSU0mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwc3Bfc29ja19hc3NvY19zZXRfdHgmIzM0OywKICAgICYjMzQ7cHNwX3NvY2tfc2V0X3R4X2tleSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9hZGQmIzM0OywKICAgICYjMzQ7cHNwX2Rldl90eF9rZXlfZGVsJiMzNDssCiAgICAmIzM0O3BzcF9hc3NvY19mcmVlJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfY3JlYXRlJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdW5yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtuc2ltX2RvX3BzcCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG5ldHdvcmtpbmcgUFNQIChQU1AgU2VjdXJpdHkgUHJvdG9jb2wpIHN1YnN5c3RlbSBsb2dpYyBhbmQgbmV0ZGV2c2ltIGRldmljZSBkcml2ZXIgY29kZS4gSXQgbWFrZXMgVHgga2V5IG9mZmxvYWQgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBkZXZpY2VzIHdpdGhvdXQgU0FEQiwgcmVmYWN0b3JzIGtleSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBpbiBwc3Bfc29jay5jLCB1cGRhdGVzIGRldmljZSByZWdpc3RyYXRpb24gY2hlY2tzIGluIHBzcF9tYWluLmMsIGFuZCByZW1vdmVzIG9ic29sZXRlIGFzc29jIHRyYWNraW5nIGluIG5ldGRldnNpbS4gVGhlc2UgY29kZSBwYXRocyBhcmUgZnVsbHkgcmVhY2hhYmxlIHZpYSBuZXRsaW5rIGNvbW1hbmRzIGFuZCBuZXRkZXZzaW0gaW50ZXJmYWNlcyBpbiBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SU5FVF9QU1AmIzM0OywKICAgICYjMzQ7TkVUREVWU0lNJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHNwX3NvY2tfYXNzb2Nfc2V0X3R4JiMzNDssCiAgICAmIzM0O3BzcF9zb2NrX3NldF90eF9rZXkmIzM0OywKICAgICYjMzQ7cHNwX2Rldl90eF9rZXlfYWRkJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2RlbCYjMzQ7LAogICAgJiMzNDtwc3BfYXNzb2NfZnJlZSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3VucmVnaXN0ZXImIzM0OywKICAgICYjMzQ7bnNpbV9kb19wc3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtYWtlcyB0aGUgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZHJpdmVyIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgUFNQIGRldmljZXMgd2l0aG91dCBTQURCIHN1cHBvcnQsIHJlZmFjdG9yaW5nIFR4IGtleSBhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGFuZCByZW1vdmluZyB1bnVzZWQga2V5IGhhbmRsaW5nIGhvb2tzIGZyb20gbmV0ZGV2c2ltLiBBbGwgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBjb250aW51ZSB0byBiZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBga3phbGxvY19mbGV4YCwgYGt6YWxsb2Nfb2JqYCwgb3IgYGttZW1kdXBgLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgY2hlY2tzLCBsaXN0IG1hbmlwdWxhdGlvbiwgb3IgbGlmZWN5Y2xlIGhhbmRsaW5nIGZhbGwgc3RyaWN0bHkgdW5kZXIgdGhlIGRvbWFpbiBvZiBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgKaW5kZXggNTVhZWM0MTIzN2I5Yi4uMTgxYjZiYWFiYTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaApAQCAtMTIyLDcgJiM0MzsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHsKIAkJc3RydWN0IGRlbnRyeSAqcmVyZWc7CiAJCXN0cnVjdCBtdXRleCByZXJlZ19sb2NrOwogCQl1MzIgc3BpOwotCQl1MzIgYXNzb2NfY250OwogCX0gcHNwOwogCiAJc3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jCmluZGV4IDZiMzUzMmI1ZTM2MGQuLmI3NDUyYzQ5YjU4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMKQEAgLTIzLDcgJiM0MzsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLAogCXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJaW50IHBzcF9sZW47Ci0Jdm9pZCAqKnB0cjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTsKQEAgLTM3LDEyICYjNDM7MzYsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucywKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCWlmICgqcHRyICE9IG5zKSB7Ci0JCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAluZXQgPSBzb2NrX25ldChza2ItJmd0O3NrKTsKIAlpZiAoIXBzcF9kZXZfZW5jYXBzdWxhdGUobmV0LCBza2IsIHBhcy0mZ3Q7dHguc3BpLCBwYXMtJmd0O3ZlcnNpb24sIDApKSB7CiAJCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7CkBAIC0xNDksMTkgJiM0MzsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbiwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCi0JCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKLXsKLQlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7Ci0Jdm9pZCAqKnB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCi0JLyogQ29weSBkcnZfcHJpdiBmcm9tIHBzZCB0byBhc3NvYyAqLwotCSpwdHIgPSBwc2QtJmd0O2Rydl9wcml2OwotCW5zLSZndDtwc3AuYXNzb2NfY250JiM0MzsmIzQzOzsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiB7CiAJc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwpAQCAtMTc3LDE1ICYjNDM7MTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0Jc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwotCXZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTsKLQotCSpwdHIgPSBOVUxMOwotCW5zLSZndDtwc3AuYXNzb2NfY250LS07Ci19Ci0KIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHsKIAlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7CkBAIC0yMDQsOCAmIzQzOzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0gewogCS5zZXRfY29uZmlnCT0gbnNpbV9wc3Bfc2V0X2NvbmZpZywKIAkucnhfc3BpX2FsbG9jCT0gbnNpbV9yeF9zcGlfYWxsb2MsCi0JLnR4X2tleV9hZGQJPSBuc2ltX2Fzc29jX2FkZCwKLQkudHhfa2V5X2RlbAk9IG5zaW1fYXNzb2NfZGVsLAogCS5rZXlfcm90YXRlCT0gbnNpbV9rZXlfcm90YXRlLAogCS5nZXRfc3RhdHMJPSBuc2ltX2dldF9zdGF0cywKIH07CkBAIC0yMTUsNyAmIzQzOzE4NCw2IEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9jYXBzIG5zaW1fcHNwX2NhcHMgPSB7CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHwKIAkJICAgIDEgJmx0OyZsdDsgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzI1NiB8CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LAotCS5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bikKQEAgLTIzMCw3ICYjNDM7MTk4LDYgQEAgc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTsKIAl9Ci0JV0FSTl9PTihucy0mZ3Q7cHNwLmFzc29jX2NudCk7CiB9CiAKIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oCmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgKQEAgLTI0LDExICYjNDM7MjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpOwogLyogS2VybmVsLWZhY2luZyBBUEkgKi8KIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0JcmV0dXJuIHBhcy0mZ3Q7ZHJ2X2RhdGE7Ci19Ci0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUCkKIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pOwogdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmggYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAppbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaApAQCAtMjE5LDEyICYjNDM7MjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7CiAJICogQHR4X2tleV9hZGQ6IGFkZCBhIFR4IGtleSB0byB0aGUgZGV2aWNlCiAJICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2UKIAkgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuCiYjNDM7CSAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsCiYjNDM7CSAqIGlzIGFsc28gTlVMTC4KIAkgKi8KIAlpbnQgKCp0eF9rZXlfYWRkKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiAJLyoqCiAJICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2UKIAkgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2FkZAomIzQzOwkgKiBpcyBhbHNvIE5VTEwuCiAJICovCiAJdm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7CiAKZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oCmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaApAQCAtNTMsNCAmIzQzOzUzLDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2lzX3JlZ2lzdGVyZWQoc3RydWN0IHBzcF9kZXYgKnBzZCkKIAlyZXR1cm4gISFwc2QtJmd0O29wczsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2hhc19zYWRiKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cHNkLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuICEhcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cGFzLSZndDtwc2QtJmd0O2xvY2spOwomIzQzOwlyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtJmd0O3BzZCkgJmFtcDsmYW1wOyBwYXMtJmd0O3R4LnNwaTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uYwppbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NAotLS0gYS9uZXQvcHNwL3BzcF9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3BfbWFpbi5jCkBAIC02OCw5ICYjNDM7NjgsOSBAQCBwc3BfZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgIXBzZF9vcHMtJmd0O3NldF9jb25maWcgfHwKIAkJICAgICFwc2Rfb3BzLSZndDtrZXlfcm90YXRlIHx8CiAJCSAgICAhcHNkX29wcy0mZ3Q7cnhfc3BpX2FsbG9jIHx8Ci0JCSAgICAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZCB8fAotCQkgICAgIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwgfHwKLQkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMpKQomIzQzOwkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMgfHwKJiM0MzsJCSAgICAoIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQgIT0gIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwpIHx8CiYjNDM7CQkgICAgKHBzZF9jYXBzLSZndDthc3NvY19kcnZfc3BjICZhbXA7JmFtcDsgIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwc2QgPSBremFsbG9jX29iaigqcHNkKTsKQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiAKIAlsaXN0X3NwbGljZV9pbml0KCZhbXA7cHNkLSZndDthY3RpdmVfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7cHJldl9hc3NvY3MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmFtcDtwc2QtJmd0O3ByZXZfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkKLQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgJmFtcDtwc2QtJmd0O3N0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHsKJiM0MzsJCWlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKQomIzQzOwkJCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CQlsaXN0X2RlbCgmYW1wO3Bhcy0mZ3Q7YXNzb2NzX2xpc3QpOwomIzQzOwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgJmFtcDtwc2QtJmd0O2Fzc29jX2Rldl9saXN0LAogCQkJCSBkZXZfbGlzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jCmluZGV4IDFhMmE2Yjc1MTZiMGYuLjZhNGJlY2MzOGI1NWEgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmMKQEAgLTc4LDE2ICYjNDM7NzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB9CiAKIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCQkgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlyZXR1cm4gcHNkLSZndDtvcHMtJmd0O3R4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKmR1bW15OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAomIzQzOwkgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UmIzM5O2xsIG5lZWQgdG8KJiM0MzsJICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuCiYjNDM7CSAqLwomIzQzOwlkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpOwomIzQzOwlpZiAoIWR1bW15KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwomIzQzOwllcnIgPSBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwomIzQzOwlpZiAoIWVycikKJiM0MzsJCW1lbWNweShwYXMtJmd0O2Rydl9kYXRhLCBkdW1teS0mZ3Q7ZHJ2X2RhdGEsCiYjNDM7CQkgICAgICAgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKJiM0MzsKJiM0MzsJa2ZyZWUoZHVtbXkpOwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB7Ci0JaWYgKHBhcy0mZ3Q7dHguc3BpKQotCQlwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7Ci0JbGlzdF9kZWwoJmFtcDtwYXMtJmd0O2Fzc29jc19saXN0KTsKJiM0MzsJcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWwocHNkLCBwYXMpOwogfQogCiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIAlzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLSZndDtwc2Q7CiAKIAltdXRleF9sb2NrKCZhbXA7cHNkLSZndDtsb2NrKTsKLQlpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpCi0JCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CWlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkgewomIzQzOwkJaWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpCiYjNDM7CQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJCWxpc3RfZGVsKCZhbXA7cGFzLSZndDthc3NvY3NfbGlzdCk7CiYjNDM7CX0KIAltdXRleF91bmxvY2soJmFtcDtwc2QtJmd0O2xvY2spOwogCXBzcF9kZXZfcHV0KHBzZCk7CiAJa2ZyZWUocGFzKTsKQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJcmV0dXJuIGVycjsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiYjNDM7CQkJICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LAomIzQzOwkJCSAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAocHNwX2Rldl9oYXNfc2FkYihwc2QpKSB7CiYjNDM7CQllcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcykKIHsKIAlzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTsKQEAgLTE3NCwxMiAmIzQzOzIxMCw0MCBAQCBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50CiYjNDM7cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCSAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCiYjNDM7CQkJICAgICAgICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gcHNwX2Fzc29jX3NldF90eChwc2QsIHBhcywga2V5LCBleHRhY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRShzay0mZ3Q7c2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTsKJiM0MzsJdGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTsKJiM0MzsJcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7CiYjNDM7CiYjNDM7CWljc2sgPSBpbmV0X2Nzayhzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfc3luY19tc3Moc2ssIGljc2stJmd0O2ljc2tfcG10dV9jb29raWUpOwomIzQzOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQkJICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7Ci0Jc3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlpbnQgZXJyOwogCiAJbG9ja19zb2NrKHNrKTsKQEAgLTIwNyw0MCAmIzQzOzI3MSw3IEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAotCWVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7Ci0JaWYgKGVycikgewotCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKLQkJZ290byBleGl0X3VubG9jazsKLQl9Ci0KLQkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAotCSAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0bwotCSAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLgotCSAqLwotCWR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7Ci0JaWYgKCFkdW1teSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfdW5sb2NrOwotCX0KLQotCW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwotCWVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlX2R1bW15OwotCi0JbWVtY3B5KHBhcy0mZ3Q7ZHJ2X2RhdGEsIGR1bW15LSZndDtkcnZfZGF0YSwgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKLQltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7Ci0KLQlXUklURV9PTkNFKHNrLSZndDtza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpOwotCXRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7Ci0JcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7Ci0KLQlpY3NrID0gaW5ldF9jc2soc2spOwotCWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7Ci0JaWNzay0mZ3Q7aWNza19zeW5jX21zcyhzaywgaWNzay0mZ3Q7aWNza19wbXR1X2Nvb2tpZSk7Ci0KLWV4aXRfZnJlZV9kdW1teToKLQlrZnJlZShkdW1teSk7CiYjNDM7CWVyciA9IHBzcF9zb2NrX3NldF90eF9rZXkoc2ssIHBzZCwgcGFzLCBrZXksIGV4dGFjayk7CiBleGl0X3VubG9jazoKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NjgyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogODEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIGl0IGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIEtNU0FOIGZ1enppbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0JiMzOTtzIGEgcmVmYWN0b3JpbmcgZXhlcmNpc2Ugd2l0aGluIHRoZSBQU1AgKFBvbGljeS1CYXNlZCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtLCBwcmltYXJpbHkgZm9jdXNlZCBvbiBzaW1wbGlmeWluZyBrZXkgbWFuYWdlbWVudCBhbmQgYXNzb2NpYXRpb24gaGFuZGxpbmcgd2l0aGluIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIuCgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF04oCZcyBiZWVuIGNoYW5nZWQuIFRoZSBwYXRjaCByZW1vdmVzIGBhc3NvY19jbnRgIGFuZCB0aGUgYHR4X2tleV9hZGRgL2B0eF9rZXlfZGVsYCBmdW5jdGlvbnMgZnJvbSB0aGUgYG5ldGRldnNpbWAgUFNQIGltcGxlbWVudGF0aW9uLiBJdCBzZWVtcyBsaWtlIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIgaXMgYmVpbmcgYWRhcHRlZCB0byBhIG1vcmUgZ2VuZXJpYywgcG9zc2libHkgb3B0aW9uYWwsIGFwcHJvYWNoIHRvIGtleSBoYW5kbGluZy4gTm90YWJseSwgYC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKilgIGlzIHJlbW92ZWQsIHN1Z2dlc3RpbmcgYSBzaGlmdCBhd2F5IGZyb20gYSBkcml2ZXItc3BlY2lmaWMgYXNzb2NpYXRpb24gZGF0YSBzaXplLiBBbHNvLCB0aGUgY2hlY2sgYHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOyBpZiAoKnB0ciAhPSBucykgLi4uYCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYG5zaW1fZG9fcHNwYCwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIHJlbW92YWwgb2YgZHJpdmVyLXNwZWNpZmljIGRhdGEgbWFuYWdlbWVudC4KClRoZSBoZWFkZXIgZmlsZSBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgdGhlIHJlbW92YWwgb2YgYHBzcF9hc3NvY19kcnZfZGF0YSgpYCBhbmQgdGhlIGRvY3VtZW50YXRpb24gYWxsb3dpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgdG8gYmUgTlVMTCwgcmVpbmZvcmNlIHRoaXMgbm90aW9uIG9mIG9wdGlvbmFsIGtleSBtYW5hZ2VtZW50LiBOZXcgZnVuY3Rpb25zIGxpa2UgYHBzcF9kZXZfaGFzX3NhZGIoKWAgYW5kIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbCgpYCBhcmUgaW50cm9kdWNlZCwgcHJvdmlkaW5nIGNvbmRpdGlvbmFsIGNoZWNrcyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgU0EgKFNlY3VyaXR5IEFzc29jaWF0aW9uKSBEYXRhYmFzZSBmdW5jdGlvbmFsaXR5IGFuZCBpZiBhIFRYIGtleSBuZWVkcyB0byBiZSBkZWxldGVkIGR1cmluZyBhc3NvY2lhdGlvbiBoYW5kbGluZy4KClRoZSBgcHNwX2Rldl9jcmVhdGVgIGZ1bmN0aW9uJiMzOTtzIGNoYW5nZXMgYXJlIGNyaXRpY2FsLiBUaGUgcGF0Y2ggbm93IGFsbG93cyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMuIEl0IHNlZW1zIHRoYXQgaWYgdGhlc2UgZnVuY3Rpb25zIGFyZSBOVUxMIGFuZCBgYXNzb2NfZHJ2X3NwY2AgaXMgMCwgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG5vdCB0byBtYW5hZ2UgVHgga2V5cy4gVGhpcyBmZWVscyBsaWtlIGEgc2lnbmlmaWNhbnQgc2ltcGxpZmljYXRpb24sIGJ1dCB0aGlzIGlzIHdoZXJlIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcy4gVGhlIGxvZ2ljIG5vdyBpbmNsdWRlcyBgKCFwc2Rfb3BzLSZndDt0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLSZndDt0eF9rZXlfZGVsKSB8fCAocHNkX2NhcHMtJmd0O2Fzc29jX2Rydl9zcGMgJmFtcDsmYW1wOyAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZClgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIGNvbmRpdGlvbnMgZG9lc24mIzM5O3QgbGVhZCB0byBhbnkgdW5leHBlY3RlZCBiZWhhdmlvciwgZXNwZWNpYWxseSByZWdhcmRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzIHdoZW4gdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcHJvdmlkZWQuCgpJbiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBhbmQgYHBzcF9hc3NvY19mcmVlYCwgd2Ugc2VlIGNvbmRpdGlvbmFsIGNhbGxzIHRvIGBwc3BfZGV2X3R4X2tleV9kZWxgIGJhc2VkIG9uIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbCgpYC4gVGhpcyBtYWtlcyBzZW5zZSwgYnV0IHRoZSByZW1vdmFsIG9mIGBsaXN0X2RlbGAgZnJvbSBpbnNpZGUgb2YgYHBzcF9kZXZfdHhfa2V5X2RlbGAgaXRzZWxmIGluIGZhdm91ciBvZiB0aGUgY2FsbGVyLCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4KClRoZSBjaGFuZ2VzIGluIGBwc3Bfc29jay5jYCBhcmUgYWxzbyBpbXBvcnRhbnQuIFRoZSBkdW1teSBhbGxvY2F0aW9uIGxvZ2ljIGlzIG5vdyBleHBsaWNpdGx5IGluc2lkZSBgcHNwX2Rldl90eF9rZXlfYWRkYC4gVGhlIGNhbGxzIHRvIGBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7YCBhcmUgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgaWYgdGhlIGRyaXZlcnMgZm9yZ2V0IHRvIGhhbmRsZSB0aGVzZSBjb3JyZWN0bHkuIFNwbGl0dGluZyBvZmYgYHBzcF9hc3NvY19zZXRfdHhgIGFuZCBgcHNwX3NvY2tfc2V0X3R4X2tleWAsIGFuZCB0aGUgYXNzb2NpYXRlZCBgbWVtY3B5YCB3aXRoaW4gYHBzcF9hc3NvY19zZXRfdHhgIGFsbCBsb29rIGxpa2UgY2xlYW51cHMuCgpNeSBtYWluIGFyZWEgb2YgY29uY2VybiByaWdodCBub3cgaXMgaG93IHRoZSAmIzM0O2R1bW15JiMzNDsgYWxsb2NhdGlvbiBpcyBiZWluZyBoYW5kbGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYHBzcF9hc3NvY19kdW1teWAgd29ya3MsIHRvIHZlcmlmeSBpZiB0aGVyZSYjMzk7cyBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIHdoZW4gdGhlIGtleSBoYW5kbGluZyBpcyAmIzM0O2R1bW15JiMzNDsuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSB1c2UgYGdyZXBwZXJgIChvciBgcmVhZC1maWxlYCBpZiBuZWVkIGJlKSB0byBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgcHNwX2Fzc29jX2R1bW15YCB0byBiZSBzdXJlIHRoZXJlJiMzOTtzIG5vIHN1YnRsZSwgbHVya2luZyB2dWxuZXJhYmlsaXR5IGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGR1bW15IGFsbG9jYXRpb24gaXNuJiMzOTt0IGluYWR2ZXJ0ZW50bHkgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgd2hlbiB0aGUgZGV2aWNlIGNob29zZXMgbm90IHRvIHN0b3JlIHR4IGtleXMuIFRoaXMgaXMgd2hlcmUgYSBzdWJ0bGUgZmxhdyBpcyBtb3N0IGxpa2VseSB0byByZXNpZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3BzcF9hc3NvY19kdW1teSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9wc3AvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wc3AvcHNwX3NvY2suYz00Nz1zdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfY3JlYXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4tLVxubmV0L3BzcC9wc3Bfc29jay5jLTY4LVxubmV0L3BzcC9wc3Bfc29jay5jOjY5OnN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxubmV0L3BzcC9wc3Bfc29jay5jLTcwLXtcbi0tXG5uZXQvcHNwL3BzcF9zb2NrLmM9ODA9c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuLS1cbm5ldC9wc3AvcHNwX3NvY2suYy05MC1cdCAqL1xubmV0L3BzcC9wc3Bfc29jay5jOjkxOlx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbm5ldC9wc3AvcHNwX3NvY2suYy05Mi1cdGlmICghZHVtbXkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2MjIKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgcHNwX3NvY2suY2AgLSBMaW5lcyA0MC0xMjAqKgoKT2theSwgbGV0JiMzOTtzIHB1bGwgdXAgYHBzcF9zb2NrLmNgIGFuZCBmb2N1cyBvbiBsaW5lcyA0MCB0aHJvdWdoIDEyMC4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHNlY3Rpb24gcHJvYmFibHkgZGVhbHMgd2l0aCB0aGUgY29yZSBzb2NrZXQgaW5pdGlhbGl6YXRpb24gb3Igc29tZSBpbXBvcnRhbnQgc2V0dXAgcm91dGluZSwgZ2l2ZW4gaXRzIHBsYWNlbWVudCBlYXJseSBpbiB0aGUgZmlsZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIHN0cnVjdCBkZWNsYXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgc29ja2V0IHN0cnVjdHVyZSBpdHNlbGYsIGFuZCBhbnkgaW5pdGlhbCBhc3NpZ25tZW50cyB0byBjcnVjaWFsIHZhcmlhYmxlcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBhbGxvY2F0aW9uIG9mIHNvY2tldCBkZXNjcmlwdG9ycywgdGhlIHNldHRpbmcgb2YgZGVmYXVsdCBvcHRpb25zIChpZiBhbnkpLCBhbmQgcG90ZW50aWFsbHkgc29tZSBlYXJseSBlcnJvciBoYW5kbGluZy4gSSYjMzk7bSBhbHNvIHJlYWR5IHRvIHRyYWNlIGNvbnRyb2wgZmxvdyB0aHJvdWdoIGFueSBwb3RlbnRpYWwgYnJhbmNoZXMsIGNoZWNraW5nIGZvciBhbnkgZWRnZSBjYXNlcyBvciB1bnVzdWFsIHBhcmFtZXRlciBoYW5kbGluZyB3aGljaCBtaWdodCBjYXVzZSBpc3N1ZXMgZG93biB0aGUgbGluZS4gSSYjMzk7bGwgYWxzbyBiZSBmb2N1c2luZyBvbiBhbnkgdXNlIG9mIGBpb2N0bGAgY2FsbHMgYXMgdGhleSBtYXkgaW5kaWNhdGUgaGFyZHdhcmUgZGVwZW5kZW5jeS4gSSYjMzk7bSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGJlaW5nIHVzZWQgZm9yIHZhcmlvdXMgc29ja2V0IG9wdGlvbnM7IHR5cGUgbWlzbWF0Y2hlcyBjYW4gYmUgbm90b3Jpb3VzbHkgdHJpY2t5IHRvIGRlYnVnLiBBbnl0aGluZyByZWxhdGVkIHRvIHRocmVhZGluZyBhbmQgc3luY2hyb25pemF0aW9uIHdpdGhpbiB0aGUgc29ja2V0JiMzOTtzIGludGVybmFsIHN0cnVjdHVyZXMgd291bGQgYmUgb2YgcGFydGljdWxhciBpbnRlcmVzdDsgSSBuZWVkIHRvIGJlIGF3YXJlIG9mIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL3BzcF9zb2NrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDQwOlx0XHRcdHNrX3NrYl9yZWFzb25fZHJvcChzaywgc2tiLCBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVCk7XG4gIDQxOlx0XHRcdHJldHVybiBOVUxMO1xuICA0MjpcdFx0fVxuICA0MzpcdFxuICA0NDpcdFx0cmV0dXJuIHNrYjtcbiAgNDU6XHR9XG4gIDQ2Olx0XG4gIDQ3Olx0c3RydWN0IHBzcF9hc3NvYyAqcHNwX2Fzc29jX2NyZWF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuICA0ODpcdHtcbiAgNDk6XHRcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcztcbiAgNTA6XHRcbiAgNTE6XHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuICA1MjpcdFxuICA1MzpcdFx0cGFzID0ga3phbGxvY19mbGV4KCpwYXMsIGRydl9kYXRhLCBwc2QtXHUwMDNlY2Fwcy1cdTAwM2Vhc3NvY19kcnZfc3BjLFxuICA1NDpcdFx0XHRcdCAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gIDU1Olx0XHRpZiAoIXBhcylcbiAgNTY6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDU3Olx0XG4gIDU4Olx0XHRwYXMtXHUwMDNlcHNkID0gcHNkO1xuICA1OTpcdFx0cGFzLVx1MDAzZWRldl9pZCA9IHBzZC1cdTAwM2VpZDtcbiAgNjA6XHRcdHBhcy1cdTAwM2VnZW5lcmF0aW9uID0gcHNkLVx1MDAzZWdlbmVyYXRpb247XG4gIDYxOlx0XHRwc3BfZGV2X2dldChwc2QpO1xuICA2MjpcdFx0cmVmY291bnRfc2V0KFx1MDAyNnBhcy1cdTAwM2VyZWZjbnQsIDEpO1xuICA2MzpcdFxuICA2NDpcdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QsIFx1MDAyNnBzZC1cdTAwM2VhY3RpdmVfYXNzb2NzKTtcbiAgNjU6XHRcbiAgNjY6XHRcdHJldHVybiBwYXM7XG4gIDY3Olx0fVxuICA2ODpcdFxuICA2OTpcdHN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuICA3MDpcdHtcbiAgNzE6XHRcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXHUwMDNlcHNkO1xuICA3MjpcdFx0c2l6ZV90IHN6O1xuICA3MzpcdFxuICA3NDpcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gIDc1Olx0XG4gIDc2Olx0XHRzeiA9IHN0cnVjdF9zaXplKHBhcywgZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuICA3NzpcdFx0cmV0dXJuIGttZW1kdXAocGFzLCBzeiwgR0ZQX0tFUk5FTCk7XG4gIDc4Olx0fVxuICA3OTpcdFxuICA4MDpcdHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAgODE6XHRcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiAgODI6XHRcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gIDgzOlx0e1xuICA4NDpcdFx0c3RydWN0IHBzcF9hc3NvYyAqZHVtbXk7XG4gIDg1Olx0XHRpbnQgZXJyO1xuICA4NjpcdFxuICA4NzpcdFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24mIzM5O3RcbiAgODg6XHRcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0b1xuICA4OTpcdFx0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4gIDkwOlx0XHQgKi9cbiAgOTE6XHRcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XG4gIDkyOlx0XHRpZiAoIWR1bW15KVxuICA5MzpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAgOTQ6XHRcbiAgOTU6XHRcdG1lbWNweShcdTAwMjZkdW1teS1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuICA5NjpcdFx0ZXJyID0gcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfYWRkKHBzZCwgZHVtbXksIGV4dGFjayk7XG4gIDk3Olx0XHRpZiAoIWVycilcbiAgOTg6XHRcdFx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsXG4gIDk5Olx0XHRcdCAgICAgICBwc2QtXHUwMDNlY2Fwcy1cdTAwM2Vhc3NvY19kcnZfc3BjKTtcbiAxMDA6XHRcbiAxMDE6XHRcdGtmcmVlKGR1bW15KTtcbiAxMDI6XHRcdHJldHVybiBlcnI7XG4gMTAzOlx0fVxuIDEwNDpcdFxuIDEwNTpcdHZvaWQgcHNwX2Rldl90eF9rZXlfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxMDY6XHR7XG4gMTA3Olx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuIDEwODpcdH1cbiAxMDk6XHRcbiAxMTA6XHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4gMTExOlx0e1xuIDExMjpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwc3BfYXNzb2MsIHdvcmspO1xuIDExMzpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gMTE0Olx0XG4gMTE1Olx0XHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAxMTY6XHRcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuIDExNzpcdFx0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiAxMTg6XHRcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuIDExOTpcdFx0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDExMgoJCQkJCQkJb3V0cHV0OiAxNjQKCQkJCQkJCXRob3VnaHRzOiA3MDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudCBvZiBQU1AgQXNzb2NpYXRpb24gQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIGZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlc2UgY2hhbmdlcyBmb3IgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLgoKRmlyc3QsIEkgbmVlZCB0byBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzIHRoYXQgY291bGQgZXhwb3NlIHNlbnNpdGl2ZSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLiBJdCBsb29rcyBsaWtlOgoKKiAgIFRoZSBgcGFzYCBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIHdpdGggYGt6YWxsb2NfZmxleGAgaW4gYHBzcF9hc3NvY19jcmVhdGVgLCB3aGljaCB6ZXJvZXMgdGhlIG1lbW9yeS4KKiAgIFRoZSBgZHVtbXlgIGlzIGNyZWF0ZWQgd2l0aCBga21lbWR1cGAsIGR1cGxpY2F0aW5nIHplcm9lZCBtZW1vcnkuCiogICBUaGUgYGtleWAgY29tZXMgZnJvbSBuZXRsaW5rIGlucHV0LCBhbmQgdGhpcyByZXF1aXJlcyBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGJ1dCBpdCBpcyBwYXJzZWQsIG9yIHZhbGlkYXRlZCwgYmVmb3JlIGJlaW5nIHVzZWQuCiogICBUaGUgcmVtb3ZhbCBvZiBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBmcm9tIG5ldGRldnNpbSBpbXBsaWVzIG5vIG5lZWQgZm9yIFNBREIgbWFuYWdlbWVudCBpbiB0aGF0IHNwZWNpZmljIGNvbnRleHQuCiogICBUaGVyZSBhcmVuJiMzOTt0IGFueSBuZXdseSBpbnRyb2R1Y2VkIHVuaW5pdGlhbGl6ZWQgc3RhY2sgdmFyaWFibGVzLCBoZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nIHRoYXQgZ2V0cyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGFyZSB0aGVyZSBhbnkgdGhhdCBhcmUgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy4KKiAgIFRoZSByZWZhY3RvcmluZyBtYWtlcyB0aGVzZSBmdW5jdGlvbnMgb3B0aW9uYWwsIGJ1dCBgcHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWxgIHByb3ZpZGVzIGEgY2hlY2ssIHVzaW5nIGBwc3BfZGV2X2hhc19zYWRiKHBhcy0mZ3Q7cHNkKSAmYW1wOyZhbXA7IHBhcy0mZ3Q7dHguc3BpYC4KCk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSB3aWRlciBjb2RlLCBnb2luZyBiZXlvbmQgdGhlIGltbWVkaWF0ZSBwYXRjaC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYGNvcHlfdG9fdXNlcmAgY2FsbHMsIG5ldGxpbmsgYXR0cmlidXRlcywgc29ja2V0IG9wdGlvbnMsIGFuZCBhbnkgbmV3IGJyYW5jaGluZyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIEhvd2V2ZXIsIEkmIzM5O20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzLgoKTm93LCBhcyBhbiBleHRyYSBzdGVwLCBJJiMzOTtsbCBxdWlja2x5IGNvbnNpZGVyIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIFVzZS1BZnRlci1GcmVlIChVQUYpLCBvciBsb2NraW5nIHByb2JsZW1zLiBUaG9zZSBhcmUgYmV0dGVyIGFkZHJlc3NlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4KClRpbWUgdG8gY29uZmlybSBteSBmaW5kaW5ncyBhZ2FpbnN0IHRoZSBLTVNBTiBjcml0ZXJpYS4KCjEuICBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2Ugd2hlcmUgZmllbGRzIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQ6IE5vIGNvbmNlcm5zIGhlcmUuCjIuICBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHM6IE5vLCBhbGwgdXNlZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbml0aWFsaXplZC4KMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRoczogTm8sIHplcm9pbmcgYWxsb2NhdG9ycyBhbmQga21lbWR1cCBhcmUgdXNlZC4KNC4gIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIHRoYXQgY291bGQgbGVhZCB0byBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBieXRlczogTm8gc3VjaCBjYXNlcyB3ZXJlIGZvdW5kLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgIGhlcmUuCgpUbyBwcm92aWRlIGEgcm9idXN0IGp1c3RpZmljYXRpb24sIGxldCYjMzk7cyBjb250cmFzdCB0aGUgS01TQU4gYW5kIEtBU0FOIGFzcGVjdHMuIFRoaXMgcGF0Y2ggcmVmYWN0b3JzIFR4IGtleSBtYW5hZ2VtZW50IHRvIG1ha2UgaXQgb3B0aW9uYWwsIHNwZWNpZmljYWxseSBmb3IgZGV2aWNlcyB0aGF0IGRvbiYjMzk7dCB1c2UgYSBUeCBrZXkgU0FEQi4gQWxsIGludm9sdmVkIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHplcm8gYWxsb2NhdG9ycyBsaWtlIGBremFsbG9jX29iamAsIGBremFsbG9jX2ZsZXhgLCBvciBga21lbWR1cGAuIE5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBudWxsYWJpbGl0eSBvZiB0aGUgY2FsbGJhY2tzIGlzIGNvdmVyZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAsIG5vdCBLTVNBTi4gVGhlIGlzc3VlcyBhcmUgZnVuY3Rpb25hbCBidWdzLCBvciBsb2NraW5nL2xpZmVjeWNsZSBpc3N1ZXMgd2hpY2ggYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgb3RoZXIgdG9vbHMuIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpc24mIzM5O3QgbmVlZGVkIGhlcmUuCgpJIHRoaW5rIHdlJiMzOTtyZSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbWFrZXMgdGhlIGB0eF9rZXlfYWRkYCBhbmQgYHR4X2tleV9kZWxgIGRyaXZlciBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIFBTUCBkZXZpY2VzIHdpdGhvdXQgU0FEQiBzdXBwb3J0LCByZWZhY3RvcmluZyBUeCBrZXkgYXNzb2NpYXRpb24gbWFuYWdlbWVudCBhbmQgcmVtb3ZpbmcgdW51c2VkIGtleSBoYW5kbGluZyBob29rcyBmcm9tIG5ldGRldnNpbS4gQWxsIGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgY29udGludWUgdG8gYmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYGt6YWxsb2NfZmxleGAsIGBremFsbG9jX29iamAsIG9yIGBrbWVtZHVwYC4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGNoZWNrcywgbGlzdCBtYW5pcHVsYXRpb24sIG9yIGxpZmVjeWNsZSBoYW5kbGluZyBmYWxsIHN0cmljdGx5IHVuZGVyIHRoZSBkb21haW4gb2YgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUxOjUxLjcwNTQxNTgzNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY1NTQwNjQ4MzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklORVRfUFNQXCIsXG4gICAgXCJORVRERVZTSU1cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwc3Bfc29ja19hc3NvY19zZXRfdHhcIixcbiAgICBcInBzcF9zb2NrX3NldF90eF9rZXlcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2FkZFwiLFxuICAgIFwicHNwX2Rldl90eF9rZXlfZGVsXCIsXG4gICAgXCJwc3BfYXNzb2NfZnJlZVwiLFxuICAgIFwicHNwX2Rldl9jcmVhdGVcIixcbiAgICBcInBzcF9kZXZfdW5yZWdpc3RlclwiLFxuICAgIFwibnNpbV9kb19wc3BcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUxOjUxLjcwNTQyMDg5NloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI3OTIyMDIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IFNlcCA1IDEwOjUxOjUwIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaCBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oXFxuKysrIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oXFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcXG4gXFx0XFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XFxuIFxcdFxcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xcbiBcXHRcXHR1MzIgc3BpO1xcbi1cXHRcXHR1MzIgYXNzb2NfY250O1xcbiBcXHR9IHBzcDtcXG4gXFxuIFxcdHN0cnVjdCBuc2ltX2J1c19kZXYgKm5zaW1fYnVzX2RldjtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXFxuaW5kZXggNmIzNTMyYjVlMzYwZC4uYjc0NTJjNDliNTgxZCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcXG5AQCAtMjMsNyArMjMsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucyxcXG4gXFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xcbiBcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuIFxcdGludCBwc3BfbGVuO1xcbi1cXHR2b2lkICoqcHRyO1xcbiBcXG4gXFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcXG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXFxuIFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gXFx0fVxcbiBcXG4tXFx0cHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XFxuLVxcdGlmICgqcHRyICE9IG5zKSB7XFxuLVxcdFxcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4gXFx0bmV0ID0gc29ja19uZXQoc2tiLVxcdTAwM2Vzayk7XFxuIFxcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVxcdTAwM2V0eC5zcGksIHBhcy1cXHUwMDNldmVyc2lvbiwgMCkpIHtcXG4gXFx0XFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcXG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgbnNpbV9hc3NvY19hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbi1cXHRcXHRcXHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4te1xcbi1cXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cXHUwMDNlZHJ2X3ByaXY7XFxuLVxcdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcXG4tXFxuLVxcdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cXG4tXFx0KnB0ciA9IHBzZC1cXHUwMDNlZHJ2X3ByaXY7XFxuLVxcdG5zLVxcdTAwM2Vwc3AuYXNzb2NfY250Kys7XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiB7XFxuIFxcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVxcdTAwM2VkcnZfcHJpdjtcXG5AQCAtMTc3LDE1ICsxNTcsNiBAQCBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuLXtcXG4tXFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXFx1MDAzZWRydl9wcml2O1xcbi1cXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XFxuLVxcbi1cXHQqcHRyID0gTlVMTDtcXG4tXFx0bnMtXFx1MDAzZXBzcC5hc3NvY19jbnQtLTtcXG4tfVxcbi1cXG4gc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxcbiB7XFxuIFxcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVxcdTAwM2VkcnZfcHJpdjtcXG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcXG4gc3RhdGljIHN0cnVjdCBwc3BfZGV2X29wcyBuc2ltX3BzcF9vcHMgPSB7XFxuIFxcdC5zZXRfY29uZmlnXFx0PSBuc2ltX3BzcF9zZXRfY29uZmlnLFxcbiBcXHQucnhfc3BpX2FsbG9jXFx0PSBuc2ltX3J4X3NwaV9hbGxvYyxcXG4tXFx0LnR4X2tleV9hZGRcXHQ9IG5zaW1fYXNzb2NfYWRkLFxcbi1cXHQudHhfa2V5X2RlbFxcdD0gbnNpbV9hc3NvY19kZWwsXFxuIFxcdC5rZXlfcm90YXRlXFx0PSBuc2ltX2tleV9yb3RhdGUsXFxuIFxcdC5nZXRfc3RhdHNcXHQ9IG5zaW1fZ2V0X3N0YXRzLFxcbiB9O1xcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcXG4gXFx0XFx0ICAgIDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18xMjggfFxcbiBcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcXG4gXFx0XFx0ICAgIDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXFxuLVxcdC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksXFxuIH07XFxuIFxcbiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bilcXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxcbiBcXHRcXHRzeW5jaHJvbml6ZV9yY3UoKTtcXG4gXFx0XFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XFxuIFxcdH1cXG4tXFx0V0FSTl9PTihucy1cXHUwMDNlcHNwLmFzc29jX2NudCk7XFxuIH1cXG4gXFxuIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcXG5pbmRleCBjNWMyM2E1NDc3NGU2Li5iMjNjMzA4OTgzODljIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxcbkBAIC0yNCwxMSArMjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpO1xcbiAvKiBLZXJuZWwtZmFjaW5nIEFQSSAqL1xcbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHNwX2Fzc29jX2Rydl9kYXRhKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4te1xcbi1cXHRyZXR1cm4gcGFzLVxcdTAwM2VkcnZfZGF0YTtcXG4tfVxcbi1cXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxcbiB1bnNpZ25lZCBpbnQgcHNwX2tleV9zaXplKHUzMiB2ZXJzaW9uKTtcXG4gdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXFxuaW5kZXggODc5OTFhMWVhMDJkMC4uYjg5MDVlZmJkNjA0ZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaFxcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXFxuQEAgLTIxOSwxMiArMjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7XFxuIFxcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxcbiBcXHQgKiBJbnN0YWxsIGFuIGFzc29jaWF0aW9uIGluIHRoZSBkZXZpY2UuIENvcmUgd2lsbCBhbGxvY2F0ZSBzcGFjZVxcbiBcXHQgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuXFxuK1xcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXFxuK1xcdCAqIGlzIGFsc28gTlVMTC5cXG4gXFx0ICovXFxuIFxcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4gXFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbiBcXHQvKipcXG4gXFx0ICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2VcXG4gXFx0ICogUmVtb3ZlIGFuIGFzc29jaWF0aW9uIGZyb20gdGhlIGRldmljZS5cXG4rXFx0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcXG4rXFx0ICogaXMgYWxzbyBOVUxMLlxcbiBcXHQgKi9cXG4gXFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XFxuIFxcbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcC5oIGIvbmV0L3BzcC9wc3AuaFxcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XFxuLS0tIGEvbmV0L3BzcC9wc3AuaFxcbisrKyBiL25ldC9wc3AvcHNwLmhcXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxcbiBcXHRyZXR1cm4gISFwc2QtXFx1MDAzZW9wcztcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbitcXHRyZXR1cm4gISFwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwYXMtXFx1MDAzZXBzZC1cXHUwMDNlbG9jayk7XFxuK1xcdHJldHVybiBwc3BfZGV2X2hhc19zYWRiKHBhcy1cXHUwMDNlcHNkKSBcXHUwMDI2XFx1MDAyNiBwYXMtXFx1MDAzZXR4LnNwaTtcXG4rfVxcbitcXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXFxuZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uY1xcbmluZGV4IGM5YzFhODgyNmI3ZjkuLjkxNDczZjk2YWQyMTEgMTAwNjQ0XFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXFxuKysrIGIvbmV0L3BzcC9wc3BfbWFpbi5jXFxuQEAgLTY4LDkgKzY4LDkgQEAgcHNwX2Rldl9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VzZXRfY29uZmlnIHx8XFxuIFxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNla2V5X3JvdGF0ZSB8fFxcbiBcXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXJ4X3NwaV9hbGxvYyB8fFxcbi1cXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9hZGQgfHxcXG4tXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2V0eF9rZXlfZGVsIHx8XFxuLVxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNlZ2V0X3N0YXRzKSlcXG4rXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VnZXRfc3RhdHMgfHxcXG4rXFx0XFx0ICAgICghcHNkX29wcy1cXHUwMDNldHhfa2V5X2FkZCAhPSAhcHNkX29wcy1cXHUwMDNldHhfa2V5X2RlbCkgfHxcXG4rXFx0XFx0ICAgIChwc2RfY2Fwcy1cXHUwMDNlYXNzb2NfZHJ2X3NwYyBcXHUwMDI2XFx1MDAyNiAhcHNkX29wcy1cXHUwMDNldHhfa2V5X2FkZCkpKVxcbiBcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xcbkBAIC0xNDcsOCArMTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuIFxcbiBcXHRsaXN0X3NwbGljZV9pbml0KFxcdTAwMjZwc2QtXFx1MDAzZWFjdGl2ZV9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gXFx0bGlzdF9zcGxpY2VfaW5pdChcXHUwMDI2cHNkLVxcdTAwM2VwcmV2X2Fzc29jcywgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcXG4tXFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkge1xcbitcXHRcXHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcXG4rXFx0XFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0XFx0bGlzdF9kZWwoXFx1MDAyNnBhcy1cXHUwMDNlYXNzb2NzX2xpc3QpO1xcbitcXHR9XFxuIFxcbiBcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXFx1MDAyNnBzZC1cXHUwMDNlYXNzb2NfZGV2X2xpc3QsXFxuIFxcdFxcdFxcdFxcdCBkZXZfbGlzdCkge1xcbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcF9zb2NrLmMgYi9uZXQvcHNwL3BzcF9zb2NrLmNcXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxcbi0tLSBhL25ldC9wc3AvcHNwX3NvY2suY1xcbisrKyBiL25ldC9wc3AvcHNwX3NvY2suY1xcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuIFxcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4ge1xcbi1cXHRyZXR1cm4gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7XFxuK1xcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxcbitcXHQgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UnbGwgbmVlZCB0b1xcbitcXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cXG4rXFx0ICovXFxuK1xcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XFxuK1xcdGlmICghZHVtbXkpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZkdW1teS1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4rXFx0ZXJyID0gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4rXFx0aWYgKCFlcnIpXFxuK1xcdFxcdG1lbWNweShwYXMtXFx1MDAzZWRydl9kYXRhLCBkdW1teS1cXHUwMDNlZHJ2X2RhdGEsXFxuK1xcdFxcdCAgICAgICBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbitcXG4rXFx0a2ZyZWUoZHVtbXkpO1xcbitcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIHtcXG4tXFx0aWYgKHBhcy1cXHUwMDNldHguc3BpKVxcbi1cXHRcXHRwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuLVxcdGxpc3RfZGVsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0KTtcXG4rXFx0cHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuQEAgLTk2LDggKzExMywxMSBAQCBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuIFxcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXFx1MDAzZXBzZDtcXG4gXFxuIFxcdG11dGV4X2xvY2soXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuLVxcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcXG4tXFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XFxuK1xcdFxcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxcbitcXHRcXHRcXHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xcbitcXHRcXHRsaXN0X2RlbChcXHUwMDI2cGFzLVxcdTAwM2Vhc3NvY3NfbGlzdCk7XFxuK1xcdH1cXG4gXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiBcXHRwc3BfZGV2X3B1dChwc2QpO1xcbiBcXHRrZnJlZShwYXMpO1xcbkBAIC0xNTUsNiArMTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xcbitcXHRcXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZwYXMtXFx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIHtcXG4gXFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XFxuQEAgLTE3NCwxMiArMjEwLDQwIEBAIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnRcXG4rcHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4rXFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHROTF9TRVRfRVJSX01TRyhleHRhY2ssXFxuK1xcdFxcdFxcdCAgICAgICBcXFwiU29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRXUklURV9PTkNFKHNrLVxcdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xcbitcXHR0Y3Bfd3JpdGVfY29sbGFwc2VfZmVuY2Uoc2spO1xcbitcXHRwYXMtXFx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cXHUwMDNlcmN2X254dDtcXG4rXFxuK1xcdGljc2sgPSBpbmV0X2Nzayhzayk7XFxuK1xcdGljc2stXFx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcXG4rXFx0aWNzay1cXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK1xcbiBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG4gXFx0XFx0XFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuIFxcdFxcdFxcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiB7XFxuLVxcdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcXG4tXFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7XFxuK1xcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcztcXG4gXFx0aW50IGVycjtcXG4gXFxuIFxcdGxvY2tfc29jayhzayk7XFxuQEAgLTIwNyw0MCArMjcxLDcgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXFxuIFxcdFxcdGdvdG8gZXhpdF91bmxvY2s7XFxuIFxcdH1cXG4gXFxuLVxcdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XFxuLVxcdGlmIChlcnIpIHtcXG4tXFx0XFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLCBcXFwiU29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVxcXCIpO1xcbi1cXHRcXHRnb3RvIGV4aXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0XFxuLVxcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXFxuLVxcdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxcbi1cXHQgKi9cXG4tXFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcXG4tXFx0aWYgKCFkdW1teSkge1xcbi1cXHRcXHRlcnIgPSAtRU5PTUVNO1xcbi1cXHRcXHRnb3RvIGV4aXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHRtZW1jcHkoXFx1MDAyNmR1bW15LVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbi1cXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBleGl0X2ZyZWVfZHVtbXk7XFxuLVxcbi1cXHRtZW1jcHkocGFzLVxcdTAwM2VkcnZfZGF0YSwgZHVtbXktXFx1MDAzZWRydl9kYXRhLCBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbi1cXHRtZW1jcHkoXFx1MDAyNnBhcy1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4tXFxuLVxcdFdSSVRFX09OQ0Uoc2stXFx1MDAzZXNrX3ZhbGlkYXRlX3htaXRfc2tiLCBwc3BfdmFsaWRhdGVfeG1pdCk7XFxuLVxcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XFxuLVxcdHBhcy1cXHUwMDNldXBncmFkZV9zZXEgPSB0Y3Bfc2soc2spLVxcdTAwM2VyY3Zfbnh0O1xcbi1cXG4tXFx0aWNzayA9IGluZXRfY3NrKHNrKTtcXG4tXFx0aWNzay1cXHUwMDNlaWNza19leHRfaGRyX2xlbiArPSBwc3Bfc2tfb3ZlcmhlYWQoc2spO1xcbi1cXHRpY3NrLVxcdTAwM2VpY3NrX3N5bmNfbXNzKHNrLCBpY3NrLVxcdTAwM2VpY3NrX3BtdHVfY29va2llKTtcXG4tXFxuLWV4aXRfZnJlZV9kdW1teTpcXG4tXFx0a2ZyZWUoZHVtbXkpO1xcbitcXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xcbiBleGl0X3VubG9jazpcXG4gXFx0cmVsZWFzZV9zb2NrKHNrKTtcXG4gXFx0cmV0dXJuIGVycjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTE6NTIuMjM0MDIyMzY2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0ODY3NTA0MDE1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJTkVUX1BTUFwiLFxuICAgIFwiTkVUREVWU0lNXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCIsXG4gICAgXCJwc3Bfc29ja19zZXRfdHhfa2V5XCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9hZGRcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2RlbFwiLFxuICAgIFwicHNwX2Fzc29jX2ZyZWVcIixcbiAgICBcInBzcF9kZXZfY3JlYXRlXCIsXG4gICAgXCJwc3BfZGV2X3VucmVnaXN0ZXJcIixcbiAgICBcIm5zaW1fZG9fcHNwXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbisrKyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcbiBcdFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XG4gXHRcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xuIFx0XHR1MzIgc3BpO1xuLVx0XHR1MzIgYXNzb2NfY250O1xuIFx0fSBwc3A7XG4gXG4gXHRzdHJ1Y3QgbnNpbV9idXNfZGV2ICpuc2ltX2J1c19kZXY7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5pbmRleCA2YjM1MzJiNWUzNjBkLi5iNzQ1MmM0OWI1ODFkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcbkBAIC0yMyw3ICsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLFxuIFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0c3RydWN0IG5ldCAqbmV0O1xuIFx0aW50IHBzcF9sZW47XG4tXHR2b2lkICoqcHRyO1xuIFxuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0cGFzID0gcHNwX3NrYl9nZXRfYXNzb2NfcmN1KHNrYik7XG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IG5zaW1fYXNzb2NfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi1cdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cbi1cdCpwdHIgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHRucy1cdTAwM2Vwc3AuYXNzb2NfY250Kys7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSArMTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG5zaW1fYXNzb2NfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdCpwdHIgPSBOVUxMO1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudC0tO1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBuc2ltX2dldF9zdGF0cyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Rldl9zdGF0cyAqc3RhdHMpXG4ge1xuIFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcbiBzdGF0aWMgc3RydWN0IHBzcF9kZXZfb3BzIG5zaW1fcHNwX29wcyA9IHtcbiBcdC5zZXRfY29uZmlnXHQ9IG5zaW1fcHNwX3NldF9jb25maWcsXG4gXHQucnhfc3BpX2FsbG9jXHQ9IG5zaW1fcnhfc3BpX2FsbG9jLFxuLVx0LnR4X2tleV9hZGRcdD0gbnNpbV9hc3NvY19hZGQsXG4tXHQudHhfa2V5X2RlbFx0PSBuc2ltX2Fzc29jX2RlbCxcbiBcdC5rZXlfcm90YXRlXHQ9IG5zaW1fa2V5X3JvdGF0ZSxcbiBcdC5nZXRfc3RhdHNcdD0gbnNpbV9nZXRfc3RhdHMsXG4gfTtcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxuIFx0XHRzeW5jaHJvbml6ZV9yY3UoKTtcbiBcdFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XG4gXHR9XG4tXHRXQVJOX09OKG5zLVx1MDAzZXBzcC5hc3NvY19jbnQpO1xuIH1cbiBcbiB2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxuQEAgLTI0LDExICsyNCw2IEBAIGludCBwc3BfZGV2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZGV2X2lkLCB1OCBnZW5lcmF0aW9uLCBib29sIHN0cmlwX2ljdik7XG4gLyogS2VybmVsLWZhY2luZyBBUEkgKi9cbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0cmV0dXJuIHBhcy1cdTAwM2VkcnZfZGF0YTtcbi19XG4tXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuIHZvaWQgcHNwX3NrX2Fzc29jX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5pbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5AQCAtMjE5LDEyICsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbitcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXG4rXHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHQvKipcbiBcdCAqIEB0eF9rZXlfZGVsOiByZW1vdmUgYSBUeCBrZXkgZnJvbSB0aGUgZGV2aWNlXG4gXHQgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbitcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3AuaCBiL25ldC9wc3AvcHNwLmhcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcC5oXG4rKysgYi9uZXQvcHNwL3BzcC5oXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIFx0cmV0dXJuICEhcHNkLVx1MDAzZW9wcztcbiB9XG4gXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbitcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBhcy1cdTAwM2Vwc2QtXHUwMDNlbG9jayk7XG4rXHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbit9XG4rXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3BfbWFpbi5jIGIvbmV0L3BzcC9wc3BfbWFpbi5jXG5pbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXG4rKysgYi9uZXQvcHNwL3BzcF9tYWluLmNcbkBAIC02OCw5ICs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4rXHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbitcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4rXHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICsxNDcsMTEgQEAgdm9pZCBwc3BfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiBcbiBcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXMsIG5leHQsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XG4rXHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuK1x0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4rXHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4rKysgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4gfVxuIFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiBcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0cmV0dXJuIHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIHBhcywgZXh0YWNrKTtcbitcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuK1x0aW50IGVycjtcbitcbitcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcbitcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXG4rXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbitcdCAqL1xuK1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbitcdGlmICghZHVtbXkpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4rXHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbitcdGlmICghZXJyKVxuK1x0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbitcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuK1xuK1x0a2ZyZWUoZHVtbXkpO1xuK1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gdm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIHtcbi1cdGlmIChwYXMtXHUwMDNldHguc3BpKVxuLVx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuLVx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbitcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICsxMTMsMTEgQEAgc3RhdGljIHZvaWQgcHNwX2Fzc29jX2ZyZWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gXG4gXHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbi1cdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuK1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbitcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuK1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICsxNzUsMjIgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4rXHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuK1x0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0aW50IGVycjtcbitcbitcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcbitcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdG1lbWNweShcdTAwMjZwYXMtXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuIFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XG5AQCAtMTc0LDEyICsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnRcbitwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuK1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxuK1x0XHRcdCAgICAgICBcIlNvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcIik7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuK1x0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbitcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbitcbitcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4rXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbitcdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLFxuIFx0XHRcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbi1cdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbi1cdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKmR1bW15O1xuK1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICsyNzEsNyBAQCBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiBcdFx0Z290byBleGl0X3VubG9jaztcbiBcdH1cbiBcbi1cdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4tXHRpZiAoZXJyKSB7XG4tXHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXCIpO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxuLVx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cbi1cdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxuLVx0ICovXG4tXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xuLVx0aWYgKCFkdW1teSkge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXhpdF9mcmVlX2R1bW15O1xuLVxuLVx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuLVx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuLVxuLVx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuLVx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbi1cdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbi1cbi1cdGljc2sgPSBpbmV0X2Nzayhzayk7XG4tXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4rXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xuIGV4aXRfdW5sb2NrOlxuIFx0cmVsZWFzZV9zb2NrKHNrKTtcbiBcdHJldHVybiBlcnI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MTo1Mi4yMzQwMjQyNDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4MDMxMzY2NzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpcyBldmVuICp3b3J0aCogZnV6emluZywgYW5kIGlmIHNvLCB3aGF0IHRoZSBiZXN0IGFwcHJvYWNoIGlzLiBJIG5lZWQgdG8gbmFpbCBkb3duIHRoZSBvcHRpbWFsIGNvbmZpZ3VyYXRpb24gYW5kIGlkZW50aWZ5IHRoZSByaWdodCBmb2N1cyBzeW1ib2xzLlxuXG5GaXJzdCBzdGVwOiBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMuIEkgc2VlIHRoYXQgdGhlIHBhdGNoIHRvdWNoZXM6XG5cbiogICBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oYFxuKiAgIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgXG4qICAgYGluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaGBcbiogICBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgXG4qICAgYG5ldC9wc3AvcHNwLmhgXG4qICAgYG5ldC9wc3AvcHNwX21haW4uY2BcbiogICBgbmV0L3BzcC9wc3Bfc29jay5jYFxuXG5SaWdodCwgc28gd2UncmUgZGVhbGluZyB3aXRoIHRoZSBuZXR3b3JrIGRldmljZSBzaW11bGF0b3IgYW5kIHNvbWUga2luZCBvZiBcInBzcFwiIChsaWtlbHkgcGFja2V0IHNjaGVkdWxpbmcgb3IgcHJvY2Vzc2luZywgYmFzZWQgb24gdGhlIGluY2x1ZGUgcGF0aHMpLiBEZWZpbml0ZWx5IGludGVyZXN0aW5nLiBOZXh0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGVzZSBtb2RpZmljYXRpb25zLiBJJ2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBhbmQgc2VlIHdoYXQncyBhY3R1YWxseSBiZWluZyBjaGFuZ2VkLiBUaGF0J2xsIGxldCBtZSBkZWNpZGUgd2hldGhlciB3ZSdyZSBsb29raW5nIGF0IHNvbWV0aGluZyB0aGF0IGNvdWxkIGJlIGhpdCBieSBmdXp6aW5nLCBhbmQgaWYgc28sIHdoYXQgdGhlIG1vc3QgdnVsbmVyYWJsZSBhcmVhcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc0NzAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjowMC4yNjUzOTM3MTdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYyODE4ODU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfSU5FVF9QU1BcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlPTE5PWVuZGlmXFxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIwLVxcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9NYWtlZmlsZToyMTppZm5lcSAoJChDT05GSUdfSU5FVF9QU1ApLClcXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vTWFrZWZpbGUtMjItbmV0ZGV2c2ltLW9ianMgKz0gcHNwLm9cXG4tLVxcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaD00NDQ9c3RhdGljIGlubGluZSB2b2lkIG5zaW1fbWFjc2VjX3RlYXJkb3duKHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxcbi0tXFxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oLTQ0OC1cXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmg6NDQ5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgtNDUwLWludCBuc2ltX3BzcF9pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmg9MjE1OD1zdHJ1Y3QgbmV0X2RldmljZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oLTIzODgtI2VuZGlmXFxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaDoyMzg5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oLTIzOTAtXFx0c3RydWN0IHBzcF9kZXYgX19yY3VcXHQqcHNwX2RldjtcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NTA0Mz1lbnVtIHNrYl9leHRfaWQge1xcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDU4LSNlbmRpZlxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NTA1OTojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDYwLVxcdFNLQl9FWFRfUFNQLFxcbi0tXFxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg9MzM9c3RydWN0IGluZXRfdGltZXdhaXRfc29jayB7XFxuLS1cXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04NC1cXHRzdHJ1Y3QgaW5ldF9iaW5kMl9idWNrZXRcXHQqdHdfdGIyO1xcbmluY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oOjg1OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04Ni1cXHRzdHJ1Y3QgcHNwX2Fzc29jIF9fcmN1XFx0ICAqcHNwX2Fzc29jO1xcbi0tXFxuaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oPTI1PXZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xcbmluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaC0yNi1cXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg6Mjc6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxcbmluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaC0yOC11bnNpZ25lZCBpbnQgcHNwX2tleV9zaXplKHUzMiB2ZXJzaW9uKTtcXG4tLVxcbmluY2x1ZGUvbmV0L3NvY2suaD0zNjU9c3RydWN0IHNvY2sge1xcbi0tXFxuaW5jbHVkZS9uZXQvc29jay5oLTQ2Ni0jZW5kaWZcXG5pbmNsdWRlL25ldC9zb2NrLmg6NDY3OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL25ldC9zb2NrLmgtNDY4LVxcdHN0cnVjdCBwc3BfYXNzb2MgX19yY3VcXHQqcHNwX2Fzc29jO1xcbi0tXFxubmV0L01ha2VmaWxlPTIwPW9iai0kKENPTkZJR19VTklYKVxcdFxcdCs9IHVuaXgvXFxubmV0L01ha2VmaWxlOjIxOm9iai0kKENPTkZJR19JTkVUX1BTUClcXHRcXHQrPSBwc3AvXFxubmV0L01ha2VmaWxlLTIyLW9iai15XFx0XFx0XFx0XFx0Kz0gaXB2Ni9cXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTUxNTA9c3RhdGljIGNvbnN0IHU4IHNrYl9leHRfdHlwZV9sZW5bXSA9IHtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTUxNjUtI2VuZGlmXFxubmV0L2NvcmUvc2tidWZmLmM6NTE2NjojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxubmV0L2NvcmUvc2tidWZmLmMtNTE2Ny1cXHRbU0tCX0VYVF9QU1BdID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgcHNwX3NrYl9leHQpLFxcbi0tXFxubmV0L2NvcmUvc29jay5jPTI0Nzk9c3RydWN0IHNvY2sgKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHksXFxuLS1cXG5uZXQvY29yZS9zb2NrLmMtMjQ5Ni0jZW5kaWZcXG5uZXQvY29yZS9zb2NrLmM6MjQ5NzojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxubmV0L2NvcmUvc29jay5jLTI0OTgtXFx0UkNVX0lOSVRfUE9JTlRFUihuZXdzay1cXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcXG4tLVxcbm5ldC9wc3AvTWFrZWZpbGUtMi1cXG5uZXQvcHNwL01ha2VmaWxlOjM6b2JqLSQoQ09ORklHX0lORVRfUFNQKSArPSBwc3Aub1xcbm5ldC9wc3AvTWFrZWZpbGUtNC1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZz0zPUNPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTPW5cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc6NDpDT05GSUdfSU5FVF9QU1A9eVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZy01LUNPTkZJR19JUFY2PXlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDEuODkzNTg5MjY0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQwOTU3Mzc0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMgZnJvbSBhIGZpcnN0LXBlcnNvbiwgZXhwZXJ0IHBlcnNwZWN0aXZlLCBmb2N1c2luZyBvbiB0aGUgYXNzdW1lZCBrbm93bGVkZ2UgdGhlIHVzZXIgaGFzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgTmV0d29yayBTaW11bGF0aW9uKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgYSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBteSB3b3JrIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JraW5nIHNpbXVsYXRpb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGNoZWNrIHRoZSBrZXJuZWwncyBLY29uZmlnIHN5c3RlbS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBJTkVUX1BTUGAgYW5kIGBORVRERVZTSU1gIHJlbGF0ZSB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJhbWV3b3JrLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtYXAgb2YgdGhlIGdlbmVyYWwgbmV0d29yayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSwgYnV0IHRoZXNlIHR3bywgaW4gdGhpcyBwYXJ0aWN1bGFyIHNjZW5hcmlvLCBuZWVkIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byBxdWlja2x5IGVzdGFibGlzaCBpZiBvbmUgZGVwZW5kcyBvbiB0aGUgb3RoZXIsIGlmIHRoZXkncmUgbXV0dWFsbHkgZXhjbHVzaXZlIGluIHNvbWUgY29tYmluYXRpb25zLCBvciBpZiB0aGV54oCZcmUgaW5kZXBlbmRlbnQgZmVhdHVyZXMgdGhhdCBjYW4gaW50ZXJhY3QuIEl0J3MgdGltZSB0byBwYXJzZSB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgc2VlIGV4YWN0bHkgaG93IHRoZXNlIHRoaW5ncyBhcmUgZGVmaW5lZCBhbmQgY29uc3RyYWluZWQuIEkgZXhwZWN0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIGRlZmF1bHQgdmFsdWVzIEkgbmVlZCB0byBpbnRlcm5hbGl6ZSB0byBlbnN1cmUgSSBzZXQgdXAgbXkgc2ltdWxhdGlvbiBlbnZpcm9ubWVudCBjb3JyZWN0bHkuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBgc2VsZWN0YCBhbmQgYGRlcGVuZHMgb25gIHN0YXRlbWVudHMgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDY4LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDQuMzAzMTY2MTgzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODUxNzg1NTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIElORVRfUFNQXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wc3AvS2NvbmZpZy00LSNcXG5uZXQvcHNwL0tjb25maWc6NTpjb25maWcgSU5FVF9QU1BcXG5uZXQvcHNwL0tjb25maWctNi1cXHRib29sIFxcXCJQU1AgU2VjdXJpdHkgUHJvdG9jb2wgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDUuOTg4MzQ5NDc1WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY5Mjc4MzEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkV4YW1pbmluZyBLY29uZmlnIEZpbGVzIGZvciBOZXR3b3JrIERldmljZSBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgY29uZmlndXJhdGlvbiBhc3BlY3RzIG9mIHRoZXNlIG5ldHdvcmsgZHJpdmVycy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB1c2VyIGNvbmZpZ3VyZXMgdGhlc2Ugc3BlY2lmaWMgbmV0d29yayBkZXZpY2VzIHdpdGhpbiB0aGUga2VybmVsLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludHMgYXJlIHRoZSBgbmV0L3BzcC9LY29uZmlnYCBhbmQgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9LY29uZmlnYCBmaWxlcy4gSSdtIGV4cGVjdGluZyB0aGVzZSB0byBvdXRsaW5lIHRoZSBtZW51IGVudHJpZXMsIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIGFuZCBoZWxwIHRleHQgdGhhdCBndWlkZSB0aGUgdXNlcidzIGNob2ljZXMgZHVyaW5nIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBwaGFzZSAodXNpbmcgYG1ha2UgbWVudWNvbmZpZ2AsIGBtYWtlIGRlZmNvbmZpZ2AsIG9yIHNpbWlsYXIpLiBJ4oCZbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6XG5cbiogICAqKkRlcGVuZGVuY2llczoqKiBXaGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcyBuZWVkIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXNlIGRldmljZXMgYmVjb21lIGF2YWlsYWJsZT8gQXJlIHRoZXJlIHNwZWNpZmljIGhhcmR3YXJlIG9yIGRyaXZlciByZXF1aXJlbWVudHM/XG4qICAgKipEZWZhdWx0IFZhbHVlczoqKiBXaGF0J3MgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24/IElzIHRoZSBkcml2ZXIgZW5hYmxlZCBieSBkZWZhdWx0LCBvciBkaXNhYmxlZD8gV2hhdCBhcmUgYW55IGRlZmF1bHQgcGFyYW1ldGVycyBsaWtlIGJ1ZmZlciBzaXplcyBvciBxdWV1ZSBsZW5ndGhzP1xuKiAgICoqTWVudSBTdHJ1Y3R1cmU6KiogSG93IGFyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGdyb3VwZWQ/IEFyZSB0aGV5IG9yZ2FuaXplZCBsb2dpY2FsbHkgYnkgZmVhdHVyZSwgZGV2aWNlIHR5cGUsIG9yIG5ldHdvcmsgcHJvdG9jb2w/IEhvdyBkZWVwbHkgbmVzdGVkIGFyZSB0aGV5P1xuKiAgICoqSGVscCBUZXh0OioqIElzIHRoZSBoZWxwIHRleHQgY2xlYXIgYW5kIGluZm9ybWF0aXZlPyBEb2VzIGl0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgZWFjaCBvcHRpb24gYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBEb2VzIGl0IHByb3ZpZGUgZ3VpZGFuY2Ugb24gd2hpY2ggc2V0dGluZ3MgYXJlIHN1aXRhYmxlIGZvciBkaWZmZXJlbnQgdXNlIGNhc2VzP1xuKiAgICoqQ29tcGF0aWJpbGl0eToqKiBBcmUgdGhlcmUgYW55IGtub3duIGNvbXBhdGliaWxpdHkgaXNzdWVzIG9yIGxpbWl0YXRpb25zPyBJcyB0aGVyZSBhbnkgaW5kaWNhdGlvbiBvZiB3aGljaCBoYXJkd2FyZSB2ZXJzaW9ucyBvciBzb2Z0d2FyZSB2ZXJzaW9ucyB0aGUgZHJpdmVycyBhcmUgZGVzaWduZWQgZm9yP1xuXG5VbmRlcnN0YW5kaW5nIHRoZXNlIGBLY29uZmlnYCBmaWxlcyBpcyBmb3VuZGF0aW9uYWwuIEl0J3MgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBkcml2ZXJzIGFyZSBpbnRlZ3JhdGVkIGFuZCBob3cgZW5kLXVzZXJzIGludGVyYWN0IHdpdGggdGhlbSBpbiB0aGUgbGFyZ2VyIGtlcm5lbCBlY29zeXN0ZW0uIFRoaXMgaXMgd2hlcmUgdGhlIHN0b3J5IGJlZ2lucy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTQxMywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjA4LjY4MTEzNDkxMVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc5NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBQU1AgY29uZmlndXJhdGlvblxcbiAgIDQ6XFx0I1xcbiAgIDU6XFx0Y29uZmlnIElORVRfUFNQXFxuICAgNjpcXHRcXHRib29sIFxcXCJQU1AgU2VjdXJpdHkgUHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4gICA3OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDg6XFx0XFx0c2VsZWN0IFNLQl9ERUNSWVBURURcXG4gICA5OlxcdFxcdHNlbGVjdCBTS0JfRVhURU5TSU9OU1xcbiAgMTA6XFx0XFx0c2VsZWN0IFNPQ0tfVkFMSURBVEVfWE1JVFxcbiAgMTE6XFx0XFx0aGVscFxcbiAgMTI6XFx0XFx0RW5hYmxlIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgUFNQIFNlY3VyaXR5IFByb3RvY29sIChQU1ApLlxcbiAgMTM6XFx0XFx0Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOlxcbiAgMTQ6XFx0XFx0ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZ29vZ2xlL3BzcC9tYWluL2RvYy9QU1BfQXJjaF9TcGVjLnBkZlxcbiAgMTU6XFx0XFxuICAxNjpcXHRcXHRJZiB1bnN1cmUsIHNheSBOLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjowOC42ODEyMTY0ODFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDYwNDE1OTA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCB3ZW50OlxuXG4qKkV4YW1pbmluZyBLY29uZmlnIGZvciBOZXRkZXZzaW0gQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHNvbWV0aGluZyBuZXR3b3JrLXJlbGF0ZWQsIGFuZCBJJ20gcHJldHR5IHN1cmUgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIE15IG1pbmQgaW1tZWRpYXRlbHkgZ29lcyB0byB3aGVyZSB0aGVzZSB0aGluZ3MgYXJlIHVzdWFsbHkgZGVmaW5lZCBpbiB0aGUga2VybmVsIHNvdXJjZSwgYW5kIHRoYXQncyB0aGUgYEtjb25maWdgIGZpbGVzLiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgZGV2aWNlIHNpbXVsYXRvciwgYG5ldGRldnNpbWAsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBkb24ndCBvdmVybG9vayBhbnl0aGluZyBzcGVjaWZpYyB0byBpdC4gVG8gZW5zdXJlIEkgY292ZXIgYWxsIHJlbGV2YW50IGFzcGVjdHMgb2YgdGhlIGJ1aWxkLCBJIG5lZWQgdG8gb3BlbiBhbmQgcmVhZCB0aGUgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9LY29uZmlnYCBmaWxlLCBzaW5jZSB0aGF0J3MgbGlrZWx5IHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgYXJlIGRlZmluZWQuIEkgaGF2ZSB0byBtYWtlIHN1cmUgdG8gZXhhbWluZSB0aGlzIGZpbGUgdGhvcm91Z2hseSBhcyBwYXJ0IG9mIG15IGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMDQ1LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoxMC43NDE2MzQ2NjVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0ODc4MTQ5NDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5FVERFVlNJTVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC9LY29uZmlnPTYwMj1zb3VyY2UgXFxcImRyaXZlcnMvbmV0L2h5cGVydi9LY29uZmlnXFxcIlxcbmRyaXZlcnMvbmV0L0tjb25maWctNjAzLVxcbmRyaXZlcnMvbmV0L0tjb25maWc6NjA0OmNvbmZpZyBORVRERVZTSU1cXG5kcml2ZXJzL25ldC9LY29uZmlnLTYwNS1cXHR0cmlzdGF0ZSBcXFwiU2ltdWxhdGVkIG5ldHdvcmtpbmcgZGV2aWNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoxMi4yMjk0NTY5NzJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ1NzA5OTQwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGUgTmV0L1BTUCBJbXBsZW1lbnRhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGlzIG5ldC9wc3AgbW9kdWxlIHdvcmtzLCBhbmQgbW9yZSBzcGVjaWZpY2FsbHksIGhvdyBpdCdzIGludGVncmF0ZWQuIFBTUCwgYXMgSSByZWNhbGwsIGlzIHRoZSBQU1AgU2VjdXJpdHkgUHJvdG9jb2wg4oCTIHRoYXQgR29vZ2xlIGluaXRpYXRpdmUgZm9yIElQL1RDUCBjcnlwdG8gb2ZmbG9hZC4gV2Uga25vdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgc3lzdGVtIHZpYSBuZXRsaW5rIGFuZCBzb2NrZXRzLCBhbmQgSSdtIHByZXR0eSBzdXJlIGl0IGhhcyBzb21lIG5ldGRldnNpbSBzdXBwb3J0IGJha2VkIGluLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29yZSBmaWxlczogYG5ldC9wc3AvcHNwX21haW4uY2Agc2hvdWxkIGJlIHRoZSBlbnRyeSBwb2ludCwgYG5ldC9wc3AvcHNwX3NvY2suY2Agd2lsbCBob2xkIHRoZSBzb2NrZXQtcmVsYXRlZCBjb2RlLCBhbmQgdGhlbiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGBuZXQvcHNwL3BzcF9ubC5jYCBmb3IgYW55IE5ldGxpbmsgaW50ZXJhY3Rpb25zLiBMZXQncyBzZWUgaWYgdGhlIE5ldGxpbmsgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhhdCBzcGVjaWZpYyBmaWxlLiBUbyBzdGFydCBJJ2xsIGxpc3QgdGhlIGZpbGVzIGluIHRoZSBgbmV0L3BzcGAgZGlyZWN0b3J5IHRvIGdldCBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgdGhlIGFyY2hpdGVjdHVyZS4gTGV0J3Mgc2VlIHdoYXQgZ2VtcyB3ZSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNDMsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MTQuNjg2NTU4ODU3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImNvZGVzZWFyY2gtZGlyLWluZGV4IiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI1MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJEaXJcIjogXCJuZXQvcHNwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIkZpbGVzXCI6IFtcbiAgICBcInBzcC1ubC1nZW4uY1wiLFxuICAgIFwicHNwLW5sLWdlbi5oXCIsXG4gICAgXCJwc3AuaFwiLFxuICAgIFwicHNwX21haW4uY1wiLFxuICAgIFwicHNwX25sLmNcIixcbiAgICBcInBzcF9zb2NrLmNcIlxuICBdLFxuICBcIlN1YmRpcnNcIjogbnVsbFxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MTQuNjg2NjEyOTY2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjc4OTMwNzY3ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUGF0Y2ggQW5hbHlzaXMgYW5kIEZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBhIGRlZXBlciBsb29rIGZvciBmdXp6aW5nIHB1cnBvc2VzLiBgbmV0ZGV2c2ltYCBpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZyBiZWNhdXNlIGl0IGlzIGVhc2lseSBhY2Nlc3NpYmxlIHdpdGhpbiBRRU1VLCBtYWtpbmcgaXQgcGVyZmVjdCBmb3Igc3l6a2FsbGVyLiBUaGUgUFNQIHByb3RvY29sIGl0c2VsZiwgbG9jYXRlZCBpbiBgbmV0L3BzcC9gLCBpcyBjb3JlIG5ldHdvcmtpbmcgbG9naWMuIFdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgY2hhbmdlcyBpbnRlcmFjdCBhbmQgc2VlIGlmIHRoZXkgaW50cm9kdWNlIGFueSBuZXcgYXZlbnVlcyBmb3IgZXhwbG9pdGF0aW9uLlxuXG5GaXJzdCwgSSdsbCBhbmFseXplIHRoZSBwYXRjaCBkaWZmLlxuMS4gICoqYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AqKjogSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgc2ltcGxpZnlpbmcgbmV0ZGV2c2ltJ3MgUFNQIGltcGxlbWVudGF0aW9uLiBXZSBhcmUgcmVtb3Zpbmcgc29tZSBpbnRlcm5hbCB0cmFja2luZyBtZWNoYW5pc21zIChgYXNzb2NfY250YCwgIGBuc2ltX2Fzc29jX2FkZGAsIGBuc2ltX2Fzc29jX2RlbGAsIGBhc3NvY19kcnZfc3BjYCkuIFRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHRoYXQgYG5ldGRldnNpbWAgaXNuJ3Qgc3RvcmluZyBUeCBrZXlzIGluIGhhcmR3YXJlIChTQURCKSwgc28gaXQncyBtYWtpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgb3BlcmF0aW9ucyBvcHRpb25hbCB3aXRoaW4gYHN0cnVjdCBwc3BfZGV2X29wc2AuIFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiB3aGljaCBtaWdodCBsZWFkIHRvIGVkZ2UgY2FzZXMuXG4yLiAgKipgaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oYCBhbmQgYGluY2x1ZGUvbmV0L3BzcC90eXBlcy5oYCoqOiBXZSdyZSBzZWVpbmcgbW9yZSBzaW1wbGlmaWNhdGlvbnMuIFRoZSByZW1vdmFsIG9mIGBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKWAgYW5kIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBvcHRpb25hbCBuYXR1cmUgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnVydGhlciBjbGFyaWZ5IHRoZSBpbnRlbnRpb24gb2YgdGhlIGNoYW5nZXMuXG4zLiAgKipgbmV0L3BzcC9wc3AuaGAqKjogVGhlIGludHJvZHVjdGlvbiBvZiBgcHNwX2Rldl9oYXNfc2FkYmAgYW5kIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbGAgaXMgY3J1Y2lhbC4gVGhleSBhcmUgZGVmaW5pbmcgdGhlIGNvbmRpdGlvbnMgZm9yIHdoZW4gVHgga2V5IG9wZXJhdGlvbnMgYXJlIG5lY2Vzc2FyeS4gV2UncmUgc2VlaW5nIGxvY2tkZXAgYXNzZXJ0aW9ucyAoYGxvY2tkZXBfYXNzZXJ0X2hlbGRgKSB3aGljaCwgaWYgdmlvbGF0ZWQsIGlzIGFuIGluZGljYXRvciBvZiBhIGxvY2tpbmcgaXNzdWUuXG40LiAgKipgbmV0L3BzcC9wc3BfbWFpbi5jYCoqOiBUaGUgdXBkYXRlIHRvIGBwc3BfZGV2X2NyZWF0ZWAgYWxsb3dzIGZvciBOVUxMIGB0eF9rZXlfYWRkYCAvIGB0eF9rZXlfZGVsYCwgYWRkaW5nIGZsZXhpYmlsaXR5IHRvIHRoZSBjb2RlLiBIb3dldmVyLCB0aGUgbG9naWMgcmVnYXJkaW5nIGBhc3NvY19kcnZfc3BjYCBhZGRzIGEgY2hlY2sgdG8gZW5zdXJlIHRoYXQgKmJvdGgqIGNhbiBiZSBudWxsIG9yIG11c3QgYmUgc2V0LiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBub3cgY29uZGl0aW9uYWxseSBjYWxscyBgcHNwX2Rldl90eF9rZXlfZGVsYCBiYXNlZCBvbiB0aGUgY29uZGl0aW9ucy5cbjUuICAqKmBuZXQvcHNwL3BzcF9zb2NrLmNgKio6IFRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gV2UncmUgc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG8gYHBzcF9kZXZfdHhfa2V5X2FkZGAgYW5kIGBwc3BfZGV2X3R4X2tleV9kZWxgIGNvbmNlcm5pbmcgZHVtbXkgYXNzb2NpYXRpb25zLCBjb3B5aW5nIG9mIGRyaXZlciBkYXRhIGFuZCBjaGFuZ2VzIHRvIHRoZSBsaXN0IGhhbmRsaW5nLiBUaGUgaW50cm9kdWN0aW9uIG9mIGBwc3BfYXNzb2Nfc2V0X3R4YCwgYHBzcF9zb2NrX3NldF90eF9rZXlgIGFuZCB1cGRhdGVzIHRvIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgIHJlcHJlc2VudCBjaGFuZ2VzIGluIGtleSBtYW5hZ2VtZW50LlxuXG5NeSBpbnR1aXRpb24gc2F5cyAqdGhpcyBpcyByZWFjaGFibGUgYW5kIHdvcnRoIHRhcmdldGluZy4qXG5cbkhlcmUncyB3aHk6XG5cbiogICAqKkNvcmUgTmV0d29ya2luZyBJbXBhY3QqKjogVGhlIGNoYW5nZXMgYWZmZWN0IHRoZSBQU1Agc3Vic3lzdGVtIChgbmV0L3BzcC9gKSBhbmQgYG5ldGRldnNpbWAsIHdoaWNoIGFyZSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIGNvbXBvbmVudHMuXG4qICAgKipLZXkgTGlmZWN5Y2xlIE1vZGlmaWNhdGlvbnMqKjogV2UncmUgZGVhbGluZyB3aXRoIFR4IGtleSBsaWZlY3ljbGUsIHNvY2tldCBhc3NvY2lhdGlvbnMsIGRldmljZSByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24sIGFuZCB0aGUgbmV0bGluayBQU1AgaW50ZXJmYWNlLiBUaGVzZSBhcmUgYWxsIGhpZ2gtdmFsdWUgdGFyZ2V0cyBmb3IgZnV6emluZy5cbiogICAqKkNvbmN1cnJlbmN5L0xvY2tpbmcqKjogVGhlIHByZXNlbmNlIG9mIGBsb2NrZGVwX2Fzc2VydF9oZWxkYCBzdWdnZXN0cyBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWVzLlxuKiAgICoqRGF0YSBTdHJ1Y3R1cmUgTWFuaXB1bGF0aW9uKio6IFRoZXJlJ3MgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmVzIChsaWtlIGBwc3BfYXNzb2NfZHVtbXlgKS4gTWVtb3J5IGNvcnJ1cHRpb24gaXMgYWx3YXlzIGEgY29uY2Vybi5cbiogICAqKkFjY2Vzc2liaWxpdHkqKjogSXQncyBhbGwgcmVhY2hhYmxlIGluIFFFTVUsIHdoaWNoIGlzIGlkZWFsIGZvciBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQsIGZvY3VzaW5nIG9uIGVudHJ5IHBvaW50cyB0aGF0IGNhbiBiZSBmdXp6ZWQ6XG5cbiogICAqKk1vZGlmaWVkIEZ1bmN0aW9ucyoqOiBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCBpbiBgbmV0L3BzcC9wc3BfbWFpbi5jYCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBhbmQgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAgaW4gYG5ldC9wc3AvcHNwX3NvY2suY2AsIGBuc2ltX2RvX3BzcGAgYW5kIGBuc2ltX3BzcF91bmluaXRgIGluIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLlxuKiAgICoqQWRkZWQgU3RhdGljIEZ1bmN0aW9ucyoqOiBgcHNwX2Fzc29jX3NldF90eGAgYW5kIGBwc3Bfc29ja19zZXRfdHhfa2V5YCBpbiBgbmV0L3BzcC9wc3Bfc29jay5jYC4gSSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlc2UgYXJlIGlubGluZWQgb3IgaGF2ZSBlbnRyeSBwb2ludHMuXG5cbkknbGxcblxuIiwiSW5wdXRUb2tlbnMiOjEwNzU5LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI2NiwiVG9vbENhbGxzIjpbImNvZGVzZWFyY2gtZGlyLWluZGV4Il19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjIuNTc5NjkyOThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjQ0ODM5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wc3AvcHNwLmg9MjY9aW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4tLVxcbm5ldC9wc3AvcHNwLmgtMjgtXFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbm5ldC9wc3AvcHNwLmg6Mjk6aW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXFxubmV0L3BzcC9wc3AuaC0zMC1cXHRcXHRcXHQgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4tLVxcbm5ldC9wc3AvcHNwX25sLmM9ODI2PWludCBwc3BfbmxfdHhfYXNzb2NfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3BzcC9wc3BfbmwuYy04NTctXFxubmV0L3BzcC9wc3BfbmwuYzo4NTg6XFx0ZXJyID0gcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHNvY2tldC1cXHUwMDNlc2ssIHBzZCwgdmVyc2lvbiwgXFx1MDAyNmtleSxcXG5uZXQvcHNwL3BzcF9ubC5jLTg1OS1cXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlZXh0YWNrKTtcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYz0yMTQ9cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYy0yNDEtXFxubmV0L3BzcC9wc3Bfc29jay5jOjI0MjppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG5uZXQvcHNwL3BzcF9zb2NrLmMtMjQzLVxcdFxcdFxcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoyNC4zMDQyMjQ2N1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjc3ODc1OTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOlxuXG4qKkRpdmluZyBpbnRvIFBTUCBTb2NrZXQgTWFuYWdlbWVudCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGBuZXQvcHNwL3BzcF9zb2NrLmNgIGZpbGUuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhpcyBQU1Agc29ja2V0IGFzc29jaWF0aW9uIHByb2Nlc3Mgd29ya3MuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGZvY3VzIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWFuYWdpbmcgdHJhbnNtaXQga2V5cyBhbmQgYXNzb2NpYXRpb25zLiBMZXQncyBzdGFydCBieSBsb29raW5nIGNsb3NlbHkgYXQgYHBzcF9hc3NvY19mcmVlYC4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIHdoZW4gYW4gYXNzb2NpYXRpb24gaXMgdGVybWluYXRlZC4gV2hhdCBoYXBwZW5zIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcz8gV2hhdCdzIHRoZSBjb21wbGV0ZSB0ZWFyZG93biBwcm9jZXNzP1xuXG5UaGVuLCBJJ2xsIG1vdmUgb24gdG8gYHBzcF9kZXZfdHhfa2V5X2FkZGAgYW5kIGBwc3BfZGV2X3R4X2tleV9kZWxgLiBJIG5lZWQgdG8gZW5zdXJlIEkgaGF2ZSBhIHNvbGlkIGdyYXNwIG9mIGhvdyB0cmFuc21pdCBrZXlzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZCBmb3IgdGhlIGFzc29jaWF0ZWQgZGV2aWNlcy4gV2hhdCBhcmUgdGhlIGtleSBtYW5hZ2VtZW50IG1lY2hhbmljcz8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgaGFyZHdhcmU/IEFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgc2hvdWxkIGJlIG1pbmRmdWwgb2Y/IEkgbmVlZCB0byBsb29rIGF0IHRoZSBsb2NraW5nIHN0cmF0ZWd5IHdpdGhpbiB0aGVzZSBmdW5jdGlvbnMuXG5cbkZpbmFsbHksIHRoZSBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCBmdW5jdGlvbi4gVGhpcyBsaWtlbHkgb3JjaGVzdHJhdGVzIHRoZSBvdmVyYWxsIHByb2Nlc3Mgb2Ygc2V0dGluZyB1cCB0aGUgdHJhbnNtaXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNvY2tldCBhc3NvY2lhdGlvbiwgc28gSSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYSBnb29kIHNlbnNlIG9mIHRoZSBjb21wbGV0ZSBmbG93IGJ5IHN0dWR5aW5nIHRoZSBmdW5jdGlvbi4gSSBuZWVkIHRvIGJlIHN1cmUgSSBhbSB2ZXJ5IGNsZWFyIG9uIHRoZSBwYXJhbWV0ZXJzIGhlcmUgYW5kIHdoYXQgdGhleSBhcmUgdXNlZCBmb3IuIEkgd2lsbCBjaGVjayBmb3IgZXJyb3IgaGFuZGxpbmcgaGVyZSB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDgxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjYuNTgyMTAyOTM3WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzMwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcHNwL3BzcF9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNzA6XFx0e1xcbiAgNzE6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cXHUwMDNlcHNkO1xcbiAgNzI6XFx0XFx0c2l6ZV90IHN6O1xcbiAgNzM6XFx0XFxuICA3NDpcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAgNzU6XFx0XFxuICA3NjpcXHRcXHRzeiA9IHN0cnVjdF9zaXplKHBhcywgZHJ2X2RhdGEsIHBzZC1cXHUwMDNlY2Fwcy1cXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XFxuICA3NzpcXHRcXHRyZXR1cm4ga21lbWR1cChwYXMsIHN6LCBHRlBfS0VSTkVMKTtcXG4gIDc4OlxcdH1cXG4gIDc5OlxcdFxcbiAgODA6XFx0c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAgODE6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuICA4MjpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuICA4MzpcXHR7XFxuICA4NDpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpkdW1teTtcXG4gIDg1OlxcdFxcdGludCBlcnI7XFxuICA4NjpcXHRcXG4gIDg3OlxcdFxcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcXG4gIDg4OlxcdFxcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXFxuICA4OTpcXHRcXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cXG4gIDkwOlxcdFxcdCAqL1xcbiAgOTE6XFx0XFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcXG4gIDkyOlxcdFxcdGlmICghZHVtbXkpXFxuICA5MzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gIDk0OlxcdFxcbiAgOTU6XFx0XFx0bWVtY3B5KFxcdTAwMjZkdW1teS1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4gIDk2OlxcdFxcdGVyciA9IHBzZC1cXHUwMDNlb3BzLVxcdTAwM2V0eF9rZXlfYWRkKHBzZCwgZHVtbXksIGV4dGFjayk7XFxuICA5NzpcXHRcXHRpZiAoIWVycilcXG4gIDk4OlxcdFxcdFxcdG1lbWNweShwYXMtXFx1MDAzZWRydl9kYXRhLCBkdW1teS1cXHUwMDNlZHJ2X2RhdGEsXFxuICA5OTpcXHRcXHRcXHQgICAgICAgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjKTtcXG4gMTAwOlxcdFxcbiAxMDE6XFx0XFx0a2ZyZWUoZHVtbXkpO1xcbiAxMDI6XFx0XFx0cmV0dXJuIGVycjtcXG4gMTAzOlxcdH1cXG4gMTA0OlxcdFxcbiAxMDU6XFx0dm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxcbiAxMDY6XFx0e1xcbiAxMDc6XFx0XFx0cHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xcbiAxMDg6XFx0fVxcbiAxMDk6XFx0XFxuIDExMDpcXHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuIDExMTpcXHR7XFxuIDExMjpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzcF9hc3NvYywgd29yayk7XFxuIDExMzpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVxcdTAwM2Vwc2Q7XFxuIDExNDpcXHRcXG4gMTE1OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuIDExNjpcXHRcXHRpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpIHtcXG4gMTE3OlxcdFxcdFxcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxcbiAxMTg6XFx0XFx0XFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4gMTE5OlxcdFxcdFxcdGxpc3RfZGVsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0KTtcXG4gMTIwOlxcdFxcdH1cXG4gMTIxOlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2cHNkLVxcdTAwM2Vsb2NrKTtcXG4gMTIyOlxcdFxcdHBzcF9kZXZfcHV0KHBzZCk7XFxuIDEyMzpcXHRcXHRrZnJlZShwYXMpO1xcbiAxMjQ6XFx0fVxcbiAxMjU6XFx0XFxuIDEyNjpcXHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZV9xdWV1ZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXFxuIDEyNzpcXHR7XFxuIDEyODpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBzcF9hc3NvYywgcmN1KTtcXG4gMTI5OlxcdFxcbiAxMzA6XFx0XFx0SU5JVF9XT1JLKFxcdTAwMjZwYXMtXFx1MDAzZXdvcmssIHBzcF9hc3NvY19mcmVlKTtcXG4gMTMxOlxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnBhcy1cXHUwMDNld29yayk7XFxuIDEzMjpcXHR9XFxuIDEzMzpcXHRcXG4gMTM0OlxcdC8qKlxcbiAxMzU6XFx0ICogcHNwX2Fzc29jX3B1dCgpIC0gcmVsZWFzZSBhIHJlZmVyZW5jZSBvbiBhIFBTUCBhc3NvY2lhdGlvblxcbiAxMzY6XFx0ICogQHBhczogYXNzb2NpYXRpb24gdG8gcmVsZWFzZVxcbiAxMzc6XFx0ICovXFxuIDEzODpcXHR2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxcbiAxMzk6XFx0e1xcbiAxNDA6XFx0XFx0aWYgKHBhcyBcXHUwMDI2XFx1MDAyNiByZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNnBhcy1cXHUwMDNlcmVmY250KSlcXG4gMTQxOlxcdFxcdFxcdGNhbGxfcmN1KFxcdTAwMjZwYXMtXFx1MDAzZXJjdSwgcHNwX2Fzc29jX2ZyZWVfcXVldWUpO1xcbiAxNDI6XFx0fVxcbiAxNDM6XFx0XFxuIDE0NDpcXHR2b2lkIHBzcF9za19hc3NvY19mcmVlKHN0cnVjdCBzb2NrICpzaylcXG4gMTQ1OlxcdHtcXG4gMTQ2OlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2stXFx1MDAzZXBzcF9hc3NvYywgMSk7XFxuIDE0NzpcXHRcXG4gMTQ4OlxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihzay1cXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcXG4gMTQ5OlxcdFxcdHBzcF9hc3NvY19wdXQocGFzKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjYuNTgyMjExNjU3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyODYxMTQ3OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYHBzcF9zb2NrLmNgKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgc3BlY2lmaWMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZSBhZ2Fpbi4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gbGluZXMgMjAwIHRocm91Z2ggMjgwLiBUaGF0IHNlY3Rpb24gbGlrZWx5IGNvbnRhaW5zIHRoZSBzb2NrZXQtc3BlY2lmaWMgZnVuY3Rpb25zIG9yIHN0cnVjdHVyZXMgSSdtIGludGVyZXN0ZWQgaW4sIGdpdmVuIHRoZSBjb250ZXh0LiBJJ20gaG9waW5nIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHJlbGV2YW50IGRhdGEgc3RydWN0dXJlcyBvciBmdW5jdGlvbiBjYWxscyByZWxhdGVkIHRvIHRoZSBpc3N1ZSBJJ20gaW52ZXN0aWdhdGluZy4gSSBrbm93IEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgY29kZSwgc28gSSBhbnRpY2lwYXRlIGJlaW5nIGFibGUgdG8gZ3Jhc3AgdGhlIGNvcmUgbG9naWMgdGhlcmUgcXVpY2tseSBhbmQgZGV0ZXJtaW5lIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZS4gSSdtIGV4cGVjdGluZyB0byBlaXRoZXIgcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGhhbmRsaW5nIG9mIHNwZWNpZmljIHNvY2tldCBvcGVyYXRpb25zIG9yIHBlcmhhcHMgZ2V0IGEgaGludCBhYm91dCBob3cgdGhpcyBwYXJ0IG9mIHRoZSBuZXR3b3JrIHN0YWNrIGludGVyYWN0cyB3aXRoIG90aGVyIG1vZHVsZXMuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTA5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjguODY4MzMwMTQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwMjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvcHNwX3NvY2suY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNzA6XFx0XFx0ZXJyID0gMDtcXG4gMTcxOlxcdFxcbiAxNzI6XFx0ZXhpdF91bmxvY2s6XFxuIDE3MzpcXHRcXHRyZWxlYXNlX3NvY2soc2spO1xcbiAxNzQ6XFx0XFxuIDE3NTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAxNzY6XFx0fVxcbiAxNzc6XFx0XFxuIDE3ODpcXHRzdGF0aWMgaW50IHBzcF9hc3NvY19zZXRfdHgoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAxNzk6XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcbiAxODA6XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4gMTgxOlxcdHtcXG4gMTgyOlxcdFxcdGludCBlcnI7XFxuIDE4MzpcXHRcXG4gMTg0OlxcdFxcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcXG4gMTg1OlxcdFxcdFxcdGVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIHBhcywga2V5LCBleHRhY2spO1xcbiAxODY6XFx0XFx0XFx0aWYgKGVycilcXG4gMTg3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDE4ODpcXHRcXHR9XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdG1lbWNweShcXHUwMDI2cGFzLVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbiAxOTE6XFx0XFx0cmV0dXJuIDA7XFxuIDE5MjpcXHR9XFxuIDE5MzpcXHRcXG4gMTk0OlxcdHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4gMTk1OlxcdHtcXG4gMTk2OlxcdFxcdHN0cnVjdCBwc3Bfc2tiX2V4dCAqcHNlO1xcbiAxOTc6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0XFx0c2tiX3JidHJlZV93YWxrKHNrYiwgXFx1MDAyNnRjcF9zayhzayktXFx1MDAzZW91dF9vZl9vcmRlcl9xdWV1ZSkge1xcbiAyMDA6XFx0XFx0XFx0cHNlID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9QU1ApO1xcbiAyMDE6XFx0XFx0XFx0aWYgKCFwc3BfcHNlX21hdGNoZXNfcGFzKHBzZSwgcGFzKSlcXG4gMjAyOlxcdFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuIDIwMzpcXHRcXHR9XFxuIDIwNDpcXHRcXG4gMjA1OlxcdFxcdHNrYl9xdWV1ZV93YWxrKFxcdTAwMjZzay1cXHUwMDNlc2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKSB7XFxuIDIwNjpcXHRcXHRcXHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XFxuIDIwNzpcXHRcXHRcXHRpZiAoIXBzcF9wc2VfbWF0Y2hlc19wYXMocHNlLCBwYXMpKVxcbiAyMDg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gMjA5OlxcdFxcdH1cXG4gMjEwOlxcdFxcdHJldHVybiAwO1xcbiAyMTE6XFx0fVxcbiAyMTI6XFx0XFxuIDIxMzpcXHRzdGF0aWMgaW50XFxuIDIxNDpcXHRwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAyMTU6XFx0XFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDIxNjpcXHR7XFxuIDIxNzpcXHRcXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XFxuIDIxODpcXHRcXHRpbnQgZXJyO1xcbiAyMTk6XFx0XFxuIDIyMDpcXHRcXHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xcbiAyMjE6XFx0XFx0aWYgKGVycikge1xcbiAyMjI6XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxcbiAyMjM6XFx0XFx0XFx0XFx0ICAgICAgIFxcXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXFxcIik7XFxuIDIyNDpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAyMjU6XFx0XFx0fVxcbiAyMjY6XFx0XFxuIDIyNzpcXHRcXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XFxuIDIyODpcXHRcXHRpZiAoZXJyKVxcbiAyMjk6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMjMwOlxcdFxcbiAyMzE6XFx0XFx0V1JJVEVfT05DRShzay1cXHUwMDNlc2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTtcXG4gMjMyOlxcdFxcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XFxuIDIzMzpcXHRcXHRwYXMtXFx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cXHUwMDNlcmN2X254dDtcXG4gMjM0OlxcdFxcbiAyMzU6XFx0XFx0aWNzayA9IGluZXRfY3NrKHNrKTtcXG4gMjM2OlxcdFxcdGljc2stXFx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcXG4gMjM3OlxcdFxcdGljc2stXFx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXFx1MDAzZWljc2tfcG10dV9jb29raWUpO1xcbiAyMzg6XFx0XFxuIDIzOTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAyNDA6XFx0fVxcbiAyNDE6XFx0XFxuIDI0MjpcXHRpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG4gMjQzOlxcdFxcdFxcdFxcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcbiAyNDQ6XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDI0NTpcXHR7XFxuIDI0NjpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XFxuIDI0NzpcXHRcXHRpbnQgZXJyO1xcbiAyNDg6XFx0XFxuIDI0OTpcXHRcXHRsb2NrX3NvY2soc2spO1xcbiAyNTA6XFx0XFxuIDI1MTpcXHRcXHRwYXMgPSBwc3Bfc2tfYXNzb2Moc2spO1xcbiAyNTI6XFx0XFx0aWYgKCFwYXMpIHtcXG4gMjUzOlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXFxcIlNvY2tldCBoYXMgbm8gUngga2V5XFxcIik7XFxuIDI1NDpcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiAyNTU6XFx0XFx0XFx0Z290byBleGl0X3VubG9jaztcXG4gMjU2OlxcdFxcdH1cXG4gMjU3OlxcdFxcdGlmIChwYXMtXFx1MDAzZXBzZCAhPSBwc2QpIHtcXG4gMjU4OlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXFxcIlJ4IGtleSBmcm9tIGRpZmZlcmVudCBkZXZpY2VcXFwiKTtcXG4gMjU5OlxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjI4Ljg2ODQxMjI3M1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDk4OTQxNjUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIFBvdGVudGlhbCBQU1AgRGV2aWNlIERyaXZlciBJc3N1ZXMqKlxuXG5Pa2F5LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoaXMgcHJvYmxlbS4gQmFzZWQgb24gd2hhdCBJJ3ZlIHNlZW4sIGl0IHNlZW1zIGxpa2UgdGhlIGlzc3VlIG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9yIGRlc3RydWN0aW9uIG9mIHRoZSBQU1AgZGV2aWNlIHdpdGhpbiB0aGUga2VybmVsLiBMZXQncyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGBuZXQvcHNwL3BzcF9tYWluLmNgLiBNeSBpbnN0aW5jdCBpcyB0byBleGFtaW5lIHRoZSBhcmVhcyBhcm91bmQgYHBzcF9kZXZfY3JlYXRlYCBhbmQgYHBzcF9kZXZfdW5yZWdpc3RlcmAgZnVuY3Rpb25zLiBUaGVzZSBhcmUgbGlrZWx5IHRoZSBjb3JlIGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiB0aGUgUFNQIGRldmljZSwgc28gYW55IGlzc3VlcyBkdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIG9yIGNsZWFudXAgd291bGQgbWFuaWZlc3QgYXJvdW5kIHRob3NlIGNhbGxzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBmdW5jdGlvbnMgYXJlIGJlaW5nIGNhbGxlZCwgd2hhdCBjaGVja3MgYXJlIGJlaW5nIHBlcmZvcm1lZCwgYW5kIGlmIGFueSBlcnJvcnMgYXJlIGJlaW5nIGhhbmRsZWQgYXBwcm9wcmlhdGVseS4gVGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGJlZ2luIG15IGRlYnVnZ2luZyBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjcxNCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzAuOTY3MzU3MDM0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg0NTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvcHNwX21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NSxcbiAgXCJMaW5lQ291bnRcIjogMTEwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNTU6XFx0ICpcXG4gIDU2OlxcdCAqIFJldHVybjogcG9pbnRlciB0byBhbGxvY2F0ZWQgUFNQIGRldmljZSwgb3IgRVJSX1BUUi5cXG4gIDU3OlxcdCAqL1xcbiAgNTg6XFx0c3RydWN0IHBzcF9kZXYgKlxcbiAgNTk6XFx0cHNwX2Rldl9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gIDYwOlxcdFxcdCAgICAgICBzdHJ1Y3QgcHNwX2Rldl9vcHMgKnBzZF9vcHMsIHN0cnVjdCBwc3BfZGV2X2NhcHMgKnBzZF9jYXBzLFxcbiAgNjE6XFx0XFx0ICAgICAgIHZvaWQgKnByaXZfcHRyKVxcbiAgNjI6XFx0e1xcbiAgNjM6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBzZDtcXG4gIDY0OlxcdFxcdHN0YXRpYyB1MzIgbGFzdF9pZDtcXG4gIDY1OlxcdFxcdGludCBlcnI7XFxuICA2NjpcXHRcXG4gIDY3OlxcdFxcdGlmIChXQVJOX09OKCFwc2RfY2Fwcy1cXHUwMDNldmVyc2lvbnMgfHxcXG4gIDY4OlxcdFxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNlc2V0X2NvbmZpZyB8fFxcbiAgNjk6XFx0XFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VrZXlfcm90YXRlIHx8XFxuICA3MDpcXHRcXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXJ4X3NwaV9hbGxvYyB8fFxcbiAgNzE6XFx0XFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VnZXRfc3RhdHMgfHxcXG4gIDcyOlxcdFxcdFxcdCAgICAoIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9kZWwpIHx8XFxuICA3MzpcXHRcXHRcXHQgICAgKHBzZF9jYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjIFxcdTAwMjZcXHUwMDI2ICFwc2Rfb3BzLVxcdTAwM2V0eF9rZXlfYWRkKSkpXFxuICA3NDpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gIDc1OlxcdFxcbiAgNzY6XFx0XFx0cHNkID0ga3phbGxvY19vYmooKnBzZCk7XFxuICA3NzpcXHRcXHRpZiAoIXBzZClcXG4gIDc4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiAgNzk6XFx0XFxuICA4MDpcXHRcXHRwc2QtXFx1MDAzZW1haW5fbmV0ZGV2ID0gbmV0ZGV2O1xcbiAgODE6XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnBzZC1cXHUwMDNlYXNzb2NfZGV2X2xpc3QpO1xcbiAgODI6XFx0XFx0cHNkLVxcdTAwM2VvcHMgPSBwc2Rfb3BzO1xcbiAgODM6XFx0XFx0cHNkLVxcdTAwM2VjYXBzID0gcHNkX2NhcHM7XFxuICA4NDpcXHRcXHRwc2QtXFx1MDAzZWRydl9wcml2ID0gcHJpdl9wdHI7XFxuICA4NTpcXHRcXG4gIDg2OlxcdFxcdG11dGV4X2luaXQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA4NzpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2cHNkLVxcdTAwM2VhY3RpdmVfYXNzb2NzKTtcXG4gIDg4OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gIDg5OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZwc2QtXFx1MDAzZXN0YWxlX2Fzc29jcyk7XFxuICA5MDpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNnBzZC1cXHUwMDNlcmVmY250LCAxKTtcXG4gIDkxOlxcdFxcbiAgOTI6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNwX2RldnNfbG9jayk7XFxuICA5MzpcXHRcXHRlcnIgPSB4YV9hbGxvY19jeWNsaWMoXFx1MDAyNnBzcF9kZXZzLCBcXHUwMDI2cHNkLVxcdTAwM2VpZCwgcHNkLCB4YV9saW1pdF8xNmIsXFxuICA5NDpcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2bGFzdF9pZCwgR0ZQX0tFUk5FTCk7XFxuICA5NTpcXHRcXHRpZiAoZXJyKSB7XFxuICA5NjpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAgOTc6XFx0XFx0XFx0a2ZyZWUocHNkKTtcXG4gIDk4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuICA5OTpcXHRcXHR9XFxuIDEwMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMDE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc3BfZGV2c19sb2NrKTtcXG4gMTAyOlxcdFxcbiAxMDM6XFx0XFx0Lyogbm90aWZ5IGJlZm9yZSBuZXRkZXYgYXNzaWdubWVudFxcbiAxMDQ6XFx0XFx0ICogVGhlcmUncyBubyBzdHJvbmcgcmVhc29uIGZvciBpdCwgYnV0IHRoaW5raW5nIGlzIHRvIGF2b2lkIGNyZWF0aW5nXFxuIDEwNTpcXHRcXHQgKiBpbXBsaWNpdCBleHBlY3RhdGlvbnMgYWJvdXQgdGhlIFBTUCBkZXYgXFx1MDAzY1xcdTAwM2UgbmV0ZGV2IHJlbGF0aW9uc2hpcC5cXG4gMTA2OlxcdFxcdCAqL1xcbiAxMDc6XFx0XFx0cHNwX25sX25vdGlmeV9kZXYocHNkLCBQU1BfQ01EX0RFVl9BRERfTlRGKTtcXG4gMTA4OlxcdFxcbiAxMDk6XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKG5ldGRldi1cXHUwMDNlcHNwX2RldiwgcHNkKTtcXG4gMTEwOlxcdFxcbiAxMTE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMTI6XFx0XFxuIDExMzpcXHRcXHRyZXR1cm4gcHNkO1xcbiAxMTQ6XFx0fVxcbiAxMTU6XFx0RVhQT1JUX1NZTUJPTChwc3BfZGV2X2NyZWF0ZSk7XFxuIDExNjpcXHRcXG4gMTE3OlxcdHZvaWQgcHNwX2Rldl9mcmVlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuIDExODpcXHR7XFxuIDExOTpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc3BfZGV2c19sb2NrKTtcXG4gMTIwOlxcdFxcdHhhX2VyYXNlKFxcdTAwMjZwc3BfZGV2cywgcHNkLVxcdTAwM2VpZCk7XFxuIDEyMTpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAxMjI6XFx0XFxuIDEyMzpcXHRcXHRtdXRleF9kZXN0cm95KFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMjQ6XFx0XFx0a2ZyZWVfcmN1KHBzZCwgcmN1KTtcXG4gMTI1OlxcdH1cXG4gMTI2OlxcdFxcbiAxMjc6XFx0LyoqXFxuIDEyODpcXHQgKiBwc3BfZGV2X3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgUFNQIGRldmljZVxcbiAxMjk6XFx0ICogQHBzZDpcXHRQU1AgZGV2aWNlIHN0cnVjdHVyZVxcbiAxMzA6XFx0ICovXFxuIDEzMTpcXHR2b2lkIHBzcF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgcHNwX2RldiAqcHNkKVxcbiAxMzI6XFx0e1xcbiAxMzM6XFx0XFx0c3RydWN0IHBzcF9hc3NvY19kZXYgKmVudHJ5LCAqZW50cnlfdG1wO1xcbiAxMzQ6XFx0XFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqbmV4dDtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNwX2RldnNfbG9jayk7XFxuIDEzNzpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMzg6XFx0XFxuIDEzOTpcXHRcXHRwc3Bfbmxfbm90aWZ5X2Rldihwc2QsIFBTUF9DTURfREVWX0RFTF9OVEYpO1xcbiAxNDA6XFx0XFxuIDE0MTpcXHRcXHQvKiBXYWl0IHVudGlsIHBzcF9kZXZfZnJlZSgpIHRvIGNhbGwgeGFfZXJhc2UoKSB0byBwcmV2ZW50IGFcXG4gMTQyOlxcdFxcdCAqIGRpZmZlcmVudCBwc2QgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgeGFycmF5IHdpdGggdGhpcyBpZCwgd2hpbGVcXG4gMTQzOlxcdFxcdCAqIHRoZXJlIGFyZSBzdGlsbCByZWZlcmVuY2VzIHRvIHRoaXMgcHNkIGJlaW5nIGhlbGQuXFxuIDE0NDpcXHRcXHQgKi9cXG4gMTQ1OlxcdFxcdHhhX3N0b3JlKFxcdTAwMjZwc3BfZGV2cywgcHNkLVxcdTAwM2VpZCwgTlVMTCwgR0ZQX0tFUk5FTCk7XFxuIDE0NjpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAxNDc6XFx0XFxuIDE0ODpcXHRcXHRsaXN0X3NwbGljZV9pbml0KFxcdTAwMjZwc2QtXFx1MDAzZWFjdGl2ZV9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gMTQ5OlxcdFxcdGxpc3Rfc3BsaWNlX2luaXQoXFx1MDAyNnBzZC1cXHUwMDNlcHJldl9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXN0YWxlX2Fzc29jcyk7XFxuIDE1MDpcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcXHUwMDI2cHNkLVxcdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XFxuIDE1MTpcXHRcXHRcXHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcXG4gMTUyOlxcdFxcdFxcdFxcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuIDE1MzpcXHRcXHRcXHRsaXN0X2RlbChcXHUwMDI2cGFzLVxcdTAwM2Vhc3NvY3NfbGlzdCk7XFxuIDE1NDpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjMwLjk2NzQ0Mjg4NVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjY0MzQ0Mjg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTmV0ZGV2c2ltIFBTUCBEcml2ZXIqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZSBOZXRkZXZzaW0ncyBQU1AgKFBhY2tldC1TY2hlZHVsaW5nIFByb2Nlc3NvcikgZHJpdmVyIG9wZXJhdGVzLiBJJ20gZ29pbmcgdG8ganVtcCBzdHJhaWdodCBpbnRvIHRoZSBjb2RlIGFuZCBzdGFydCB3aXRoIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLiBUaGF0J3MgdGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEZyb20gdGhlcmUsIEkgY2FuIGRlbHZlIGludG8gdGhlIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1NzMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjMyLjYzMTc5MDA4OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjUxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0XFxuICAgMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaXAuaFxcdTAwM2VcXG4gICA0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9za2J1ZmYuaFxcdTAwM2VcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvaXA2X2NoZWNrc3VtLmhcXHUwMDNlXFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L3BzcC5oXFx1MDAzZVxcbiAgIDc6XFx0I2luY2x1ZGUgXFx1MDAzY25ldC9zb2NrLmhcXHUwMDNlXFxuICAgODpcXHRcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJuZXRkZXZzaW0uaFxcXCJcXG4gIDEwOlxcdFxcbiAgMTE6XFx0dm9pZCBuc2ltX3BzcF9oYW5kbGVfZXh0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza2JfZXh0ICpwc3BfZXh0KVxcbiAgMTI6XFx0e1xcbiAgMTM6XFx0XFx0aWYgKHBzcF9leHQpXFxuICAxNDpcXHRcXHRcXHRfX3NrYl9leHRfc2V0KHNrYiwgU0tCX0VYVF9QU1AsIHBzcF9leHQpO1xcbiAgMTU6XFx0fVxcbiAgMTY6XFx0XFxuICAxNzpcXHRlbnVtIHNrYl9kcm9wX3JlYXNvblxcbiAgMTg6XFx0bnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXFxuICAxOTpcXHRcXHQgICAgc3RydWN0IG5ldGRldnNpbSAqcGVlcl9ucywgc3RydWN0IHNrYl9leHQgKipwc3BfZXh0KVxcbiAgMjA6XFx0e1xcbiAgMjE6XFx0XFx0ZW51bSBza2JfZHJvcF9yZWFzb24gcmMgPSAwO1xcbiAgMjI6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBlZXJfcHNkO1xcbiAgMjM6XFx0XFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xcbiAgMjQ6XFx0XFx0c3RydWN0IG5ldCAqbmV0O1xcbiAgMjU6XFx0XFx0aW50IHBzcF9sZW47XFxuICAyNjpcXHRcXG4gIDI3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gIDI4OlxcdFxcdHBhcyA9IHBzcF9za2JfZ2V0X2Fzc29jX3JjdShza2IpO1xcbiAgMjk6XFx0XFx0aWYgKCFwYXMpIHtcXG4gIDMwOlxcdFxcdFxcdHJjID0gU0tCX05PVF9EUk9QUEVEX1lFVDtcXG4gIDMxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gIDMyOlxcdFxcdH1cXG4gIDMzOlxcdFxcbiAgMzQ6XFx0XFx0aWYgKCFza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpIHtcXG4gIDM1OlxcdFxcdFxcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XFxuICAzNjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuICAzNzpcXHRcXHR9XFxuICAzODpcXHRcXG4gIDM5OlxcdFxcdG5ldCA9IHNvY2tfbmV0KHNrYi1cXHUwMDNlc2spO1xcbiAgNDA6XFx0XFx0aWYgKCFwc3BfZGV2X2VuY2Fwc3VsYXRlKG5ldCwgc2tiLCBwYXMtXFx1MDAzZXR4LnNwaSwgcGFzLVxcdTAwM2V2ZXJzaW9uLCAwKSkge1xcbiAgNDE6XFx0XFx0XFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcXG4gIDQyOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gIDQzOlxcdFxcdH1cXG4gIDQ0OlxcdFxcbiAgNDU6XFx0XFx0cHNwX2xlbiA9IHNrYi1cXHUwMDNlbGVuIC0gc2tiX2lubmVyX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTtcXG4gIDQ2OlxcdFxcdGF0b21pYzY0X2luYyhcXHUwMDI2bnMtXFx1MDAzZXBzcC50eF9wYWNrZXRzKTtcXG4gIDQ3OlxcdFxcdGF0b21pYzY0X2FkZChwc3BfbGVuLCBcXHUwMDI2bnMtXFx1MDAzZXBzcC50eF9ieXRlcyk7XFxuICA0ODpcXHRcXG4gIDQ5OlxcdFxcdC8qIE5vdyBwcmV0ZW5kIHdlIGp1c3QgcmVjZWl2ZWQgdGhpcyBmcmFtZSAqL1xcbiAgNTA6XFx0XFx0cGVlcl9wc2QgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9ucy1cXHUwMDNlcHNwLmRldik7XFxuICA1MTpcXHRcXHRpZiAocGVlcl9wc2QgXFx1MDAyNlxcdTAwMjYgcGVlcl9wc2QtXFx1MDAzZWNvbmZpZy52ZXJzaW9ucyBcXHUwMDI2ICgxIFxcdTAwM2NcXHUwMDNjIHBhcy1cXHUwMDNldmVyc2lvbikpIHtcXG4gIDUyOlxcdFxcdFxcdGJvb2wgc3RyaXBfaWN2ID0gZmFsc2U7XFxuICA1MzpcXHRcXHRcXHR1OCBnZW5lcmF0aW9uO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHRcXHQvKiBXZSBjaGVhdCBhIGJpdCBhbmQgcHV0IHRoZSBnZW5lcmF0aW9uIGluIHRoZSBrZXkuXFxuICA1NjpcXHRcXHRcXHQgKiBJbiByZWFsIGxpZmUgaWYgZ2VuZXJhdGlvbiB3YXMgdG9vIG9sZCwgdGhlbiBkZWNyeXB0aW9uIHdvdWxkXFxuICA1NzpcXHRcXHRcXHQgKiBmYWlsLiBIZXJlLCB3ZSBqdXN0IG1ha2UgaXQgc28gYSBiYWQga2V5IGNhdXNlcyBhIGJhZFxcbiAgNTg6XFx0XFx0XFx0ICogZ2VuZXJhdGlvbiB0b28sIGFuZCBwc3Bfc2tfcnhfcG9saWN5X2NoZWNrKCkgd2lsbCBmYWlsLlxcbiAgNTk6XFx0XFx0XFx0ICovXFxuICA2MDpcXHRcXHRcXHRnZW5lcmF0aW9uID0gcGFzLVxcdTAwM2V0eC5rZXlbMF07XFxuICA2MTpcXHRcXG4gIDYyOlxcdFxcdFxcdHNrYl9leHRfcmVzZXQoc2tiKTtcXG4gIDYzOlxcdFxcdFxcdHNrYi1cXHUwMDNlbWFjX2xlbiA9IEVUSF9ITEVOO1xcbiAgNjQ6XFx0XFx0XFx0aWYgKHBzcF9kZXZfcmN2KHNrYiwgcGVlcl9wc2QtXFx1MDAzZWlkLCBnZW5lcmF0aW9uLCBzdHJpcF9pY3YpKSB7XFxuICA2NTpcXHRcXHRcXHRcXHRyYyA9IFNLQl9EUk9QX1JFQVNPTl9QU1BfT1VUUFVUO1xcbiAgNjY6XFx0XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiAgNjc6XFx0XFx0XFx0fVxcbiAgNjg6XFx0XFxuICA2OTpcXHRcXHRcXHQqcHNwX2V4dCA9IHNrYi1cXHUwMDNlZXh0ZW5zaW9ucztcXG4gIDcwOlxcdFxcdFxcdHJlZmNvdW50X2luYyhcXHUwMDI2KCpwc3BfZXh0KS1cXHUwMDNlcmVmY250KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzIuNjMxODY4MzI5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNzUxODA4MTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYHBzcC5jYCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGJlaGF2aW9yIG9mIGBfX25zaW1fcHNwX3VuaW5pdGAuIEkgaW1tZWRpYXRlbHkga25vdyB0aGF0IGl0J3MgbG9jYXRlZCB3aXRoaW4gYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AsIHNvIHRoYXQncyB3aGVyZSBJJ2xsIGJlIHN0YXJ0aW5nLiBJJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgY3JpdGljYWwgZm9yIHVuaW5pdGlhbGl6aW5nIG9yIGNsZWFuaW5nIHVwIGFmdGVyIGEgc2ltdWxhdGVkIG5ldHdvcmsgZGV2aWNlLCBsaWtlbHkgcGVydGFpbmluZyB0byB0aGUgUGFja2V0IFN3aXRjaGluZyBQYXRoIChQU1ApIGNvbXBvbmVudCwgc2luY2UgdGhhdCBzZWVtcyB0byBiZSB0aGUgY29udGV4dC4gSSdtIGhvcGluZyBJIGNhbiBnbGVhbiBzb21lIGluc2lnaHRzIGZyb20gaG93IGl0J3MgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0J3MgY2FsbGVkLCBzcGVjaWZpY2FsbHkgYWJvdXQgcmVzb3VyY2UgbWFuYWdlbWVudCBvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLiBMZXQncyBzZWUgd2hhdCdzIGFjdHVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTgxMiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzQuODA3MDUxNTE1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY5MjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxODA6XFx0fTtcXG4gMTgxOlxcdFxcbiAxODI6XFx0c3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcXG4gMTgzOlxcdFxcdC52ZXJzaW9ucyA9IDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzEyOCB8XFxuIDE4NDpcXHRcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HTUFDXzEyOCB8XFxuIDE4NTpcXHRcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcXG4gMTg2OlxcdFxcdFxcdCAgICAxIFxcdTAwM2NcXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LFxcbiAxODc6XFx0fTtcXG4gMTg4OlxcdFxcbiAxODk6XFx0c3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXFxuIDE5MDpcXHR7XFxuIDE5MTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xcbiAxOTI6XFx0XFxuIDE5MzpcXHRcXHRwc2QgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5zLVxcdTAwM2Vwc3AuZGV2LFxcbiAxOTQ6XFx0XFx0XFx0XFx0XFx0XFx0dGVhcmRvd24gfHxcXG4gMTk1OlxcdFxcdFxcdFxcdFxcdFxcdGxvY2tkZXBfaXNfaGVsZChcXHUwMDI2bnMtXFx1MDAzZXBzcC5yZXJlZ19sb2NrKSk7XFxuIDE5NjpcXHRcXHRpZiAocHNkKSB7XFxuIDE5NzpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIobnMtXFx1MDAzZXBzcC5kZXYsIE5VTEwpO1xcbiAxOTg6XFx0XFx0XFx0c3luY2hyb25pemVfcmN1KCk7XFxuIDE5OTpcXHRcXHRcXHRwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTtcXG4gMjAwOlxcdFxcdH1cXG4gMjAxOlxcdH1cXG4gMjAyOlxcdFxcbiAyMDM6XFx0dm9pZCBuc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpXFxuIDIwNDpcXHR7XFxuIDIwNTpcXHRcXHRkZWJ1Z2ZzX3JlbW92ZShucy1cXHUwMDNlcHNwLnJlcmVnKTtcXG4gMjA2OlxcdFxcdG11dGV4X2Rlc3Ryb3koXFx1MDAyNm5zLVxcdTAwM2Vwc3AucmVyZWdfbG9jayk7XFxuIDIwNzpcXHRcXHRfX25zaW1fcHNwX3VuaW5pdChucywgdHJ1ZSk7XFxuIDIwODpcXHR9XFxuIDIwOTpcXHRcXG4gMjEwOlxcdHN0YXRpYyBzc2l6ZV90XFxuIDIxMTpcXHRuc2ltX3BzcF9yZXJlZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCxcXG4gMjEyOlxcdFxcdFxcdCAgICAgbG9mZl90ICpwcG9zKVxcbiAyMTM6XFx0e1xcbiAyMTQ6XFx0XFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDIxNTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xcbiAyMTY6XFx0XFx0c3NpemVfdCByZXQ7XFxuIDIxNzpcXHRcXG4gMjE4OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5zLVxcdTAwM2Vwc3AucmVyZWdfbG9jayk7XFxuIDIxOTpcXHRcXHRfX25zaW1fcHNwX3VuaW5pdChucywgZmFsc2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjozNC44MDcxMjIyNDVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjAyMzEyNDMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBQU1AgYW5kIE5ldGRldnNpbSBJbnRlZ3JhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gRmlyc3QsIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgY29yZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cy4gQ2xlYXJseSwgYENPTkZJR19JTkVUX1BTUGAgaXMgZXNzZW50aWFsIHNpbmNlIHRoaXMgcGF0Y2ggdGFyZ2V0cyB0aGUgYG5ldC9wc3AvYCBkaXJlY3RvcnkgYW5kIGVuYWJsZXMgUFNQIHN1cHBvcnQgaW4gdGhlIGBuZXRkZXZzaW1gIGRyaXZlci4gYENPTkZJR19ORVRERVZTSU1gIGlzIGFsc28gY3JpdGljYWwsIGl0J3MgdGhlIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSBkcml2ZXIgaXRzZWxmLiBJdCdzIG9idmlvdXMgdGhhdCBgSU5FVF9QU1BgIGhpbmdlcyBvbiBgSU5FVGAgYW5kIGBORVRERVZTSU1gIGRlcGVuZHMgb24gYE5FVF9DT1JFYCwgYFNZU0ZTYCBhbmQgdGhlIGxpa2UsIGFzIGV4cGVjdGVkLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IHRoZSBjcml0aWNhbCBzeW1ib2xzLiBNeSBhdHRlbnRpb24gZ29lcyB0bzogYHBzcF9kZXZfY3JlYXRlYCwgYHBzcF9kZXZfdW5yZWdpc3RlcmAsIGBwc3BfZGV2X3R4X2tleV9hZGRgLCBgcHNwX2Rldl90eF9rZXlfZGVsYCwgYHBzcF9hc3NvY19mcmVlYCwgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAsIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYW5kIGBuc2ltX2RvX3BzcGAuIEFyZSB0aGVzZSBnZW51aW5lbHkgKnNwZWNpZmljKiB0byBQU1AgbG9naWMgd2l0aGluIG5ldGRldnNpbSwgb3IgYXJlIHRoZXkgbW9yZSBnZW5lcmljPyBZZXMsIGNvbmZpcm1lZC4gVGhleSBhcmUgYWxsIGRpcmVjdGx5IHRpZWQgdG8gUFNQIGFuZCB0aGUgbmV0ZGV2c2ltIGltcGxlbWVudGF0aW9uLlxuXG5Ob3csIGxldCdzIGNyZWF0ZSBhIGNsZWFyIHN1bW1hcnkgb2YgdGhlIGNoYW5nZXM6XG5cbiogICAqKlJlYWNoYWJpbGl0eToqKiBUaGVzZSBtb2RpZmljYXRpb25zIGltcGFjdCBib3RoIHRoZSBQU1Agc3Vic3lzdGVtIGFuZCB0aGUgc2ltdWxhdGVkIG5ldGRldnNpbSBkcml2ZXIuIEluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBmdWxseSBhY2Nlc3NpYmxlIHRocm91Z2ggbmV0bGluayBjb21tYW5kcywgc29ja2V0IG9wZXJhdGlvbnMsIGFuZCBuZXRkZXZzaW0gdmlydHVhbCBkZXZpY2VzLlxuKiAgICoqQ2hhbmdlczoqKiBUaGlzIHBhdGNoIG1ha2VzIHNvbWUgVHgga2V5IG9mZmxvYWRpbmcgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBkZXZpY2VzIGxhY2tpbmcgVHggU0FEQiwgYWRkcmVzc2VzIGRyaXZlciByZWdpc3RyYXRpb24gdmFsaWRhdGlvbiBpbiBgcHNwX2Rldl9jcmVhdGVgLCByZWZhY3RvcnMgYXNzb2NpYXRpb24gY2xlYW51cCBpbiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBhbmQgYHBzcF9hc3NvY19mcmVlYCwgYW5kIHVwZGF0ZXMga2V5IGFzc2lnbm1lbnQgaW4gYHBzcF9zb2NrX2Fzc29jX3NldF90eGAuXG4qICAgKipDb25maWdzOioqIFdlIGhhdmUgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAuXG4qICAgKipGb2N1cyBTeW1ib2xzOioqIFRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgYXJlIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgLCBgcHNwX3NvY2tfc2V0X3R4X2tleWAsIGBwc3BfZGV2X3R4X2tleV9hZGRgLCBgcHNwX2Rldl90eF9rZXlfZGVsYCwgYHBzcF9hc3NvY19mcmVlYCwgYHBzcF9kZXZfY3JlYXRlYCwgYHBzcF9kZXZfdW5yZWdpc3RlcmAsIGFuZCBgbnNpbV9kb19wc3BgLlxuXG5SaWdodCwgdGhhdCBjb3ZlcnMgdGhlIGVzc2VudGlhbHMuIFRpbWUgZm9yIHRoZSB0b29sIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzAwLCJPdXRwdXRUb2tlbnMiOjIxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjQwLjgzMDI0ODUxN1oiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4ODExMDI0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJTkVUX1BTUFwiLFxuICAgIFwiTkVUREVWU0lNXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCIsXG4gICAgXCJwc3Bfc29ja19zZXRfdHhfa2V5XCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9hZGRcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2RlbFwiLFxuICAgIFwicHNwX2Fzc29jX2ZyZWVcIixcbiAgICBcInBzcF9kZXZfY3JlYXRlXCIsXG4gICAgXCJwc3BfZGV2X3VucmVnaXN0ZXJcIixcbiAgICBcIm5zaW1fZG9fcHNwXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSU5FVF9QU1BcIixcbiAgICBcIk5FVERFVlNJTVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInBzcF9zb2NrX2Fzc29jX3NldF90eFwiLFxuICAgIFwicHNwX3NvY2tfc2V0X3R4X2tleVwiLFxuICAgIFwicHNwX2Rldl90eF9rZXlfYWRkXCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9kZWxcIixcbiAgICBcInBzcF9hc3NvY19mcmVlXCIsXG4gICAgXCJwc3BfZGV2X2NyZWF0ZVwiLFxuICAgIFwicHNwX2Rldl91bnJlZ2lzdGVyXCIsXG4gICAgXCJuc2ltX2RvX3BzcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbmV0d29ya2luZyBQU1AgKFBTUCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtIGxvZ2ljIGFuZCBuZXRkZXZzaW0gZGV2aWNlIGRyaXZlciBjb2RlLiBJdCBtYWtlcyBUeCBrZXkgb2ZmbG9hZCBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIGRldmljZXMgd2l0aG91dCBTQURCLCByZWZhY3RvcnMga2V5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGluIHBzcF9zb2NrLmMsIHVwZGF0ZXMgZGV2aWNlIHJlZ2lzdHJhdGlvbiBjaGVja3MgaW4gcHNwX21haW4uYywgYW5kIHJlbW92ZXMgb2Jzb2xldGUgYXNzb2MgdHJhY2tpbmcgaW4gbmV0ZGV2c2ltLiBUaGVzZSBjb2RlIHBhdGhzIGFyZSBmdWxseSByZWFjaGFibGUgdmlhIG5ldGxpbmsgY29tbWFuZHMgYW5kIG5ldGRldnNpbSBpbnRlcmZhY2VzIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0MC45MDkwNjY2MTFaIiwiU2VxIjoyNywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzM2OTg1ODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6NDAuOTA5NTY4NjgxWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTYzMzY0NzkzMDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbisrKyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcbiBcdFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XG4gXHRcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xuIFx0XHR1MzIgc3BpO1xuLVx0XHR1MzIgYXNzb2NfY250O1xuIFx0fSBwc3A7XG4gXG4gXHRzdHJ1Y3QgbnNpbV9idXNfZGV2ICpuc2ltX2J1c19kZXY7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5pbmRleCA2YjM1MzJiNWUzNjBkLi5iNzQ1MmM0OWI1ODFkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcbkBAIC0yMyw3ICsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLFxuIFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0c3RydWN0IG5ldCAqbmV0O1xuIFx0aW50IHBzcF9sZW47XG4tXHR2b2lkICoqcHRyO1xuIFxuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0cGFzID0gcHNwX3NrYl9nZXRfYXNzb2NfcmN1KHNrYik7XG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IG5zaW1fYXNzb2NfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi1cdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cbi1cdCpwdHIgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHRucy1cdTAwM2Vwc3AuYXNzb2NfY250Kys7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSArMTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG5zaW1fYXNzb2NfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdCpwdHIgPSBOVUxMO1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudC0tO1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBuc2ltX2dldF9zdGF0cyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Rldl9zdGF0cyAqc3RhdHMpXG4ge1xuIFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcbiBzdGF0aWMgc3RydWN0IHBzcF9kZXZfb3BzIG5zaW1fcHNwX29wcyA9IHtcbiBcdC5zZXRfY29uZmlnXHQ9IG5zaW1fcHNwX3NldF9jb25maWcsXG4gXHQucnhfc3BpX2FsbG9jXHQ9IG5zaW1fcnhfc3BpX2FsbG9jLFxuLVx0LnR4X2tleV9hZGRcdD0gbnNpbV9hc3NvY19hZGQsXG4tXHQudHhfa2V5X2RlbFx0PSBuc2ltX2Fzc29jX2RlbCxcbiBcdC5rZXlfcm90YXRlXHQ9IG5zaW1fa2V5X3JvdGF0ZSxcbiBcdC5nZXRfc3RhdHNcdD0gbnNpbV9nZXRfc3RhdHMsXG4gfTtcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxuIFx0XHRzeW5jaHJvbml6ZV9yY3UoKTtcbiBcdFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XG4gXHR9XG4tXHRXQVJOX09OKG5zLVx1MDAzZXBzcC5hc3NvY19jbnQpO1xuIH1cbiBcbiB2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxuQEAgLTI0LDExICsyNCw2IEBAIGludCBwc3BfZGV2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZGV2X2lkLCB1OCBnZW5lcmF0aW9uLCBib29sIHN0cmlwX2ljdik7XG4gLyogS2VybmVsLWZhY2luZyBBUEkgKi9cbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0cmV0dXJuIHBhcy1cdTAwM2VkcnZfZGF0YTtcbi19XG4tXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuIHZvaWQgcHNwX3NrX2Fzc29jX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5pbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5AQCAtMjE5LDEyICsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbitcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXG4rXHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHQvKipcbiBcdCAqIEB0eF9rZXlfZGVsOiByZW1vdmUgYSBUeCBrZXkgZnJvbSB0aGUgZGV2aWNlXG4gXHQgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbitcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3AuaCBiL25ldC9wc3AvcHNwLmhcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcC5oXG4rKysgYi9uZXQvcHNwL3BzcC5oXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIFx0cmV0dXJuICEhcHNkLVx1MDAzZW9wcztcbiB9XG4gXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbitcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBhcy1cdTAwM2Vwc2QtXHUwMDNlbG9jayk7XG4rXHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbit9XG4rXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3BfbWFpbi5jIGIvbmV0L3BzcC9wc3BfbWFpbi5jXG5pbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXG4rKysgYi9uZXQvcHNwL3BzcF9tYWluLmNcbkBAIC02OCw5ICs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4rXHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbitcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4rXHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICsxNDcsMTEgQEAgdm9pZCBwc3BfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiBcbiBcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXMsIG5leHQsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XG4rXHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuK1x0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4rXHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4rKysgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4gfVxuIFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiBcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0cmV0dXJuIHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIHBhcywgZXh0YWNrKTtcbitcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuK1x0aW50IGVycjtcbitcbitcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcbitcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXG4rXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbitcdCAqL1xuK1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbitcdGlmICghZHVtbXkpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4rXHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbitcdGlmICghZXJyKVxuK1x0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbitcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuK1xuK1x0a2ZyZWUoZHVtbXkpO1xuK1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gdm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIHtcbi1cdGlmIChwYXMtXHUwMDNldHguc3BpKVxuLVx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuLVx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbitcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICsxMTMsMTEgQEAgc3RhdGljIHZvaWQgcHNwX2Fzc29jX2ZyZWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gXG4gXHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbi1cdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuK1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbitcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuK1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICsxNzUsMjIgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4rXHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuK1x0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0aW50IGVycjtcbitcbitcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcbitcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdG1lbWNweShcdTAwMjZwYXMtXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuIFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XG5AQCAtMTc0LDEyICsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnRcbitwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuK1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxuK1x0XHRcdCAgICAgICBcIlNvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcIik7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuK1x0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbitcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbitcbitcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4rXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbitcdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLFxuIFx0XHRcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbi1cdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbi1cdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKmR1bW15O1xuK1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICsyNzEsNyBAQCBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiBcdFx0Z290byBleGl0X3VubG9jaztcbiBcdH1cbiBcbi1cdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4tXHRpZiAoZXJyKSB7XG4tXHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXCIpO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxuLVx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cbi1cdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxuLVx0ICovXG4tXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xuLVx0aWYgKCFkdW1teSkge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXhpdF9mcmVlX2R1bW15O1xuLVxuLVx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuLVx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuLVxuLVx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuLVx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbi1cdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbi1cbi1cdGljc2sgPSBpbmV0X2Nzayhzayk7XG4tXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4rXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xuIGV4aXRfdW5sb2NrOlxuIFx0cmVsZWFzZV9zb2NrKHNrKTtcbiBcdHJldHVybiBlcnI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0MC45MDk1NzIxMDFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjU1MjgwNzI2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBzZWUgaWYgaXQgaW50cm9kdWNlcyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgS01TQU4gZnV6emluZy4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQncyBhIHJlZmFjdG9yaW5nIGV4ZXJjaXNlIHdpdGhpbiB0aGUgUFNQIChQb2xpY3ktQmFzZWQgU2VjdXJpdHkgUHJvdG9jb2wpIHN1YnN5c3RlbSwgcHJpbWFyaWx5IGZvY3VzZWQgb24gc2ltcGxpZnlpbmcga2V5IG1hbmFnZW1lbnQgYW5kIGFzc29jaWF0aW9uIGhhbmRsaW5nIHdpdGhpbiB0aGUgYG5ldGRldnNpbWAgZHJpdmVyLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF04oCZcyBiZWVuIGNoYW5nZWQuIFRoZSBwYXRjaCByZW1vdmVzIGBhc3NvY19jbnRgIGFuZCB0aGUgYHR4X2tleV9hZGRgL2B0eF9rZXlfZGVsYCBmdW5jdGlvbnMgZnJvbSB0aGUgYG5ldGRldnNpbWAgUFNQIGltcGxlbWVudGF0aW9uLiBJdCBzZWVtcyBsaWtlIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIgaXMgYmVpbmcgYWRhcHRlZCB0byBhIG1vcmUgZ2VuZXJpYywgcG9zc2libHkgb3B0aW9uYWwsIGFwcHJvYWNoIHRvIGtleSBoYW5kbGluZy4gTm90YWJseSwgYC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKilgIGlzIHJlbW92ZWQsIHN1Z2dlc3RpbmcgYSBzaGlmdCBhd2F5IGZyb20gYSBkcml2ZXItc3BlY2lmaWMgYXNzb2NpYXRpb24gZGF0YSBzaXplLiBBbHNvLCB0aGUgY2hlY2sgYHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOyBpZiAoKnB0ciAhPSBucykgLi4uYCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYG5zaW1fZG9fcHNwYCwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIHJlbW92YWwgb2YgZHJpdmVyLXNwZWNpZmljIGRhdGEgbWFuYWdlbWVudC5cblxuVGhlIGhlYWRlciBmaWxlIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB0aGUgcmVtb3ZhbCBvZiBgcHNwX2Fzc29jX2Rydl9kYXRhKClgIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBhbGxvd2luZyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMLCByZWluZm9yY2UgdGhpcyBub3Rpb24gb2Ygb3B0aW9uYWwga2V5IG1hbmFnZW1lbnQuIE5ldyBmdW5jdGlvbnMgbGlrZSBgcHNwX2Rldl9oYXNfc2FkYigpYCBhbmQgYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKClgIGFyZSBpbnRyb2R1Y2VkLCBwcm92aWRpbmcgY29uZGl0aW9uYWwgY2hlY2tzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTQSAoU2VjdXJpdHkgQXNzb2NpYXRpb24pIERhdGFiYXNlIGZ1bmN0aW9uYWxpdHkgYW5kIGlmIGEgVFgga2V5IG5lZWRzIHRvIGJlIGRlbGV0ZWQgZHVyaW5nIGFzc29jaWF0aW9uIGhhbmRsaW5nLlxuXG5UaGUgYHBzcF9kZXZfY3JlYXRlYCBmdW5jdGlvbidzIGNoYW5nZXMgYXJlIGNyaXRpY2FsLiBUaGUgcGF0Y2ggbm93IGFsbG93cyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMuIEl0IHNlZW1zIHRoYXQgaWYgdGhlc2UgZnVuY3Rpb25zIGFyZSBOVUxMIGFuZCBgYXNzb2NfZHJ2X3NwY2AgaXMgMCwgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG5vdCB0byBtYW5hZ2UgVHgga2V5cy4gVGhpcyBmZWVscyBsaWtlIGEgc2lnbmlmaWNhbnQgc2ltcGxpZmljYXRpb24sIGJ1dCB0aGlzIGlzIHdoZXJlIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcy4gVGhlIGxvZ2ljIG5vdyBpbmNsdWRlcyBgKCFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXHUwMDNldHhfa2V5X2RlbCkgfHwgKHBzZF9jYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMgXHUwMDI2XHUwMDI2ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQpYC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb21iaW5hdGlvbiBvZiB0aGVzZSBjb25kaXRpb25zIGRvZXNuJ3QgbGVhZCB0byBhbnkgdW5leHBlY3RlZCBiZWhhdmlvciwgZXNwZWNpYWxseSByZWdhcmRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzIHdoZW4gdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcHJvdmlkZWQuXG5cbkluIGBwc3BfZGV2X3VucmVnaXN0ZXJgIGFuZCBgcHNwX2Fzc29jX2ZyZWVgLCB3ZSBzZWUgY29uZGl0aW9uYWwgY2FsbHMgdG8gYHBzcF9kZXZfdHhfa2V5X2RlbGAgYmFzZWQgb24gYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKClgLiBUaGlzIG1ha2VzIHNlbnNlLCBidXQgdGhlIHJlbW92YWwgb2YgYGxpc3RfZGVsYCBmcm9tIGluc2lkZSBvZiBgcHNwX2Rldl90eF9rZXlfZGVsYCBpdHNlbGYgaW4gZmF2b3VyIG9mIHRoZSBjYWxsZXIsIGlzIHNvbWV0aGluZyBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kLlxuXG5UaGUgY2hhbmdlcyBpbiBgcHNwX3NvY2suY2AgYXJlIGFsc28gaW1wb3J0YW50LiBUaGUgZHVtbXkgYWxsb2NhdGlvbiBsb2dpYyBpcyBub3cgZXhwbGljaXRseSBpbnNpZGUgYHBzcF9kZXZfdHhfa2V5X2FkZGAuIFRoZSBjYWxscyB0byBgcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfZGVsKHBzZCwgcGFzKTtgIGFyZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBpZiB0aGUgZHJpdmVycyBmb3JnZXQgdG8gaGFuZGxlIHRoZXNlIGNvcnJlY3RseS4gU3BsaXR0aW5nIG9mZiBgcHNwX2Fzc29jX3NldF90eGAgYW5kIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYW5kIHRoZSBhc3NvY2lhdGVkIGBtZW1jcHlgIHdpdGhpbiBgcHNwX2Fzc29jX3NldF90eGAgYWxsIGxvb2sgbGlrZSBjbGVhbnVwcy5cblxuTXkgbWFpbiBhcmVhIG9mIGNvbmNlcm4gcmlnaHQgbm93IGlzIGhvdyB0aGUgXCJkdW1teVwiIGFsbG9jYXRpb24gaXMgYmVpbmcgaGFuZGxlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBwc3BfYXNzb2NfZHVtbXlgIHdvcmtzLCB0byB2ZXJpZnkgaWYgdGhlcmUncyBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIHdoZW4gdGhlIGtleSBoYW5kbGluZyBpcyBcImR1bW15XCIuIEknbSBnb2luZyB0byBxdWlja2x5IHVzZSBgZ3JlcHBlcmAgKG9yIGByZWFkLWZpbGVgIGlmIG5lZWQgYmUpIHRvIGV4YW1pbmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBwc3BfYXNzb2NfZHVtbXlgIHRvIGJlIHN1cmUgdGhlcmUncyBubyBzdWJ0bGUsIGx1cmtpbmcgdnVsbmVyYWJpbGl0eSBoZXJlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBkdW1teSBhbGxvY2F0aW9uIGlzbid0IGluYWR2ZXJ0ZW50bHkgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgd2hlbiB0aGUgZGV2aWNlIGNob29zZXMgbm90IHRvIHN0b3JlIHR4IGtleXMuIFRoaXMgaXMgd2hlcmUgYSBzdWJ0bGUgZmxhdyBpcyBtb3N0IGxpa2VseSB0byByZXNpZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2ODIsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MTMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0Ny40NjIzODMxNDRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzcxNjk5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwc3BfYXNzb2NfZHVtbXlcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3BzcC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3BzcC9wc3Bfc29jay5jPTQ3PXN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19jcmVhdGUoc3RydWN0IHBzcF9kZXYgKnBzZClcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYy02OC1cXG5uZXQvcHNwL3BzcF9zb2NrLmM6Njk6c3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxubmV0L3BzcC9wc3Bfc29jay5jLTcwLXtcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYz04MD1zdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuLS1cXG5uZXQvcHNwL3BzcF9zb2NrLmMtOTAtXFx0ICovXFxubmV0L3BzcC9wc3Bfc29jay5jOjkxOlxcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XFxubmV0L3BzcC9wc3Bfc29jay5jLTkyLVxcdGlmICghZHVtbXkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjQ3LjY0MDEwNTAyMVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDc3OTc4NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGBwc3Bfc29jay5jYCAtIExpbmVzIDQwLTEyMCoqXG5cbk9rYXksIGxldCdzIHB1bGwgdXAgYHBzcF9zb2NrLmNgIGFuZCBmb2N1cyBvbiBsaW5lcyA0MCB0aHJvdWdoIDEyMC4gSSdtIGd1ZXNzaW5nIHRoaXMgc2VjdGlvbiBwcm9iYWJseSBkZWFscyB3aXRoIHRoZSBjb3JlIHNvY2tldCBpbml0aWFsaXphdGlvbiBvciBzb21lIGltcG9ydGFudCBzZXR1cCByb3V0aW5lLCBnaXZlbiBpdHMgcGxhY2VtZW50IGVhcmx5IGluIHRoZSBmaWxlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBzdHJ1Y3QgZGVjbGFyYXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNvY2tldCBzdHJ1Y3R1cmUgaXRzZWxmLCBhbmQgYW55IGluaXRpYWwgYXNzaWdubWVudHMgdG8gY3J1Y2lhbCB2YXJpYWJsZXMuIEknbSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBhbGxvY2F0aW9uIG9mIHNvY2tldCBkZXNjcmlwdG9ycywgdGhlIHNldHRpbmcgb2YgZGVmYXVsdCBvcHRpb25zIChpZiBhbnkpLCBhbmQgcG90ZW50aWFsbHkgc29tZSBlYXJseSBlcnJvciBoYW5kbGluZy4gSSdtIGFsc28gcmVhZHkgdG8gdHJhY2UgY29udHJvbCBmbG93IHRocm91Z2ggYW55IHBvdGVudGlhbCBicmFuY2hlcywgY2hlY2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzIG9yIHVudXN1YWwgcGFyYW1ldGVyIGhhbmRsaW5nIHdoaWNoIG1pZ2h0IGNhdXNlIGlzc3VlcyBkb3duIHRoZSBsaW5lLiBJJ2xsIGFsc28gYmUgZm9jdXNpbmcgb24gYW55IHVzZSBvZiBgaW9jdGxgIGNhbGxzIGFzIHRoZXkgbWF5IGluZGljYXRlIGhhcmR3YXJlIGRlcGVuZGVuY3kuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGJlaW5nIHVzZWQgZm9yIHZhcmlvdXMgc29ja2V0IG9wdGlvbnM7IHR5cGUgbWlzbWF0Y2hlcyBjYW4gYmUgbm90b3Jpb3VzbHkgdHJpY2t5IHRvIGRlYnVnLiBBbnl0aGluZyByZWxhdGVkIHRvIHRocmVhZGluZyBhbmQgc3luY2hyb25pemF0aW9uIHdpdGhpbiB0aGUgc29ja2V0J3MgaW50ZXJuYWwgc3RydWN0dXJlcyB3b3VsZCBiZSBvZiBwYXJ0aWN1bGFyIGludGVyZXN0OyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIExldCdzIHNlZSB3aGF0J3Mgd2hhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6ODYyMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjUwLjExODA4Njc5MloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcHNwL3BzcF9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNDA6XFx0XFx0XFx0c2tfc2tiX3JlYXNvbl9kcm9wKHNrLCBza2IsIFNLQl9EUk9QX1JFQVNPTl9QU1BfT1VUUFVUKTtcXG4gIDQxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgNDI6XFx0XFx0fVxcbiAgNDM6XFx0XFxuICA0NDpcXHRcXHRyZXR1cm4gc2tiO1xcbiAgNDU6XFx0fVxcbiAgNDY6XFx0XFxuICA0NzpcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfY3JlYXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XFxuICA1MDpcXHRcXG4gIDUxOlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA1MjpcXHRcXG4gIDUzOlxcdFxcdHBhcyA9IGt6YWxsb2NfZmxleCgqcGFzLCBkcnZfZGF0YSwgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjLFxcbiAgNTQ6XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4gIDU1OlxcdFxcdGlmICghcGFzKVxcbiAgNTY6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA1NzpcXHRcXG4gIDU4OlxcdFxcdHBhcy1cXHUwMDNlcHNkID0gcHNkO1xcbiAgNTk6XFx0XFx0cGFzLVxcdTAwM2VkZXZfaWQgPSBwc2QtXFx1MDAzZWlkO1xcbiAgNjA6XFx0XFx0cGFzLVxcdTAwM2VnZW5lcmF0aW9uID0gcHNkLVxcdTAwM2VnZW5lcmF0aW9uO1xcbiAgNjE6XFx0XFx0cHNwX2Rldl9nZXQocHNkKTtcXG4gIDYyOlxcdFxcdHJlZmNvdW50X3NldChcXHUwMDI2cGFzLVxcdTAwM2VyZWZjbnQsIDEpO1xcbiAgNjM6XFx0XFxuICA2NDpcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0LCBcXHUwMDI2cHNkLVxcdTAwM2VhY3RpdmVfYXNzb2NzKTtcXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0cmV0dXJuIHBhcztcXG4gIDY3OlxcdH1cXG4gIDY4OlxcdFxcbiAgNjk6XFx0c3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuICA3MDpcXHR7XFxuICA3MTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVxcdTAwM2Vwc2Q7XFxuICA3MjpcXHRcXHRzaXplX3Qgc3o7XFxuICA3MzpcXHRcXG4gIDc0OlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA3NTpcXHRcXG4gIDc2OlxcdFxcdHN6ID0gc3RydWN0X3NpemUocGFzLCBkcnZfZGF0YSwgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjKTtcXG4gIDc3OlxcdFxcdHJldHVybiBrbWVtZHVwKHBhcywgc3osIEdGUF9LRVJORUwpO1xcbiAgNzg6XFx0fVxcbiAgNzk6XFx0XFxuICA4MDpcXHRzdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuICA4MTpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4gIDgyOlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4gIDgzOlxcdHtcXG4gIDg0OlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xcbiAgODU6XFx0XFx0aW50IGVycjtcXG4gIDg2OlxcdFxcbiAgODc6XFx0XFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxcbiAgODg6XFx0XFx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cXG4gIDg5OlxcdFxcdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxcbiAgOTA6XFx0XFx0ICovXFxuICA5MTpcXHRcXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xcbiAgOTI6XFx0XFx0aWYgKCFkdW1teSlcXG4gIDkzOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRcXHRtZW1jcHkoXFx1MDAyNmR1bW15LVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbiAgOTY6XFx0XFx0ZXJyID0gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4gIDk3OlxcdFxcdGlmICghZXJyKVxcbiAgOTg6XFx0XFx0XFx0bWVtY3B5KHBhcy1cXHUwMDNlZHJ2X2RhdGEsIGR1bW15LVxcdTAwM2VkcnZfZGF0YSxcXG4gIDk5OlxcdFxcdFxcdCAgICAgICBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbiAxMDA6XFx0XFxuIDEwMTpcXHRcXHRrZnJlZShkdW1teSk7XFxuIDEwMjpcXHRcXHRyZXR1cm4gZXJyO1xcbiAxMDM6XFx0fVxcbiAxMDQ6XFx0XFxuIDEwNTpcXHR2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIDEwNjpcXHR7XFxuIDEwNzpcXHRcXHRwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuIDEwODpcXHR9XFxuIDEwOTpcXHRcXG4gMTEwOlxcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4gMTExOlxcdHtcXG4gMTEyOlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcHNwX2Fzc29jLCB3b3JrKTtcXG4gMTEzOlxcdFxcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXFx1MDAzZXBzZDtcXG4gMTE0OlxcdFxcbiAxMTU6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNkLVxcdTAwM2Vsb2NrKTtcXG4gMTE2OlxcdFxcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xcbiAxMTc6XFx0XFx0XFx0aWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpXFxuIDExODpcXHRcXHRcXHRcXHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xcbiAxMTk6XFx0XFx0XFx0bGlzdF9kZWwoXFx1MDAyNnBhcy1cXHUwMDNlYXNzb2NzX2xpc3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo1MC4xMTgxNzM3NzJaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzEyNzg1MjA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBc3Nlc3NtZW50IG9mIFBTUCBBc3NvY2lhdGlvbiBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIGZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlc2UgY2hhbmdlcyBmb3IgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgdGhhdCBjb3VsZCBleHBvc2Ugc2Vuc2l0aXZlIGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UuIEl0IGxvb2tzIGxpa2U6XG5cbiogICBUaGUgYHBhc2Agc3RydWN0dXJlIGlzIGFsbG9jYXRlZCB3aXRoIGBremFsbG9jX2ZsZXhgIGluIGBwc3BfYXNzb2NfY3JlYXRlYCwgd2hpY2ggemVyb2VzIHRoZSBtZW1vcnkuXG4qICAgVGhlIGBkdW1teWAgaXMgY3JlYXRlZCB3aXRoIGBrbWVtZHVwYCwgZHVwbGljYXRpbmcgemVyb2VkIG1lbW9yeS5cbiogICBUaGUgYGtleWAgY29tZXMgZnJvbSBuZXRsaW5rIGlucHV0LCBhbmQgdGhpcyByZXF1aXJlcyBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGJ1dCBpdCBpcyBwYXJzZWQsIG9yIHZhbGlkYXRlZCwgYmVmb3JlIGJlaW5nIHVzZWQuXG4qICAgVGhlIHJlbW92YWwgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnJvbSBuZXRkZXZzaW0gaW1wbGllcyBubyBuZWVkIGZvciBTQURCIG1hbmFnZW1lbnQgaW4gdGhhdCBzcGVjaWZpYyBjb250ZXh0LlxuKiAgIFRoZXJlIGFyZW4ndCBhbnkgbmV3bHkgaW50cm9kdWNlZCB1bmluaXRpYWxpemVkIHN0YWNrIHZhcmlhYmxlcywgaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZyB0aGF0IGdldHMgY29waWVkIHRvIHVzZXIgc3BhY2UsIG5vciBhcmUgdGhlcmUgYW55IHRoYXQgYXJlIHJlYWQgaW4gY29uZGl0aW9uYWwgbG9naWMuXG4qICAgVGhlIHJlZmFjdG9yaW5nIG1ha2VzIHRoZXNlIGZ1bmN0aW9ucyBvcHRpb25hbCwgYnV0IGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbGAgcHJvdmlkZXMgYSBjaGVjaywgdXNpbmcgYHBzcF9kZXZfaGFzX3NhZGIocGFzLVx1MDAzZXBzZCkgXHUwMDI2XHUwMDI2IHBhcy1cdTAwM2V0eC5zcGlgLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29kZSwgZ29pbmcgYmV5b25kIHRoZSBpbW1lZGlhdGUgcGF0Y2guIEknbGwgYmUgbG9va2luZyBmb3IgYGNvcHlfdG9fdXNlcmAgY2FsbHMsIG5ldGxpbmsgYXR0cmlidXRlcywgc29ja2V0IG9wdGlvbnMsIGFuZCBhbnkgbmV3IGJyYW5jaGluZyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIEhvd2V2ZXIsIEknbSBub3Qgc2VlaW5nIGFueSByZWQgZmxhZ3MuXG5cbk5vdywgYXMgYW4gZXh0cmEgc3RlcCwgSSdsbCBxdWlja2x5IGNvbnNpZGVyIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIFVzZS1BZnRlci1GcmVlIChVQUYpLCBvciBsb2NraW5nIHByb2JsZW1zLiBUaG9zZSBhcmUgYmV0dGVyIGFkZHJlc3NlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC5cblxuVGltZSB0byBjb25maXJtIG15IGZpbmRpbmdzIGFnYWluc3QgdGhlIEtNU0FOIGNyaXRlcmlhLlxuXG4xLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlIHdoZXJlIGZpZWxkcyBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkOiBObyBjb25jZXJucyBoZXJlLlxuMi4gIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkczogTm8sIGFsbCB1c2VkIHN0cnVjdCBmaWVsZHMgYXJlIGluaXRpYWxpemVkLlxuMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRoczogTm8sIHplcm9pbmcgYWxsb2NhdG9ycyBhbmQga21lbWR1cCBhcmUgdXNlZC5cbjQuICBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM6IE5vIHN1Y2ggY2FzZXMgd2VyZSBmb3VuZC5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgIGhlcmUuXG5cblRvIHByb3ZpZGUgYSByb2J1c3QganVzdGlmaWNhdGlvbiwgbGV0J3MgY29udHJhc3QgdGhlIEtNU0FOIGFuZCBLQVNBTiBhc3BlY3RzLiBUaGlzIHBhdGNoIHJlZmFjdG9ycyBUeCBrZXkgbWFuYWdlbWVudCB0byBtYWtlIGl0IG9wdGlvbmFsLCBzcGVjaWZpY2FsbHkgZm9yIGRldmljZXMgdGhhdCBkb24ndCB1c2UgYSBUeCBrZXkgU0FEQi4gQWxsIGludm9sdmVkIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHplcm8gYWxsb2NhdG9ycyBsaWtlIGBremFsbG9jX29iamAsIGBremFsbG9jX2ZsZXhgLCBvciBga21lbWR1cGAuIE5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBudWxsYWJpbGl0eSBvZiB0aGUgY2FsbGJhY2tzIGlzIGNvdmVyZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAsIG5vdCBLTVNBTi4gVGhlIGlzc3VlcyBhcmUgZnVuY3Rpb25hbCBidWdzLCBvciBsb2NraW5nL2xpZmVjeWNsZSBpc3N1ZXMgd2hpY2ggYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgb3RoZXIgdG9vbHMuIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpc24ndCBuZWVkZWQgaGVyZS5cblxuSSB0aGluayB3ZSdyZSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMTIsIk91dHB1dFRva2VucyI6MTY0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzA0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6NTcuMjQ2MDI5MDExWiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0NzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtYWtlcyB0aGUgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZHJpdmVyIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgUFNQIGRldmljZXMgd2l0aG91dCBTQURCIHN1cHBvcnQsIHJlZmFjdG9yaW5nIFR4IGtleSBhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGFuZCByZW1vdmluZyB1bnVzZWQga2V5IGhhbmRsaW5nIGhvb2tzIGZyb20gbmV0ZGV2c2ltLiBBbGwgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBjb250aW51ZSB0byBiZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBga3phbGxvY19mbGV4YCwgYGt6YWxsb2Nfb2JqYCwgb3IgYGttZW1kdXBgLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgY2hlY2tzLCBsaXN0IG1hbmlwdWxhdGlvbiwgb3IgbGlmZWN5Y2xlIGhhbmRsaW5nIGZhbGwgc3RyaWN0bHkgdW5kZXIgdGhlIGRvbWFpbiBvZiBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-05 10:49:58 +0000 UTC FinishedAt: 2026-09-05 10:52:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6ebcf5074cff0402730c6981d2397139fee6322d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "INET_PSP", "NETDEVSIM" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "6ebcf5074cff0402730c6981d2397139fee6322d", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "INET_PSP", "NETDEVSIM" ], "series_id": "f905573f-bb57-4da1-91d6-b3b9c14d31c5" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "psp_sock_assoc_set_tx", "psp_sock_set_tx_key", "psp_dev_tx_key_add", "psp_dev_tx_key_del", "psp_assoc_free", "psp_dev_create", "psp_dev_unregister", "nsim_do_psp" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lORVRfUFNQJiMzNDssCiAgICAmIzM0O05FVERFVlNJTSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BzcF9zb2NrX2Fzc29jX3NldF90eCYjMzQ7LAogICAgJiMzNDtwc3Bfc29ja19zZXRfdHhfa2V5JiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2FkZCYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9kZWwmIzM0OywKICAgICYjMzQ7cHNwX2Fzc29jX2ZyZWUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl9jcmVhdGUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl91bnJlZ2lzdGVyJiMzNDssCiAgICAmIzM0O25zaW1fZG9fcHNwJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbWFrZXMgdGhlIGB0eF9rZXlfYWRkYCBhbmQgYHR4X2tleV9kZWxgIGRyaXZlciBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIFBTUCBkZXZpY2VzIHdpdGhvdXQgU0FEQiBzdXBwb3J0LCByZWZhY3RvcmluZyBUeCBrZXkgYXNzb2NpYXRpb24gbWFuYWdlbWVudCBhbmQgcmVtb3ZpbmcgdW51c2VkIGtleSBoYW5kbGluZyBob29rcyBmcm9tIG5ldGRldnNpbS4gQWxsIGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgY29udGludWUgdG8gYmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYGt6YWxsb2NfZmxleGAsIGBremFsbG9jX29iamAsIG9yIGBrbWVtZHVwYC4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGNoZWNrcywgbGlzdCBtYW5pcHVsYXRpb24sIG9yIGxpZmVjeWNsZSBoYW5kbGluZyBmYWxsIHN0cmljdGx5IHVuZGVyIHRoZSBkb21haW4gb2YgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTE8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAyNzAyNzkwZGVmOTQxN2ZlMTFmZTcyNDVkODg3NTczZTg3MWFmMzFiXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBTZXAgNSAxMDo1MTo1MCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICYjNDM7MTIyLDYgQEAgc3RydWN0IG5ldGRldnNpbSB7XG4gXHRcdHN0cnVjdCBkZW50cnkgKnJlcmVnO1xuIFx0XHRzdHJ1Y3QgbXV0ZXggcmVyZWdfbG9jaztcbiBcdFx0dTMyIHNwaTtcbi1cdFx0dTMyIGFzc29jX2NudDtcbiBcdH0gcHNwO1xuIFxuIFx0c3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2O1xuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1xuaW5kZXggNmIzNTMyYjVlMzYwZC4uYjc0NTJjNDliNTgxZCAxMDA2NDRcbi0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5AQCAtMjMsNyAmIzQzOzIzLDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XG4gXHRzdHJ1Y3QgbmV0ICpuZXQ7XG4gXHRpbnQgcHNwX2xlbjtcbi1cdHZvaWQgKipwdHI7XG4gXG4gXHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcbkBAIC0zNywxMiAmIzQzOzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICYjNDM7MTQyLDYgQEAgbnNpbV9yeF9zcGlfYWxsb2Moc3RydWN0IHBzcF9kZXYgKnBzZCwgdTMyIHZlcnNpb24sXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4tXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4te1xuLVx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XG4tXG4tXHQvKiBDb3B5IGRydl9wcml2IGZyb20gcHNkIHRvIGFzc29jICovXG4tXHQqcHRyID0gcHNkLVx1MDAzZWRydl9wcml2O1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudCYjNDM7JiM0Mzs7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSAmIzQzOzE1Nyw2IEBAIHN0YXRpYyBpbnQgbnNpbV9rZXlfcm90YXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XG4tXG4tXHQqcHRyID0gTlVMTDtcbi1cdG5zLVx1MDAzZXBzcC5hc3NvY19jbnQtLTtcbi19XG4tXG4gc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTIwNCw4ICYjNDM7MTc1LDYgQEAgc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxuIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0ge1xuIFx0LnNldF9jb25maWdcdD0gbnNpbV9wc3Bfc2V0X2NvbmZpZyxcbiBcdC5yeF9zcGlfYWxsb2NcdD0gbnNpbV9yeF9zcGlfYWxsb2MsXG4tXHQudHhfa2V5X2FkZFx0PSBuc2ltX2Fzc29jX2FkZCxcbi1cdC50eF9rZXlfZGVsXHQ9IG5zaW1fYXNzb2NfZGVsLFxuIFx0LmtleV9yb3RhdGVcdD0gbnNpbV9rZXlfcm90YXRlLFxuIFx0LmdldF9zdGF0c1x0PSBuc2ltX2dldF9zdGF0cyxcbiB9O1xuQEAgLTIxNSw3ICYjNDM7MTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgJiM0MzsxOTgsNiBAQCBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bilcbiBcdFx0c3luY2hyb25pemVfcmN1KCk7XG4gXHRcdHBzcF9kZXZfdW5yZWdpc3Rlcihwc2QpO1xuIFx0fVxuLVx0V0FSTl9PTihucy1cdTAwM2Vwc3AuYXNzb2NfY250KTtcbiB9XG4gXG4gdm9pZCBuc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oXG5pbmRleCBjNWMyM2E1NDc3NGU2Li5iMjNjMzA4OTgzODljIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbkBAIC0yNCwxMSAmIzQzOzI0LDYgQEAgaW50IHBzcF9kZXZfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHUxNiBkZXZfaWQsIHU4IGdlbmVyYXRpb24sIGJvb2wgc3RyaXBfaWN2KTtcbiAvKiBLZXJuZWwtZmFjaW5nIEFQSSAqL1xuIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHNwX2Fzc29jX2Rydl9kYXRhKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRyZXR1cm4gcGFzLVx1MDAzZWRydl9kYXRhO1xuLX1cbi1cbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG4gdW5zaWduZWQgaW50IHBzcF9rZXlfc2l6ZSh1MzIgdmVyc2lvbik7XG4gdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oIGIvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbmluZGV4IDg3OTkxYTFlYTAyZDAuLmI4OTA1ZWZiZDYwNGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbkBAIC0yMTksMTIgJiM0MzsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbiYjNDM7XHQgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2RlbFxuJiM0MztcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0aW50ICgqdHhfa2V5X2FkZCkoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKTtcbiBcdC8qKlxuIFx0ICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2VcbiBcdCAqIFJlbW92ZSBhbiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBkZXZpY2UuXG4mIzQzO1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbiYjNDM7XHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdHZvaWQgKCp0eF9rZXlfZGVsKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xuIFxuZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oXG5pbmRleCA4NmVlYmE4MjNjZWQxLi5iYmIzOWUyZjViMGFiIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3AuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaFxuQEAgLTUzLDQgJiM0Mzs1MywxNiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcHNwX2Rldl9pc19yZWdpc3RlcmVkKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4gXHRyZXR1cm4gISFwc2QtXHUwMDNlb3BzO1xuIH1cbiBcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuJiM0MztcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiYjNDM7e1xuJiM0MztcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cGFzLVx1MDAzZXBzZC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbiYjNDM7fVxuJiM0MztcbiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi9cbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcF9tYWluLmMgYi9uZXQvcHNwL3BzcF9tYWluLmNcbmluZGV4IGM5YzFhODgyNmI3ZjkuLjkxNDczZjk2YWQyMTEgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcF9tYWluLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9wc3AvcHNwX21haW4uY1xuQEAgLTY4LDkgJiM0Mzs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4mIzQzO1x0XHQgICAgIXBzZF9vcHMtXHUwMDNlZ2V0X3N0YXRzIHx8XG4mIzQzO1x0XHQgICAgKCFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXHUwMDNldHhfa2V5X2RlbCkgfHxcbiYjNDM7XHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4gXG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VhY3RpdmVfYXNzb2NzLCBcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MpO1xuIFx0bGlzdF9zcGxpY2VfaW5pdChcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MpO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpXG4tXHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4mIzQzO1x0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHtcbiYjNDM7XHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuJiM0MztcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuJiM0MztcdFx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbiYjNDM7XHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiAmIzQzOzc4LDMzIEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIH1cbiBcbiBzdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4mIzQzO1x0XHRcdCAgICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiB7XG4tXHRyZXR1cm4gcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfYWRkKHBzZCwgcGFzLCBleHRhY2spO1xuJiM0MztcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuJiM0MztcdGludCBlcnI7XG4mIzQzO1xuJiM0MztcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJiMzOTt0XG4mIzQzO1x0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJiMzOTtsbCBuZWVkIHRvXG4mIzQzO1x0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbiYjNDM7XHRpZiAoIWR1bW15KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1xuJiM0MztcdG1lbWNweShcdTAwMjZkdW1teS1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuJiM0MztcdGVyciA9IHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spO1xuJiM0MztcdGlmICghZXJyKVxuJiM0MztcdFx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsXG4mIzQzO1x0XHQgICAgICAgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4mIzQzO1xuJiM0MztcdGtmcmVlKGR1bW15KTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuIH1cbiBcbiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuLVx0aWYgKHBhcy1cdTAwM2V0eC5zcGkpXG4tXHRcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4tXHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuJiM0MztcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiBcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXHUwMDNlcHNkO1xuIFxuIFx0bXV0ZXhfbG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4tXHRpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpXG4tXHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4mIzQzO1x0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XG4mIzQzO1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiYjNDM7XHRcdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbiYjNDM7XHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4mIzQzO1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBwc3BfYXNzb2Nfc2V0X3R4KHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiYjNDM7XHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuJiM0MztcdFx0XHQgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xuJiM0MztcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4mIzQzO1x0XHRpZiAoZXJyKVxuJiM0MztcdFx0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiB7XG4gXHRzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTtcbkBAIC0xNzQsMTIgJiM0MzsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50XG4mIzQzO3BzcF9zb2NrX3NldF90eF9rZXkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4mIzQzO1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xuJiM0MztcdGlmIChlcnIpIHtcbiYjNDM7XHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjayxcbiYjNDM7XHRcdFx0ICAgICAgIFwmIzM0O1NvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IHBzcF9hc3NvY19zZXRfdHgocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuJiM0MztcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XG4mIzQzO1x0cGFzLVx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cdTAwM2VyY3Zfbnh0O1xuJiM0MztcbiYjNDM7XHRpY3NrID0gaW5ldF9jc2soc2spO1xuJiM0MztcdGljc2stXHUwMDNlaWNza19leHRfaGRyX2xlbiAmIzQzOz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbiYjNDM7XHRpY3NrLVx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXG4gXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4gXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xuLVx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7XG4mIzQzO1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICYjNDM7MjcxLDcgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXG4gXHRcdGdvdG8gZXhpdF91bmxvY2s7XG4gXHR9XG4gXG4tXHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xuLVx0aWYgKGVycikge1xuLVx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1NvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcJiMzNDspO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24mIzM5O3Rcbi1cdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0b1xuLVx0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4tXHQgKi9cbi1cdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XG4tXHRpZiAoIWR1bW15KSB7XG4tXHRcdGVyciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gZXhpdF91bmxvY2s7XG4tXHR9XG4tXG4tXHRtZW1jcHkoXHUwMDI2ZHVtbXktXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbi1cdGVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBleGl0X2ZyZWVfZHVtbXk7XG4tXG4tXHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSwgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4tXHRtZW1jcHkoXHUwMDI2cGFzLVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXG4tXHRXUklURV9PTkNFKHNrLVx1MDAzZXNrX3ZhbGlkYXRlX3htaXRfc2tiLCBwc3BfdmFsaWRhdGVfeG1pdCk7XG4tXHR0Y3Bfd3JpdGVfY29sbGFwc2VfZmVuY2Uoc2spO1xuLVx0cGFzLVx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cdTAwM2VyY3Zfbnh0O1xuLVxuLVx0aWNzayA9IGluZXRfY3NrKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19leHRfaGRyX2xlbiAmIzQzOz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4mIzQzO1x0ZXJyID0gcHNwX3NvY2tfc2V0X3R4X2tleShzaywgcHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiBleGl0X3VubG9jazpcbiBcdHJlbGVhc2Vfc29jayhzayk7XG4gXHRyZXR1cm4gZXJyO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0lORVRfUFNQJiMzNDssCiAgICAmIzM0O05FVERFVlNJTSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3BzcF9zb2NrX2Fzc29jX3NldF90eCYjMzQ7LAogICAgJiMzNDtwc3Bfc29ja19zZXRfdHhfa2V5JiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2FkZCYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9kZWwmIzM0OywKICAgICYjMzQ7cHNwX2Fzc29jX2ZyZWUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl9jcmVhdGUmIzM0OywKICAgICYjMzQ7cHNwX2Rldl91bnJlZ2lzdGVyJiMzNDssCiAgICAmIzM0O25zaW1fZG9fcHNwJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbmV0d29ya2luZyBQU1AgKFBTUCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtIGxvZ2ljIGFuZCBuZXRkZXZzaW0gZGV2aWNlIGRyaXZlciBjb2RlLiBJdCBtYWtlcyBUeCBrZXkgb2ZmbG9hZCBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIGRldmljZXMgd2l0aG91dCBTQURCLCByZWZhY3RvcnMga2V5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGluIHBzcF9zb2NrLmMsIHVwZGF0ZXMgZGV2aWNlIHJlZ2lzdHJhdGlvbiBjaGVja3MgaW4gcHNwX21haW4uYywgYW5kIHJlbW92ZXMgb2Jzb2xldGUgYXNzb2MgdHJhY2tpbmcgaW4gbmV0ZGV2c2ltLiBUaGVzZSBjb2RlIHBhdGhzIGFyZSBmdWxseSByZWFjaGFibGUgdmlhIG5ldGxpbmsgY29tbWFuZHMgYW5kIG5ldGRldnNpbSBpbnRlcmZhY2VzIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgKaW5kZXggNTVhZWM0MTIzN2I5Yi4uMTgxYjZiYWFiYTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaApAQCAtMTIyLDcgJiM0MzsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHsKIAkJc3RydWN0IGRlbnRyeSAqcmVyZWc7CiAJCXN0cnVjdCBtdXRleCByZXJlZ19sb2NrOwogCQl1MzIgc3BpOwotCQl1MzIgYXNzb2NfY250OwogCX0gcHNwOwogCiAJc3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jCmluZGV4IDZiMzUzMmI1ZTM2MGQuLmI3NDUyYzQ5YjU4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMKQEAgLTIzLDcgJiM0MzsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLAogCXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJaW50IHBzcF9sZW47Ci0Jdm9pZCAqKnB0cjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTsKQEAgLTM3LDEyICYjNDM7MzYsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucywKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCWlmICgqcHRyICE9IG5zKSB7Ci0JCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAluZXQgPSBzb2NrX25ldChza2ItJmd0O3NrKTsKIAlpZiAoIXBzcF9kZXZfZW5jYXBzdWxhdGUobmV0LCBza2IsIHBhcy0mZ3Q7dHguc3BpLCBwYXMtJmd0O3ZlcnNpb24sIDApKSB7CiAJCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7CkBAIC0xNDksMTkgJiM0MzsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbiwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCi0JCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKLXsKLQlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7Ci0Jdm9pZCAqKnB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCi0JLyogQ29weSBkcnZfcHJpdiBmcm9tIHBzZCB0byBhc3NvYyAqLwotCSpwdHIgPSBwc2QtJmd0O2Rydl9wcml2OwotCW5zLSZndDtwc3AuYXNzb2NfY250JiM0MzsmIzQzOzsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiB7CiAJc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwpAQCAtMTc3LDE1ICYjNDM7MTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0Jc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwotCXZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTsKLQotCSpwdHIgPSBOVUxMOwotCW5zLSZndDtwc3AuYXNzb2NfY250LS07Ci19Ci0KIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHsKIAlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7CkBAIC0yMDQsOCAmIzQzOzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0gewogCS5zZXRfY29uZmlnCT0gbnNpbV9wc3Bfc2V0X2NvbmZpZywKIAkucnhfc3BpX2FsbG9jCT0gbnNpbV9yeF9zcGlfYWxsb2MsCi0JLnR4X2tleV9hZGQJPSBuc2ltX2Fzc29jX2FkZCwKLQkudHhfa2V5X2RlbAk9IG5zaW1fYXNzb2NfZGVsLAogCS5rZXlfcm90YXRlCT0gbnNpbV9rZXlfcm90YXRlLAogCS5nZXRfc3RhdHMJPSBuc2ltX2dldF9zdGF0cywKIH07CkBAIC0yMTUsNyAmIzQzOzE4NCw2IEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9jYXBzIG5zaW1fcHNwX2NhcHMgPSB7CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHwKIAkJICAgIDEgJmx0OyZsdDsgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzI1NiB8CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LAotCS5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bikKQEAgLTIzMCw3ICYjNDM7MTk4LDYgQEAgc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTsKIAl9Ci0JV0FSTl9PTihucy0mZ3Q7cHNwLmFzc29jX2NudCk7CiB9CiAKIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oCmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgKQEAgLTI0LDExICYjNDM7MjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpOwogLyogS2VybmVsLWZhY2luZyBBUEkgKi8KIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0JcmV0dXJuIHBhcy0mZ3Q7ZHJ2X2RhdGE7Ci19Ci0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUCkKIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pOwogdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmggYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAppbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaApAQCAtMjE5LDEyICYjNDM7MjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7CiAJICogQHR4X2tleV9hZGQ6IGFkZCBhIFR4IGtleSB0byB0aGUgZGV2aWNlCiAJICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2UKIAkgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuCiYjNDM7CSAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsCiYjNDM7CSAqIGlzIGFsc28gTlVMTC4KIAkgKi8KIAlpbnQgKCp0eF9rZXlfYWRkKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiAJLyoqCiAJICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2UKIAkgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2FkZAomIzQzOwkgKiBpcyBhbHNvIE5VTEwuCiAJICovCiAJdm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7CiAKZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oCmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaApAQCAtNTMsNCAmIzQzOzUzLDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2lzX3JlZ2lzdGVyZWQoc3RydWN0IHBzcF9kZXYgKnBzZCkKIAlyZXR1cm4gISFwc2QtJmd0O29wczsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2hhc19zYWRiKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cHNkLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuICEhcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cGFzLSZndDtwc2QtJmd0O2xvY2spOwomIzQzOwlyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtJmd0O3BzZCkgJmFtcDsmYW1wOyBwYXMtJmd0O3R4LnNwaTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uYwppbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NAotLS0gYS9uZXQvcHNwL3BzcF9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3BfbWFpbi5jCkBAIC02OCw5ICYjNDM7NjgsOSBAQCBwc3BfZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgIXBzZF9vcHMtJmd0O3NldF9jb25maWcgfHwKIAkJICAgICFwc2Rfb3BzLSZndDtrZXlfcm90YXRlIHx8CiAJCSAgICAhcHNkX29wcy0mZ3Q7cnhfc3BpX2FsbG9jIHx8Ci0JCSAgICAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZCB8fAotCQkgICAgIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwgfHwKLQkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMpKQomIzQzOwkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMgfHwKJiM0MzsJCSAgICAoIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQgIT0gIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwpIHx8CiYjNDM7CQkgICAgKHBzZF9jYXBzLSZndDthc3NvY19kcnZfc3BjICZhbXA7JmFtcDsgIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwc2QgPSBremFsbG9jX29iaigqcHNkKTsKQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiAKIAlsaXN0X3NwbGljZV9pbml0KCZhbXA7cHNkLSZndDthY3RpdmVfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7cHJldl9hc3NvY3MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmFtcDtwc2QtJmd0O3ByZXZfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkKLQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgJmFtcDtwc2QtJmd0O3N0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHsKJiM0MzsJCWlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKQomIzQzOwkJCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CQlsaXN0X2RlbCgmYW1wO3Bhcy0mZ3Q7YXNzb2NzX2xpc3QpOwomIzQzOwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgJmFtcDtwc2QtJmd0O2Fzc29jX2Rldl9saXN0LAogCQkJCSBkZXZfbGlzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jCmluZGV4IDFhMmE2Yjc1MTZiMGYuLjZhNGJlY2MzOGI1NWEgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmMKQEAgLTc4LDE2ICYjNDM7NzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB9CiAKIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCQkgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlyZXR1cm4gcHNkLSZndDtvcHMtJmd0O3R4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKmR1bW15OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAomIzQzOwkgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UmIzM5O2xsIG5lZWQgdG8KJiM0MzsJICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuCiYjNDM7CSAqLwomIzQzOwlkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpOwomIzQzOwlpZiAoIWR1bW15KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwomIzQzOwllcnIgPSBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwomIzQzOwlpZiAoIWVycikKJiM0MzsJCW1lbWNweShwYXMtJmd0O2Rydl9kYXRhLCBkdW1teS0mZ3Q7ZHJ2X2RhdGEsCiYjNDM7CQkgICAgICAgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKJiM0MzsKJiM0MzsJa2ZyZWUoZHVtbXkpOwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB7Ci0JaWYgKHBhcy0mZ3Q7dHguc3BpKQotCQlwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7Ci0JbGlzdF9kZWwoJmFtcDtwYXMtJmd0O2Fzc29jc19saXN0KTsKJiM0MzsJcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWwocHNkLCBwYXMpOwogfQogCiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIAlzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLSZndDtwc2Q7CiAKIAltdXRleF9sb2NrKCZhbXA7cHNkLSZndDtsb2NrKTsKLQlpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpCi0JCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CWlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkgewomIzQzOwkJaWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpCiYjNDM7CQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJCWxpc3RfZGVsKCZhbXA7cGFzLSZndDthc3NvY3NfbGlzdCk7CiYjNDM7CX0KIAltdXRleF91bmxvY2soJmFtcDtwc2QtJmd0O2xvY2spOwogCXBzcF9kZXZfcHV0KHBzZCk7CiAJa2ZyZWUocGFzKTsKQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJcmV0dXJuIGVycjsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiYjNDM7CQkJICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LAomIzQzOwkJCSAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAocHNwX2Rldl9oYXNfc2FkYihwc2QpKSB7CiYjNDM7CQllcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcykKIHsKIAlzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTsKQEAgLTE3NCwxMiAmIzQzOzIxMCw0MCBAQCBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50CiYjNDM7cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCSAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCiYjNDM7CQkJICAgICAgICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gcHNwX2Fzc29jX3NldF90eChwc2QsIHBhcywga2V5LCBleHRhY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRShzay0mZ3Q7c2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTsKJiM0MzsJdGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTsKJiM0MzsJcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7CiYjNDM7CiYjNDM7CWljc2sgPSBpbmV0X2Nzayhzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfc3luY19tc3Moc2ssIGljc2stJmd0O2ljc2tfcG10dV9jb29raWUpOwomIzQzOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQkJICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7Ci0Jc3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlpbnQgZXJyOwogCiAJbG9ja19zb2NrKHNrKTsKQEAgLTIwNyw0MCAmIzQzOzI3MSw3IEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAotCWVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7Ci0JaWYgKGVycikgewotCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKLQkJZ290byBleGl0X3VubG9jazsKLQl9Ci0KLQkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAotCSAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0bwotCSAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLgotCSAqLwotCWR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7Ci0JaWYgKCFkdW1teSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfdW5sb2NrOwotCX0KLQotCW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwotCWVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlX2R1bW15OwotCi0JbWVtY3B5KHBhcy0mZ3Q7ZHJ2X2RhdGEsIGR1bW15LSZndDtkcnZfZGF0YSwgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKLQltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7Ci0KLQlXUklURV9PTkNFKHNrLSZndDtza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpOwotCXRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7Ci0JcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7Ci0KLQlpY3NrID0gaW5ldF9jc2soc2spOwotCWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7Ci0JaWNzay0mZ3Q7aWNza19zeW5jX21zcyhzaywgaWNzay0mZ3Q7aWNza19wbXR1X2Nvb2tpZSk7Ci0KLWV4aXRfZnJlZV9kdW1teToKLQlrZnJlZShkdW1teSk7CiYjNDM7CWVyciA9IHBzcF9zb2NrX3NldF90eF9rZXkoc2ssIHBzZCwgcGFzLCBrZXksIGV4dGFjayk7CiBleGl0X3VubG9jazoKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc0NzAKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW4uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmaWd1cmUgb3V0IGlmIHRoaXMgcGF0Y2ggaXMgZXZlbiAqd29ydGgqIGZ1enppbmcsIGFuZCBpZiBzbywgd2hhdCB0aGUgYmVzdCBhcHByb2FjaCBpcy4gSSBuZWVkIHRvIG5haWwgZG93biB0aGUgb3B0aW1hbCBjb25maWd1cmF0aW9uIGFuZCBpZGVudGlmeSB0aGUgcmlnaHQgZm9jdXMgc3ltYm9scy4KCkZpcnN0IHN0ZXA6IGdldCBhIGdvb2QgbG9vayBhdCB0aGUgY2hhbmdlcy4gSSBzZWUgdGhhdCB0aGUgcGF0Y2ggdG91Y2hlczoKCiogICBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oYAoqICAgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AKKiAgIGBpbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhgCiogICBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgCiogICBgbmV0L3BzcC9wc3AuaGAKKiAgIGBuZXQvcHNwL3BzcF9tYWluLmNgCiogICBgbmV0L3BzcC9wc3Bfc29jay5jYAoKUmlnaHQsIHNvIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgZGV2aWNlIHNpbXVsYXRvciBhbmQgc29tZSBraW5kIG9mICYjMzQ7cHNwJiMzNDsgKGxpa2VseSBwYWNrZXQgc2NoZWR1bGluZyBvciBwcm9jZXNzaW5nLCBiYXNlZCBvbiB0aGUgaW5jbHVkZSBwYXRocykuIERlZmluaXRlbHkgaW50ZXJlc3RpbmcuIE5leHQsIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIHRoZXNlIG1vZGlmaWNhdGlvbnMuIEkmIzM5O2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBhbmQgc2VlIHdoYXQmIzM5O3MgYWN0dWFsbHkgYmVpbmcgY2hhbmdlZC4gVGhhdCYjMzk7bGwgbGV0IG1lIGRlY2lkZSB3aGV0aGVyIHdlJiMzOTtyZSBsb29raW5nIGF0IHNvbWV0aGluZyB0aGF0IGNvdWxkIGJlIGhpdCBieSBmdXp6aW5nLCBhbmQgaWYgc28sIHdoYXQgdGhlIG1vc3QgdnVsbmVyYWJsZSBhcmVhcyBhcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0lORVRfUFNQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L25ldGRldnNpbS9NYWtlZmlsZT0xOT1lbmRpZlxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIwLVxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlOjIxOmlmbmVxICgkKENPTkZJR19JTkVUX1BTUCksKVxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIyLW5ldGRldnNpbS1vYmpzICYjNDM7PSBwc3Aub1xuLS1cbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaD00NDQ9c3RhdGljIGlubGluZSB2b2lkIG5zaW1fbWFjc2VjX3RlYXJkb3duKHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxuLS1cbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaC00NDgtXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmg6NDQ5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaC00NTAtaW50IG5zaW1fcHNwX2luaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpO1xuLS1cbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmg9MjE1OD1zdHJ1Y3QgbmV0X2RldmljZSB7XG4tLVxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaC0yMzg4LSNlbmRpZlxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaDoyMzg5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgtMjM5MC1cdHN0cnVjdCBwc3BfZGV2IF9fcmN1XHQqcHNwX2Rldjtcbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oPTUwNDM9ZW51bSBza2JfZXh0X2lkIHtcbi0tXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oLTUwNTgtI2VuZGlmXG5pbmNsdWRlL2xpbnV4L3NrYnVmZi5oOjUwNTk6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDYwLVx0U0tCX0VYVF9QU1AsXG4tLVxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg9MzM9c3RydWN0IGluZXRfdGltZXdhaXRfc29jayB7XG4tLVxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmgtODQtXHRzdHJ1Y3QgaW5ldF9iaW5kMl9idWNrZXRcdCp0d190YjI7XG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaDo4NTojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04Ni1cdHN0cnVjdCBwc3BfYXNzb2MgX19yY3VcdCAgKnBzcF9hc3NvYztcbi0tXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg9MjU9dm9pZCBwc3BfYXNzb2NfcHV0KHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgtMjYtXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg6Mjc6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oLTI4LXVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuLS1cbmluY2x1ZGUvbmV0L3NvY2suaD0zNjU9c3RydWN0IHNvY2sge1xuLS1cbmluY2x1ZGUvbmV0L3NvY2suaC00NjYtI2VuZGlmXG5pbmNsdWRlL25ldC9zb2NrLmg6NDY3OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcbmluY2x1ZGUvbmV0L3NvY2suaC00NjgtXHRzdHJ1Y3QgcHNwX2Fzc29jIF9fcmN1XHQqcHNwX2Fzc29jO1xuLS1cbm5ldC9NYWtlZmlsZT0yMD1vYmotJChDT05GSUdfVU5JWClcdFx0JiM0Mzs9IHVuaXgvXG5uZXQvTWFrZWZpbGU6MjE6b2JqLSQoQ09ORklHX0lORVRfUFNQKVx0XHQmIzQzOz0gcHNwL1xubmV0L01ha2VmaWxlLTIyLW9iai15XHRcdFx0XHQmIzQzOz0gaXB2Ni9cbi0tXG5uZXQvY29yZS9za2J1ZmYuYz01MTUwPXN0YXRpYyBjb25zdCB1OCBza2JfZXh0X3R5cGVfbGVuW10gPSB7XG4tLVxubmV0L2NvcmUvc2tidWZmLmMtNTE2NS0jZW5kaWZcbm5ldC9jb3JlL3NrYnVmZi5jOjUxNjY6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxubmV0L2NvcmUvc2tidWZmLmMtNTE2Ny1cdFtTS0JfRVhUX1BTUF0gPSBTS0JfRVhUX0NIVU5LU0laRU9GKHN0cnVjdCBwc3Bfc2tiX2V4dCksXG4tLVxubmV0L2NvcmUvc29jay5jPTI0Nzk9c3RydWN0IHNvY2sgKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHksXG4tLVxubmV0L2NvcmUvc29jay5jLTI0OTYtI2VuZGlmXG5uZXQvY29yZS9zb2NrLmM6MjQ5NzojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXG5uZXQvY29yZS9zb2NrLmMtMjQ5OC1cdFJDVV9JTklUX1BPSU5URVIobmV3c2stXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcbi0tXG5uZXQvcHNwL01ha2VmaWxlLTItXG5uZXQvcHNwL01ha2VmaWxlOjM6b2JqLSQoQ09ORklHX0lORVRfUFNQKSAmIzQzOz0gcHNwLm9cbm5ldC9wc3AvTWFrZWZpbGUtNC1cbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc9Mz1DT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUz1uXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc6NDpDT05GSUdfSU5FVF9QU1A9eVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnLTUtQ09ORklHX0lQVjY9eVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkwNjgKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGFzc3VtZWQga25vd2xlZGdlIHRoZSB1c2VyIGhhczoKCioqRGl2aW5nIGludG8gdGhlIEtlcm5lbCBDb25maWd1cmF0aW9uIGZvciBOZXR3b3JrIFNpbXVsYXRpb24qKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgYSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBteSB3b3JrIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JraW5nIHNpbXVsYXRpb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGNoZWNrIHRoZSBrZXJuZWwmIzM5O3MgS2NvbmZpZyBzeXN0ZW0uIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAgcmVsYXRlIHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbiBmcmFtZXdvcmsuIEkgYWxyZWFkeSBoYXZlIGEgcHJldHR5IGdvb2QgbWVudGFsIG1hcCBvZiB0aGUgZ2VuZXJhbCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLCBidXQgdGhlc2UgdHdvLCBpbiB0aGlzIHBhcnRpY3VsYXIgc2NlbmFyaW8sIG5lZWQgYSBjbG9zZXIgbG9vay4gSSBuZWVkIHRvIHF1aWNrbHkgZXN0YWJsaXNoIGlmIG9uZSBkZXBlbmRzIG9uIHRoZSBvdGhlciwgaWYgdGhleSYjMzk7cmUgbXV0dWFsbHkgZXhjbHVzaXZlIGluIHNvbWUgY29tYmluYXRpb25zLCBvciBpZiB0aGV54oCZcmUgaW5kZXBlbmRlbnQgZmVhdHVyZXMgdGhhdCBjYW4gaW50ZXJhY3QuIEl0JiMzOTtzIHRpbWUgdG8gcGFyc2UgdGhlIEtjb25maWcgZmlsZXMgYW5kIHNlZSBleGFjdGx5IGhvdyB0aGVzZSB0aGluZ3MgYXJlIGRlZmluZWQgYW5kIGNvbnN0cmFpbmVkLiBJIGV4cGVjdCB0aGVyZSBtaWdodCBiZSBzb21lIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBvciBkZWZhdWx0IHZhbHVlcyBJIG5lZWQgdG8gaW50ZXJuYWxpemUgdG8gZW5zdXJlIEkgc2V0IHVwIG15IHNpbXVsYXRpb24gZW52aXJvbm1lbnQgY29ycmVjdGx5LiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGBzZWxlY3RgIGFuZCBgZGVwZW5kcyBvbmAgc3RhdGVtZW50cyB0byBnZXQgYSBmdWxsIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIElORVRfUFNQJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wc3AvS2NvbmZpZy00LSNcbm5ldC9wc3AvS2NvbmZpZzo1OmNvbmZpZyBJTkVUX1BTUFxubmV0L3BzcC9LY29uZmlnLTYtXHRib29sIFwmIzM0O1BTUCBTZWN1cml0eSBQcm90b2NvbCBzdXBwb3J0XCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTQxMwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipFeGFtaW5pbmcgS2NvbmZpZyBGaWxlcyBmb3IgTmV0d29yayBEZXZpY2UgQ29uZmlndXJhdGlvbioqCgpPa2F5LCB0aW1lIHRvIGRpZyBpbnRvIHRoZSBjb25maWd1cmF0aW9uIGFzcGVjdHMgb2YgdGhlc2UgbmV0d29yayBkcml2ZXJzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIHVzZXIgY29uZmlndXJlcyB0aGVzZSBzcGVjaWZpYyBuZXR3b3JrIGRldmljZXMgd2l0aGluIHRoZSBrZXJuZWwuIFRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50cyBhcmUgdGhlIGBuZXQvcHNwL0tjb25maWdgIGFuZCBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL0tjb25maWdgIGZpbGVzLiBJJiMzOTttIGV4cGVjdGluZyB0aGVzZSB0byBvdXRsaW5lIHRoZSBtZW51IGVudHJpZXMsIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIGFuZCBoZWxwIHRleHQgdGhhdCBndWlkZSB0aGUgdXNlciYjMzk7cyBjaG9pY2VzIGR1cmluZyB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gcGhhc2UgKHVzaW5nIGBtYWtlIG1lbnVjb25maWdgLCBgbWFrZSBkZWZjb25maWdgLCBvciBzaW1pbGFyKS4gSeKAmWxsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlOgoKKiAgICoqRGVwZW5kZW5jaWVzOioqIFdoYXQgb3RoZXIga2VybmVsIGZlYXR1cmVzIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgdGhlc2UgZGV2aWNlcyBiZWNvbWUgYXZhaWxhYmxlPyBBcmUgdGhlcmUgc3BlY2lmaWMgaGFyZHdhcmUgb3IgZHJpdmVyIHJlcXVpcmVtZW50cz8KKiAgICoqRGVmYXVsdCBWYWx1ZXM6KiogV2hhdCYjMzk7cyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgY29uZmlndXJhdGlvbj8gSXMgdGhlIGRyaXZlciBlbmFibGVkIGJ5IGRlZmF1bHQsIG9yIGRpc2FibGVkPyBXaGF0IGFyZSBhbnkgZGVmYXVsdCBwYXJhbWV0ZXJzIGxpa2UgYnVmZmVyIHNpemVzIG9yIHF1ZXVlIGxlbmd0aHM/CiogICAqKk1lbnUgU3RydWN0dXJlOioqIEhvdyBhcmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBncm91cGVkPyBBcmUgdGhleSBvcmdhbml6ZWQgbG9naWNhbGx5IGJ5IGZlYXR1cmUsIGRldmljZSB0eXBlLCBvciBuZXR3b3JrIHByb3RvY29sPyBIb3cgZGVlcGx5IG5lc3RlZCBhcmUgdGhleT8KKiAgICoqSGVscCBUZXh0OioqIElzIHRoZSBoZWxwIHRleHQgY2xlYXIgYW5kIGluZm9ybWF0aXZlPyBEb2VzIGl0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgZWFjaCBvcHRpb24gYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBEb2VzIGl0IHByb3ZpZGUgZ3VpZGFuY2Ugb24gd2hpY2ggc2V0dGluZ3MgYXJlIHN1aXRhYmxlIGZvciBkaWZmZXJlbnQgdXNlIGNhc2VzPwoqICAgKipDb21wYXRpYmlsaXR5OioqIEFyZSB0aGVyZSBhbnkga25vd24gY29tcGF0aWJpbGl0eSBpc3N1ZXMgb3IgbGltaXRhdGlvbnM/IElzIHRoZXJlIGFueSBpbmRpY2F0aW9uIG9mIHdoaWNoIGhhcmR3YXJlIHZlcnNpb25zIG9yIHNvZnR3YXJlIHZlcnNpb25zIHRoZSBkcml2ZXJzIGFyZSBkZXNpZ25lZCBmb3I/CgpVbmRlcnN0YW5kaW5nIHRoZXNlIGBLY29uZmlnYCBmaWxlcyBpcyBmb3VuZGF0aW9uYWwuIEl0JiMzOTtzIHRoZSBrZXkgdG8gdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZHJpdmVycyBhcmUgaW50ZWdyYXRlZCBhbmQgaG93IGVuZC11c2VycyBpbnRlcmFjdCB3aXRoIHRoZW0gaW4gdGhlIGxhcmdlciBrZXJuZWwgZWNvc3lzdGVtLiBUaGlzIGlzIHdoZXJlIHRoZSBzdG9yeSBiZWdpbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQjXG4gICAzOlx0IyBQU1AgY29uZmlndXJhdGlvblxuICAgNDpcdCNcbiAgIDU6XHRjb25maWcgSU5FVF9QU1BcbiAgIDY6XHRcdGJvb2wgXCYjMzQ7UFNQIFNlY3VyaXR5IFByb3RvY29sIHN1cHBvcnRcJiMzNDtcbiAgIDc6XHRcdGRlcGVuZHMgb24gSU5FVFxuICAgODpcdFx0c2VsZWN0IFNLQl9ERUNSWVBURURcbiAgIDk6XHRcdHNlbGVjdCBTS0JfRVhURU5TSU9OU1xuICAxMDpcdFx0c2VsZWN0IFNPQ0tfVkFMSURBVEVfWE1JVFxuICAxMTpcdFx0aGVscFxuICAxMjpcdFx0RW5hYmxlIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgUFNQIFNlY3VyaXR5IFByb3RvY29sIChQU1ApLlxuICAxMzpcdFx0Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOlxuICAxNDpcdFx0ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZ29vZ2xlL3BzcC9tYWluL2RvYy9QU1BfQXJjaF9TcGVjLnBkZlxuICAxNTpcdFxuICAxNjpcdFx0SWYgdW5zdXJlLCBzYXkgTi5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA0NQoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgd2VudDoKCioqRXhhbWluaW5nIEtjb25maWcgZm9yIE5ldGRldnNpbSBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBzb21ldGhpbmcgbmV0d29yay1yZWxhdGVkLCBhbmQgSSYjMzk7bSBwcmV0dHkgc3VyZSBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gTXkgbWluZCBpbW1lZGlhdGVseSBnb2VzIHRvIHdoZXJlIHRoZXNlIHRoaW5ncyBhcmUgdXN1YWxseSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgc291cmNlLCBhbmQgdGhhdCYjMzk7cyB0aGUgYEtjb25maWdgIGZpbGVzLiBTaW5jZSB3ZSYjMzk7cmUgZGVhbGluZyB3aXRoIHRoZSBuZXR3b3JrIGRldmljZSBzaW11bGF0b3IsIGBuZXRkZXZzaW1gLCBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgZG9uJiMzOTt0IG92ZXJsb29rIGFueXRoaW5nIHNwZWNpZmljIHRvIGl0LiBUbyBlbnN1cmUgSSBjb3ZlciBhbGwgcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUgYnVpbGQsIEkgbmVlZCB0byBvcGVuIGFuZCByZWFkIHRoZSBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL0tjb25maWdgIGZpbGUsIHNpbmNlIHRoYXQmIzM5O3MgbGlrZWx5IHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgYXJlIGRlZmluZWQuIEkgaGF2ZSB0byBtYWtlIHN1cmUgdG8gZXhhbWluZSB0aGlzIGZpbGUgdGhvcm91Z2hseSBhcyBwYXJ0IG9mIG15IGludmVzdGlnYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORVRERVZTSU0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZHJpdmVycy9uZXQvS2NvbmZpZz02MDI9c291cmNlIFwmIzM0O2RyaXZlcnMvbmV0L2h5cGVydi9LY29uZmlnXCYjMzQ7XG5kcml2ZXJzL25ldC9LY29uZmlnLTYwMy1cbmRyaXZlcnMvbmV0L0tjb25maWc6NjA0OmNvbmZpZyBORVRERVZTSU1cbmRyaXZlcnMvbmV0L0tjb25maWctNjA1LVx0dHJpc3RhdGUgXCYjMzQ7U2ltdWxhdGVkIG5ldHdvcmtpbmcgZGV2aWNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwMzQzCgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMTA3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoZSBOZXQvUFNQIEltcGxlbWVudGF0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgdW5kZXJzdGFuZCBob3cgdGhpcyBuZXQvcHNwIG1vZHVsZSB3b3JrcywgYW5kIG1vcmUgc3BlY2lmaWNhbGx5LCBob3cgaXQmIzM5O3MgaW50ZWdyYXRlZC4gUFNQLCBhcyBJIHJlY2FsbCwgaXMgdGhlIFBTUCBTZWN1cml0eSBQcm90b2NvbCDigJMgdGhhdCBHb29nbGUgaW5pdGlhdGl2ZSBmb3IgSVAvVENQIGNyeXB0byBvZmZsb2FkLiBXZSBrbm93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBzeXN0ZW0gdmlhIG5ldGxpbmsgYW5kIHNvY2tldHMsIGFuZCBJJiMzOTttIHByZXR0eSBzdXJlIGl0IGhhcyBzb21lIG5ldGRldnNpbSBzdXBwb3J0IGJha2VkIGluLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBleGFtaW5pbmcgdGhlIGNvcmUgZmlsZXM6IGBuZXQvcHNwL3BzcF9tYWluLmNgIHNob3VsZCBiZSB0aGUgZW50cnkgcG9pbnQsIGBuZXQvcHNwL3BzcF9zb2NrLmNgIHdpbGwgaG9sZCB0aGUgc29ja2V0LXJlbGF0ZWQgY29kZSwgYW5kIHRoZW4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYG5ldC9wc3AvcHNwX25sLmNgIGZvciBhbnkgTmV0bGluayBpbnRlcmFjdGlvbnMuIExldCYjMzk7cyBzZWUgaWYgdGhlIE5ldGxpbmsgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhhdCBzcGVjaWZpYyBmaWxlLiBUbyBzdGFydCBJJiMzOTtsbCBsaXN0IHRoZSBmaWxlcyBpbiB0aGUgYG5ldC9wc3BgIGRpcmVjdG9yeSB0byBnZXQgYSBjb21wcmVoZW5zaXZlIG92ZXJ2aWV3IG9mIHRoZSBhcmNoaXRlY3R1cmUuIExldCYjMzk7cyBzZWUgd2hhdCBnZW1zIHdlIGNhbiBmaW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmNvZGVzZWFyY2gtZGlyLWluZGV4PC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtEaXImIzM0OzogJiMzNDtuZXQvcHNwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGVzJiMzNDs6IFsKICAgICYjMzQ7cHNwLW5sLWdlbi5jJiMzNDssCiAgICAmIzM0O3BzcC1ubC1nZW4uaCYjMzQ7LAogICAgJiMzNDtwc3AuaCYjMzQ7LAogICAgJiMzNDtwc3BfbWFpbi5jJiMzNDssCiAgICAmIzM0O3BzcF9ubC5jJiMzNDssCiAgICAmIzM0O3BzcF9zb2NrLmMmIzM0OwogIF0sCiAgJiMzNDtTdWJkaXJzJiMzNDs6IG51bGwKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDc1OQoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDEyNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqUGF0Y2ggQW5hbHlzaXMgYW5kIEZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IHRoaXMgaXMgKmRlZmluaXRlbHkqIHdvcnRoIGEgZGVlcGVyIGxvb2sgZm9yIGZ1enppbmcgcHVycG9zZXMuIGBuZXRkZXZzaW1gIGlzIGEgcHJpbWUgdGFyZ2V0IGZvciBmdXp6aW5nIGJlY2F1c2UgaXQgaXMgZWFzaWx5IGFjY2Vzc2libGUgd2l0aGluIFFFTVUsIG1ha2luZyBpdCBwZXJmZWN0IGZvciBzeXprYWxsZXIuIFRoZSBQU1AgcHJvdG9jb2wgaXRzZWxmLCBsb2NhdGVkIGluIGBuZXQvcHNwL2AsIGlzIGNvcmUgbmV0d29ya2luZyBsb2dpYy4gV2UgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBjaGFuZ2VzIGludGVyYWN0IGFuZCBzZWUgaWYgdGhleSBpbnRyb2R1Y2UgYW55IG5ldyBhdmVudWVzIGZvciBleHBsb2l0YXRpb24uCgpGaXJzdCwgSSYjMzk7bGwgYW5hbHl6ZSB0aGUgcGF0Y2ggZGlmZi4KMS4gICoqYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AqKjogSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgc2ltcGxpZnlpbmcgbmV0ZGV2c2ltJiMzOTtzIFBTUCBpbXBsZW1lbnRhdGlvbi4gV2UgYXJlIHJlbW92aW5nIHNvbWUgaW50ZXJuYWwgdHJhY2tpbmcgbWVjaGFuaXNtcyAoYGFzc29jX2NudGAsICBgbnNpbV9hc3NvY19hZGRgLCBgbnNpbV9hc3NvY19kZWxgLCBgYXNzb2NfZHJ2X3NwY2ApLiBUaGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGF0IGBuZXRkZXZzaW1gIGlzbiYjMzk7dCBzdG9yaW5nIFR4IGtleXMgaW4gaGFyZHdhcmUgKFNBREIpLCBzbyBpdCYjMzk7cyBtYWtpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgb3BlcmF0aW9ucyBvcHRpb25hbCB3aXRoaW4gYHN0cnVjdCBwc3BfZGV2X29wc2AuIFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiB3aGljaCBtaWdodCBsZWFkIHRvIGVkZ2UgY2FzZXMuCjIuICAqKmBpbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhgIGFuZCBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgKio6IFdlJiMzOTtyZSBzZWVpbmcgbW9yZSBzaW1wbGlmaWNhdGlvbnMuIFRoZSByZW1vdmFsIG9mIGBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKWAgYW5kIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBvcHRpb25hbCBuYXR1cmUgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnVydGhlciBjbGFyaWZ5IHRoZSBpbnRlbnRpb24gb2YgdGhlIGNoYW5nZXMuCjMuICAqKmBuZXQvcHNwL3BzcC5oYCoqOiBUaGUgaW50cm9kdWN0aW9uIG9mIGBwc3BfZGV2X2hhc19zYWRiYCBhbmQgYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsYCBpcyBjcnVjaWFsLiBUaGV5IGFyZSBkZWZpbmluZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hlbiBUeCBrZXkgb3BlcmF0aW9ucyBhcmUgbmVjZXNzYXJ5LiBXZSYjMzk7cmUgc2VlaW5nIGxvY2tkZXAgYXNzZXJ0aW9ucyAoYGxvY2tkZXBfYXNzZXJ0X2hlbGRgKSB3aGljaCwgaWYgdmlvbGF0ZWQsIGlzIGFuIGluZGljYXRvciBvZiBhIGxvY2tpbmcgaXNzdWUuCjQuICAqKmBuZXQvcHNwL3BzcF9tYWluLmNgKio6IFRoZSB1cGRhdGUgdG8gYHBzcF9kZXZfY3JlYXRlYCBhbGxvd3MgZm9yIE5VTEwgYHR4X2tleV9hZGRgIC8gYHR4X2tleV9kZWxgLCBhZGRpbmcgZmxleGliaWxpdHkgdG8gdGhlIGNvZGUuIEhvd2V2ZXIsIHRoZSBsb2dpYyByZWdhcmRpbmcgYGFzc29jX2Rydl9zcGNgIGFkZHMgYSBjaGVjayB0byBlbnN1cmUgdGhhdCAqYm90aCogY2FuIGJlIG51bGwgb3IgbXVzdCBiZSBzZXQuIGBwc3BfZGV2X3VucmVnaXN0ZXJgIG5vdyBjb25kaXRpb25hbGx5IGNhbGxzIGBwc3BfZGV2X3R4X2tleV9kZWxgIGJhc2VkIG9uIHRoZSBjb25kaXRpb25zLgo1LiAgKipgbmV0L3BzcC9wc3Bfc29jay5jYCoqOiBUaGlzIGlzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIFdlJiMzOTtyZSBzZWVpbmcgbW9kaWZpY2F0aW9ucyB0byBgcHNwX2Rldl90eF9rZXlfYWRkYCBhbmQgYHBzcF9kZXZfdHhfa2V5X2RlbGAgY29uY2VybmluZyBkdW1teSBhc3NvY2lhdGlvbnMsIGNvcHlpbmcgb2YgZHJpdmVyIGRhdGEgYW5kIGNoYW5nZXMgdG8gdGhlIGxpc3QgaGFuZGxpbmcuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgYHBzcF9hc3NvY19zZXRfdHhgLCBgcHNwX3NvY2tfc2V0X3R4X2tleWAgYW5kIHVwZGF0ZXMgdG8gYHBzcF9zb2NrX2Fzc29jX3NldF90eGAgcmVwcmVzZW50IGNoYW5nZXMgaW4ga2V5IG1hbmFnZW1lbnQuCgpNeSBpbnR1aXRpb24gc2F5cyAqdGhpcyBpcyByZWFjaGFibGUgYW5kIHdvcnRoIHRhcmdldGluZy4qCgpIZXJlJiMzOTtzIHdoeToKCiogICAqKkNvcmUgTmV0d29ya2luZyBJbXBhY3QqKjogVGhlIGNoYW5nZXMgYWZmZWN0IHRoZSBQU1Agc3Vic3lzdGVtIChgbmV0L3BzcC9gKSBhbmQgYG5ldGRldnNpbWAsIHdoaWNoIGFyZSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIGNvbXBvbmVudHMuCiogICAqKktleSBMaWZlY3ljbGUgTW9kaWZpY2F0aW9ucyoqOiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIFR4IGtleSBsaWZlY3ljbGUsIHNvY2tldCBhc3NvY2lhdGlvbnMsIGRldmljZSByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24sIGFuZCB0aGUgbmV0bGluayBQU1AgaW50ZXJmYWNlLiBUaGVzZSBhcmUgYWxsIGhpZ2gtdmFsdWUgdGFyZ2V0cyBmb3IgZnV6emluZy4KKiAgICoqQ29uY3VycmVuY3kvTG9ja2luZyoqOiBUaGUgcHJlc2VuY2Ugb2YgYGxvY2tkZXBfYXNzZXJ0X2hlbGRgIHN1Z2dlc3RzIHBvdGVudGlhbCBjb25jdXJyZW5jeSBpc3N1ZXMuCiogICAqKkRhdGEgU3RydWN0dXJlIE1hbmlwdWxhdGlvbioqOiBUaGVyZSYjMzk7cyBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBvZiBkYXRhIHN0cnVjdHVyZXMgKGxpa2UgYHBzcF9hc3NvY19kdW1teWApLiBNZW1vcnkgY29ycnVwdGlvbiBpcyBhbHdheXMgYSBjb25jZXJuLgoqICAgKipBY2Nlc3NpYmlsaXR5Kio6IEl0JiMzOTtzIGFsbCByZWFjaGFibGUgaW4gUUVNVSwgd2hpY2ggaXMgaWRlYWwgZm9yIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zIHRoYXQgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLCBmb2N1c2luZyBvbiBlbnRyeSBwb2ludHMgdGhhdCBjYW4gYmUgZnV6emVkOgoKKiAgICoqTW9kaWZpZWQgRnVuY3Rpb25zKio6IGBwc3BfZGV2X2NyZWF0ZWAsIGBwc3BfZGV2X3VucmVnaXN0ZXJgIGluIGBuZXQvcHNwL3BzcF9tYWluLmNgLCBgcHNwX2Rldl90eF9rZXlfYWRkYCwgYHBzcF9kZXZfdHhfa2V5X2RlbGAsIGBwc3BfYXNzb2NfZnJlZWAsIGFuZCBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCBpbiBgbmV0L3BzcC9wc3Bfc29jay5jYCwgYG5zaW1fZG9fcHNwYCBhbmQgYG5zaW1fcHNwX3VuaW5pdGAgaW4gYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AuCiogICAqKkFkZGVkIFN0YXRpYyBGdW5jdGlvbnMqKjogYHBzcF9hc3NvY19zZXRfdHhgIGFuZCBgcHNwX3NvY2tfc2V0X3R4X2tleWAgaW4gYG5ldC9wc3AvcHNwX3NvY2suY2AuIEkgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZXNlIGFyZSBpbmxpbmVkIG9yIGhhdmUgZW50cnkgcG9pbnRzLgoKSSYjMzk7bGwKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwc3Bfc29ja19hc3NvY19zZXRfdHgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3BzcC9wc3AuaD0yNj1pbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3J4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuLS1cbm5ldC9wc3AvcHNwLmgtMjgtXHRcdFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xubmV0L3BzcC9wc3AuaDoyOTppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbm5ldC9wc3AvcHNwLmgtMzAtXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4tLVxubmV0L3BzcC9wc3BfbmwuYz04MjY9aW50IHBzcF9ubF90eF9hc3NvY19kb2l0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4tLVxubmV0L3BzcC9wc3BfbmwuYy04NTctXG5uZXQvcHNwL3BzcF9ubC5jOjg1ODpcdGVyciA9IHBzcF9zb2NrX2Fzc29jX3NldF90eChzb2NrZXQtXHUwMDNlc2ssIHBzZCwgdmVyc2lvbiwgXHUwMDI2a2V5LFxubmV0L3BzcC9wc3BfbmwuYy04NTktXHRcdFx0XHQgICAgaW5mby1cdTAwM2VleHRhY2spO1xuLS1cbm5ldC9wc3AvcHNwX3NvY2suYz0yMTQ9cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi0tXG5uZXQvcHNwL3BzcF9zb2NrLmMtMjQxLVxubmV0L3BzcC9wc3Bfc29jay5jOjI0MjppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbm5ldC9wc3AvcHNwX3NvY2suYy0yNDMtXHRcdFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNDgxCgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogNTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOgoKKipEaXZpbmcgaW50byBQU1AgU29ja2V0IE1hbmFnZW1lbnQqKgoKQWxyaWdodCwgdGltZSB0byBkaWcgaW50byB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZS4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGlzIFBTUCBzb2NrZXQgYXNzb2NpYXRpb24gcHJvY2VzcyB3b3Jrcy4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWFuYWdpbmcgdHJhbnNtaXQga2V5cyBhbmQgYXNzb2NpYXRpb25zLiBMZXQmIzM5O3Mgc3RhcnQgYnkgbG9va2luZyBjbG9zZWx5IGF0IGBwc3BfYXNzb2NfZnJlZWAuIEkgd2FudCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCB3aGVuIGFuIGFzc29jaWF0aW9uIGlzIHRlcm1pbmF0ZWQuIFdoYXQgaGFwcGVucyB0byB0aGUgdW5kZXJseWluZyBkYXRhIHN0cnVjdHVyZXM/IFdoYXQmIzM5O3MgdGhlIGNvbXBsZXRlIHRlYXJkb3duIHByb2Nlc3M/CgpUaGVuLCBJJiMzOTtsbCBtb3ZlIG9uIHRvIGBwc3BfZGV2X3R4X2tleV9hZGRgIGFuZCBgcHNwX2Rldl90eF9rZXlfZGVsYC4gSSBuZWVkIHRvIGVuc3VyZSBJIGhhdmUgYSBzb2xpZCBncmFzcCBvZiBob3cgdHJhbnNtaXQga2V5cyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQgZm9yIHRoZSBhc3NvY2lhdGVkIGRldmljZXMuIFdoYXQgYXJlIHRoZSBrZXkgbWFuYWdlbWVudCBtZWNoYW5pY3M/IEhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIGhhcmR3YXJlPyBBbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBJIHNob3VsZCBiZSBtaW5kZnVsIG9mPyBJIG5lZWQgdG8gbG9vayBhdCB0aGUgbG9ja2luZyBzdHJhdGVneSB3aXRoaW4gdGhlc2UgZnVuY3Rpb25zLgoKRmluYWxseSwgdGhlIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgIGZ1bmN0aW9uLiBUaGlzIGxpa2VseSBvcmNoZXN0cmF0ZXMgdGhlIG92ZXJhbGwgcHJvY2VzcyBvZiBzZXR0aW5nIHVwIHRoZSB0cmFuc21pdCBjb25maWd1cmF0aW9uIGZvciB0aGUgc29ja2V0IGFzc29jaWF0aW9uLCBzbyBJIHNob3VsZCBiZSBhYmxlIHRvIGdldCBhIGdvb2Qgc2Vuc2Ugb2YgdGhlIGNvbXBsZXRlIGZsb3cgYnkgc3R1ZHlpbmcgdGhlIGZ1bmN0aW9uLiBJIG5lZWQgdG8gYmUgc3VyZSBJIGFtIHZlcnkgY2xlYXIgb24gdGhlIHBhcmFtZXRlcnMgaGVyZSBhbmQgd2hhdCB0aGV5IGFyZSB1c2VkIGZvci4gSSB3aWxsIGNoZWNrIGZvciBlcnJvciBoYW5kbGluZyBoZXJlIHRvby4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL3BzcF9zb2NrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDcwOlx0e1xuICA3MTpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gIDcyOlx0XHRzaXplX3Qgc3o7XG4gIDczOlx0XG4gIDc0Olx0XHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAgNzU6XHRcbiAgNzY6XHRcdHN6ID0gc3RydWN0X3NpemUocGFzLCBkcnZfZGF0YSwgcHNkLVx1MDAzZWNhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XG4gIDc3Olx0XHRyZXR1cm4ga21lbWR1cChwYXMsIHN6LCBHRlBfS0VSTkVMKTtcbiAgNzg6XHR9XG4gIDc5Olx0XG4gIDgwOlx0c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuICA4MTpcdFx0XHRcdCAgICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuICA4MjpcdFx0XHRcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAgODM6XHR7XG4gIDg0Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpkdW1teTtcbiAgODU6XHRcdGludCBlcnI7XG4gIDg2Olx0XG4gIDg3Olx0XHQvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dFxuICA4ODpcdFx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJiMzOTtsbCBuZWVkIHRvXG4gIDg5Olx0XHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbiAgOTA6XHRcdCAqL1xuICA5MTpcdFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbiAgOTI6XHRcdGlmICghZHVtbXkpXG4gIDkzOlx0XHRcdHJldHVybiAtRU5PTUVNO1xuICA5NDpcdFxuICA5NTpcdFx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4gIDk2Olx0XHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbiAgOTc6XHRcdGlmICghZXJyKVxuICA5ODpcdFx0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbiAgOTk6XHRcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuIDEwMDpcdFxuIDEwMTpcdFx0a2ZyZWUoZHVtbXkpO1xuIDEwMjpcdFx0cmV0dXJuIGVycjtcbiAxMDM6XHR9XG4gMTA0Olx0XG4gMTA1Olx0dm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIDEwNjpcdHtcbiAxMDc6XHRcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gMTA4Olx0fVxuIDEwOTpcdFxuIDExMDpcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbiAxMTE6XHR7XG4gMTEyOlx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzcF9hc3NvYywgd29yayk7XG4gMTEzOlx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVx1MDAzZXBzZDtcbiAxMTQ6XHRcbiAxMTU6XHRcdG11dGV4X2xvY2soXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDExNjpcdFx0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XG4gMTE3Olx0XHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuIDExODpcdFx0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gMTE5Olx0XHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4gMTIwOlx0XHR9XG4gMTIxOlx0XHRtdXRleF91bmxvY2soXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDEyMjpcdFx0cHNwX2Rldl9wdXQocHNkKTtcbiAxMjM6XHRcdGtmcmVlKHBhcyk7XG4gMTI0Olx0fVxuIDEyNTpcdFxuIDEyNjpcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlX3F1ZXVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbiAxMjc6XHR7XG4gMTI4Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBzcF9hc3NvYywgcmN1KTtcbiAxMjk6XHRcbiAxMzA6XHRcdElOSVRfV09SSyhcdTAwMjZwYXMtXHUwMDNld29yaywgcHNwX2Fzc29jX2ZyZWUpO1xuIDEzMTpcdFx0c2NoZWR1bGVfd29yayhcdTAwMjZwYXMtXHUwMDNld29yayk7XG4gMTMyOlx0fVxuIDEzMzpcdFxuIDEzNDpcdC8qKlxuIDEzNTpcdCAqIHBzcF9hc3NvY19wdXQoKSAtIHJlbGVhc2UgYSByZWZlcmVuY2Ugb24gYSBQU1AgYXNzb2NpYXRpb25cbiAxMzY6XHQgKiBAcGFzOiBhc3NvY2lhdGlvbiB0byByZWxlYXNlXG4gMTM3Olx0ICovXG4gMTM4Olx0dm9pZCBwc3BfYXNzb2NfcHV0KHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxMzk6XHR7XG4gMTQwOlx0XHRpZiAocGFzIFx1MDAyNlx1MDAyNiByZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2cGFzLVx1MDAzZXJlZmNudCkpXG4gMTQxOlx0XHRcdGNhbGxfcmN1KFx1MDAyNnBhcy1cdTAwM2VyY3UsIHBzcF9hc3NvY19mcmVlX3F1ZXVlKTtcbiAxNDI6XHR9XG4gMTQzOlx0XG4gMTQ0Olx0dm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spXG4gMTQ1Olx0e1xuIDE0NjpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzay1cdTAwM2Vwc3BfYXNzb2MsIDEpO1xuIDE0NzpcdFxuIDE0ODpcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHNrLVx1MDAzZXBzcF9hc3NvYywgTlVMTCk7XG4gMTQ5Olx0XHRwc3BfYXNzb2NfcHV0KHBhcyk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1MDkwCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgcHNwX3NvY2suY2AqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgc3BlY2lmaWMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZSBhZ2Fpbi4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gbGluZXMgMjAwIHRocm91Z2ggMjgwLiBUaGF0IHNlY3Rpb24gbGlrZWx5IGNvbnRhaW5zIHRoZSBzb2NrZXQtc3BlY2lmaWMgZnVuY3Rpb25zIG9yIHN0cnVjdHVyZXMgSSYjMzk7bSBpbnRlcmVzdGVkIGluLCBnaXZlbiB0aGUgY29udGV4dC4gSSYjMzk7bSBob3BpbmcgdG8gcXVpY2tseSBpZGVudGlmeSB0aGUgcmVsZXZhbnQgZGF0YSBzdHJ1Y3R1cmVzIG9yIGZ1bmN0aW9uIGNhbGxzIHJlbGF0ZWQgdG8gdGhlIGlzc3VlIEkmIzM5O20gaW52ZXN0aWdhdGluZy4gSSBrbm93IEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgY29kZSwgc28gSSBhbnRpY2lwYXRlIGJlaW5nIGFibGUgdG8gZ3Jhc3AgdGhlIGNvcmUgbG9naWMgdGhlcmUgcXVpY2tseSBhbmQgZGV0ZXJtaW5lIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZS4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZWl0aGVyIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBoYW5kbGluZyBvZiBzcGVjaWZpYyBzb2NrZXQgb3BlcmF0aW9ucyBvciBwZXJoYXBzIGdldCBhIGhpbnQgYWJvdXQgaG93IHRoaXMgcGFydCBvZiB0aGUgbmV0d29yayBzdGFjayBpbnRlcmFjdHMgd2l0aCBvdGhlciBtb2R1bGVzLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGZpbmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3BzcC9wc3Bfc29jay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTcwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDkwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNzA6XHRcdGVyciA9IDA7XG4gMTcxOlx0XG4gMTcyOlx0ZXhpdF91bmxvY2s6XG4gMTczOlx0XHRyZWxlYXNlX3NvY2soc2spO1xuIDE3NDpcdFxuIDE3NTpcdFx0cmV0dXJuIGVycjtcbiAxNzY6XHR9XG4gMTc3Olx0XG4gMTc4Olx0c3RhdGljIGludCBwc3BfYXNzb2Nfc2V0X3R4KHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAxNzk6XHRcdFx0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXG4gMTgwOlx0XHRcdFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAxODE6XHR7XG4gMTgyOlx0XHRpbnQgZXJyO1xuIDE4MzpcdFxuIDE4NDpcdFx0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xuIDE4NTpcdFx0XHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcbiAxODY6XHRcdFx0aWYgKGVycilcbiAxODc6XHRcdFx0XHRyZXR1cm4gZXJyO1xuIDE4ODpcdFx0fVxuIDE4OTpcdFxuIDE5MDpcdFx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuIDE5MTpcdFx0cmV0dXJuIDA7XG4gMTkyOlx0fVxuIDE5MzpcdFxuIDE5NDpcdHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxOTU6XHR7XG4gMTk2Olx0XHRzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTtcbiAxOTc6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4gMTk4Olx0XG4gMTk5Olx0XHRza2JfcmJ0cmVlX3dhbGsoc2tiLCBcdTAwMjZ0Y3Bfc2soc2spLVx1MDAzZW91dF9vZl9vcmRlcl9xdWV1ZSkge1xuIDIwMDpcdFx0XHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XG4gMjAxOlx0XHRcdGlmICghcHNwX3BzZV9tYXRjaGVzX3Bhcyhwc2UsIHBhcykpXG4gMjAyOlx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbiAyMDM6XHRcdH1cbiAyMDQ6XHRcbiAyMDU6XHRcdHNrYl9xdWV1ZV93YWxrKFx1MDAyNnNrLVx1MDAzZXNrX3JlY2VpdmVfcXVldWUsIHNrYikge1xuIDIwNjpcdFx0XHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XG4gMjA3Olx0XHRcdGlmICghcHNwX3BzZV9tYXRjaGVzX3Bhcyhwc2UsIHBhcykpXG4gMjA4Olx0XHRcdFx0cmV0dXJuIC1FQlVTWTtcbiAyMDk6XHRcdH1cbiAyMTA6XHRcdHJldHVybiAwO1xuIDIxMTpcdH1cbiAyMTI6XHRcbiAyMTM6XHRzdGF0aWMgaW50XG4gMjE0Olx0cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAyMTU6XHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gMjE2Olx0e1xuIDIxNzpcdFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xuIDIxODpcdFx0aW50IGVycjtcbiAyMTk6XHRcbiAyMjA6XHRcdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4gMjIxOlx0XHRpZiAoZXJyKSB7XG4gMjIyOlx0XHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjayxcbiAyMjM6XHRcdFx0XHQgICAgICAgXCYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVwmIzM0Oyk7XG4gMjI0Olx0XHRcdHJldHVybiBlcnI7XG4gMjI1Olx0XHR9XG4gMjI2Olx0XG4gMjI3Olx0XHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4gMjI4Olx0XHRpZiAoZXJyKVxuIDIyOTpcdFx0XHRyZXR1cm4gZXJyO1xuIDIzMDpcdFxuIDIzMTpcdFx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuIDIzMjpcdFx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbiAyMzM6XHRcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbiAyMzQ6XHRcbiAyMzU6XHRcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4gMjM2Olx0XHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7XG4gMjM3Olx0XHRpY3NrLVx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XG4gMjM4Olx0XG4gMjM5Olx0XHRyZXR1cm4gZXJyO1xuIDI0MDpcdH1cbiAyNDE6XHRcbiAyNDI6XHRpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiAyNDM6XHRcdFx0XHQgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiAyNDQ6XHRcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbiAyNDU6XHR7XG4gMjQ2Olx0XHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XG4gMjQ3Olx0XHRpbnQgZXJyO1xuIDI0ODpcdFxuIDI0OTpcdFx0bG9ja19zb2NrKHNrKTtcbiAyNTA6XHRcbiAyNTE6XHRcdHBhcyA9IHBzcF9za19hc3NvYyhzayk7XG4gMjUyOlx0XHRpZiAoIXBhcykge1xuIDI1MzpcdFx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1NvY2tldCBoYXMgbm8gUngga2V5XCYjMzQ7KTtcbiAyNTQ6XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiAyNTU6XHRcdFx0Z290byBleGl0X3VubG9jaztcbiAyNTY6XHRcdH1cbiAyNTc6XHRcdGlmIChwYXMtXHUwMDNlcHNkICE9IHBzZCkge1xuIDI1ODpcdFx0XHROTF9TRVRfRVJSX01TRyhleHRhY2ssIFwmIzM0O1J4IGtleSBmcm9tIGRpZmZlcmVudCBkZXZpY2VcJiMzNDspO1xuIDI1OTpcdFx0XHRlcnIgPSAtRUlOVkFMO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjcxNAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDMxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkludmVzdGlnYXRpbmcgUG90ZW50aWFsIFBTUCBEZXZpY2UgRHJpdmVyIElzc3VlcyoqCgpPa2F5LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoaXMgcHJvYmxlbS4gQmFzZWQgb24gd2hhdCBJJiMzOTt2ZSBzZWVuLCBpdCBzZWVtcyBsaWtlIHRoZSBpc3N1ZSBtaWdodCBiZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvciBkZXN0cnVjdGlvbiBvZiB0aGUgUFNQIGRldmljZSB3aXRoaW4gdGhlIGtlcm5lbC4gTGV0JiMzOTtzIHN0YXJ0IGJ5IHplcm9pbmcgaW4gb24gYG5ldC9wc3AvcHNwX21haW4uY2AuIE15IGluc3RpbmN0IGlzIHRvIGV4YW1pbmUgdGhlIGFyZWFzIGFyb3VuZCBgcHNwX2Rldl9jcmVhdGVgIGFuZCBgcHNwX2Rldl91bnJlZ2lzdGVyYCBmdW5jdGlvbnMuIFRoZXNlIGFyZSBsaWtlbHkgdGhlIGNvcmUgZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBQU1AgZGV2aWNlLCBzbyBhbnkgaXNzdWVzIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24gb3IgY2xlYW51cCB3b3VsZCBtYW5pZmVzdCBhcm91bmQgdGhvc2UgY2FsbHMuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkLCB3aGF0IGNoZWNrcyBhcmUgYmVpbmcgcGVyZm9ybWVkLCBhbmQgaWYgYW55IGVycm9ycyBhcmUgYmVpbmcgaGFuZGxlZCBhcHByb3ByaWF0ZWx5LiBUaGF0JiMzOTtzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGJlZ2luIG15IGRlYnVnZ2luZyBwcm9jZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9wc3AvcHNwX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDExMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDU1Olx0ICpcbiAgNTY6XHQgKiBSZXR1cm46IHBvaW50ZXIgdG8gYWxsb2NhdGVkIFBTUCBkZXZpY2UsIG9yIEVSUl9QVFIuXG4gIDU3Olx0ICovXG4gIDU4Olx0c3RydWN0IHBzcF9kZXYgKlxuICA1OTpcdHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gIDYwOlx0XHQgICAgICAgc3RydWN0IHBzcF9kZXZfb3BzICpwc2Rfb3BzLCBzdHJ1Y3QgcHNwX2Rldl9jYXBzICpwc2RfY2FwcyxcbiAgNjE6XHRcdCAgICAgICB2b2lkICpwcml2X3B0cilcbiAgNjI6XHR7XG4gIDYzOlx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xuICA2NDpcdFx0c3RhdGljIHUzMiBsYXN0X2lkO1xuICA2NTpcdFx0aW50IGVycjtcbiAgNjY6XHRcbiAgNjc6XHRcdGlmIChXQVJOX09OKCFwc2RfY2Fwcy1cdTAwM2V2ZXJzaW9ucyB8fFxuICA2ODpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNlc2V0X2NvbmZpZyB8fFxuICA2OTpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNla2V5X3JvdGF0ZSB8fFxuICA3MDpcdFx0XHQgICAgIXBzZF9vcHMtXHUwMDNlcnhfc3BpX2FsbG9jIHx8XG4gIDcxOlx0XHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbiAgNzI6XHRcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4gIDczOlx0XHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuICA3NDpcdFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiAgNzU6XHRcbiAgNzY6XHRcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuICA3NzpcdFx0aWYgKCFwc2QpXG4gIDc4Olx0XHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuICA3OTpcdFxuICA4MDpcdFx0cHNkLVx1MDAzZW1haW5fbmV0ZGV2ID0gbmV0ZGV2O1xuICA4MTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0KTtcbiAgODI6XHRcdHBzZC1cdTAwM2VvcHMgPSBwc2Rfb3BzO1xuICA4MzpcdFx0cHNkLVx1MDAzZWNhcHMgPSBwc2RfY2FwcztcbiAgODQ6XHRcdHBzZC1cdTAwM2VkcnZfcHJpdiA9IHByaXZfcHRyO1xuICA4NTpcdFxuICA4NjpcdFx0bXV0ZXhfaW5pdChcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gIDg3Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZwc2QtXHUwMDNlYWN0aXZlX2Fzc29jcyk7XG4gIDg4Olx0XHRJTklUX0xJU1RfSEVBRChcdTAwMjZwc2QtXHUwMDNlcHJldl9hc3NvY3MpO1xuICA4OTpcdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4gIDkwOlx0XHRyZWZjb3VudF9zZXQoXHUwMDI2cHNkLVx1MDAzZXJlZmNudCwgMSk7XG4gIDkxOlx0XG4gIDkyOlx0XHRtdXRleF9sb2NrKFx1MDAyNnBzcF9kZXZzX2xvY2spO1xuICA5MzpcdFx0ZXJyID0geGFfYWxsb2NfY3ljbGljKFx1MDAyNnBzcF9kZXZzLCBcdTAwMjZwc2QtXHUwMDNlaWQsIHBzZCwgeGFfbGltaXRfMTZiLFxuICA5NDpcdFx0XHRcdCAgICAgIFx1MDAyNmxhc3RfaWQsIEdGUF9LRVJORUwpO1xuICA5NTpcdFx0aWYgKGVycikge1xuICA5NjpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2cHNwX2RldnNfbG9jayk7XG4gIDk3Olx0XHRcdGtmcmVlKHBzZCk7XG4gIDk4Olx0XHRcdHJldHVybiBFUlJfUFRSKGVycik7XG4gIDk5Olx0XHR9XG4gMTAwOlx0XHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAxMDE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxMDI6XHRcbiAxMDM6XHRcdC8qIG5vdGlmeSBiZWZvcmUgbmV0ZGV2IGFzc2lnbm1lbnRcbiAxMDQ6XHRcdCAqIFRoZXJlJiMzOTtzIG5vIHN0cm9uZyByZWFzb24gZm9yIGl0LCBidXQgdGhpbmtpbmcgaXMgdG8gYXZvaWQgY3JlYXRpbmdcbiAxMDU6XHRcdCAqIGltcGxpY2l0IGV4cGVjdGF0aW9ucyBhYm91dCB0aGUgUFNQIGRldiBcdTAwM2NcdTAwM2UgbmV0ZGV2IHJlbGF0aW9uc2hpcC5cbiAxMDY6XHRcdCAqL1xuIDEwNzpcdFx0cHNwX25sX25vdGlmeV9kZXYocHNkLCBQU1BfQ01EX0RFVl9BRERfTlRGKTtcbiAxMDg6XHRcbiAxMDk6XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXRkZXYtXHUwMDNlcHNwX2RldiwgcHNkKTtcbiAxMTA6XHRcbiAxMTE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gMTEyOlx0XG4gMTEzOlx0XHRyZXR1cm4gcHNkO1xuIDExNDpcdH1cbiAxMTU6XHRFWFBPUlRfU1lNQk9MKHBzcF9kZXZfY3JlYXRlKTtcbiAxMTY6XHRcbiAxMTc6XHR2b2lkIHBzcF9kZXZfZnJlZShzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIDExODpcdHtcbiAxMTk6XHRcdG11dGV4X2xvY2soXHUwMDI2cHNwX2RldnNfbG9jayk7XG4gMTIwOlx0XHR4YV9lcmFzZShcdTAwMjZwc3BfZGV2cywgcHNkLVx1MDAzZWlkKTtcbiAxMjE6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxMjI6XHRcbiAxMjM6XHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuIDEyNDpcdFx0a2ZyZWVfcmN1KHBzZCwgcmN1KTtcbiAxMjU6XHR9XG4gMTI2Olx0XG4gMTI3Olx0LyoqXG4gMTI4Olx0ICogcHNwX2Rldl91bnJlZ2lzdGVyKCkgLSB1bnJlZ2lzdGVyIFBTUCBkZXZpY2VcbiAxMjk6XHQgKiBAcHNkOlx0UFNQIGRldmljZSBzdHJ1Y3R1cmVcbiAxMzA6XHQgKi9cbiAxMzE6XHR2b2lkIHBzcF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIDEzMjpcdHtcbiAxMzM6XHRcdHN0cnVjdCBwc3BfYXNzb2NfZGV2ICplbnRyeSwgKmVudHJ5X3RtcDtcbiAxMzQ6XHRcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKm5leHQ7XG4gMTM1Olx0XG4gMTM2Olx0XHRtdXRleF9sb2NrKFx1MDAyNnBzcF9kZXZzX2xvY2spO1xuIDEzNzpcdFx0bXV0ZXhfbG9jayhcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gMTM4Olx0XG4gMTM5Olx0XHRwc3Bfbmxfbm90aWZ5X2Rldihwc2QsIFBTUF9DTURfREVWX0RFTF9OVEYpO1xuIDE0MDpcdFxuIDE0MTpcdFx0LyogV2FpdCB1bnRpbCBwc3BfZGV2X2ZyZWUoKSB0byBjYWxsIHhhX2VyYXNlKCkgdG8gcHJldmVudCBhXG4gMTQyOlx0XHQgKiBkaWZmZXJlbnQgcHNkIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlIHhhcnJheSB3aXRoIHRoaXMgaWQsIHdoaWxlXG4gMTQzOlx0XHQgKiB0aGVyZSBhcmUgc3RpbGwgcmVmZXJlbmNlcyB0byB0aGlzIHBzZCBiZWluZyBoZWxkLlxuIDE0NDpcdFx0ICovXG4gMTQ1Olx0XHR4YV9zdG9yZShcdTAwMjZwc3BfZGV2cywgcHNkLVx1MDAzZWlkLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiAxNDY6XHRcdG11dGV4X3VubG9jayhcdTAwMjZwc3BfZGV2c19sb2NrKTtcbiAxNDc6XHRcbiAxNDg6XHRcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gMTQ5Olx0XHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4gMTUwOlx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkge1xuIDE1MTpcdFx0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiAxNTI6XHRcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuIDE1MzpcdFx0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuIDE1NDpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODU3MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIHRoZSBOZXRkZXZzaW0gUFNQIERyaXZlcioqCgpPa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZSBOZXRkZXZzaW0mIzM5O3MgUFNQIChQYWNrZXQtU2NoZWR1bGluZyBQcm9jZXNzb3IpIGRyaXZlciBvcGVyYXRlcy4gSSYjMzk7bSBnb2luZyB0byBqdW1wIHN0cmFpZ2h0IGludG8gdGhlIGNvZGUgYW5kIHN0YXJ0IHdpdGggYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEZyb20gdGhlcmUsIEkgY2FuIGRlbHZlIGludG8gdGhlIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDcwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdFxuICAgMzpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2lwLmhcdTAwM2VcbiAgIDQ6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9za2J1ZmYuaFx1MDAzZVxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY25ldC9pcDZfY2hlY2tzdW0uaFx1MDAzZVxuICAgNjpcdCNpbmNsdWRlIFx1MDAzY25ldC9wc3AuaFx1MDAzZVxuICAgNzpcdCNpbmNsdWRlIFx1MDAzY25ldC9zb2NrLmhcdTAwM2VcbiAgIDg6XHRcbiAgIDk6XHQjaW5jbHVkZSBcJiMzNDtuZXRkZXZzaW0uaFwmIzM0O1xuICAxMDpcdFxuICAxMTpcdHZvaWQgbnNpbV9wc3BfaGFuZGxlX2V4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tiX2V4dCAqcHNwX2V4dClcbiAgMTI6XHR7XG4gIDEzOlx0XHRpZiAocHNwX2V4dClcbiAgMTQ6XHRcdFx0X19za2JfZXh0X3NldChza2IsIFNLQl9FWFRfUFNQLCBwc3BfZXh0KTtcbiAgMTU6XHR9XG4gIDE2Olx0XG4gIDE3Olx0ZW51bSBza2JfZHJvcF9yZWFzb25cbiAgMTg6XHRuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucyxcbiAgMTk6XHRcdCAgICBzdHJ1Y3QgbmV0ZGV2c2ltICpwZWVyX25zLCBzdHJ1Y3Qgc2tiX2V4dCAqKnBzcF9leHQpXG4gIDIwOlx0e1xuICAyMTpcdFx0ZW51bSBza2JfZHJvcF9yZWFzb24gcmMgPSAwO1xuICAyMjpcdFx0c3RydWN0IHBzcF9kZXYgKnBlZXJfcHNkO1xuICAyMzpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuICAyNDpcdFx0c3RydWN0IG5ldCAqbmV0O1xuICAyNTpcdFx0aW50IHBzcF9sZW47XG4gIDI2Olx0XG4gIDI3Olx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDI4Olx0XHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcbiAgMjk6XHRcdGlmICghcGFzKSB7XG4gIDMwOlx0XHRcdHJjID0gU0tCX05PVF9EUk9QUEVEX1lFVDtcbiAgMzE6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICAzMjpcdFx0fVxuICAzMzpcdFxuICAzNDpcdFx0aWYgKCFza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpIHtcbiAgMzU6XHRcdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbiAgMzY6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICAzNzpcdFx0fVxuICAzODpcdFxuICAzOTpcdFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiAgNDA6XHRcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gIDQxOlx0XHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG4gIDQyOlx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiAgNDM6XHRcdH1cbiAgNDQ6XHRcbiAgNDU6XHRcdHBzcF9sZW4gPSBza2ItXHUwMDNlbGVuIC0gc2tiX2lubmVyX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTtcbiAgNDY6XHRcdGF0b21pYzY0X2luYyhcdTAwMjZucy1cdTAwM2Vwc3AudHhfcGFja2V0cyk7XG4gIDQ3Olx0XHRhdG9taWM2NF9hZGQocHNwX2xlbiwgXHUwMDI2bnMtXHUwMDNlcHNwLnR4X2J5dGVzKTtcbiAgNDg6XHRcbiAgNDk6XHRcdC8qIE5vdyBwcmV0ZW5kIHdlIGp1c3QgcmVjZWl2ZWQgdGhpcyBmcmFtZSAqL1xuICA1MDpcdFx0cGVlcl9wc2QgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9ucy1cdTAwM2Vwc3AuZGV2KTtcbiAgNTE6XHRcdGlmIChwZWVyX3BzZCBcdTAwMjZcdTAwMjYgcGVlcl9wc2QtXHUwMDNlY29uZmlnLnZlcnNpb25zIFx1MDAyNiAoMSBcdTAwM2NcdTAwM2MgcGFzLVx1MDAzZXZlcnNpb24pKSB7XG4gIDUyOlx0XHRcdGJvb2wgc3RyaXBfaWN2ID0gZmFsc2U7XG4gIDUzOlx0XHRcdHU4IGdlbmVyYXRpb247XG4gIDU0Olx0XG4gIDU1Olx0XHRcdC8qIFdlIGNoZWF0IGEgYml0IGFuZCBwdXQgdGhlIGdlbmVyYXRpb24gaW4gdGhlIGtleS5cbiAgNTY6XHRcdFx0ICogSW4gcmVhbCBsaWZlIGlmIGdlbmVyYXRpb24gd2FzIHRvbyBvbGQsIHRoZW4gZGVjcnlwdGlvbiB3b3VsZFxuICA1NzpcdFx0XHQgKiBmYWlsLiBIZXJlLCB3ZSBqdXN0IG1ha2UgaXQgc28gYSBiYWQga2V5IGNhdXNlcyBhIGJhZFxuICA1ODpcdFx0XHQgKiBnZW5lcmF0aW9uIHRvbywgYW5kIHBzcF9za19yeF9wb2xpY3lfY2hlY2soKSB3aWxsIGZhaWwuXG4gIDU5Olx0XHRcdCAqL1xuICA2MDpcdFx0XHRnZW5lcmF0aW9uID0gcGFzLVx1MDAzZXR4LmtleVswXTtcbiAgNjE6XHRcbiAgNjI6XHRcdFx0c2tiX2V4dF9yZXNldChza2IpO1xuICA2MzpcdFx0XHRza2ItXHUwMDNlbWFjX2xlbiA9IEVUSF9ITEVOO1xuICA2NDpcdFx0XHRpZiAocHNwX2Rldl9yY3Yoc2tiLCBwZWVyX3BzZC1cdTAwM2VpZCwgZ2VuZXJhdGlvbiwgc3RyaXBfaWN2KSkge1xuICA2NTpcdFx0XHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG4gIDY2Olx0XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuICA2NzpcdFx0XHR9XG4gIDY4Olx0XG4gIDY5Olx0XHRcdCpwc3BfZXh0ID0gc2tiLVx1MDAzZWV4dGVuc2lvbnM7XG4gIDcwOlx0XHRcdHJlZmNvdW50X2luYyhcdTAwMjYoKnBzcF9leHQpLVx1MDAzZXJlZmNudCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5ODEyCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgcHNwLmNgKioKCk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGJlaGF2aW9yIG9mIGBfX25zaW1fcHNwX3VuaW5pdGAuIEkgaW1tZWRpYXRlbHkga25vdyB0aGF0IGl0JiMzOTtzIGxvY2F0ZWQgd2l0aGluIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLCBzbyB0aGF0JiMzOTtzIHdoZXJlIEkmIzM5O2xsIGJlIHN0YXJ0aW5nLiBJJiMzOTttIGV4cGVjdGluZyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNyaXRpY2FsIGZvciB1bmluaXRpYWxpemluZyBvciBjbGVhbmluZyB1cCBhZnRlciBhIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSwgbGlrZWx5IHBlcnRhaW5pbmcgdG8gdGhlIFBhY2tldCBTd2l0Y2hpbmcgUGF0aCAoUFNQKSBjb21wb25lbnQsIHNpbmNlIHRoYXQgc2VlbXMgdG8gYmUgdGhlIGNvbnRleHQuIEkmIzM5O20gaG9waW5nIEkgY2FuIGdsZWFuIHNvbWUgaW5zaWdodHMgZnJvbSBob3cgaXQmIzM5O3MgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0JiMzOTtzIGNhbGxlZCwgc3BlY2lmaWNhbGx5IGFib3V0IHJlc291cmNlIG1hbmFnZW1lbnQgb3IgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGFjdHVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE4MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTgwOlx0fTtcbiAxODE6XHRcbiAxODI6XHRzdGF0aWMgc3RydWN0IHBzcF9kZXZfY2FwcyBuc2ltX3BzcF9jYXBzID0ge1xuIDE4MzpcdFx0LnZlcnNpb25zID0gMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzEyOCB8XG4gMTg0Olx0XHRcdCAgICAxIFx1MDAzY1x1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HTUFDXzEyOCB8XG4gMTg1Olx0XHRcdCAgICAxIFx1MDAzY1x1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcbiAxODY6XHRcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LFxuIDE4NzpcdH07XG4gMTg4Olx0XG4gMTg5Olx0c3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG4gMTkwOlx0e1xuIDE5MTpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZDtcbiAxOTI6XHRcbiAxOTM6XHRcdHBzZCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobnMtXHUwMDNlcHNwLmRldixcbiAxOTQ6XHRcdFx0XHRcdFx0dGVhcmRvd24gfHxcbiAxOTU6XHRcdFx0XHRcdFx0bG9ja2RlcF9pc19oZWxkKFx1MDAyNm5zLVx1MDAzZXBzcC5yZXJlZ19sb2NrKSk7XG4gMTk2Olx0XHRpZiAocHNkKSB7XG4gMTk3Olx0XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihucy1cdTAwM2Vwc3AuZGV2LCBOVUxMKTtcbiAxOTg6XHRcdFx0c3luY2hyb25pemVfcmN1KCk7XG4gMTk5Olx0XHRcdHBzcF9kZXZfdW5yZWdpc3Rlcihwc2QpO1xuIDIwMDpcdFx0fVxuIDIwMTpcdH1cbiAyMDI6XHRcbiAyMDM6XHR2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbiAyMDQ6XHR7XG4gMjA1Olx0XHRkZWJ1Z2ZzX3JlbW92ZShucy1cdTAwM2Vwc3AucmVyZWcpO1xuIDIwNjpcdFx0bXV0ZXhfZGVzdHJveShcdTAwMjZucy1cdTAwM2Vwc3AucmVyZWdfbG9jayk7XG4gMjA3Olx0XHRfX25zaW1fcHNwX3VuaW5pdChucywgdHJ1ZSk7XG4gMjA4Olx0fVxuIDIwOTpcdFxuIDIxMDpcdHN0YXRpYyBzc2l6ZV90XG4gMjExOlx0bnNpbV9wc3BfcmVyZWdfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsXG4gMjEyOlx0XHRcdCAgICAgbG9mZl90ICpwcG9zKVxuIDIxMzpcdHtcbiAyMTQ6XHRcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gMjE1Olx0XHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xuIDIxNjpcdFx0c3NpemVfdCByZXQ7XG4gMjE3Olx0XG4gMjE4Olx0XHRtdXRleF9sb2NrKFx1MDAyNm5zLVx1MDAzZXBzcC5yZXJlZ19sb2NrKTtcbiAyMTk6XHRcdF9fbnNpbV9wc3BfdW5pbml0KG5zLCBmYWxzZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIwNzAwCgkJCQkJCQlvdXRwdXQ6IDIxNwoJCQkJCQkJdGhvdWdodHM6IDUwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXNpcyBvZiBQU1AgYW5kIE5ldGRldnNpbSBJbnRlZ3JhdGlvbioqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBGaXJzdCwgSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBDbGVhcmx5LCBgQ09ORklHX0lORVRfUFNQYCBpcyBlc3NlbnRpYWwgc2luY2UgdGhpcyBwYXRjaCB0YXJnZXRzIHRoZSBgbmV0L3BzcC9gIGRpcmVjdG9yeSBhbmQgZW5hYmxlcyBQU1Agc3VwcG9ydCBpbiB0aGUgYG5ldGRldnNpbWAgZHJpdmVyLiBgQ09ORklHX05FVERFVlNJTWAgaXMgYWxzbyBjcml0aWNhbCwgaXQmIzM5O3MgdGhlIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSBkcml2ZXIgaXRzZWxmLiBJdCYjMzk7cyBvYnZpb3VzIHRoYXQgYElORVRfUFNQYCBoaW5nZXMgb24gYElORVRgIGFuZCBgTkVUREVWU0lNYCBkZXBlbmRzIG9uIGBORVRfQ09SRWAsIGBTWVNGU2AgYW5kIHRoZSBsaWtlLCBhcyBleHBlY3RlZC4KCk5leHQsIEkgbmVlZCB0byB2ZXJpZnkgdGhlIGNyaXRpY2FsIHN5bWJvbHMuIE15IGF0dGVudGlvbiBnb2VzIHRvOiBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCwgYHBzcF9zb2NrX3NldF90eF9rZXlgLCBhbmQgYG5zaW1fZG9fcHNwYC4gQXJlIHRoZXNlIGdlbnVpbmVseSAqc3BlY2lmaWMqIHRvIFBTUCBsb2dpYyB3aXRoaW4gbmV0ZGV2c2ltLCBvciBhcmUgdGhleSBtb3JlIGdlbmVyaWM/IFllcywgY29uZmlybWVkLiBUaGV5IGFyZSBhbGwgZGlyZWN0bHkgdGllZCB0byBQU1AgYW5kIHRoZSBuZXRkZXZzaW0gaW1wbGVtZW50YXRpb24uCgpOb3csIGxldCYjMzk7cyBjcmVhdGUgYSBjbGVhciBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzOgoKKiAgICoqUmVhY2hhYmlsaXR5OioqIFRoZXNlIG1vZGlmaWNhdGlvbnMgaW1wYWN0IGJvdGggdGhlIFBTUCBzdWJzeXN0ZW0gYW5kIHRoZSBzaW11bGF0ZWQgbmV0ZGV2c2ltIGRyaXZlci4gSW4gYSB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudCwgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGZ1bGx5IGFjY2Vzc2libGUgdGhyb3VnaCBuZXRsaW5rIGNvbW1hbmRzLCBzb2NrZXQgb3BlcmF0aW9ucywgYW5kIG5ldGRldnNpbSB2aXJ0dWFsIGRldmljZXMuCiogICAqKkNoYW5nZXM6KiogVGhpcyBwYXRjaCBtYWtlcyBzb21lIFR4IGtleSBvZmZsb2FkaW5nIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyBsYWNraW5nIFR4IFNBREIsIGFkZHJlc3NlcyBkcml2ZXIgcmVnaXN0cmF0aW9uIHZhbGlkYXRpb24gaW4gYHBzcF9kZXZfY3JlYXRlYCwgcmVmYWN0b3JzIGFzc29jaWF0aW9uIGNsZWFudXAgaW4gYHBzcF9kZXZfdW5yZWdpc3RlcmAgYW5kIGBwc3BfYXNzb2NfZnJlZWAsIGFuZCB1cGRhdGVzIGtleSBhc3NpZ25tZW50IGluIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgLgoqICAgKipDb25maWdzOioqIFdlIGhhdmUgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAuCiogICAqKkZvY3VzIFN5bWJvbHM6KiogVGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBhcmUgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAsIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCwgYW5kIGBuc2ltX2RvX3BzcGAuCgpSaWdodCwgdGhhdCBjb3ZlcnMgdGhlIGVzc2VudGlhbHMuIFRpbWUgZm9yIHRoZSB0b29sIGNhbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtJTkVUX1BTUCYjMzQ7LAogICAgJiMzNDtORVRERVZTSU0mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtwc3Bfc29ja19hc3NvY19zZXRfdHgmIzM0OywKICAgICYjMzQ7cHNwX3NvY2tfc2V0X3R4X2tleSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3R4X2tleV9hZGQmIzM0OywKICAgICYjMzQ7cHNwX2Rldl90eF9rZXlfZGVsJiMzNDssCiAgICAmIzM0O3BzcF9hc3NvY19mcmVlJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfY3JlYXRlJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdW5yZWdpc3RlciYjMzQ7LAogICAgJiMzNDtuc2ltX2RvX3BzcCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyBjb3JlIG5ldHdvcmtpbmcgUFNQIChQU1AgU2VjdXJpdHkgUHJvdG9jb2wpIHN1YnN5c3RlbSBsb2dpYyBhbmQgbmV0ZGV2c2ltIGRldmljZSBkcml2ZXIgY29kZS4gSXQgbWFrZXMgVHgga2V5IG9mZmxvYWQgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBkZXZpY2VzIHdpdGhvdXQgU0FEQiwgcmVmYWN0b3JzIGtleSBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBpbiBwc3Bfc29jay5jLCB1cGRhdGVzIGRldmljZSByZWdpc3RyYXRpb24gY2hlY2tzIGluIHBzcF9tYWluLmMsIGFuZCByZW1vdmVzIG9ic29sZXRlIGFzc29jIHRyYWNraW5nIGluIG5ldGRldnNpbS4gVGhlc2UgY29kZSBwYXRocyBhcmUgZnVsbHkgcmVhY2hhYmxlIHZpYSBuZXRsaW5rIGNvbW1hbmRzIGFuZCBuZXRkZXZzaW0gaW50ZXJmYWNlcyBpbiBzdGFuZGFyZCBRRU1VIGVudmlyb25tZW50cy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SU5FVF9QU1AmIzM0OywKICAgICYjMzQ7TkVUREVWU0lNJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7cHNwX3NvY2tfYXNzb2Nfc2V0X3R4JiMzNDssCiAgICAmIzM0O3BzcF9zb2NrX3NldF90eF9rZXkmIzM0OywKICAgICYjMzQ7cHNwX2Rldl90eF9rZXlfYWRkJiMzNDssCiAgICAmIzM0O3BzcF9kZXZfdHhfa2V5X2RlbCYjMzQ7LAogICAgJiMzNDtwc3BfYXNzb2NfZnJlZSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X2NyZWF0ZSYjMzQ7LAogICAgJiMzNDtwc3BfZGV2X3VucmVnaXN0ZXImIzM0OywKICAgICYjMzQ7bnNpbV9kb19wc3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtYWtlcyB0aGUgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZHJpdmVyIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgUFNQIGRldmljZXMgd2l0aG91dCBTQURCIHN1cHBvcnQsIHJlZmFjdG9yaW5nIFR4IGtleSBhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGFuZCByZW1vdmluZyB1bnVzZWQga2V5IGhhbmRsaW5nIGhvb2tzIGZyb20gbmV0ZGV2c2ltLiBBbGwgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBjb250aW51ZSB0byBiZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBga3phbGxvY19mbGV4YCwgYGt6YWxsb2Nfb2JqYCwgb3IgYGttZW1kdXBgLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgY2hlY2tzLCBsaXN0IG1hbmlwdWxhdGlvbiwgb3IgbGlmZWN5Y2xlIGhhbmRsaW5nIGZhbGwgc3RyaWN0bHkgdW5kZXIgdGhlIGRvbWFpbiBvZiBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYgpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgKaW5kZXggNTVhZWM0MTIzN2I5Yi4uMTgxYjZiYWFiYTdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oCiYjNDM7JiM0MzsmIzQzOyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaApAQCAtMTIyLDcgJiM0MzsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHsKIAkJc3RydWN0IGRlbnRyeSAqcmVyZWc7CiAJCXN0cnVjdCBtdXRleCByZXJlZ19sb2NrOwogCQl1MzIgc3BpOwotCQl1MzIgYXNzb2NfY250OwogCX0gcHNwOwogCiAJc3RydWN0IG5zaW1fYnVzX2RldiAqbnNpbV9idXNfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jCmluZGV4IDZiMzUzMmI1ZTM2MGQuLmI3NDUyYzQ5YjU4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuYwomIzQzOyYjNDM7JiM0MzsgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmMKQEAgLTIzLDcgJiM0MzsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLAogCXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJaW50IHBzcF9sZW47Ci0Jdm9pZCAqKnB0cjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTsKQEAgLTM3LDEyICYjNDM7MzYsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucywKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCWlmICgqcHRyICE9IG5zKSB7Ci0JCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAluZXQgPSBzb2NrX25ldChza2ItJmd0O3NrKTsKIAlpZiAoIXBzcF9kZXZfZW5jYXBzdWxhdGUobmV0LCBza2IsIHBhcy0mZ3Q7dHguc3BpLCBwYXMtJmd0O3ZlcnNpb24sIDApKSB7CiAJCXJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7CkBAIC0xNDksMTkgJiM0MzsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbiwKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuc2ltX2Fzc29jX2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCi0JCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKLXsKLQlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7Ci0Jdm9pZCAqKnB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOwotCi0JLyogQ29weSBkcnZfcHJpdiBmcm9tIHBzZCB0byBhc3NvYyAqLwotCSpwdHIgPSBwc2QtJmd0O2Rydl9wcml2OwotCW5zLSZndDtwc3AuYXNzb2NfY250JiM0MzsmIzQzOzsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiB7CiAJc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwpAQCAtMTc3LDE1ICYjNDM7MTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0Jc3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtJmd0O2Rydl9wcml2OwotCXZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTsKLQotCSpwdHIgPSBOVUxMOwotCW5zLSZndDtwc3AuYXNzb2NfY250LS07Ci19Ci0KIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHsKIAlzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC0mZ3Q7ZHJ2X3ByaXY7CkBAIC0yMDQsOCAmIzQzOzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cykKIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9vcHMgbnNpbV9wc3Bfb3BzID0gewogCS5zZXRfY29uZmlnCT0gbnNpbV9wc3Bfc2V0X2NvbmZpZywKIAkucnhfc3BpX2FsbG9jCT0gbnNpbV9yeF9zcGlfYWxsb2MsCi0JLnR4X2tleV9hZGQJPSBuc2ltX2Fzc29jX2FkZCwKLQkudHhfa2V5X2RlbAk9IG5zaW1fYXNzb2NfZGVsLAogCS5rZXlfcm90YXRlCT0gbnNpbV9rZXlfcm90YXRlLAogCS5nZXRfc3RhdHMJPSBuc2ltX2dldF9zdGF0cywKIH07CkBAIC0yMTUsNyAmIzQzOzE4NCw2IEBAIHN0YXRpYyBzdHJ1Y3QgcHNwX2Rldl9jYXBzIG5zaW1fcHNwX2NhcHMgPSB7CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHwKIAkJICAgIDEgJmx0OyZsdDsgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzI1NiB8CiAJCSAgICAxICZsdDsmbHQ7IFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LAotCS5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksCiB9OwogCiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bikKQEAgLTIzMCw3ICYjNDM7MTk4LDYgQEAgc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pCiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQlwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTsKIAl9Ci0JV0FSTl9PTihucy0mZ3Q7cHNwLmFzc29jX2NudCk7CiB9CiAKIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oIGIvaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oCmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmgKQEAgLTI0LDExICYjNDM7MjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpOwogLyogS2VybmVsLWZhY2luZyBBUEkgKi8KIHZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCi17Ci0JcmV0dXJuIHBhcy0mZ3Q7ZHJ2X2RhdGE7Ci19Ci0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUCkKIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pOwogdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmggYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAppbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaApAQCAtMjE5LDEyICYjNDM7MjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7CiAJICogQHR4X2tleV9hZGQ6IGFkZCBhIFR4IGtleSB0byB0aGUgZGV2aWNlCiAJICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2UKIAkgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuCiYjNDM7CSAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsCiYjNDM7CSAqIGlzIGFsc28gTlVMTC4KIAkgKi8KIAlpbnQgKCp0eF9rZXlfYWRkKShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7CiAJLyoqCiAJICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2UKIAkgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLgomIzQzOwkgKiBDYW4gYmUgbGVmdCBOVUxMIGlmIGRldmljZSBkb2VzIG5vdCBzdG9yZSBUeCBrZXlzIGFuZCBAdHhfa2V5X2FkZAomIzQzOwkgKiBpcyBhbHNvIE5VTEwuCiAJICovCiAJdm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7CiAKZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwLmggYi9uZXQvcHNwL3BzcC5oCmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwLmgKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3AuaApAQCAtNTMsNCAmIzQzOzUzLDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2lzX3JlZ2lzdGVyZWQoc3RydWN0IHBzcF9kZXYgKnBzZCkKIAlyZXR1cm4gISFwc2QtJmd0O29wczsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfZGV2X2hhc19zYWRiKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cHNkLSZndDtsb2NrKTsKJiM0MzsJcmV0dXJuICEhcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiYjNDM7ewomIzQzOwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7cGFzLSZndDtwc2QtJmd0O2xvY2spOwomIzQzOwlyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtJmd0O3BzZCkgJmFtcDsmYW1wOyBwYXMtJmd0O3R4LnNwaTsKJiM0Mzt9CiYjNDM7CiAjZW5kaWYgLyogX19QU1BfUFNQX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uYwppbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NAotLS0gYS9uZXQvcHNwL3BzcF9tYWluLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3BzcC9wc3BfbWFpbi5jCkBAIC02OCw5ICYjNDM7NjgsOSBAQCBwc3BfZGV2X2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgIXBzZF9vcHMtJmd0O3NldF9jb25maWcgfHwKIAkJICAgICFwc2Rfb3BzLSZndDtrZXlfcm90YXRlIHx8CiAJCSAgICAhcHNkX29wcy0mZ3Q7cnhfc3BpX2FsbG9jIHx8Ci0JCSAgICAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZCB8fAotCQkgICAgIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwgfHwKLQkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMpKQomIzQzOwkJICAgICFwc2Rfb3BzLSZndDtnZXRfc3RhdHMgfHwKJiM0MzsJCSAgICAoIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQgIT0gIXBzZF9vcHMtJmd0O3R4X2tleV9kZWwpIHx8CiYjNDM7CQkgICAgKHBzZF9jYXBzLSZndDthc3NvY19kcnZfc3BjICZhbXA7JmFtcDsgIXBzZF9vcHMtJmd0O3R4X2tleV9hZGQpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlwc2QgPSBremFsbG9jX29iaigqcHNkKTsKQEAgLTE0Nyw4ICYjNDM7MTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpCiAKIAlsaXN0X3NwbGljZV9pbml0KCZhbXA7cHNkLSZndDthY3RpdmVfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7cHJldl9hc3NvY3MpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmFtcDtwc2QtJmd0O3ByZXZfYXNzb2NzLCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCAmYW1wO3BzZC0mZ3Q7c3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkKLQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgJmFtcDtwc2QtJmd0O3N0YWxlX2Fzc29jcywgYXNzb2NzX2xpc3QpIHsKJiM0MzsJCWlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKQomIzQzOwkJCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CQlsaXN0X2RlbCgmYW1wO3Bhcy0mZ3Q7YXNzb2NzX2xpc3QpOwomIzQzOwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgJmFtcDtwc2QtJmd0O2Fzc29jX2Rldl9saXN0LAogCQkJCSBkZXZfbGlzdCkgewpkaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jCmluZGV4IDFhMmE2Yjc1MTZiMGYuLjZhNGJlY2MzOGI1NWEgMTAwNjQ0Ci0tLSBhL25ldC9wc3AvcHNwX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvcHNwL3BzcF9zb2NrLmMKQEAgLTc4LDE2ICYjNDM7NzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB9CiAKIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCQkgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlyZXR1cm4gcHNkLSZndDtvcHMtJmd0O3R4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKmR1bW15OwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAomIzQzOwkgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UmIzM5O2xsIG5lZWQgdG8KJiM0MzsJICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuCiYjNDM7CSAqLwomIzQzOwlkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpOwomIzQzOwlpZiAoIWR1bW15KQomIzQzOwkJcmV0dXJuIC1FTk9NRU07CiYjNDM7CiYjNDM7CW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwomIzQzOwllcnIgPSBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwomIzQzOwlpZiAoIWVycikKJiM0MzsJCW1lbWNweShwYXMtJmd0O2Rydl9kYXRhLCBkdW1teS0mZ3Q7ZHJ2X2RhdGEsCiYjNDM7CQkgICAgICAgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKJiM0MzsKJiM0MzsJa2ZyZWUoZHVtbXkpOwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiB7Ci0JaWYgKHBhcy0mZ3Q7dHguc3BpKQotCQlwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7Ci0JbGlzdF9kZWwoJmFtcDtwYXMtJmd0O2Fzc29jc19saXN0KTsKJiM0MzsJcHNkLSZndDtvcHMtJmd0O3R4X2tleV9kZWwocHNkLCBwYXMpOwogfQogCiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC05Niw4ICYjNDM7MTEzLDExIEBAIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIAlzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLSZndDtwc2Q7CiAKIAltdXRleF9sb2NrKCZhbXA7cHNkLSZndDtsb2NrKTsKLQlpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpCi0JCXBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7CiYjNDM7CWlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkgewomIzQzOwkJaWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpCiYjNDM7CQkJcHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTsKJiM0MzsJCWxpc3RfZGVsKCZhbXA7cGFzLSZndDthc3NvY3NfbGlzdCk7CiYjNDM7CX0KIAltdXRleF91bmxvY2soJmFtcDtwc2QtJmd0O2xvY2spOwogCXBzcF9kZXZfcHV0KHBzZCk7CiAJa2ZyZWUocGFzKTsKQEAgLTE1NSw2ICYjNDM7MTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiAJcmV0dXJuIGVycjsKIH0KIAomIzQzO3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsCiYjNDM7CQkJICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LAomIzQzOwkJCSAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCiYjNDM7ewomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwlpZiAocHNwX2Rldl9oYXNfc2FkYihwc2QpKSB7CiYjNDM7CQllcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcykKIHsKIAlzdHJ1Y3QgcHNwX3NrYl9leHQgKnBzZTsKQEAgLTE3NCwxMiAmIzQzOzIxMCw0MCBAQCBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50CiYjNDM7cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcywKJiM0MzsJCSAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQomIzQzO3sKJiM0MzsJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwllcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCiYjNDM7CQkJICAgICAgICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gcHNwX2Fzc29jX3NldF90eChwc2QsIHBhcywga2V5LCBleHRhY2spOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJV1JJVEVfT05DRShzay0mZ3Q7c2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTsKJiM0MzsJdGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTsKJiM0MzsJcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7CiYjNDM7CiYjNDM7CWljc2sgPSBpbmV0X2Nzayhzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7CiYjNDM7CWljc2stJmd0O2ljc2tfc3luY19tc3Moc2ssIGljc2stJmd0O2ljc2tfcG10dV9jb29raWUpOwomIzQzOwomIzQzOwlyZXR1cm4gZXJyOwomIzQzO30KJiM0MzsKIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQkJICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksCiAJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKIHsKLQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7Ci0Jc3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7CiYjNDM7CXN0cnVjdCBwc3BfYXNzb2MgKnBhczsKIAlpbnQgZXJyOwogCiAJbG9ja19zb2NrKHNrKTsKQEAgLTIwNyw0MCAmIzQzOzI3MSw3IEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLAogCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAotCWVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7Ci0JaWYgKGVycikgewotCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICYjMzQ7U29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZSYjMzQ7KTsKLQkJZ290byBleGl0X3VubG9jazsKLQl9Ci0KLQkvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbiYjMzk7dAotCSAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0bwotCSAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLgotCSAqLwotCWR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7Ci0JaWYgKCFkdW1teSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfdW5sb2NrOwotCX0KLQotCW1lbWNweSgmYW1wO2R1bW15LSZndDt0eCwga2V5LCBzaXplb2YoKmtleSkpOwotCWVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIGR1bW15LCBleHRhY2spOwotCWlmIChlcnIpCi0JCWdvdG8gZXhpdF9mcmVlX2R1bW15OwotCi0JbWVtY3B5KHBhcy0mZ3Q7ZHJ2X2RhdGEsIGR1bW15LSZndDtkcnZfZGF0YSwgcHNkLSZndDtjYXBzLSZndDthc3NvY19kcnZfc3BjKTsKLQltZW1jcHkoJmFtcDtwYXMtJmd0O3R4LCBrZXksIHNpemVvZigqa2V5KSk7Ci0KLQlXUklURV9PTkNFKHNrLSZndDtza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpOwotCXRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7Ci0JcGFzLSZndDt1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktJmd0O3Jjdl9ueHQ7Ci0KLQlpY3NrID0gaW5ldF9jc2soc2spOwotCWljc2stJmd0O2ljc2tfZXh0X2hkcl9sZW4gJiM0Mzs9IHBzcF9za19vdmVyaGVhZChzayk7Ci0JaWNzay0mZ3Q7aWNza19zeW5jX21zcyhzaywgaWNzay0mZ3Q7aWNza19wbXR1X2Nvb2tpZSk7Ci0KLWV4aXRfZnJlZV9kdW1teToKLQlrZnJlZShkdW1teSk7CiYjNDM7CWVyciA9IHBzcF9zb2NrX3NldF90eF9rZXkoc2ssIHBzZCwgcGFzLCBrZXksIGV4dGFjayk7CiBleGl0X3VubG9jazoKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2NjgyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogODEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgc2VlIGlmIGl0IGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIEtNU0FOIGZ1enppbmcuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0JiMzOTtzIGEgcmVmYWN0b3JpbmcgZXhlcmNpc2Ugd2l0aGluIHRoZSBQU1AgKFBvbGljeS1CYXNlZCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtLCBwcmltYXJpbHkgZm9jdXNlZCBvbiBzaW1wbGlmeWluZyBrZXkgbWFuYWdlbWVudCBhbmQgYXNzb2NpYXRpb24gaGFuZGxpbmcgd2l0aGluIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIuCgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF04oCZcyBiZWVuIGNoYW5nZWQuIFRoZSBwYXRjaCByZW1vdmVzIGBhc3NvY19jbnRgIGFuZCB0aGUgYHR4X2tleV9hZGRgL2B0eF9rZXlfZGVsYCBmdW5jdGlvbnMgZnJvbSB0aGUgYG5ldGRldnNpbWAgUFNQIGltcGxlbWVudGF0aW9uLiBJdCBzZWVtcyBsaWtlIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIgaXMgYmVpbmcgYWRhcHRlZCB0byBhIG1vcmUgZ2VuZXJpYywgcG9zc2libHkgb3B0aW9uYWwsIGFwcHJvYWNoIHRvIGtleSBoYW5kbGluZy4gTm90YWJseSwgYC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKilgIGlzIHJlbW92ZWQsIHN1Z2dlc3RpbmcgYSBzaGlmdCBhd2F5IGZyb20gYSBkcml2ZXItc3BlY2lmaWMgYXNzb2NpYXRpb24gZGF0YSBzaXplLiBBbHNvLCB0aGUgY2hlY2sgYHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOyBpZiAoKnB0ciAhPSBucykgLi4uYCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYG5zaW1fZG9fcHNwYCwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIHJlbW92YWwgb2YgZHJpdmVyLXNwZWNpZmljIGRhdGEgbWFuYWdlbWVudC4KClRoZSBoZWFkZXIgZmlsZSBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgdGhlIHJlbW92YWwgb2YgYHBzcF9hc3NvY19kcnZfZGF0YSgpYCBhbmQgdGhlIGRvY3VtZW50YXRpb24gYWxsb3dpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgdG8gYmUgTlVMTCwgcmVpbmZvcmNlIHRoaXMgbm90aW9uIG9mIG9wdGlvbmFsIGtleSBtYW5hZ2VtZW50LiBOZXcgZnVuY3Rpb25zIGxpa2UgYHBzcF9kZXZfaGFzX3NhZGIoKWAgYW5kIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbCgpYCBhcmUgaW50cm9kdWNlZCwgcHJvdmlkaW5nIGNvbmRpdGlvbmFsIGNoZWNrcyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgU0EgKFNlY3VyaXR5IEFzc29jaWF0aW9uKSBEYXRhYmFzZSBmdW5jdGlvbmFsaXR5IGFuZCBpZiBhIFRYIGtleSBuZWVkcyB0byBiZSBkZWxldGVkIGR1cmluZyBhc3NvY2lhdGlvbiBoYW5kbGluZy4KClRoZSBgcHNwX2Rldl9jcmVhdGVgIGZ1bmN0aW9uJiMzOTtzIGNoYW5nZXMgYXJlIGNyaXRpY2FsLiBUaGUgcGF0Y2ggbm93IGFsbG93cyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMuIEl0IHNlZW1zIHRoYXQgaWYgdGhlc2UgZnVuY3Rpb25zIGFyZSBOVUxMIGFuZCBgYXNzb2NfZHJ2X3NwY2AgaXMgMCwgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG5vdCB0byBtYW5hZ2UgVHgga2V5cy4gVGhpcyBmZWVscyBsaWtlIGEgc2lnbmlmaWNhbnQgc2ltcGxpZmljYXRpb24sIGJ1dCB0aGlzIGlzIHdoZXJlIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcy4gVGhlIGxvZ2ljIG5vdyBpbmNsdWRlcyBgKCFwc2Rfb3BzLSZndDt0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLSZndDt0eF9rZXlfZGVsKSB8fCAocHNkX2NhcHMtJmd0O2Fzc29jX2Rydl9zcGMgJmFtcDsmYW1wOyAhcHNkX29wcy0mZ3Q7dHhfa2V5X2FkZClgLiBJIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZXNlIGNvbmRpdGlvbnMgZG9lc24mIzM5O3QgbGVhZCB0byBhbnkgdW5leHBlY3RlZCBiZWhhdmlvciwgZXNwZWNpYWxseSByZWdhcmRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzIHdoZW4gdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcHJvdmlkZWQuCgpJbiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBhbmQgYHBzcF9hc3NvY19mcmVlYCwgd2Ugc2VlIGNvbmRpdGlvbmFsIGNhbGxzIHRvIGBwc3BfZGV2X3R4X2tleV9kZWxgIGJhc2VkIG9uIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbCgpYC4gVGhpcyBtYWtlcyBzZW5zZSwgYnV0IHRoZSByZW1vdmFsIG9mIGBsaXN0X2RlbGAgZnJvbSBpbnNpZGUgb2YgYHBzcF9kZXZfdHhfa2V5X2RlbGAgaXRzZWxmIGluIGZhdm91ciBvZiB0aGUgY2FsbGVyLCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4KClRoZSBjaGFuZ2VzIGluIGBwc3Bfc29jay5jYCBhcmUgYWxzbyBpbXBvcnRhbnQuIFRoZSBkdW1teSBhbGxvY2F0aW9uIGxvZ2ljIGlzIG5vdyBleHBsaWNpdGx5IGluc2lkZSBgcHNwX2Rldl90eF9rZXlfYWRkYC4gVGhlIGNhbGxzIHRvIGBwc2QtJmd0O29wcy0mZ3Q7dHhfa2V5X2RlbChwc2QsIHBhcyk7YCBhcmUgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgaWYgdGhlIGRyaXZlcnMgZm9yZ2V0IHRvIGhhbmRsZSB0aGVzZSBjb3JyZWN0bHkuIFNwbGl0dGluZyBvZmYgYHBzcF9hc3NvY19zZXRfdHhgIGFuZCBgcHNwX3NvY2tfc2V0X3R4X2tleWAsIGFuZCB0aGUgYXNzb2NpYXRlZCBgbWVtY3B5YCB3aXRoaW4gYHBzcF9hc3NvY19zZXRfdHhgIGFsbCBsb29rIGxpa2UgY2xlYW51cHMuCgpNeSBtYWluIGFyZWEgb2YgY29uY2VybiByaWdodCBub3cgaXMgaG93IHRoZSAmIzM0O2R1bW15JiMzNDsgYWxsb2NhdGlvbiBpcyBiZWluZyBoYW5kbGVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYHBzcF9hc3NvY19kdW1teWAgd29ya3MsIHRvIHZlcmlmeSBpZiB0aGVyZSYjMzk7cyBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIHdoZW4gdGhlIGtleSBoYW5kbGluZyBpcyAmIzM0O2R1bW15JiMzNDsuIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSB1c2UgYGdyZXBwZXJgIChvciBgcmVhZC1maWxlYCBpZiBuZWVkIGJlKSB0byBleGFtaW5lIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgcHNwX2Fzc29jX2R1bW15YCB0byBiZSBzdXJlIHRoZXJlJiMzOTtzIG5vIHN1YnRsZSwgbHVya2luZyB2dWxuZXJhYmlsaXR5IGhlcmUuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGR1bW15IGFsbG9jYXRpb24gaXNuJiMzOTt0IGluYWR2ZXJ0ZW50bHkgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgd2hlbiB0aGUgZGV2aWNlIGNob29zZXMgbm90IHRvIHN0b3JlIHR4IGtleXMuIFRoaXMgaXMgd2hlcmUgYSBzdWJ0bGUgZmxhdyBpcyBtb3N0IGxpa2VseSB0byByZXNpZGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3BzcF9hc3NvY19kdW1teSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9wc3AvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9wc3AvcHNwX3NvY2suYz00Nz1zdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfY3JlYXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXG4tLVxubmV0L3BzcC9wc3Bfc29jay5jLTY4LVxubmV0L3BzcC9wc3Bfc29jay5jOjY5OnN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxubmV0L3BzcC9wc3Bfc29jay5jLTcwLXtcbi0tXG5uZXQvcHNwL3BzcF9zb2NrLmM9ODA9c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuLS1cbm5ldC9wc3AvcHNwX3NvY2suYy05MC1cdCAqL1xubmV0L3BzcC9wc3Bfc29jay5jOjkxOlx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbm5ldC9wc3AvcHNwX3NvY2suYy05Mi1cdGlmICghZHVtbXkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDEwOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2MjIKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSYjMzk7bSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgcHNwX3NvY2suY2AgLSBMaW5lcyA0MC0xMjAqKgoKT2theSwgbGV0JiMzOTtzIHB1bGwgdXAgYHBzcF9zb2NrLmNgIGFuZCBmb2N1cyBvbiBsaW5lcyA0MCB0aHJvdWdoIDEyMC4gSSYjMzk7bSBndWVzc2luZyB0aGlzIHNlY3Rpb24gcHJvYmFibHkgZGVhbHMgd2l0aCB0aGUgY29yZSBzb2NrZXQgaW5pdGlhbGl6YXRpb24gb3Igc29tZSBpbXBvcnRhbnQgc2V0dXAgcm91dGluZSwgZ2l2ZW4gaXRzIHBsYWNlbWVudCBlYXJseSBpbiB0aGUgZmlsZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIHN0cnVjdCBkZWNsYXJhdGlvbnMgcmVsYXRlZCB0byB0aGUgc29ja2V0IHN0cnVjdHVyZSBpdHNlbGYsIGFuZCBhbnkgaW5pdGlhbCBhc3NpZ25tZW50cyB0byBjcnVjaWFsIHZhcmlhYmxlcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBhbGxvY2F0aW9uIG9mIHNvY2tldCBkZXNjcmlwdG9ycywgdGhlIHNldHRpbmcgb2YgZGVmYXVsdCBvcHRpb25zIChpZiBhbnkpLCBhbmQgcG90ZW50aWFsbHkgc29tZSBlYXJseSBlcnJvciBoYW5kbGluZy4gSSYjMzk7bSBhbHNvIHJlYWR5IHRvIHRyYWNlIGNvbnRyb2wgZmxvdyB0aHJvdWdoIGFueSBwb3RlbnRpYWwgYnJhbmNoZXMsIGNoZWNraW5nIGZvciBhbnkgZWRnZSBjYXNlcyBvciB1bnVzdWFsIHBhcmFtZXRlciBoYW5kbGluZyB3aGljaCBtaWdodCBjYXVzZSBpc3N1ZXMgZG93biB0aGUgbGluZS4gSSYjMzk7bGwgYWxzbyBiZSBmb2N1c2luZyBvbiBhbnkgdXNlIG9mIGBpb2N0bGAgY2FsbHMgYXMgdGhleSBtYXkgaW5kaWNhdGUgaGFyZHdhcmUgZGVwZW5kZW5jeS4gSSYjMzk7bSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGJlaW5nIHVzZWQgZm9yIHZhcmlvdXMgc29ja2V0IG9wdGlvbnM7IHR5cGUgbWlzbWF0Y2hlcyBjYW4gYmUgbm90b3Jpb3VzbHkgdHJpY2t5IHRvIGRlYnVnLiBBbnl0aGluZyByZWxhdGVkIHRvIHRocmVhZGluZyBhbmQgc3luY2hyb25pemF0aW9uIHdpdGhpbiB0aGUgc29ja2V0JiMzOTtzIGludGVybmFsIHN0cnVjdHVyZXMgd291bGQgYmUgb2YgcGFydGljdWxhciBpbnRlcmVzdDsgSSBuZWVkIHRvIGJlIGF3YXJlIG9mIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3Mgd2hhdCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvcHNwL3BzcF9zb2NrLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDQwOlx0XHRcdHNrX3NrYl9yZWFzb25fZHJvcChzaywgc2tiLCBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVCk7XG4gIDQxOlx0XHRcdHJldHVybiBOVUxMO1xuICA0MjpcdFx0fVxuICA0MzpcdFxuICA0NDpcdFx0cmV0dXJuIHNrYjtcbiAgNDU6XHR9XG4gIDQ2Olx0XG4gIDQ3Olx0c3RydWN0IHBzcF9hc3NvYyAqcHNwX2Fzc29jX2NyZWF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuICA0ODpcdHtcbiAgNDk6XHRcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcztcbiAgNTA6XHRcbiAgNTE6XHRcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2cHNkLVx1MDAzZWxvY2spO1xuICA1MjpcdFxuICA1MzpcdFx0cGFzID0ga3phbGxvY19mbGV4KCpwYXMsIGRydl9kYXRhLCBwc2QtXHUwMDNlY2Fwcy1cdTAwM2Vhc3NvY19kcnZfc3BjLFxuICA1NDpcdFx0XHRcdCAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gIDU1Olx0XHRpZiAoIXBhcylcbiAgNTY6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDU3Olx0XG4gIDU4Olx0XHRwYXMtXHUwMDNlcHNkID0gcHNkO1xuICA1OTpcdFx0cGFzLVx1MDAzZWRldl9pZCA9IHBzZC1cdTAwM2VpZDtcbiAgNjA6XHRcdHBhcy1cdTAwM2VnZW5lcmF0aW9uID0gcHNkLVx1MDAzZWdlbmVyYXRpb247XG4gIDYxOlx0XHRwc3BfZGV2X2dldChwc2QpO1xuICA2MjpcdFx0cmVmY291bnRfc2V0KFx1MDAyNnBhcy1cdTAwM2VyZWZjbnQsIDEpO1xuICA2MzpcdFxuICA2NDpcdFx0bGlzdF9hZGRfdGFpbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QsIFx1MDAyNnBzZC1cdTAwM2VhY3RpdmVfYXNzb2NzKTtcbiAgNjU6XHRcbiAgNjY6XHRcdHJldHVybiBwYXM7XG4gIDY3Olx0fVxuICA2ODpcdFxuICA2OTpcdHN0YXRpYyBzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfZHVtbXkoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuICA3MDpcdHtcbiAgNzE6XHRcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXHUwMDNlcHNkO1xuICA3MjpcdFx0c2l6ZV90IHN6O1xuICA3MzpcdFxuICA3NDpcdFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZwc2QtXHUwMDNlbG9jayk7XG4gIDc1Olx0XG4gIDc2Olx0XHRzeiA9IHN0cnVjdF9zaXplKHBhcywgZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuICA3NzpcdFx0cmV0dXJuIGttZW1kdXAocGFzLCBzeiwgR0ZQX0tFUk5FTCk7XG4gIDc4Olx0fVxuICA3OTpcdFxuICA4MDpcdHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiAgODE6XHRcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiAgODI6XHRcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4gIDgzOlx0e1xuICA4NDpcdFx0c3RydWN0IHBzcF9hc3NvYyAqZHVtbXk7XG4gIDg1Olx0XHRpbnQgZXJyO1xuICA4NjpcdFxuICA4NzpcdFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24mIzM5O3RcbiAgODg6XHRcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSYjMzk7bGwgbmVlZCB0b1xuICA4OTpcdFx0ICogcmUtYWxsb2NhdGUgdGhlIGFzc29jIHN0cnVjdHVyZXMuXG4gIDkwOlx0XHQgKi9cbiAgOTE6XHRcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XG4gIDkyOlx0XHRpZiAoIWR1bW15KVxuICA5MzpcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAgOTQ6XHRcbiAgOTU6XHRcdG1lbWNweShcdTAwMjZkdW1teS1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuICA5NjpcdFx0ZXJyID0gcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfYWRkKHBzZCwgZHVtbXksIGV4dGFjayk7XG4gIDk3Olx0XHRpZiAoIWVycilcbiAgOTg6XHRcdFx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsXG4gIDk5Olx0XHRcdCAgICAgICBwc2QtXHUwMDNlY2Fwcy1cdTAwM2Vhc3NvY19kcnZfc3BjKTtcbiAxMDA6XHRcbiAxMDE6XHRcdGtmcmVlKGR1bW15KTtcbiAxMDI6XHRcdHJldHVybiBlcnI7XG4gMTAzOlx0fVxuIDEwNDpcdFxuIDEwNTpcdHZvaWQgcHNwX2Rldl90eF9rZXlfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbiAxMDY6XHR7XG4gMTA3Olx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuIDEwODpcdH1cbiAxMDk6XHRcbiAxMTA6XHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4gMTExOlx0e1xuIDExMjpcdFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBwc3BfYXNzb2MsIHdvcmspO1xuIDExMzpcdFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gMTE0Olx0XG4gMTE1Olx0XHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiAxMTY6XHRcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuIDExNzpcdFx0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbiAxMTg6XHRcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuIDExOTpcdFx0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAxMDo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDExMgoJCQkJCQkJb3V0cHV0OiAxNjQKCQkJCQkJCXRob3VnaHRzOiA3MDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudCBvZiBQU1AgQXNzb2NpYXRpb24gQ2hhbmdlcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duIGZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlc2UgY2hhbmdlcyBmb3IgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLgoKRmlyc3QsIEkgbmVlZCB0byBwaW5wb2ludCBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGxlYWtzIHRoYXQgY291bGQgZXhwb3NlIHNlbnNpdGl2ZSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLiBJdCBsb29rcyBsaWtlOgoKKiAgIFRoZSBgcGFzYCBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIHdpdGggYGt6YWxsb2NfZmxleGAgaW4gYHBzcF9hc3NvY19jcmVhdGVgLCB3aGljaCB6ZXJvZXMgdGhlIG1lbW9yeS4KKiAgIFRoZSBgZHVtbXlgIGlzIGNyZWF0ZWQgd2l0aCBga21lbWR1cGAsIGR1cGxpY2F0aW5nIHplcm9lZCBtZW1vcnkuCiogICBUaGUgYGtleWAgY29tZXMgZnJvbSBuZXRsaW5rIGlucHV0LCBhbmQgdGhpcyByZXF1aXJlcyBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGJ1dCBpdCBpcyBwYXJzZWQsIG9yIHZhbGlkYXRlZCwgYmVmb3JlIGJlaW5nIHVzZWQuCiogICBUaGUgcmVtb3ZhbCBvZiBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBmcm9tIG5ldGRldnNpbSBpbXBsaWVzIG5vIG5lZWQgZm9yIFNBREIgbWFuYWdlbWVudCBpbiB0aGF0IHNwZWNpZmljIGNvbnRleHQuCiogICBUaGVyZSBhcmVuJiMzOTt0IGFueSBuZXdseSBpbnRyb2R1Y2VkIHVuaW5pdGlhbGl6ZWQgc3RhY2sgdmFyaWFibGVzLCBoZWFwIGJ1ZmZlcnMsIG9yIHN0cnVjdCBwYWRkaW5nIHRoYXQgZ2V0cyBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGFyZSB0aGVyZSBhbnkgdGhhdCBhcmUgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy4KKiAgIFRoZSByZWZhY3RvcmluZyBtYWtlcyB0aGVzZSBmdW5jdGlvbnMgb3B0aW9uYWwsIGJ1dCBgcHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWxgIHByb3ZpZGVzIGEgY2hlY2ssIHVzaW5nIGBwc3BfZGV2X2hhc19zYWRiKHBhcy0mZ3Q7cHNkKSAmYW1wOyZhbXA7IHBhcy0mZ3Q7dHguc3BpYC4KCk15IG5leHQgc3RlcCBpcyB0byBleGFtaW5lIHRoZSB3aWRlciBjb2RlLCBnb2luZyBiZXlvbmQgdGhlIGltbWVkaWF0ZSBwYXRjaC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYGNvcHlfdG9fdXNlcmAgY2FsbHMsIG5ldGxpbmsgYXR0cmlidXRlcywgc29ja2V0IG9wdGlvbnMsIGFuZCBhbnkgbmV3IGJyYW5jaGluZyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIEhvd2V2ZXIsIEkmIzM5O20gbm90IHNlZWluZyBhbnkgcmVkIGZsYWdzLgoKTm93LCBhcyBhbiBleHRyYSBzdGVwLCBJJiMzOTtsbCBxdWlja2x5IGNvbnNpZGVyIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIFVzZS1BZnRlci1GcmVlIChVQUYpLCBvciBsb2NraW5nIHByb2JsZW1zLiBUaG9zZSBhcmUgYmV0dGVyIGFkZHJlc3NlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4KClRpbWUgdG8gY29uZmlybSBteSBmaW5kaW5ncyBhZ2FpbnN0IHRoZSBLTVNBTiBjcml0ZXJpYS4KCjEuICBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2Ugd2hlcmUgZmllbGRzIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQ6IE5vIGNvbmNlcm5zIGhlcmUuCjIuICBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzIG9yIHN0cnVjdCBmaWVsZHM6IE5vLCBhbGwgdXNlZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbml0aWFsaXplZC4KMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRoczogTm8sIHplcm9pbmcgYWxsb2NhdG9ycyBhbmQga21lbWR1cCBhcmUgdXNlZC4KNC4gIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIHRoYXQgY291bGQgbGVhZCB0byBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBieXRlczogTm8gc3VjaCBjYXNlcyB3ZXJlIGZvdW5kLgoKVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgIGhlcmUuCgpUbyBwcm92aWRlIGEgcm9idXN0IGp1c3RpZmljYXRpb24sIGxldCYjMzk7cyBjb250cmFzdCB0aGUgS01TQU4gYW5kIEtBU0FOIGFzcGVjdHMuIFRoaXMgcGF0Y2ggcmVmYWN0b3JzIFR4IGtleSBtYW5hZ2VtZW50IHRvIG1ha2UgaXQgb3B0aW9uYWwsIHNwZWNpZmljYWxseSBmb3IgZGV2aWNlcyB0aGF0IGRvbiYjMzk7dCB1c2UgYSBUeCBrZXkgU0FEQi4gQWxsIGludm9sdmVkIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHplcm8gYWxsb2NhdG9ycyBsaWtlIGBremFsbG9jX29iamAsIGBremFsbG9jX2ZsZXhgLCBvciBga21lbWR1cGAuIE5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBudWxsYWJpbGl0eSBvZiB0aGUgY2FsbGJhY2tzIGlzIGNvdmVyZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAsIG5vdCBLTVNBTi4gVGhlIGlzc3VlcyBhcmUgZnVuY3Rpb25hbCBidWdzLCBvciBsb2NraW5nL2xpZmVjeWNsZSBpc3N1ZXMgd2hpY2ggYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgb3RoZXIgdG9vbHMuIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpc24mIzM5O3QgbmVlZGVkIGhlcmUuCgpJIHRoaW5rIHdlJiMzOTtyZSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMTA6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbWFrZXMgdGhlIGB0eF9rZXlfYWRkYCBhbmQgYHR4X2tleV9kZWxgIGRyaXZlciBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIFBTUCBkZXZpY2VzIHdpdGhvdXQgU0FEQiBzdXBwb3J0LCByZWZhY3RvcmluZyBUeCBrZXkgYXNzb2NpYXRpb24gbWFuYWdlbWVudCBhbmQgcmVtb3ZpbmcgdW51c2VkIGtleSBoYW5kbGluZyBob29rcyBmcm9tIG5ldGRldnNpbS4gQWxsIGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgY29udGludWUgdG8gYmUgZnVsbHkgemVyby1pbml0aWFsaXplZCB2aWEgYGt6YWxsb2NfZmxleGAsIGBremFsbG9jX29iamAsIG9yIGBrbWVtZHVwYC4gVGhlIGNoYW5nZXMgZG8gbm90IGludHJvZHVjZSBvciBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnksIGluZm8tbGVha3MsIG9yIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcy4gQW55IHBvdGVudGlhbCBpc3N1ZXMgd2l0aCBwb2ludGVyIGNoZWNrcywgbGlzdCBtYW5pcHVsYXRpb24sIG9yIGxpZmVjeWNsZSBoYW5kbGluZyBmYWxsIHN0cmljdGx5IHVuZGVyIHRoZSBkb21haW4gb2YgS0FTQU4gYW5kIExPQ0tERVAuIFRoZXJlZm9yZSwgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUxOjUxLjcwNTQxNTgzNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY1NTQwNjQ4MzQ0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIklORVRfUFNQXCIsXG4gICAgXCJORVRERVZTSU1cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJwc3Bfc29ja19hc3NvY19zZXRfdHhcIixcbiAgICBcInBzcF9zb2NrX3NldF90eF9rZXlcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2FkZFwiLFxuICAgIFwicHNwX2Rldl90eF9rZXlfZGVsXCIsXG4gICAgXCJwc3BfYXNzb2NfZnJlZVwiLFxuICAgIFwicHNwX2Rldl9jcmVhdGVcIixcbiAgICBcInBzcF9kZXZfdW5yZWdpc3RlclwiLFxuICAgIFwibnNpbV9kb19wc3BcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUxOjUxLjcwNTQyMDg5NloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI3OTIyMDIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IFNlcCA1IDEwOjUxOjUwIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaCBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oXFxuKysrIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oXFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcXG4gXFx0XFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XFxuIFxcdFxcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xcbiBcXHRcXHR1MzIgc3BpO1xcbi1cXHRcXHR1MzIgYXNzb2NfY250O1xcbiBcXHR9IHBzcDtcXG4gXFxuIFxcdHN0cnVjdCBuc2ltX2J1c19kZXYgKm5zaW1fYnVzX2RldjtcXG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXFxuaW5kZXggNmIzNTMyYjVlMzYwZC4uYjc0NTJjNDliNTgxZCAxMDA2NDRcXG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcXG5AQCAtMjMsNyArMjMsNiBAQCBuc2ltX2RvX3BzcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ZGV2c2ltICpucyxcXG4gXFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xcbiBcXHRzdHJ1Y3QgbmV0ICpuZXQ7XFxuIFxcdGludCBwc3BfbGVuO1xcbi1cXHR2b2lkICoqcHRyO1xcbiBcXG4gXFx0cmN1X3JlYWRfbG9jaygpO1xcbiBcXHRwYXMgPSBwc3Bfc2tiX2dldF9hc3NvY19yY3Uoc2tiKTtcXG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXFxuIFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gXFx0fVxcbiBcXG4tXFx0cHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XFxuLVxcdGlmICgqcHRyICE9IG5zKSB7XFxuLVxcdFxcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XFxuLVxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4tXFx0fVxcbi1cXG4gXFx0bmV0ID0gc29ja19uZXQoc2tiLVxcdTAwM2Vzayk7XFxuIFxcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVxcdTAwM2V0eC5zcGksIHBhcy1cXHUwMDNldmVyc2lvbiwgMCkpIHtcXG4gXFx0XFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcXG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgbnNpbV9hc3NvY19hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbi1cXHRcXHRcXHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4te1xcbi1cXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cXHUwMDNlZHJ2X3ByaXY7XFxuLVxcdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcXG4tXFxuLVxcdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cXG4tXFx0KnB0ciA9IHBzZC1cXHUwMDNlZHJ2X3ByaXY7XFxuLVxcdG5zLVxcdTAwM2Vwc3AuYXNzb2NfY250Kys7XFxuLVxcbi1cXHRyZXR1cm4gMDtcXG4tfVxcbi1cXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiB7XFxuIFxcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVxcdTAwM2VkcnZfcHJpdjtcXG5AQCAtMTc3LDE1ICsxNTcsNiBAQCBzdGF0aWMgaW50IG5zaW1fa2V5X3JvdGF0ZShzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBuc2ltX2Fzc29jX2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuLXtcXG4tXFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXFx1MDAzZWRydl9wcml2O1xcbi1cXHR2b2lkICoqcHRyID0gcHNwX2Fzc29jX2Rydl9kYXRhKHBhcyk7XFxuLVxcbi1cXHQqcHRyID0gTlVMTDtcXG4tXFx0bnMtXFx1MDAzZXBzcC5hc3NvY19jbnQtLTtcXG4tfVxcbi1cXG4gc3RhdGljIHZvaWQgbnNpbV9nZXRfc3RhdHMoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9kZXZfc3RhdHMgKnN0YXRzKVxcbiB7XFxuIFxcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVxcdTAwM2VkcnZfcHJpdjtcXG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcXG4gc3RhdGljIHN0cnVjdCBwc3BfZGV2X29wcyBuc2ltX3BzcF9vcHMgPSB7XFxuIFxcdC5zZXRfY29uZmlnXFx0PSBuc2ltX3BzcF9zZXRfY29uZmlnLFxcbiBcXHQucnhfc3BpX2FsbG9jXFx0PSBuc2ltX3J4X3NwaV9hbGxvYyxcXG4tXFx0LnR4X2tleV9hZGRcXHQ9IG5zaW1fYXNzb2NfYWRkLFxcbi1cXHQudHhfa2V5X2RlbFxcdD0gbnNpbV9hc3NvY19kZWwsXFxuIFxcdC5rZXlfcm90YXRlXFx0PSBuc2ltX2tleV9yb3RhdGUsXFxuIFxcdC5nZXRfc3RhdHNcXHQ9IG5zaW1fZ2V0X3N0YXRzLFxcbiB9O1xcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcXG4gXFx0XFx0ICAgIDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18xMjggfFxcbiBcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcXG4gXFx0XFx0ICAgIDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXFxuLVxcdC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKiksXFxuIH07XFxuIFxcbiBzdGF0aWMgdm9pZCBfX25zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucywgYm9vbCB0ZWFyZG93bilcXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxcbiBcXHRcXHRzeW5jaHJvbml6ZV9yY3UoKTtcXG4gXFx0XFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XFxuIFxcdH1cXG4tXFx0V0FSTl9PTihucy1cXHUwMDNlcHNwLmFzc29jX2NudCk7XFxuIH1cXG4gXFxuIHZvaWQgbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcXG5pbmRleCBjNWMyM2E1NDc3NGU2Li5iMjNjMzA4OTgzODljIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxcbkBAIC0yNCwxMSArMjQsNiBAQCBpbnQgcHNwX2Rldl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGRldl9pZCwgdTggZ2VuZXJhdGlvbiwgYm9vbCBzdHJpcF9pY3YpO1xcbiAvKiBLZXJuZWwtZmFjaW5nIEFQSSAqL1xcbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHNwX2Fzc29jX2Rydl9kYXRhKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4te1xcbi1cXHRyZXR1cm4gcGFzLVxcdTAwM2VkcnZfZGF0YTtcXG4tfVxcbi1cXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxcbiB1bnNpZ25lZCBpbnQgcHNwX2tleV9zaXplKHUzMiB2ZXJzaW9uKTtcXG4gdm9pZCBwc3Bfc2tfYXNzb2NfZnJlZShzdHJ1Y3Qgc29jayAqc2spO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXFxuaW5kZXggODc5OTFhMWVhMDJkMC4uYjg5MDVlZmJkNjA0ZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaFxcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXFxuQEAgLTIxOSwxMiArMjE5LDE2IEBAIHN0cnVjdCBwc3BfZGV2X29wcyB7XFxuIFxcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxcbiBcXHQgKiBJbnN0YWxsIGFuIGFzc29jaWF0aW9uIGluIHRoZSBkZXZpY2UuIENvcmUgd2lsbCBhbGxvY2F0ZSBzcGFjZVxcbiBcXHQgKiBmb3IgdGhlIGRyaXZlciB0byB1c2UgYXQgZHJ2X2RhdGEuXFxuK1xcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXFxuK1xcdCAqIGlzIGFsc28gTlVMTC5cXG4gXFx0ICovXFxuIFxcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4gXFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbiBcXHQvKipcXG4gXFx0ICogQHR4X2tleV9kZWw6IHJlbW92ZSBhIFR4IGtleSBmcm9tIHRoZSBkZXZpY2VcXG4gXFx0ICogUmVtb3ZlIGFuIGFzc29jaWF0aW9uIGZyb20gdGhlIGRldmljZS5cXG4rXFx0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcXG4rXFx0ICogaXMgYWxzbyBOVUxMLlxcbiBcXHQgKi9cXG4gXFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XFxuIFxcbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcC5oIGIvbmV0L3BzcC9wc3AuaFxcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XFxuLS0tIGEvbmV0L3BzcC9wc3AuaFxcbisrKyBiL25ldC9wc3AvcHNwLmhcXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxcbiBcXHRyZXR1cm4gISFwc2QtXFx1MDAzZW9wcztcXG4gfVxcbiBcXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbitcXHRyZXR1cm4gISFwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4re1xcbitcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwYXMtXFx1MDAzZXBzZC1cXHUwMDNlbG9jayk7XFxuK1xcdHJldHVybiBwc3BfZGV2X2hhc19zYWRiKHBhcy1cXHUwMDNlcHNkKSBcXHUwMDI2XFx1MDAyNiBwYXMtXFx1MDAzZXR4LnNwaTtcXG4rfVxcbitcXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXFxuZGlmZiAtLWdpdCBhL25ldC9wc3AvcHNwX21haW4uYyBiL25ldC9wc3AvcHNwX21haW4uY1xcbmluZGV4IGM5YzFhODgyNmI3ZjkuLjkxNDczZjk2YWQyMTEgMTAwNjQ0XFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXFxuKysrIGIvbmV0L3BzcC9wc3BfbWFpbi5jXFxuQEAgLTY4LDkgKzY4LDkgQEAgcHNwX2Rldl9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VzZXRfY29uZmlnIHx8XFxuIFxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNla2V5X3JvdGF0ZSB8fFxcbiBcXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXJ4X3NwaV9hbGxvYyB8fFxcbi1cXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9hZGQgfHxcXG4tXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2V0eF9rZXlfZGVsIHx8XFxuLVxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNlZ2V0X3N0YXRzKSlcXG4rXFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VnZXRfc3RhdHMgfHxcXG4rXFx0XFx0ICAgICghcHNkX29wcy1cXHUwMDNldHhfa2V5X2FkZCAhPSAhcHNkX29wcy1cXHUwMDNldHhfa2V5X2RlbCkgfHxcXG4rXFx0XFx0ICAgIChwc2RfY2Fwcy1cXHUwMDNlYXNzb2NfZHJ2X3NwYyBcXHUwMDI2XFx1MDAyNiAhcHNkX29wcy1cXHUwMDNldHhfa2V5X2FkZCkpKVxcbiBcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xcbkBAIC0xNDcsOCArMTQ3LDExIEBAIHZvaWQgcHNwX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuIFxcbiBcXHRsaXN0X3NwbGljZV9pbml0KFxcdTAwMjZwc2QtXFx1MDAzZWFjdGl2ZV9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gXFx0bGlzdF9zcGxpY2VfaW5pdChcXHUwMDI2cHNkLVxcdTAwM2VwcmV2X2Fzc29jcywgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcXG4tXFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhcywgbmV4dCwgXFx1MDAyNnBzZC1cXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdCkge1xcbitcXHRcXHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcXG4rXFx0XFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0XFx0bGlzdF9kZWwoXFx1MDAyNnBhcy1cXHUwMDNlYXNzb2NzX2xpc3QpO1xcbitcXHR9XFxuIFxcbiBcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXFx1MDAyNnBzZC1cXHUwMDNlYXNzb2NfZGV2X2xpc3QsXFxuIFxcdFxcdFxcdFxcdCBkZXZfbGlzdCkge1xcbmRpZmYgLS1naXQgYS9uZXQvcHNwL3BzcF9zb2NrLmMgYi9uZXQvcHNwL3BzcF9zb2NrLmNcXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxcbi0tLSBhL25ldC9wc3AvcHNwX3NvY2suY1xcbisrKyBiL25ldC9wc3AvcHNwX3NvY2suY1xcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4rXFx0XFx0XFx0ICAgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuIFxcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4ge1xcbi1cXHRyZXR1cm4gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBwYXMsIGV4dGFjayk7XFxuK1xcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxcbitcXHQgKiB0cnkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gaXQuIEZvciByZS1rZXlpbmcgd2UnbGwgbmVlZCB0b1xcbitcXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cXG4rXFx0ICovXFxuK1xcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XFxuK1xcdGlmICghZHVtbXkpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZkdW1teS1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4rXFx0ZXJyID0gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4rXFx0aWYgKCFlcnIpXFxuK1xcdFxcdG1lbWNweShwYXMtXFx1MDAzZWRydl9kYXRhLCBkdW1teS1cXHUwMDNlZHJ2X2RhdGEsXFxuK1xcdFxcdCAgICAgICBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbitcXG4rXFx0a2ZyZWUoZHVtbXkpO1xcbitcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbiB2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIHtcXG4tXFx0aWYgKHBhcy1cXHUwMDNldHguc3BpKVxcbi1cXHRcXHRwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuLVxcdGxpc3RfZGVsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0KTtcXG4rXFx0cHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuQEAgLTk2LDggKzExMywxMSBAQCBzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuIFxcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXFx1MDAzZXBzZDtcXG4gXFxuIFxcdG11dGV4X2xvY2soXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuLVxcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcXG4tXFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4rXFx0aWYgKHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChwc2QpKSB7XFxuK1xcdFxcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxcbitcXHRcXHRcXHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xcbitcXHRcXHRsaXN0X2RlbChcXHUwMDI2cGFzLVxcdTAwM2Vhc3NvY3NfbGlzdCk7XFxuK1xcdH1cXG4gXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiBcXHRwc3BfZGV2X3B1dChwc2QpO1xcbiBcXHRrZnJlZShwYXMpO1xcbkBAIC0xNTUsNiArMTc1LDIyIEBAIGludCBwc3Bfc29ja19hc3NvY19zZXRfcngoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuK1xcdFxcdFxcdCAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4rXFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4re1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0aWYgKHBzcF9kZXZfaGFzX3NhZGIocHNkKSkge1xcbitcXHRcXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBwYXMsIGtleSwgZXh0YWNrKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0fVxcbitcXG4rXFx0bWVtY3B5KFxcdTAwMjZwYXMtXFx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIHtcXG4gXFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XFxuQEAgLTE3NCwxMiArMjEwLDQwIEBAIHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuK3N0YXRpYyBpbnRcXG4rcHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4rXFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuK3tcXG4rXFx0c3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHROTF9TRVRfRVJSX01TRyhleHRhY2ssXFxuK1xcdFxcdFxcdCAgICAgICBcXFwiU29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVxcXCIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRXUklURV9PTkNFKHNrLVxcdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xcbitcXHR0Y3Bfd3JpdGVfY29sbGFwc2VfZmVuY2Uoc2spO1xcbitcXHRwYXMtXFx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cXHUwMDNlcmN2X254dDtcXG4rXFxuK1xcdGljc2sgPSBpbmV0X2Nzayhzayk7XFxuK1xcdGljc2stXFx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcXG4rXFx0aWNzay1cXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cXHUwMDNlaWNza19wbXR1X2Nvb2tpZSk7XFxuK1xcbitcXHRyZXR1cm4gZXJyO1xcbit9XFxuK1xcbiBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG4gXFx0XFx0XFx0ICB1MzIgdmVyc2lvbiwgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuIFxcdFxcdFxcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxcbiB7XFxuLVxcdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcXG4tXFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqZHVtbXk7XFxuK1xcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcztcXG4gXFx0aW50IGVycjtcXG4gXFxuIFxcdGxvY2tfc29jayhzayk7XFxuQEAgLTIwNyw0MCArMjcxLDcgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXFxuIFxcdFxcdGdvdG8gZXhpdF91bmxvY2s7XFxuIFxcdH1cXG4gXFxuLVxcdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XFxuLVxcdGlmIChlcnIpIHtcXG4tXFx0XFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLCBcXFwiU29ja2V0IGhhcyBpbmNvbXBhdGlibGUgc2VnbWVudHMgYWxyZWFkeSBpbiB0aGUgcmVjdiBxdWV1ZVxcXCIpO1xcbi1cXHRcXHRnb3RvIGV4aXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHQvKiBQYXNzIGEgZmFrZSBhc3NvY2lhdGlvbiB0byBkcml2ZXJzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0XFxuLVxcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXFxuLVxcdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxcbi1cXHQgKi9cXG4tXFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcXG4tXFx0aWYgKCFkdW1teSkge1xcbi1cXHRcXHRlcnIgPSAtRU5PTUVNO1xcbi1cXHRcXHRnb3RvIGV4aXRfdW5sb2NrO1xcbi1cXHR9XFxuLVxcbi1cXHRtZW1jcHkoXFx1MDAyNmR1bW15LVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbi1cXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBleGl0X2ZyZWVfZHVtbXk7XFxuLVxcbi1cXHRtZW1jcHkocGFzLVxcdTAwM2VkcnZfZGF0YSwgZHVtbXktXFx1MDAzZWRydl9kYXRhLCBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbi1cXHRtZW1jcHkoXFx1MDAyNnBhcy1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4tXFxuLVxcdFdSSVRFX09OQ0Uoc2stXFx1MDAzZXNrX3ZhbGlkYXRlX3htaXRfc2tiLCBwc3BfdmFsaWRhdGVfeG1pdCk7XFxuLVxcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XFxuLVxcdHBhcy1cXHUwMDNldXBncmFkZV9zZXEgPSB0Y3Bfc2soc2spLVxcdTAwM2VyY3Zfbnh0O1xcbi1cXG4tXFx0aWNzayA9IGluZXRfY3NrKHNrKTtcXG4tXFx0aWNzay1cXHUwMDNlaWNza19leHRfaGRyX2xlbiArPSBwc3Bfc2tfb3ZlcmhlYWQoc2spO1xcbi1cXHRpY3NrLVxcdTAwM2VpY3NrX3N5bmNfbXNzKHNrLCBpY3NrLVxcdTAwM2VpY3NrX3BtdHVfY29va2llKTtcXG4tXFxuLWV4aXRfZnJlZV9kdW1teTpcXG4tXFx0a2ZyZWUoZHVtbXkpO1xcbitcXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xcbiBleGl0X3VubG9jazpcXG4gXFx0cmVsZWFzZV9zb2NrKHNrKTtcXG4gXFx0cmV0dXJuIGVycjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTE6NTIuMjM0MDIyMzY2WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo0ODY3NTA0MDE1NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJTkVUX1BTUFwiLFxuICAgIFwiTkVUREVWU0lNXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCIsXG4gICAgXCJwc3Bfc29ja19zZXRfdHhfa2V5XCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9hZGRcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2RlbFwiLFxuICAgIFwicHNwX2Fzc29jX2ZyZWVcIixcbiAgICBcInBzcF9kZXZfY3JlYXRlXCIsXG4gICAgXCJwc3BfZGV2X3VucmVnaXN0ZXJcIixcbiAgICBcIm5zaW1fZG9fcHNwXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbisrKyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcbiBcdFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XG4gXHRcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xuIFx0XHR1MzIgc3BpO1xuLVx0XHR1MzIgYXNzb2NfY250O1xuIFx0fSBwc3A7XG4gXG4gXHRzdHJ1Y3QgbnNpbV9idXNfZGV2ICpuc2ltX2J1c19kZXY7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5pbmRleCA2YjM1MzJiNWUzNjBkLi5iNzQ1MmM0OWI1ODFkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcbkBAIC0yMyw3ICsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLFxuIFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0c3RydWN0IG5ldCAqbmV0O1xuIFx0aW50IHBzcF9sZW47XG4tXHR2b2lkICoqcHRyO1xuIFxuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0cGFzID0gcHNwX3NrYl9nZXRfYXNzb2NfcmN1KHNrYik7XG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IG5zaW1fYXNzb2NfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi1cdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cbi1cdCpwdHIgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHRucy1cdTAwM2Vwc3AuYXNzb2NfY250Kys7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSArMTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG5zaW1fYXNzb2NfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdCpwdHIgPSBOVUxMO1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudC0tO1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBuc2ltX2dldF9zdGF0cyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Rldl9zdGF0cyAqc3RhdHMpXG4ge1xuIFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcbiBzdGF0aWMgc3RydWN0IHBzcF9kZXZfb3BzIG5zaW1fcHNwX29wcyA9IHtcbiBcdC5zZXRfY29uZmlnXHQ9IG5zaW1fcHNwX3NldF9jb25maWcsXG4gXHQucnhfc3BpX2FsbG9jXHQ9IG5zaW1fcnhfc3BpX2FsbG9jLFxuLVx0LnR4X2tleV9hZGRcdD0gbnNpbV9hc3NvY19hZGQsXG4tXHQudHhfa2V5X2RlbFx0PSBuc2ltX2Fzc29jX2RlbCxcbiBcdC5rZXlfcm90YXRlXHQ9IG5zaW1fa2V5X3JvdGF0ZSxcbiBcdC5nZXRfc3RhdHNcdD0gbnNpbV9nZXRfc3RhdHMsXG4gfTtcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxuIFx0XHRzeW5jaHJvbml6ZV9yY3UoKTtcbiBcdFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XG4gXHR9XG4tXHRXQVJOX09OKG5zLVx1MDAzZXBzcC5hc3NvY19jbnQpO1xuIH1cbiBcbiB2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxuQEAgLTI0LDExICsyNCw2IEBAIGludCBwc3BfZGV2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZGV2X2lkLCB1OCBnZW5lcmF0aW9uLCBib29sIHN0cmlwX2ljdik7XG4gLyogS2VybmVsLWZhY2luZyBBUEkgKi9cbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0cmV0dXJuIHBhcy1cdTAwM2VkcnZfZGF0YTtcbi19XG4tXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuIHZvaWQgcHNwX3NrX2Fzc29jX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5pbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5AQCAtMjE5LDEyICsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbitcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXG4rXHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHQvKipcbiBcdCAqIEB0eF9rZXlfZGVsOiByZW1vdmUgYSBUeCBrZXkgZnJvbSB0aGUgZGV2aWNlXG4gXHQgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbitcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3AuaCBiL25ldC9wc3AvcHNwLmhcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcC5oXG4rKysgYi9uZXQvcHNwL3BzcC5oXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIFx0cmV0dXJuICEhcHNkLVx1MDAzZW9wcztcbiB9XG4gXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbitcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBhcy1cdTAwM2Vwc2QtXHUwMDNlbG9jayk7XG4rXHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbit9XG4rXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3BfbWFpbi5jIGIvbmV0L3BzcC9wc3BfbWFpbi5jXG5pbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXG4rKysgYi9uZXQvcHNwL3BzcF9tYWluLmNcbkBAIC02OCw5ICs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4rXHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbitcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4rXHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICsxNDcsMTEgQEAgdm9pZCBwc3BfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiBcbiBcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXMsIG5leHQsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XG4rXHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuK1x0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4rXHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4rKysgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4gfVxuIFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiBcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0cmV0dXJuIHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIHBhcywgZXh0YWNrKTtcbitcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuK1x0aW50IGVycjtcbitcbitcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcbitcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXG4rXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbitcdCAqL1xuK1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbitcdGlmICghZHVtbXkpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4rXHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbitcdGlmICghZXJyKVxuK1x0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbitcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuK1xuK1x0a2ZyZWUoZHVtbXkpO1xuK1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gdm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIHtcbi1cdGlmIChwYXMtXHUwMDNldHguc3BpKVxuLVx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuLVx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbitcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICsxMTMsMTEgQEAgc3RhdGljIHZvaWQgcHNwX2Fzc29jX2ZyZWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gXG4gXHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbi1cdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuK1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbitcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuK1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICsxNzUsMjIgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4rXHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuK1x0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0aW50IGVycjtcbitcbitcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcbitcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdG1lbWNweShcdTAwMjZwYXMtXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuIFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XG5AQCAtMTc0LDEyICsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnRcbitwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuK1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxuK1x0XHRcdCAgICAgICBcIlNvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcIik7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuK1x0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbitcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbitcbitcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4rXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbitcdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLFxuIFx0XHRcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbi1cdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbi1cdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKmR1bW15O1xuK1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICsyNzEsNyBAQCBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiBcdFx0Z290byBleGl0X3VubG9jaztcbiBcdH1cbiBcbi1cdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4tXHRpZiAoZXJyKSB7XG4tXHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXCIpO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxuLVx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cbi1cdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxuLVx0ICovXG4tXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xuLVx0aWYgKCFkdW1teSkge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXhpdF9mcmVlX2R1bW15O1xuLVxuLVx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuLVx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuLVxuLVx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuLVx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbi1cdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbi1cbi1cdGljc2sgPSBpbmV0X2Nzayhzayk7XG4tXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4rXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xuIGV4aXRfdW5sb2NrOlxuIFx0cmVsZWFzZV9zb2NrKHNrKTtcbiBcdHJldHVybiBlcnI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MTo1Mi4yMzQwMjQyNDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4MDMxMzY2NzYxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBpcyBldmVuICp3b3J0aCogZnV6emluZywgYW5kIGlmIHNvLCB3aGF0IHRoZSBiZXN0IGFwcHJvYWNoIGlzLiBJIG5lZWQgdG8gbmFpbCBkb3duIHRoZSBvcHRpbWFsIGNvbmZpZ3VyYXRpb24gYW5kIGlkZW50aWZ5IHRoZSByaWdodCBmb2N1cyBzeW1ib2xzLlxuXG5GaXJzdCBzdGVwOiBnZXQgYSBnb29kIGxvb2sgYXQgdGhlIGNoYW5nZXMuIEkgc2VlIHRoYXQgdGhlIHBhdGNoIHRvdWNoZXM6XG5cbiogICBgZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oYFxuKiAgIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgXG4qICAgYGluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaGBcbiogICBgaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhgXG4qICAgYG5ldC9wc3AvcHNwLmhgXG4qICAgYG5ldC9wc3AvcHNwX21haW4uY2BcbiogICBgbmV0L3BzcC9wc3Bfc29jay5jYFxuXG5SaWdodCwgc28gd2UncmUgZGVhbGluZyB3aXRoIHRoZSBuZXR3b3JrIGRldmljZSBzaW11bGF0b3IgYW5kIHNvbWUga2luZCBvZiBcInBzcFwiIChsaWtlbHkgcGFja2V0IHNjaGVkdWxpbmcgb3IgcHJvY2Vzc2luZywgYmFzZWQgb24gdGhlIGluY2x1ZGUgcGF0aHMpLiBEZWZpbml0ZWx5IGludGVyZXN0aW5nLiBOZXh0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udGV4dCBvZiB0aGVzZSBtb2RpZmljYXRpb25zLiBJJ2xsIG5lZWQgdG8gdXNlIGBncmVwcGVyYCBvciBgcmVhZC1maWxlYCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSBhbmQgc2VlIHdoYXQncyBhY3R1YWxseSBiZWluZyBjaGFuZ2VkLiBUaGF0J2xsIGxldCBtZSBkZWNpZGUgd2hldGhlciB3ZSdyZSBsb29raW5nIGF0IHNvbWV0aGluZyB0aGF0IGNvdWxkIGJlIGhpdCBieSBmdXp6aW5nLCBhbmQgaWYgc28sIHdoYXQgdGhlIG1vc3QgdnVsbmVyYWJsZSBhcmVhcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc0NzAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTksIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjowMC4yNjUzOTM3MTdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYyODE4ODU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfSU5FVF9QU1BcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlPTE5PWVuZGlmXFxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL01ha2VmaWxlLTIwLVxcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9NYWtlZmlsZToyMTppZm5lcSAoJChDT05GSUdfSU5FVF9QU1ApLClcXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vTWFrZWZpbGUtMjItbmV0ZGV2c2ltLW9ianMgKz0gcHNwLm9cXG4tLVxcbmRyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaD00NDQ9c3RhdGljIGlubGluZSB2b2lkIG5zaW1fbWFjc2VjX3RlYXJkb3duKHN0cnVjdCBuZXRkZXZzaW0gKm5zKVxcbi0tXFxuZHJpdmVycy9uZXQvbmV0ZGV2c2ltL25ldGRldnNpbS5oLTQ0OC1cXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmg6NDQ5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmgtNDUwLWludCBuc2ltX3BzcF9pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmg9MjE1OD1zdHJ1Y3QgbmV0X2RldmljZSB7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oLTIzODgtI2VuZGlmXFxuaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaDoyMzg5OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oLTIzOTAtXFx0c3RydWN0IHBzcF9kZXYgX19yY3VcXHQqcHNwX2RldjtcXG4tLVxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg9NTA0Mz1lbnVtIHNrYl9leHRfaWQge1xcbi0tXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDU4LSNlbmRpZlxcbmluY2x1ZGUvbGludXgvc2tidWZmLmg6NTA1OTojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxuaW5jbHVkZS9saW51eC9za2J1ZmYuaC01MDYwLVxcdFNLQl9FWFRfUFNQLFxcbi0tXFxuaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg9MzM9c3RydWN0IGluZXRfdGltZXdhaXRfc29jayB7XFxuLS1cXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04NC1cXHRzdHJ1Y3QgaW5ldF9iaW5kMl9idWNrZXRcXHQqdHdfdGIyO1xcbmluY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oOjg1OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaC04Ni1cXHRzdHJ1Y3QgcHNwX2Fzc29jIF9fcmN1XFx0ICAqcHNwX2Fzc29jO1xcbi0tXFxuaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oPTI1PXZvaWQgcHNwX2Fzc29jX3B1dChzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpO1xcbmluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaC0yNi1cXG5pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmg6Mjc6I2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxcbmluY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaC0yOC11bnNpZ25lZCBpbnQgcHNwX2tleV9zaXplKHUzMiB2ZXJzaW9uKTtcXG4tLVxcbmluY2x1ZGUvbmV0L3NvY2suaD0zNjU9c3RydWN0IHNvY2sge1xcbi0tXFxuaW5jbHVkZS9uZXQvc29jay5oLTQ2Ni0jZW5kaWZcXG5pbmNsdWRlL25ldC9zb2NrLmg6NDY3OiNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX1BTUClcXG5pbmNsdWRlL25ldC9zb2NrLmgtNDY4LVxcdHN0cnVjdCBwc3BfYXNzb2MgX19yY3VcXHQqcHNwX2Fzc29jO1xcbi0tXFxubmV0L01ha2VmaWxlPTIwPW9iai0kKENPTkZJR19VTklYKVxcdFxcdCs9IHVuaXgvXFxubmV0L01ha2VmaWxlOjIxOm9iai0kKENPTkZJR19JTkVUX1BTUClcXHRcXHQrPSBwc3AvXFxubmV0L01ha2VmaWxlLTIyLW9iai15XFx0XFx0XFx0XFx0Kz0gaXB2Ni9cXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jPTUxNTA9c3RhdGljIGNvbnN0IHU4IHNrYl9leHRfdHlwZV9sZW5bXSA9IHtcXG4tLVxcbm5ldC9jb3JlL3NrYnVmZi5jLTUxNjUtI2VuZGlmXFxubmV0L2NvcmUvc2tidWZmLmM6NTE2NjojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxubmV0L2NvcmUvc2tidWZmLmMtNTE2Ny1cXHRbU0tCX0VYVF9QU1BdID0gU0tCX0VYVF9DSFVOS1NJWkVPRihzdHJ1Y3QgcHNwX3NrYl9leHQpLFxcbi0tXFxubmV0L2NvcmUvc29jay5jPTI0Nzk9c3RydWN0IHNvY2sgKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHksXFxuLS1cXG5uZXQvY29yZS9zb2NrLmMtMjQ5Ni0jZW5kaWZcXG5uZXQvY29yZS9zb2NrLmM6MjQ5NzojaWYgSVNfRU5BQkxFRChDT05GSUdfSU5FVF9QU1ApXFxubmV0L2NvcmUvc29jay5jLTI0OTgtXFx0UkNVX0lOSVRfUE9JTlRFUihuZXdzay1cXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcXG4tLVxcbm5ldC9wc3AvTWFrZWZpbGUtMi1cXG5uZXQvcHNwL01ha2VmaWxlOjM6b2JqLSQoQ09ORklHX0lORVRfUFNQKSArPSBwc3Aub1xcbm5ldC9wc3AvTWFrZWZpbGUtNC1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZz0zPUNPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTPW5cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWc6NDpDT05GSUdfSU5FVF9QU1A9eVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZy01LUNPTkZJR19JUFY2PXlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDEuODkzNTg5MjY0WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQwOTU3Mzc0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhvc2UgdGhvdWdodHMgZnJvbSBhIGZpcnN0LXBlcnNvbiwgZXhwZXJ0IHBlcnNwZWN0aXZlLCBmb2N1c2luZyBvbiB0aGUgYXNzdW1lZCBrbm93bGVkZ2UgdGhlIHVzZXIgaGFzOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgTmV0d29yayBTaW11bGF0aW9uKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgYSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBteSB3b3JrIHRoYXQgZGVhbHMgd2l0aCBuZXR3b3JraW5nIHNpbXVsYXRpb24uIE15IGZpcnN0IGluc3RpbmN0LCBhcyBhbHdheXMsIGlzIHRvIGNoZWNrIHRoZSBrZXJuZWwncyBLY29uZmlnIHN5c3RlbS4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBJTkVUX1BTUGAgYW5kIGBORVRERVZTSU1gIHJlbGF0ZSB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJhbWV3b3JrLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtYXAgb2YgdGhlIGdlbmVyYWwgbmV0d29yayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSwgYnV0IHRoZXNlIHR3bywgaW4gdGhpcyBwYXJ0aWN1bGFyIHNjZW5hcmlvLCBuZWVkIGEgY2xvc2VyIGxvb2suIEkgbmVlZCB0byBxdWlja2x5IGVzdGFibGlzaCBpZiBvbmUgZGVwZW5kcyBvbiB0aGUgb3RoZXIsIGlmIHRoZXkncmUgbXV0dWFsbHkgZXhjbHVzaXZlIGluIHNvbWUgY29tYmluYXRpb25zLCBvciBpZiB0aGV54oCZcmUgaW5kZXBlbmRlbnQgZmVhdHVyZXMgdGhhdCBjYW4gaW50ZXJhY3QuIEl0J3MgdGltZSB0byBwYXJzZSB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgc2VlIGV4YWN0bHkgaG93IHRoZXNlIHRoaW5ncyBhcmUgZGVmaW5lZCBhbmQgY29uc3RyYWluZWQuIEkgZXhwZWN0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29uZGl0aW9uYWwgZGVwZW5kZW5jaWVzIG9yIGRlZmF1bHQgdmFsdWVzIEkgbmVlZCB0byBpbnRlcm5hbGl6ZSB0byBlbnN1cmUgSSBzZXQgdXAgbXkgc2ltdWxhdGlvbiBlbnZpcm9ubWVudCBjb3JyZWN0bHkuIEknbGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBgc2VsZWN0YCBhbmQgYGRlcGVuZHMgb25gIHN0YXRlbWVudHMgdG8gZ2V0IGEgZnVsbCBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MDY4LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDQuMzAzMTY2MTgzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2ODUxNzg1NTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIElORVRfUFNQXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wc3AvS2NvbmZpZy00LSNcXG5uZXQvcHNwL0tjb25maWc6NTpjb25maWcgSU5FVF9QU1BcXG5uZXQvcHNwL0tjb25maWctNi1cXHRib29sIFxcXCJQU1AgU2VjdXJpdHkgUHJvdG9jb2wgc3VwcG9ydFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MDUuOTg4MzQ5NDc1WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY5Mjc4MzEyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OlxuXG4qKkV4YW1pbmluZyBLY29uZmlnIEZpbGVzIGZvciBOZXR3b3JrIERldmljZSBDb25maWd1cmF0aW9uKipcblxuT2theSwgdGltZSB0byBkaWcgaW50byB0aGUgY29uZmlndXJhdGlvbiBhc3BlY3RzIG9mIHRoZXNlIG5ldHdvcmsgZHJpdmVycy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSB1c2VyIGNvbmZpZ3VyZXMgdGhlc2Ugc3BlY2lmaWMgbmV0d29yayBkZXZpY2VzIHdpdGhpbiB0aGUga2VybmVsLiBUaGUgb2J2aW91cyBzdGFydGluZyBwb2ludHMgYXJlIHRoZSBgbmV0L3BzcC9LY29uZmlnYCBhbmQgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9LY29uZmlnYCBmaWxlcy4gSSdtIGV4cGVjdGluZyB0aGVzZSB0byBvdXRsaW5lIHRoZSBtZW51IGVudHJpZXMsIGRlcGVuZGVuY2llcywgZGVmYXVsdCB2YWx1ZXMsIGFuZCBoZWxwIHRleHQgdGhhdCBndWlkZSB0aGUgdXNlcidzIGNob2ljZXMgZHVyaW5nIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBwaGFzZSAodXNpbmcgYG1ha2UgbWVudWNvbmZpZ2AsIGBtYWtlIGRlZmNvbmZpZ2AsIG9yIHNpbWlsYXIpLiBJ4oCZbGwgYmUgbG9va2luZyBmb3IgdGhpbmdzIGxpa2U6XG5cbiogICAqKkRlcGVuZGVuY2llczoqKiBXaGF0IG90aGVyIGtlcm5lbCBmZWF0dXJlcyBuZWVkIHRvIGJlIGVuYWJsZWQgYmVmb3JlIHRoZXNlIGRldmljZXMgYmVjb21lIGF2YWlsYWJsZT8gQXJlIHRoZXJlIHNwZWNpZmljIGhhcmR3YXJlIG9yIGRyaXZlciByZXF1aXJlbWVudHM/XG4qICAgKipEZWZhdWx0IFZhbHVlczoqKiBXaGF0J3MgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24/IElzIHRoZSBkcml2ZXIgZW5hYmxlZCBieSBkZWZhdWx0LCBvciBkaXNhYmxlZD8gV2hhdCBhcmUgYW55IGRlZmF1bHQgcGFyYW1ldGVycyBsaWtlIGJ1ZmZlciBzaXplcyBvciBxdWV1ZSBsZW5ndGhzP1xuKiAgICoqTWVudSBTdHJ1Y3R1cmU6KiogSG93IGFyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGdyb3VwZWQ/IEFyZSB0aGV5IG9yZ2FuaXplZCBsb2dpY2FsbHkgYnkgZmVhdHVyZSwgZGV2aWNlIHR5cGUsIG9yIG5ldHdvcmsgcHJvdG9jb2w/IEhvdyBkZWVwbHkgbmVzdGVkIGFyZSB0aGV5P1xuKiAgICoqSGVscCBUZXh0OioqIElzIHRoZSBoZWxwIHRleHQgY2xlYXIgYW5kIGluZm9ybWF0aXZlPyBEb2VzIGl0IGV4cGxhaW4gdGhlIHB1cnBvc2Ugb2YgZWFjaCBvcHRpb24gYW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBEb2VzIGl0IHByb3ZpZGUgZ3VpZGFuY2Ugb24gd2hpY2ggc2V0dGluZ3MgYXJlIHN1aXRhYmxlIGZvciBkaWZmZXJlbnQgdXNlIGNhc2VzP1xuKiAgICoqQ29tcGF0aWJpbGl0eToqKiBBcmUgdGhlcmUgYW55IGtub3duIGNvbXBhdGliaWxpdHkgaXNzdWVzIG9yIGxpbWl0YXRpb25zPyBJcyB0aGVyZSBhbnkgaW5kaWNhdGlvbiBvZiB3aGljaCBoYXJkd2FyZSB2ZXJzaW9ucyBvciBzb2Z0d2FyZSB2ZXJzaW9ucyB0aGUgZHJpdmVycyBhcmUgZGVzaWduZWQgZm9yP1xuXG5VbmRlcnN0YW5kaW5nIHRoZXNlIGBLY29uZmlnYCBmaWxlcyBpcyBmb3VuZGF0aW9uYWwuIEl0J3MgdGhlIGtleSB0byB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBkcml2ZXJzIGFyZSBpbnRlZ3JhdGVkIGFuZCBob3cgZW5kLXVzZXJzIGludGVyYWN0IHdpdGggdGhlbSBpbiB0aGUgbGFyZ2VyIGtlcm5lbCBlY29zeXN0ZW0uIFRoaXMgaXMgd2hlcmUgdGhlIHN0b3J5IGJlZ2lucy5cblxuXG4iLCJJbnB1dFRva2VucyI6OTQxMywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjA4LjY4MTEzNDkxMVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc5NzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBQU1AgY29uZmlndXJhdGlvblxcbiAgIDQ6XFx0I1xcbiAgIDU6XFx0Y29uZmlnIElORVRfUFNQXFxuICAgNjpcXHRcXHRib29sIFxcXCJQU1AgU2VjdXJpdHkgUHJvdG9jb2wgc3VwcG9ydFxcXCJcXG4gICA3OlxcdFxcdGRlcGVuZHMgb24gSU5FVFxcbiAgIDg6XFx0XFx0c2VsZWN0IFNLQl9ERUNSWVBURURcXG4gICA5OlxcdFxcdHNlbGVjdCBTS0JfRVhURU5TSU9OU1xcbiAgMTA6XFx0XFx0c2VsZWN0IFNPQ0tfVkFMSURBVEVfWE1JVFxcbiAgMTE6XFx0XFx0aGVscFxcbiAgMTI6XFx0XFx0RW5hYmxlIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgUFNQIFNlY3VyaXR5IFByb3RvY29sIChQU1ApLlxcbiAgMTM6XFx0XFx0Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOlxcbiAgMTQ6XFx0XFx0ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZ29vZ2xlL3BzcC9tYWluL2RvYy9QU1BfQXJjaF9TcGVjLnBkZlxcbiAgMTU6XFx0XFxuICAxNjpcXHRcXHRJZiB1bnN1cmUsIHNheSBOLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjowOC42ODEyMTY0ODFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDYwNDE1OTA0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCB3ZW50OlxuXG4qKkV4YW1pbmluZyBLY29uZmlnIGZvciBOZXRkZXZzaW0gQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHNvbWV0aGluZyBuZXR3b3JrLXJlbGF0ZWQsIGFuZCBJJ20gcHJldHR5IHN1cmUgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuIE15IG1pbmQgaW1tZWRpYXRlbHkgZ29lcyB0byB3aGVyZSB0aGVzZSB0aGluZ3MgYXJlIHVzdWFsbHkgZGVmaW5lZCBpbiB0aGUga2VybmVsIHNvdXJjZSwgYW5kIHRoYXQncyB0aGUgYEtjb25maWdgIGZpbGVzLiBTaW5jZSB3ZSdyZSBkZWFsaW5nIHdpdGggdGhlIG5ldHdvcmsgZGV2aWNlIHNpbXVsYXRvciwgYG5ldGRldnNpbWAsIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBkb24ndCBvdmVybG9vayBhbnl0aGluZyBzcGVjaWZpYyB0byBpdC4gVG8gZW5zdXJlIEkgY292ZXIgYWxsIHJlbGV2YW50IGFzcGVjdHMgb2YgdGhlIGJ1aWxkLCBJIG5lZWQgdG8gb3BlbiBhbmQgcmVhZCB0aGUgYGRyaXZlcnMvbmV0L25ldGRldnNpbS9LY29uZmlnYCBmaWxlLCBzaW5jZSB0aGF0J3MgbGlrZWx5IHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc3BlY2lmaWMgdG8gdGhpcyBtb2R1bGUgYXJlIGRlZmluZWQuIEkgaGF2ZSB0byBtYWtlIHN1cmUgdG8gZXhhbWluZSB0aGlzIGZpbGUgdGhvcm91Z2hseSBhcyBwYXJ0IG9mIG15IGludmVzdGlnYXRpb24uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMDQ1LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoxMC43NDE2MzQ2NjVaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0ODc4MTQ5NDcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5FVERFVlNJTVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJkcml2ZXJzL25ldC9LY29uZmlnPTYwMj1zb3VyY2UgXFxcImRyaXZlcnMvbmV0L2h5cGVydi9LY29uZmlnXFxcIlxcbmRyaXZlcnMvbmV0L0tjb25maWctNjAzLVxcbmRyaXZlcnMvbmV0L0tjb25maWc6NjA0OmNvbmZpZyBORVRERVZTSU1cXG5kcml2ZXJzL25ldC9LY29uZmlnLTYwNS1cXHR0cmlzdGF0ZSBcXFwiU2ltdWxhdGVkIG5ldHdvcmtpbmcgZGV2aWNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoxMi4yMjk0NTY5NzJaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ1NzA5OTQwNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGUgTmV0L1BTUCBJbXBsZW1lbnRhdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzIGFuZCB1bmRlcnN0YW5kIGhvdyB0aGlzIG5ldC9wc3AgbW9kdWxlIHdvcmtzLCBhbmQgbW9yZSBzcGVjaWZpY2FsbHksIGhvdyBpdCdzIGludGVncmF0ZWQuIFBTUCwgYXMgSSByZWNhbGwsIGlzIHRoZSBQU1AgU2VjdXJpdHkgUHJvdG9jb2wg4oCTIHRoYXQgR29vZ2xlIGluaXRpYXRpdmUgZm9yIElQL1RDUCBjcnlwdG8gb2ZmbG9hZC4gV2Uga25vdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgc3lzdGVtIHZpYSBuZXRsaW5rIGFuZCBzb2NrZXRzLCBhbmQgSSdtIHByZXR0eSBzdXJlIGl0IGhhcyBzb21lIG5ldGRldnNpbSBzdXBwb3J0IGJha2VkIGluLiBUaW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29yZSBmaWxlczogYG5ldC9wc3AvcHNwX21haW4uY2Agc2hvdWxkIGJlIHRoZSBlbnRyeSBwb2ludCwgYG5ldC9wc3AvcHNwX3NvY2suY2Agd2lsbCBob2xkIHRoZSBzb2NrZXQtcmVsYXRlZCBjb2RlLCBhbmQgdGhlbiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGBuZXQvcHNwL3BzcF9ubC5jYCBmb3IgYW55IE5ldGxpbmsgaW50ZXJhY3Rpb25zLiBMZXQncyBzZWUgaWYgdGhlIE5ldGxpbmsgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhhdCBzcGVjaWZpYyBmaWxlLiBUbyBzdGFydCBJJ2xsIGxpc3QgdGhlIGZpbGVzIGluIHRoZSBgbmV0L3BzcGAgZGlyZWN0b3J5IHRvIGdldCBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgdGhlIGFyY2hpdGVjdHVyZS4gTGV0J3Mgc2VlIHdoYXQgZ2VtcyB3ZSBjYW4gZmluZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNDMsIk91dHB1dFRva2VucyI6MjEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MTQuNjg2NTU4ODU3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImNvZGVzZWFyY2gtZGlyLWluZGV4IiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTI1MTEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJEaXJcIjogXCJuZXQvcHNwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIkZpbGVzXCI6IFtcbiAgICBcInBzcC1ubC1nZW4uY1wiLFxuICAgIFwicHNwLW5sLWdlbi5oXCIsXG4gICAgXCJwc3AuaFwiLFxuICAgIFwicHNwX21haW4uY1wiLFxuICAgIFwicHNwX25sLmNcIixcbiAgICBcInBzcF9zb2NrLmNcIlxuICBdLFxuICBcIlN1YmRpcnNcIjogbnVsbFxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MTQuNjg2NjEyOTY2WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjc4OTMwNzY3ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqUGF0Y2ggQW5hbHlzaXMgYW5kIEZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB0aGlzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBhIGRlZXBlciBsb29rIGZvciBmdXp6aW5nIHB1cnBvc2VzLiBgbmV0ZGV2c2ltYCBpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZyBiZWNhdXNlIGl0IGlzIGVhc2lseSBhY2Nlc3NpYmxlIHdpdGhpbiBRRU1VLCBtYWtpbmcgaXQgcGVyZmVjdCBmb3Igc3l6a2FsbGVyLiBUaGUgUFNQIHByb3RvY29sIGl0c2VsZiwgbG9jYXRlZCBpbiBgbmV0L3BzcC9gLCBpcyBjb3JlIG5ldHdvcmtpbmcgbG9naWMuIFdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgY2hhbmdlcyBpbnRlcmFjdCBhbmQgc2VlIGlmIHRoZXkgaW50cm9kdWNlIGFueSBuZXcgYXZlbnVlcyBmb3IgZXhwbG9pdGF0aW9uLlxuXG5GaXJzdCwgSSdsbCBhbmFseXplIHRoZSBwYXRjaCBkaWZmLlxuMS4gICoqYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AqKjogSXQgbG9va3MgbGlrZSB0aGUgcGF0Y2ggaXMgc2ltcGxpZnlpbmcgbmV0ZGV2c2ltJ3MgUFNQIGltcGxlbWVudGF0aW9uLiBXZSBhcmUgcmVtb3Zpbmcgc29tZSBpbnRlcm5hbCB0cmFja2luZyBtZWNoYW5pc21zIChgYXNzb2NfY250YCwgIGBuc2ltX2Fzc29jX2FkZGAsIGBuc2ltX2Fzc29jX2RlbGAsIGBhc3NvY19kcnZfc3BjYCkuIFRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIHRoYXQgYG5ldGRldnNpbWAgaXNuJ3Qgc3RvcmluZyBUeCBrZXlzIGluIGhhcmR3YXJlIChTQURCKSwgc28gaXQncyBtYWtpbmcgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgb3BlcmF0aW9ucyBvcHRpb25hbCB3aXRoaW4gYHN0cnVjdCBwc3BfZGV2X29wc2AuIFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiB3aGljaCBtaWdodCBsZWFkIHRvIGVkZ2UgY2FzZXMuXG4yLiAgKipgaW5jbHVkZS9uZXQvcHNwL2Z1bmN0aW9ucy5oYCBhbmQgYGluY2x1ZGUvbmV0L3BzcC90eXBlcy5oYCoqOiBXZSdyZSBzZWVpbmcgbW9yZSBzaW1wbGlmaWNhdGlvbnMuIFRoZSByZW1vdmFsIG9mIGBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKWAgYW5kIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBvcHRpb25hbCBuYXR1cmUgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnVydGhlciBjbGFyaWZ5IHRoZSBpbnRlbnRpb24gb2YgdGhlIGNoYW5nZXMuXG4zLiAgKipgbmV0L3BzcC9wc3AuaGAqKjogVGhlIGludHJvZHVjdGlvbiBvZiBgcHNwX2Rldl9oYXNfc2FkYmAgYW5kIGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbGAgaXMgY3J1Y2lhbC4gVGhleSBhcmUgZGVmaW5pbmcgdGhlIGNvbmRpdGlvbnMgZm9yIHdoZW4gVHgga2V5IG9wZXJhdGlvbnMgYXJlIG5lY2Vzc2FyeS4gV2UncmUgc2VlaW5nIGxvY2tkZXAgYXNzZXJ0aW9ucyAoYGxvY2tkZXBfYXNzZXJ0X2hlbGRgKSB3aGljaCwgaWYgdmlvbGF0ZWQsIGlzIGFuIGluZGljYXRvciBvZiBhIGxvY2tpbmcgaXNzdWUuXG40LiAgKipgbmV0L3BzcC9wc3BfbWFpbi5jYCoqOiBUaGUgdXBkYXRlIHRvIGBwc3BfZGV2X2NyZWF0ZWAgYWxsb3dzIGZvciBOVUxMIGB0eF9rZXlfYWRkYCAvIGB0eF9rZXlfZGVsYCwgYWRkaW5nIGZsZXhpYmlsaXR5IHRvIHRoZSBjb2RlLiBIb3dldmVyLCB0aGUgbG9naWMgcmVnYXJkaW5nIGBhc3NvY19kcnZfc3BjYCBhZGRzIGEgY2hlY2sgdG8gZW5zdXJlIHRoYXQgKmJvdGgqIGNhbiBiZSBudWxsIG9yIG11c3QgYmUgc2V0LiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBub3cgY29uZGl0aW9uYWxseSBjYWxscyBgcHNwX2Rldl90eF9rZXlfZGVsYCBiYXNlZCBvbiB0aGUgY29uZGl0aW9ucy5cbjUuICAqKmBuZXQvcHNwL3BzcF9zb2NrLmNgKio6IFRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gV2UncmUgc2VlaW5nIG1vZGlmaWNhdGlvbnMgdG8gYHBzcF9kZXZfdHhfa2V5X2FkZGAgYW5kIGBwc3BfZGV2X3R4X2tleV9kZWxgIGNvbmNlcm5pbmcgZHVtbXkgYXNzb2NpYXRpb25zLCBjb3B5aW5nIG9mIGRyaXZlciBkYXRhIGFuZCBjaGFuZ2VzIHRvIHRoZSBsaXN0IGhhbmRsaW5nLiBUaGUgaW50cm9kdWN0aW9uIG9mIGBwc3BfYXNzb2Nfc2V0X3R4YCwgYHBzcF9zb2NrX3NldF90eF9rZXlgIGFuZCB1cGRhdGVzIHRvIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgIHJlcHJlc2VudCBjaGFuZ2VzIGluIGtleSBtYW5hZ2VtZW50LlxuXG5NeSBpbnR1aXRpb24gc2F5cyAqdGhpcyBpcyByZWFjaGFibGUgYW5kIHdvcnRoIHRhcmdldGluZy4qXG5cbkhlcmUncyB3aHk6XG5cbiogICAqKkNvcmUgTmV0d29ya2luZyBJbXBhY3QqKjogVGhlIGNoYW5nZXMgYWZmZWN0IHRoZSBQU1Agc3Vic3lzdGVtIChgbmV0L3BzcC9gKSBhbmQgYG5ldGRldnNpbWAsIHdoaWNoIGFyZSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIGNvbXBvbmVudHMuXG4qICAgKipLZXkgTGlmZWN5Y2xlIE1vZGlmaWNhdGlvbnMqKjogV2UncmUgZGVhbGluZyB3aXRoIFR4IGtleSBsaWZlY3ljbGUsIHNvY2tldCBhc3NvY2lhdGlvbnMsIGRldmljZSByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24sIGFuZCB0aGUgbmV0bGluayBQU1AgaW50ZXJmYWNlLiBUaGVzZSBhcmUgYWxsIGhpZ2gtdmFsdWUgdGFyZ2V0cyBmb3IgZnV6emluZy5cbiogICAqKkNvbmN1cnJlbmN5L0xvY2tpbmcqKjogVGhlIHByZXNlbmNlIG9mIGBsb2NrZGVwX2Fzc2VydF9oZWxkYCBzdWdnZXN0cyBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWVzLlxuKiAgICoqRGF0YSBTdHJ1Y3R1cmUgTWFuaXB1bGF0aW9uKio6IFRoZXJlJ3MgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmVzIChsaWtlIGBwc3BfYXNzb2NfZHVtbXlgKS4gTWVtb3J5IGNvcnJ1cHRpb24gaXMgYWx3YXlzIGEgY29uY2Vybi5cbiogICAqKkFjY2Vzc2liaWxpdHkqKjogSXQncyBhbGwgcmVhY2hhYmxlIGluIFFFTVUsIHdoaWNoIGlzIGlkZWFsIGZvciBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdCBhcmUgYWRkZWQgb3IgbW9kaWZpZWQsIGZvY3VzaW5nIG9uIGVudHJ5IHBvaW50cyB0aGF0IGNhbiBiZSBmdXp6ZWQ6XG5cbiogICAqKk1vZGlmaWVkIEZ1bmN0aW9ucyoqOiBgcHNwX2Rldl9jcmVhdGVgLCBgcHNwX2Rldl91bnJlZ2lzdGVyYCBpbiBgbmV0L3BzcC9wc3BfbWFpbi5jYCwgYHBzcF9kZXZfdHhfa2V5X2FkZGAsIGBwc3BfZGV2X3R4X2tleV9kZWxgLCBgcHNwX2Fzc29jX2ZyZWVgLCBhbmQgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAgaW4gYG5ldC9wc3AvcHNwX3NvY2suY2AsIGBuc2ltX2RvX3BzcGAgYW5kIGBuc2ltX3BzcF91bmluaXRgIGluIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLlxuKiAgICoqQWRkZWQgU3RhdGljIEZ1bmN0aW9ucyoqOiBgcHNwX2Fzc29jX3NldF90eGAgYW5kIGBwc3Bfc29ja19zZXRfdHhfa2V5YCBpbiBgbmV0L3BzcC9wc3Bfc29jay5jYC4gSSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlc2UgYXJlIGlubGluZWQgb3IgaGF2ZSBlbnRyeSBwb2ludHMuXG5cbkknbGxcblxuIiwiSW5wdXRUb2tlbnMiOjEwNzU5LCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTI2NiwiVG9vbENhbGxzIjpbImNvZGVzZWFyY2gtZGlyLWluZGV4Il19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjIuNTc5NjkyOThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3MjQ0ODM5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9wc3AvcHNwLmg9MjY9aW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4tLVxcbm5ldC9wc3AvcHNwLmgtMjgtXFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spO1xcbm5ldC9wc3AvcHNwLmg6Mjk6aW50IHBzcF9zb2NrX2Fzc29jX3NldF90eChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsXFxubmV0L3BzcC9wc3AuaC0zMC1cXHRcXHRcXHQgIHUzMiB2ZXJzaW9uLCBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4tLVxcbm5ldC9wc3AvcHNwX25sLmM9ODI2PWludCBwc3BfbmxfdHhfYXNzb2NfZG9pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3BzcC9wc3BfbmwuYy04NTctXFxubmV0L3BzcC9wc3BfbmwuYzo4NTg6XFx0ZXJyID0gcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHNvY2tldC1cXHUwMDNlc2ssIHBzZCwgdmVyc2lvbiwgXFx1MDAyNmtleSxcXG5uZXQvcHNwL3BzcF9ubC5jLTg1OS1cXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlZXh0YWNrKTtcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYz0yMTQ9cHNwX3NvY2tfc2V0X3R4X2tleShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYy0yNDEtXFxubmV0L3BzcC9wc3Bfc29jay5jOjI0MjppbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG5uZXQvcHNwL3BzcF9zb2NrLmMtMjQzLVxcdFxcdFxcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjoyNC4zMDQyMjQ2N1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjc3ODc1OTU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgaWYgSSB3ZXJlIHRoaW5raW5nIHRoZXNlIHRob3VnaHRzOlxuXG4qKkRpdmluZyBpbnRvIFBTUCBTb2NrZXQgTWFuYWdlbWVudCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGludG8gdGhlIGBuZXQvcHNwL3BzcF9zb2NrLmNgIGZpbGUuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhpcyBQU1Agc29ja2V0IGFzc29jaWF0aW9uIHByb2Nlc3Mgd29ya3MuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGZvY3VzIG9uIHRoZSBrZXkgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gbWFuYWdpbmcgdHJhbnNtaXQga2V5cyBhbmQgYXNzb2NpYXRpb25zLiBMZXQncyBzdGFydCBieSBsb29raW5nIGNsb3NlbHkgYXQgYHBzcF9hc3NvY19mcmVlYC4gSSB3YW50IHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIHdoZW4gYW4gYXNzb2NpYXRpb24gaXMgdGVybWluYXRlZC4gV2hhdCBoYXBwZW5zIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RydWN0dXJlcz8gV2hhdCdzIHRoZSBjb21wbGV0ZSB0ZWFyZG93biBwcm9jZXNzP1xuXG5UaGVuLCBJJ2xsIG1vdmUgb24gdG8gYHBzcF9kZXZfdHhfa2V5X2FkZGAgYW5kIGBwc3BfZGV2X3R4X2tleV9kZWxgLiBJIG5lZWQgdG8gZW5zdXJlIEkgaGF2ZSBhIHNvbGlkIGdyYXNwIG9mIGhvdyB0cmFuc21pdCBrZXlzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZCBmb3IgdGhlIGFzc29jaWF0ZWQgZGV2aWNlcy4gV2hhdCBhcmUgdGhlIGtleSBtYW5hZ2VtZW50IG1lY2hhbmljcz8gSG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgaGFyZHdhcmU/IEFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIEkgc2hvdWxkIGJlIG1pbmRmdWwgb2Y/IEkgbmVlZCB0byBsb29rIGF0IHRoZSBsb2NraW5nIHN0cmF0ZWd5IHdpdGhpbiB0aGVzZSBmdW5jdGlvbnMuXG5cbkZpbmFsbHksIHRoZSBgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4YCBmdW5jdGlvbi4gVGhpcyBsaWtlbHkgb3JjaGVzdHJhdGVzIHRoZSBvdmVyYWxsIHByb2Nlc3Mgb2Ygc2V0dGluZyB1cCB0aGUgdHJhbnNtaXQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHNvY2tldCBhc3NvY2lhdGlvbiwgc28gSSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYSBnb29kIHNlbnNlIG9mIHRoZSBjb21wbGV0ZSBmbG93IGJ5IHN0dWR5aW5nIHRoZSBmdW5jdGlvbi4gSSBuZWVkIHRvIGJlIHN1cmUgSSBhbSB2ZXJ5IGNsZWFyIG9uIHRoZSBwYXJhbWV0ZXJzIGhlcmUgYW5kIHdoYXQgdGhleSBhcmUgdXNlZCBmb3IuIEkgd2lsbCBjaGVjayBmb3IgZXJyb3IgaGFuZGxpbmcgaGVyZSB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNDgxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjYuNTgyMTAyOTM3WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNzMwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcHNwL3BzcF9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNzAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNzA6XFx0e1xcbiAgNzE6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cXHUwMDNlcHNkO1xcbiAgNzI6XFx0XFx0c2l6ZV90IHN6O1xcbiAgNzM6XFx0XFxuICA3NDpcXHRcXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAgNzU6XFx0XFxuICA3NjpcXHRcXHRzeiA9IHN0cnVjdF9zaXplKHBhcywgZHJ2X2RhdGEsIHBzZC1cXHUwMDNlY2Fwcy1cXHUwMDNlYXNzb2NfZHJ2X3NwYyk7XFxuICA3NzpcXHRcXHRyZXR1cm4ga21lbWR1cChwYXMsIHN6LCBHRlBfS0VSTkVMKTtcXG4gIDc4OlxcdH1cXG4gIDc5OlxcdFxcbiAgODA6XFx0c3RhdGljIGludCBwc3BfZGV2X3R4X2tleV9hZGQoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAgODE6XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksXFxuICA4MjpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuICA4MzpcXHR7XFxuICA4NDpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpkdW1teTtcXG4gIDg1OlxcdFxcdGludCBlcnI7XFxuICA4NjpcXHRcXG4gIDg3OlxcdFxcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcXG4gIDg4OlxcdFxcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXFxuICA4OTpcXHRcXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cXG4gIDkwOlxcdFxcdCAqL1xcbiAgOTE6XFx0XFx0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcXG4gIDkyOlxcdFxcdGlmICghZHVtbXkpXFxuICA5MzpcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gIDk0OlxcdFxcbiAgOTU6XFx0XFx0bWVtY3B5KFxcdTAwMjZkdW1teS1cXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcXG4gIDk2OlxcdFxcdGVyciA9IHBzZC1cXHUwMDNlb3BzLVxcdTAwM2V0eF9rZXlfYWRkKHBzZCwgZHVtbXksIGV4dGFjayk7XFxuICA5NzpcXHRcXHRpZiAoIWVycilcXG4gIDk4OlxcdFxcdFxcdG1lbWNweShwYXMtXFx1MDAzZWRydl9kYXRhLCBkdW1teS1cXHUwMDNlZHJ2X2RhdGEsXFxuICA5OTpcXHRcXHRcXHQgICAgICAgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjKTtcXG4gMTAwOlxcdFxcbiAxMDE6XFx0XFx0a2ZyZWUoZHVtbXkpO1xcbiAxMDI6XFx0XFx0cmV0dXJuIGVycjtcXG4gMTAzOlxcdH1cXG4gMTA0OlxcdFxcbiAxMDU6XFx0dm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxcbiAxMDY6XFx0e1xcbiAxMDc6XFx0XFx0cHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xcbiAxMDg6XFx0fVxcbiAxMDk6XFx0XFxuIDExMDpcXHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXFxuIDExMTpcXHR7XFxuIDExMjpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzcF9hc3NvYywgd29yayk7XFxuIDExMzpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVxcdTAwM2Vwc2Q7XFxuIDExNDpcXHRcXG4gMTE1OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuIDExNjpcXHRcXHRpZiAocHNwX2Rldl9pc19yZWdpc3RlcmVkKHBzZCkpIHtcXG4gMTE3OlxcdFxcdFxcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxcbiAxMTg6XFx0XFx0XFx0XFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcXG4gMTE5OlxcdFxcdFxcdGxpc3RfZGVsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0KTtcXG4gMTIwOlxcdFxcdH1cXG4gMTIxOlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2cHNkLVxcdTAwM2Vsb2NrKTtcXG4gMTIyOlxcdFxcdHBzcF9kZXZfcHV0KHBzZCk7XFxuIDEyMzpcXHRcXHRrZnJlZShwYXMpO1xcbiAxMjQ6XFx0fVxcbiAxMjU6XFx0XFxuIDEyNjpcXHRzdGF0aWMgdm9pZCBwc3BfYXNzb2NfZnJlZV9xdWV1ZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXFxuIDEyNzpcXHR7XFxuIDEyODpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXMgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBzcF9hc3NvYywgcmN1KTtcXG4gMTI5OlxcdFxcbiAxMzA6XFx0XFx0SU5JVF9XT1JLKFxcdTAwMjZwYXMtXFx1MDAzZXdvcmssIHBzcF9hc3NvY19mcmVlKTtcXG4gMTMxOlxcdFxcdHNjaGVkdWxlX3dvcmsoXFx1MDAyNnBhcy1cXHUwMDNld29yayk7XFxuIDEzMjpcXHR9XFxuIDEzMzpcXHRcXG4gMTM0OlxcdC8qKlxcbiAxMzU6XFx0ICogcHNwX2Fzc29jX3B1dCgpIC0gcmVsZWFzZSBhIHJlZmVyZW5jZSBvbiBhIFBTUCBhc3NvY2lhdGlvblxcbiAxMzY6XFx0ICogQHBhczogYXNzb2NpYXRpb24gdG8gcmVsZWFzZVxcbiAxMzc6XFx0ICovXFxuIDEzODpcXHR2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxcbiAxMzk6XFx0e1xcbiAxNDA6XFx0XFx0aWYgKHBhcyBcXHUwMDI2XFx1MDAyNiByZWZjb3VudF9kZWNfYW5kX3Rlc3QoXFx1MDAyNnBhcy1cXHUwMDNlcmVmY250KSlcXG4gMTQxOlxcdFxcdFxcdGNhbGxfcmN1KFxcdTAwMjZwYXMtXFx1MDAzZXJjdSwgcHNwX2Fzc29jX2ZyZWVfcXVldWUpO1xcbiAxNDI6XFx0fVxcbiAxNDM6XFx0XFxuIDE0NDpcXHR2b2lkIHBzcF9za19hc3NvY19mcmVlKHN0cnVjdCBzb2NrICpzaylcXG4gMTQ1OlxcdHtcXG4gMTQ2OlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2stXFx1MDAzZXBzcF9hc3NvYywgMSk7XFxuIDE0NzpcXHRcXG4gMTQ4OlxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihzay1cXHUwMDNlcHNwX2Fzc29jLCBOVUxMKTtcXG4gMTQ5OlxcdFxcdHBzcF9hc3NvY19wdXQocGFzKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjYuNTgyMjExNjU3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyODYxMTQ3OTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYHBzcF9zb2NrLmNgKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgc3BlY2lmaWMuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCB0aGUgYG5ldC9wc3AvcHNwX3NvY2suY2AgZmlsZSBhZ2Fpbi4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gbGluZXMgMjAwIHRocm91Z2ggMjgwLiBUaGF0IHNlY3Rpb24gbGlrZWx5IGNvbnRhaW5zIHRoZSBzb2NrZXQtc3BlY2lmaWMgZnVuY3Rpb25zIG9yIHN0cnVjdHVyZXMgSSdtIGludGVyZXN0ZWQgaW4sIGdpdmVuIHRoZSBjb250ZXh0LiBJJ20gaG9waW5nIHRvIHF1aWNrbHkgaWRlbnRpZnkgdGhlIHJlbGV2YW50IGRhdGEgc3RydWN0dXJlcyBvciBmdW5jdGlvbiBjYWxscyByZWxhdGVkIHRvIHRoZSBpc3N1ZSBJJ20gaW52ZXN0aWdhdGluZy4gSSBrbm93IEkgaGF2ZSBhIGdvb2QgaGFuZGxlIG9uIHRoaXMgY29kZSwgc28gSSBhbnRpY2lwYXRlIGJlaW5nIGFibGUgdG8gZ3Jhc3AgdGhlIGNvcmUgbG9naWMgdGhlcmUgcXVpY2tseSBhbmQgZGV0ZXJtaW5lIGl0cyByb2xlIGluIHRoZSBsYXJnZXIgcGljdHVyZS4gSSdtIGV4cGVjdGluZyB0byBlaXRoZXIgcmVmcmVzaCBteSBtZW1vcnkgb24gdGhlIGhhbmRsaW5nIG9mIHNwZWNpZmljIHNvY2tldCBvcGVyYXRpb25zIG9yIHBlcmhhcHMgZ2V0IGEgaGludCBhYm91dCBob3cgdGhpcyBwYXJ0IG9mIHRoZSBuZXR3b3JrIHN0YWNrIGludGVyYWN0cyB3aXRoIG90aGVyIG1vZHVsZXMuIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTA5MCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MjguODY4MzMwMTQzWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwMjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvcHNwX3NvY2suY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzAsXG4gIFwiTGluZUNvdW50XCI6IDkwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNzA6XFx0XFx0ZXJyID0gMDtcXG4gMTcxOlxcdFxcbiAxNzI6XFx0ZXhpdF91bmxvY2s6XFxuIDE3MzpcXHRcXHRyZWxlYXNlX3NvY2soc2spO1xcbiAxNzQ6XFx0XFxuIDE3NTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAxNzY6XFx0fVxcbiAxNzc6XFx0XFxuIDE3ODpcXHRzdGF0aWMgaW50IHBzcF9hc3NvY19zZXRfdHgoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAxNzk6XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcbiAxODA6XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4gMTgxOlxcdHtcXG4gMTgyOlxcdFxcdGludCBlcnI7XFxuIDE4MzpcXHRcXG4gMTg0OlxcdFxcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcXG4gMTg1OlxcdFxcdFxcdGVyciA9IHBzcF9kZXZfdHhfa2V5X2FkZChwc2QsIHBhcywga2V5LCBleHRhY2spO1xcbiAxODY6XFx0XFx0XFx0aWYgKGVycilcXG4gMTg3OlxcdFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDE4ODpcXHRcXHR9XFxuIDE4OTpcXHRcXG4gMTkwOlxcdFxcdG1lbWNweShcXHUwMDI2cGFzLVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbiAxOTE6XFx0XFx0cmV0dXJuIDA7XFxuIDE5MjpcXHR9XFxuIDE5MzpcXHRcXG4gMTk0OlxcdHN0YXRpYyBpbnQgcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcXG4gMTk1OlxcdHtcXG4gMTk2OlxcdFxcdHN0cnVjdCBwc3Bfc2tiX2V4dCAqcHNlO1xcbiAxOTc6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcXG4gMTk4OlxcdFxcbiAxOTk6XFx0XFx0c2tiX3JidHJlZV93YWxrKHNrYiwgXFx1MDAyNnRjcF9zayhzayktXFx1MDAzZW91dF9vZl9vcmRlcl9xdWV1ZSkge1xcbiAyMDA6XFx0XFx0XFx0cHNlID0gc2tiX2V4dF9maW5kKHNrYiwgU0tCX0VYVF9QU1ApO1xcbiAyMDE6XFx0XFx0XFx0aWYgKCFwc3BfcHNlX21hdGNoZXNfcGFzKHBzZSwgcGFzKSlcXG4gMjAyOlxcdFxcdFxcdFxcdHJldHVybiAtRUJVU1k7XFxuIDIwMzpcXHRcXHR9XFxuIDIwNDpcXHRcXG4gMjA1OlxcdFxcdHNrYl9xdWV1ZV93YWxrKFxcdTAwMjZzay1cXHUwMDNlc2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKSB7XFxuIDIwNjpcXHRcXHRcXHRwc2UgPSBza2JfZXh0X2ZpbmQoc2tiLCBTS0JfRVhUX1BTUCk7XFxuIDIwNzpcXHRcXHRcXHRpZiAoIXBzcF9wc2VfbWF0Y2hlc19wYXMocHNlLCBwYXMpKVxcbiAyMDg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FQlVTWTtcXG4gMjA5OlxcdFxcdH1cXG4gMjEwOlxcdFxcdHJldHVybiAwO1xcbiAyMTE6XFx0fVxcbiAyMTI6XFx0XFxuIDIxMzpcXHRzdGF0aWMgaW50XFxuIDIxNDpcXHRwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxcbiAyMTU6XFx0XFx0XFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LCBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDIxNjpcXHR7XFxuIDIxNzpcXHRcXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XFxuIDIxODpcXHRcXHRpbnQgZXJyO1xcbiAyMTk6XFx0XFxuIDIyMDpcXHRcXHRlcnIgPSBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHNrLCBwYXMpO1xcbiAyMjE6XFx0XFx0aWYgKGVycikge1xcbiAyMjI6XFx0XFx0XFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxcbiAyMjM6XFx0XFx0XFx0XFx0ICAgICAgIFxcXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXFxcIik7XFxuIDIyNDpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbiAyMjU6XFx0XFx0fVxcbiAyMjY6XFx0XFxuIDIyNzpcXHRcXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XFxuIDIyODpcXHRcXHRpZiAoZXJyKVxcbiAyMjk6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMjMwOlxcdFxcbiAyMzE6XFx0XFx0V1JJVEVfT05DRShzay1cXHUwMDNlc2tfdmFsaWRhdGVfeG1pdF9za2IsIHBzcF92YWxpZGF0ZV94bWl0KTtcXG4gMjMyOlxcdFxcdHRjcF93cml0ZV9jb2xsYXBzZV9mZW5jZShzayk7XFxuIDIzMzpcXHRcXHRwYXMtXFx1MDAzZXVwZ3JhZGVfc2VxID0gdGNwX3NrKHNrKS1cXHUwMDNlcmN2X254dDtcXG4gMjM0OlxcdFxcbiAyMzU6XFx0XFx0aWNzayA9IGluZXRfY3NrKHNrKTtcXG4gMjM2OlxcdFxcdGljc2stXFx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcXG4gMjM3OlxcdFxcdGljc2stXFx1MDAzZWljc2tfc3luY19tc3Moc2ssIGljc2stXFx1MDAzZWljc2tfcG10dV9jb29raWUpO1xcbiAyMzg6XFx0XFxuIDIzOTpcXHRcXHRyZXR1cm4gZXJyO1xcbiAyNDA6XFx0fVxcbiAyNDE6XFx0XFxuIDI0MjpcXHRpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcXG4gMjQzOlxcdFxcdFxcdFxcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxcbiAyNDQ6XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXFxuIDI0NTpcXHR7XFxuIDI0NjpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XFxuIDI0NzpcXHRcXHRpbnQgZXJyO1xcbiAyNDg6XFx0XFxuIDI0OTpcXHRcXHRsb2NrX3NvY2soc2spO1xcbiAyNTA6XFx0XFxuIDI1MTpcXHRcXHRwYXMgPSBwc3Bfc2tfYXNzb2Moc2spO1xcbiAyNTI6XFx0XFx0aWYgKCFwYXMpIHtcXG4gMjUzOlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXFxcIlNvY2tldCBoYXMgbm8gUngga2V5XFxcIik7XFxuIDI1NDpcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbiAyNTU6XFx0XFx0XFx0Z290byBleGl0X3VubG9jaztcXG4gMjU2OlxcdFxcdH1cXG4gMjU3OlxcdFxcdGlmIChwYXMtXFx1MDAzZXBzZCAhPSBwc2QpIHtcXG4gMjU4OlxcdFxcdFxcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXFxcIlJ4IGtleSBmcm9tIGRpZmZlcmVudCBkZXZpY2VcXFwiKTtcXG4gMjU5OlxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjI4Ljg2ODQxMjI3M1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDk4OTQxNjUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIFBvdGVudGlhbCBQU1AgRGV2aWNlIERyaXZlciBJc3N1ZXMqKlxuXG5Pa2F5LCBJIG5lZWQgdG8gZGl2ZSBpbnRvIHRoaXMgcHJvYmxlbS4gQmFzZWQgb24gd2hhdCBJJ3ZlIHNlZW4sIGl0IHNlZW1zIGxpa2UgdGhlIGlzc3VlIG1pZ2h0IGJlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9yIGRlc3RydWN0aW9uIG9mIHRoZSBQU1AgZGV2aWNlIHdpdGhpbiB0aGUga2VybmVsLiBMZXQncyBzdGFydCBieSB6ZXJvaW5nIGluIG9uIGBuZXQvcHNwL3BzcF9tYWluLmNgLiBNeSBpbnN0aW5jdCBpcyB0byBleGFtaW5lIHRoZSBhcmVhcyBhcm91bmQgYHBzcF9kZXZfY3JlYXRlYCBhbmQgYHBzcF9kZXZfdW5yZWdpc3RlcmAgZnVuY3Rpb25zLiBUaGVzZSBhcmUgbGlrZWx5IHRoZSBjb3JlIGZ1bmN0aW9ucyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIGxpZmVjeWNsZSBvZiB0aGUgUFNQIGRldmljZSwgc28gYW55IGlzc3VlcyBkdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIG9yIGNsZWFudXAgd291bGQgbWFuaWZlc3QgYXJvdW5kIHRob3NlIGNhbGxzLiBJIHdhbnQgdG8gc2VlIGhvdyB0aGVzZSBmdW5jdGlvbnMgYXJlIGJlaW5nIGNhbGxlZCwgd2hhdCBjaGVja3MgYXJlIGJlaW5nIHBlcmZvcm1lZCwgYW5kIGlmIGFueSBlcnJvcnMgYXJlIGJlaW5nIGhhbmRsZWQgYXBwcm9wcmlhdGVseS4gVGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIGJlZ2luIG15IGRlYnVnZ2luZyBwcm9jZXNzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjcxNCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzAuOTY3MzU3MDM0WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg0NTI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9wc3AvcHNwX21haW4uY1wiLFxuICBcIkZpcnN0TGluZVwiOiA1NSxcbiAgXCJMaW5lQ291bnRcIjogMTEwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNTU6XFx0ICpcXG4gIDU2OlxcdCAqIFJldHVybjogcG9pbnRlciB0byBhbGxvY2F0ZWQgUFNQIGRldmljZSwgb3IgRVJSX1BUUi5cXG4gIDU3OlxcdCAqL1xcbiAgNTg6XFx0c3RydWN0IHBzcF9kZXYgKlxcbiAgNTk6XFx0cHNwX2Rldl9jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldixcXG4gIDYwOlxcdFxcdCAgICAgICBzdHJ1Y3QgcHNwX2Rldl9vcHMgKnBzZF9vcHMsIHN0cnVjdCBwc3BfZGV2X2NhcHMgKnBzZF9jYXBzLFxcbiAgNjE6XFx0XFx0ICAgICAgIHZvaWQgKnByaXZfcHRyKVxcbiAgNjI6XFx0e1xcbiAgNjM6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBzZDtcXG4gIDY0OlxcdFxcdHN0YXRpYyB1MzIgbGFzdF9pZDtcXG4gIDY1OlxcdFxcdGludCBlcnI7XFxuICA2NjpcXHRcXG4gIDY3OlxcdFxcdGlmIChXQVJOX09OKCFwc2RfY2Fwcy1cXHUwMDNldmVyc2lvbnMgfHxcXG4gIDY4OlxcdFxcdFxcdCAgICAhcHNkX29wcy1cXHUwMDNlc2V0X2NvbmZpZyB8fFxcbiAgNjk6XFx0XFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VrZXlfcm90YXRlIHx8XFxuICA3MDpcXHRcXHRcXHQgICAgIXBzZF9vcHMtXFx1MDAzZXJ4X3NwaV9hbGxvYyB8fFxcbiAgNzE6XFx0XFx0XFx0ICAgICFwc2Rfb3BzLVxcdTAwM2VnZXRfc3RhdHMgfHxcXG4gIDcyOlxcdFxcdFxcdCAgICAoIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXFx1MDAzZXR4X2tleV9kZWwpIHx8XFxuICA3MzpcXHRcXHRcXHQgICAgKHBzZF9jYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjIFxcdTAwMjZcXHUwMDI2ICFwc2Rfb3BzLVxcdTAwM2V0eF9rZXlfYWRkKSkpXFxuICA3NDpcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gIDc1OlxcdFxcbiAgNzY6XFx0XFx0cHNkID0ga3phbGxvY19vYmooKnBzZCk7XFxuICA3NzpcXHRcXHRpZiAoIXBzZClcXG4gIDc4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiAgNzk6XFx0XFxuICA4MDpcXHRcXHRwc2QtXFx1MDAzZW1haW5fbmV0ZGV2ID0gbmV0ZGV2O1xcbiAgODE6XFx0XFx0SU5JVF9MSVNUX0hFQUQoXFx1MDAyNnBzZC1cXHUwMDNlYXNzb2NfZGV2X2xpc3QpO1xcbiAgODI6XFx0XFx0cHNkLVxcdTAwM2VvcHMgPSBwc2Rfb3BzO1xcbiAgODM6XFx0XFx0cHNkLVxcdTAwM2VjYXBzID0gcHNkX2NhcHM7XFxuICA4NDpcXHRcXHRwc2QtXFx1MDAzZWRydl9wcml2ID0gcHJpdl9wdHI7XFxuICA4NTpcXHRcXG4gIDg2OlxcdFxcdG11dGV4X2luaXQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA4NzpcXHRcXHRJTklUX0xJU1RfSEVBRChcXHUwMDI2cHNkLVxcdTAwM2VhY3RpdmVfYXNzb2NzKTtcXG4gIDg4OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gIDg5OlxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZwc2QtXFx1MDAzZXN0YWxlX2Fzc29jcyk7XFxuICA5MDpcXHRcXHRyZWZjb3VudF9zZXQoXFx1MDAyNnBzZC1cXHUwMDNlcmVmY250LCAxKTtcXG4gIDkxOlxcdFxcbiAgOTI6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNwX2RldnNfbG9jayk7XFxuICA5MzpcXHRcXHRlcnIgPSB4YV9hbGxvY19jeWNsaWMoXFx1MDAyNnBzcF9kZXZzLCBcXHUwMDI2cHNkLVxcdTAwM2VpZCwgcHNkLCB4YV9saW1pdF8xNmIsXFxuICA5NDpcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2bGFzdF9pZCwgR0ZQX0tFUk5FTCk7XFxuICA5NTpcXHRcXHRpZiAoZXJyKSB7XFxuICA5NjpcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAgOTc6XFx0XFx0XFx0a2ZyZWUocHNkKTtcXG4gIDk4OlxcdFxcdFxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuICA5OTpcXHRcXHR9XFxuIDEwMDpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMDE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc3BfZGV2c19sb2NrKTtcXG4gMTAyOlxcdFxcbiAxMDM6XFx0XFx0Lyogbm90aWZ5IGJlZm9yZSBuZXRkZXYgYXNzaWdubWVudFxcbiAxMDQ6XFx0XFx0ICogVGhlcmUncyBubyBzdHJvbmcgcmVhc29uIGZvciBpdCwgYnV0IHRoaW5raW5nIGlzIHRvIGF2b2lkIGNyZWF0aW5nXFxuIDEwNTpcXHRcXHQgKiBpbXBsaWNpdCBleHBlY3RhdGlvbnMgYWJvdXQgdGhlIFBTUCBkZXYgXFx1MDAzY1xcdTAwM2UgbmV0ZGV2IHJlbGF0aW9uc2hpcC5cXG4gMTA2OlxcdFxcdCAqL1xcbiAxMDc6XFx0XFx0cHNwX25sX25vdGlmeV9kZXYocHNkLCBQU1BfQ01EX0RFVl9BRERfTlRGKTtcXG4gMTA4OlxcdFxcbiAxMDk6XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKG5ldGRldi1cXHUwMDNlcHNwX2RldiwgcHNkKTtcXG4gMTEwOlxcdFxcbiAxMTE6XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMTI6XFx0XFxuIDExMzpcXHRcXHRyZXR1cm4gcHNkO1xcbiAxMTQ6XFx0fVxcbiAxMTU6XFx0RVhQT1JUX1NZTUJPTChwc3BfZGV2X2NyZWF0ZSk7XFxuIDExNjpcXHRcXG4gMTE3OlxcdHZvaWQgcHNwX2Rldl9mcmVlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuIDExODpcXHR7XFxuIDExOTpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc3BfZGV2c19sb2NrKTtcXG4gMTIwOlxcdFxcdHhhX2VyYXNlKFxcdTAwMjZwc3BfZGV2cywgcHNkLVxcdTAwM2VpZCk7XFxuIDEyMTpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAxMjI6XFx0XFxuIDEyMzpcXHRcXHRtdXRleF9kZXN0cm95KFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMjQ6XFx0XFx0a2ZyZWVfcmN1KHBzZCwgcmN1KTtcXG4gMTI1OlxcdH1cXG4gMTI2OlxcdFxcbiAxMjc6XFx0LyoqXFxuIDEyODpcXHQgKiBwc3BfZGV2X3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgUFNQIGRldmljZVxcbiAxMjk6XFx0ICogQHBzZDpcXHRQU1AgZGV2aWNlIHN0cnVjdHVyZVxcbiAxMzA6XFx0ICovXFxuIDEzMTpcXHR2b2lkIHBzcF9kZXZfdW5yZWdpc3RlcihzdHJ1Y3QgcHNwX2RldiAqcHNkKVxcbiAxMzI6XFx0e1xcbiAxMzM6XFx0XFx0c3RydWN0IHBzcF9hc3NvY19kZXYgKmVudHJ5LCAqZW50cnlfdG1wO1xcbiAxMzQ6XFx0XFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzLCAqbmV4dDtcXG4gMTM1OlxcdFxcbiAxMzY6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNwX2RldnNfbG9jayk7XFxuIDEzNzpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZwc2QtXFx1MDAzZWxvY2spO1xcbiAxMzg6XFx0XFxuIDEzOTpcXHRcXHRwc3Bfbmxfbm90aWZ5X2Rldihwc2QsIFBTUF9DTURfREVWX0RFTF9OVEYpO1xcbiAxNDA6XFx0XFxuIDE0MTpcXHRcXHQvKiBXYWl0IHVudGlsIHBzcF9kZXZfZnJlZSgpIHRvIGNhbGwgeGFfZXJhc2UoKSB0byBwcmV2ZW50IGFcXG4gMTQyOlxcdFxcdCAqIGRpZmZlcmVudCBwc2QgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgeGFycmF5IHdpdGggdGhpcyBpZCwgd2hpbGVcXG4gMTQzOlxcdFxcdCAqIHRoZXJlIGFyZSBzdGlsbCByZWZlcmVuY2VzIHRvIHRoaXMgcHNkIGJlaW5nIGhlbGQuXFxuIDE0NDpcXHRcXHQgKi9cXG4gMTQ1OlxcdFxcdHhhX3N0b3JlKFxcdTAwMjZwc3BfZGV2cywgcHNkLVxcdTAwM2VpZCwgTlVMTCwgR0ZQX0tFUk5FTCk7XFxuIDE0NjpcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNnBzcF9kZXZzX2xvY2spO1xcbiAxNDc6XFx0XFxuIDE0ODpcXHRcXHRsaXN0X3NwbGljZV9pbml0KFxcdTAwMjZwc2QtXFx1MDAzZWFjdGl2ZV9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXByZXZfYXNzb2NzKTtcXG4gMTQ5OlxcdFxcdGxpc3Rfc3BsaWNlX2luaXQoXFx1MDAyNnBzZC1cXHUwMDNlcHJldl9hc3NvY3MsIFxcdTAwMjZwc2QtXFx1MDAzZXN0YWxlX2Fzc29jcyk7XFxuIDE1MDpcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcXHUwMDI2cHNkLVxcdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XFxuIDE1MTpcXHRcXHRcXHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcXG4gMTUyOlxcdFxcdFxcdFxcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuIDE1MzpcXHRcXHRcXHRsaXN0X2RlbChcXHUwMDI2cGFzLVxcdTAwM2Vhc3NvY3NfbGlzdCk7XFxuIDE1NDpcXHRcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjMwLjk2NzQ0Mjg4NVoiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjY0MzQ0Mjg0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgTmV0ZGV2c2ltIFBTUCBEcml2ZXIqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBzcGVjaWZpY3Mgb2YgaG93IHRoZSBOZXRkZXZzaW0ncyBQU1AgKFBhY2tldC1TY2hlZHVsaW5nIFByb2Nlc3NvcikgZHJpdmVyIG9wZXJhdGVzLiBJJ20gZ29pbmcgdG8ganVtcCBzdHJhaWdodCBpbnRvIHRoZSBjb2RlIGFuZCBzdGFydCB3aXRoIGBkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNgLiBUaGF0J3MgdGhlIGxvZ2ljYWwgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGltcGxlbWVudGF0aW9uIGRldGFpbHMuIEZyb20gdGhlcmUsIEkgY2FuIGRlbHZlIGludG8gdGhlIGFyY2hpdGVjdHVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg1NzMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjMyLjYzMTc5MDA4OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjUxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJkcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0XFxuICAgMzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaXAuaFxcdTAwM2VcXG4gICA0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9za2J1ZmYuaFxcdTAwM2VcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NuZXQvaXA2X2NoZWNrc3VtLmhcXHUwMDNlXFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L3BzcC5oXFx1MDAzZVxcbiAgIDc6XFx0I2luY2x1ZGUgXFx1MDAzY25ldC9zb2NrLmhcXHUwMDNlXFxuICAgODpcXHRcXG4gICA5OlxcdCNpbmNsdWRlIFxcXCJuZXRkZXZzaW0uaFxcXCJcXG4gIDEwOlxcdFxcbiAgMTE6XFx0dm9pZCBuc2ltX3BzcF9oYW5kbGVfZXh0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza2JfZXh0ICpwc3BfZXh0KVxcbiAgMTI6XFx0e1xcbiAgMTM6XFx0XFx0aWYgKHBzcF9leHQpXFxuICAxNDpcXHRcXHRcXHRfX3NrYl9leHRfc2V0KHNrYiwgU0tCX0VYVF9QU1AsIHBzcF9leHQpO1xcbiAgMTU6XFx0fVxcbiAgMTY6XFx0XFxuICAxNzpcXHRlbnVtIHNrYl9kcm9wX3JlYXNvblxcbiAgMTg6XFx0bnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXFxuICAxOTpcXHRcXHQgICAgc3RydWN0IG5ldGRldnNpbSAqcGVlcl9ucywgc3RydWN0IHNrYl9leHQgKipwc3BfZXh0KVxcbiAgMjA6XFx0e1xcbiAgMjE6XFx0XFx0ZW51bSBza2JfZHJvcF9yZWFzb24gcmMgPSAwO1xcbiAgMjI6XFx0XFx0c3RydWN0IHBzcF9kZXYgKnBlZXJfcHNkO1xcbiAgMjM6XFx0XFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xcbiAgMjQ6XFx0XFx0c3RydWN0IG5ldCAqbmV0O1xcbiAgMjU6XFx0XFx0aW50IHBzcF9sZW47XFxuICAyNjpcXHRcXG4gIDI3OlxcdFxcdHJjdV9yZWFkX2xvY2soKTtcXG4gIDI4OlxcdFxcdHBhcyA9IHBzcF9za2JfZ2V0X2Fzc29jX3JjdShza2IpO1xcbiAgMjk6XFx0XFx0aWYgKCFwYXMpIHtcXG4gIDMwOlxcdFxcdFxcdHJjID0gU0tCX05PVF9EUk9QUEVEX1lFVDtcXG4gIDMxOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gIDMyOlxcdFxcdH1cXG4gIDMzOlxcdFxcbiAgMzQ6XFx0XFx0aWYgKCFza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpIHtcXG4gIDM1OlxcdFxcdFxcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XFxuICAzNjpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuICAzNzpcXHRcXHR9XFxuICAzODpcXHRcXG4gIDM5OlxcdFxcdG5ldCA9IHNvY2tfbmV0KHNrYi1cXHUwMDNlc2spO1xcbiAgNDA6XFx0XFx0aWYgKCFwc3BfZGV2X2VuY2Fwc3VsYXRlKG5ldCwgc2tiLCBwYXMtXFx1MDAzZXR4LnNwaSwgcGFzLVxcdTAwM2V2ZXJzaW9uLCAwKSkge1xcbiAgNDE6XFx0XFx0XFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcXG4gIDQyOlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gIDQzOlxcdFxcdH1cXG4gIDQ0OlxcdFxcbiAgNDU6XFx0XFx0cHNwX2xlbiA9IHNrYi1cXHUwMDNlbGVuIC0gc2tiX2lubmVyX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTtcXG4gIDQ2OlxcdFxcdGF0b21pYzY0X2luYyhcXHUwMDI2bnMtXFx1MDAzZXBzcC50eF9wYWNrZXRzKTtcXG4gIDQ3OlxcdFxcdGF0b21pYzY0X2FkZChwc3BfbGVuLCBcXHUwMDI2bnMtXFx1MDAzZXBzcC50eF9ieXRlcyk7XFxuICA0ODpcXHRcXG4gIDQ5OlxcdFxcdC8qIE5vdyBwcmV0ZW5kIHdlIGp1c3QgcmVjZWl2ZWQgdGhpcyBmcmFtZSAqL1xcbiAgNTA6XFx0XFx0cGVlcl9wc2QgPSByY3VfZGVyZWZlcmVuY2UocGVlcl9ucy1cXHUwMDNlcHNwLmRldik7XFxuICA1MTpcXHRcXHRpZiAocGVlcl9wc2QgXFx1MDAyNlxcdTAwMjYgcGVlcl9wc2QtXFx1MDAzZWNvbmZpZy52ZXJzaW9ucyBcXHUwMDI2ICgxIFxcdTAwM2NcXHUwMDNjIHBhcy1cXHUwMDNldmVyc2lvbikpIHtcXG4gIDUyOlxcdFxcdFxcdGJvb2wgc3RyaXBfaWN2ID0gZmFsc2U7XFxuICA1MzpcXHRcXHRcXHR1OCBnZW5lcmF0aW9uO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHRcXHQvKiBXZSBjaGVhdCBhIGJpdCBhbmQgcHV0IHRoZSBnZW5lcmF0aW9uIGluIHRoZSBrZXkuXFxuICA1NjpcXHRcXHRcXHQgKiBJbiByZWFsIGxpZmUgaWYgZ2VuZXJhdGlvbiB3YXMgdG9vIG9sZCwgdGhlbiBkZWNyeXB0aW9uIHdvdWxkXFxuICA1NzpcXHRcXHRcXHQgKiBmYWlsLiBIZXJlLCB3ZSBqdXN0IG1ha2UgaXQgc28gYSBiYWQga2V5IGNhdXNlcyBhIGJhZFxcbiAgNTg6XFx0XFx0XFx0ICogZ2VuZXJhdGlvbiB0b28sIGFuZCBwc3Bfc2tfcnhfcG9saWN5X2NoZWNrKCkgd2lsbCBmYWlsLlxcbiAgNTk6XFx0XFx0XFx0ICovXFxuICA2MDpcXHRcXHRcXHRnZW5lcmF0aW9uID0gcGFzLVxcdTAwM2V0eC5rZXlbMF07XFxuICA2MTpcXHRcXG4gIDYyOlxcdFxcdFxcdHNrYl9leHRfcmVzZXQoc2tiKTtcXG4gIDYzOlxcdFxcdFxcdHNrYi1cXHUwMDNlbWFjX2xlbiA9IEVUSF9ITEVOO1xcbiAgNjQ6XFx0XFx0XFx0aWYgKHBzcF9kZXZfcmN2KHNrYiwgcGVlcl9wc2QtXFx1MDAzZWlkLCBnZW5lcmF0aW9uLCBzdHJpcF9pY3YpKSB7XFxuICA2NTpcXHRcXHRcXHRcXHRyYyA9IFNLQl9EUk9QX1JFQVNPTl9QU1BfT1VUUFVUO1xcbiAgNjY6XFx0XFx0XFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbiAgNjc6XFx0XFx0XFx0fVxcbiAgNjg6XFx0XFxuICA2OTpcXHRcXHRcXHQqcHNwX2V4dCA9IHNrYi1cXHUwMDNlZXh0ZW5zaW9ucztcXG4gIDcwOlxcdFxcdFxcdHJlZmNvdW50X2luYyhcXHUwMDI2KCpwc3BfZXh0KS1cXHUwMDNlcmVmY250KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzIuNjMxODY4MzI5WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNzUxODA4MTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYHBzcC5jYCoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGUgbWF0dGVyLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgdGhlIGJlaGF2aW9yIG9mIGBfX25zaW1fcHNwX3VuaW5pdGAuIEkgaW1tZWRpYXRlbHkga25vdyB0aGF0IGl0J3MgbG9jYXRlZCB3aXRoaW4gYGRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY2AsIHNvIHRoYXQncyB3aGVyZSBJJ2xsIGJlIHN0YXJ0aW5nLiBJJ20gZXhwZWN0aW5nIHRoaXMgZnVuY3Rpb24gdG8gYmUgY3JpdGljYWwgZm9yIHVuaW5pdGlhbGl6aW5nIG9yIGNsZWFuaW5nIHVwIGFmdGVyIGEgc2ltdWxhdGVkIG5ldHdvcmsgZGV2aWNlLCBsaWtlbHkgcGVydGFpbmluZyB0byB0aGUgUGFja2V0IFN3aXRjaGluZyBQYXRoIChQU1ApIGNvbXBvbmVudCwgc2luY2UgdGhhdCBzZWVtcyB0byBiZSB0aGUgY29udGV4dC4gSSdtIGhvcGluZyBJIGNhbiBnbGVhbiBzb21lIGluc2lnaHRzIGZyb20gaG93IGl0J3MgaW1wbGVtZW50ZWQgYW5kIHdoZXJlIGl0J3MgY2FsbGVkLCBzcGVjaWZpY2FsbHkgYWJvdXQgcmVzb3VyY2UgbWFuYWdlbWVudCBvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLiBMZXQncyBzZWUgd2hhdCdzIGFjdHVhbGx5IGdvaW5nIG9uIGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxOTgxMiwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6MzQuODA3MDUxNTE1WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjY5MjUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImRyaXZlcnMvbmV0L25ldGRldnNpbS9wc3AuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxODA6XFx0fTtcXG4gMTgxOlxcdFxcbiAxODI6XFx0c3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcXG4gMTgzOlxcdFxcdC52ZXJzaW9ucyA9IDEgXFx1MDAzY1xcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR0NNXzEyOCB8XFxuIDE4NDpcXHRcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HTUFDXzEyOCB8XFxuIDE4NTpcXHRcXHRcXHQgICAgMSBcXHUwMDNjXFx1MDAzYyBQU1BfVkVSU0lPTl9IRFIwX0FFU19HQ01fMjU2IHxcXG4gMTg2OlxcdFxcdFxcdCAgICAxIFxcdTAwM2NcXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMjU2LFxcbiAxODc6XFx0fTtcXG4gMTg4OlxcdFxcbiAxODk6XFx0c3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXFxuIDE5MDpcXHR7XFxuIDE5MTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xcbiAxOTI6XFx0XFxuIDE5MzpcXHRcXHRwc2QgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5zLVxcdTAwM2Vwc3AuZGV2LFxcbiAxOTQ6XFx0XFx0XFx0XFx0XFx0XFx0dGVhcmRvd24gfHxcXG4gMTk1OlxcdFxcdFxcdFxcdFxcdFxcdGxvY2tkZXBfaXNfaGVsZChcXHUwMDI2bnMtXFx1MDAzZXBzcC5yZXJlZ19sb2NrKSk7XFxuIDE5NjpcXHRcXHRpZiAocHNkKSB7XFxuIDE5NzpcXHRcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIobnMtXFx1MDAzZXBzcC5kZXYsIE5VTEwpO1xcbiAxOTg6XFx0XFx0XFx0c3luY2hyb25pemVfcmN1KCk7XFxuIDE5OTpcXHRcXHRcXHRwc3BfZGV2X3VucmVnaXN0ZXIocHNkKTtcXG4gMjAwOlxcdFxcdH1cXG4gMjAxOlxcdH1cXG4gMjAyOlxcdFxcbiAyMDM6XFx0dm9pZCBuc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMpXFxuIDIwNDpcXHR7XFxuIDIwNTpcXHRcXHRkZWJ1Z2ZzX3JlbW92ZShucy1cXHUwMDNlcHNwLnJlcmVnKTtcXG4gMjA2OlxcdFxcdG11dGV4X2Rlc3Ryb3koXFx1MDAyNm5zLVxcdTAwM2Vwc3AucmVyZWdfbG9jayk7XFxuIDIwNzpcXHRcXHRfX25zaW1fcHNwX3VuaW5pdChucywgdHJ1ZSk7XFxuIDIwODpcXHR9XFxuIDIwOTpcXHRcXG4gMjEwOlxcdHN0YXRpYyBzc2l6ZV90XFxuIDIxMTpcXHRuc2ltX3BzcF9yZXJlZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCxcXG4gMjEyOlxcdFxcdFxcdCAgICAgbG9mZl90ICpwcG9zKVxcbiAyMTM6XFx0e1xcbiAyMTQ6XFx0XFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDIxNTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkO1xcbiAyMTY6XFx0XFx0c3NpemVfdCByZXQ7XFxuIDIxNzpcXHRcXG4gMjE4OlxcdFxcdG11dGV4X2xvY2soXFx1MDAyNm5zLVxcdTAwM2Vwc3AucmVyZWdfbG9jayk7XFxuIDIxOTpcXHRcXHRfX25zaW1fcHNwX3VuaW5pdChucywgZmFsc2UpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1MjozNC44MDcxMjIyNDVaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjAyMzEyNDMwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBQU1AgYW5kIE5ldGRldnNpbSBJbnRlZ3JhdGlvbioqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gRmlyc3QsIEkgbmVlZCB0byBpZGVudGlmeSB0aGUgY29yZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cy4gQ2xlYXJseSwgYENPTkZJR19JTkVUX1BTUGAgaXMgZXNzZW50aWFsIHNpbmNlIHRoaXMgcGF0Y2ggdGFyZ2V0cyB0aGUgYG5ldC9wc3AvYCBkaXJlY3RvcnkgYW5kIGVuYWJsZXMgUFNQIHN1cHBvcnQgaW4gdGhlIGBuZXRkZXZzaW1gIGRyaXZlci4gYENPTkZJR19ORVRERVZTSU1gIGlzIGFsc28gY3JpdGljYWwsIGl0J3MgdGhlIHNpbXVsYXRlZCBuZXR3b3JrIGRldmljZSBkcml2ZXIgaXRzZWxmLiBJdCdzIG9idmlvdXMgdGhhdCBgSU5FVF9QU1BgIGhpbmdlcyBvbiBgSU5FVGAgYW5kIGBORVRERVZTSU1gIGRlcGVuZHMgb24gYE5FVF9DT1JFYCwgYFNZU0ZTYCBhbmQgdGhlIGxpa2UsIGFzIGV4cGVjdGVkLlxuXG5OZXh0LCBJIG5lZWQgdG8gdmVyaWZ5IHRoZSBjcml0aWNhbCBzeW1ib2xzLiBNeSBhdHRlbnRpb24gZ29lcyB0bzogYHBzcF9kZXZfY3JlYXRlYCwgYHBzcF9kZXZfdW5yZWdpc3RlcmAsIGBwc3BfZGV2X3R4X2tleV9hZGRgLCBgcHNwX2Rldl90eF9rZXlfZGVsYCwgYHBzcF9hc3NvY19mcmVlYCwgYHBzcF9zb2NrX2Fzc29jX3NldF90eGAsIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYW5kIGBuc2ltX2RvX3BzcGAuIEFyZSB0aGVzZSBnZW51aW5lbHkgKnNwZWNpZmljKiB0byBQU1AgbG9naWMgd2l0aGluIG5ldGRldnNpbSwgb3IgYXJlIHRoZXkgbW9yZSBnZW5lcmljPyBZZXMsIGNvbmZpcm1lZC4gVGhleSBhcmUgYWxsIGRpcmVjdGx5IHRpZWQgdG8gUFNQIGFuZCB0aGUgbmV0ZGV2c2ltIGltcGxlbWVudGF0aW9uLlxuXG5Ob3csIGxldCdzIGNyZWF0ZSBhIGNsZWFyIHN1bW1hcnkgb2YgdGhlIGNoYW5nZXM6XG5cbiogICAqKlJlYWNoYWJpbGl0eToqKiBUaGVzZSBtb2RpZmljYXRpb25zIGltcGFjdCBib3RoIHRoZSBQU1Agc3Vic3lzdGVtIGFuZCB0aGUgc2ltdWxhdGVkIG5ldGRldnNpbSBkcml2ZXIuIEluIGEgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnQsIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBmdWxseSBhY2Nlc3NpYmxlIHRocm91Z2ggbmV0bGluayBjb21tYW5kcywgc29ja2V0IG9wZXJhdGlvbnMsIGFuZCBuZXRkZXZzaW0gdmlydHVhbCBkZXZpY2VzLlxuKiAgICoqQ2hhbmdlczoqKiBUaGlzIHBhdGNoIG1ha2VzIHNvbWUgVHgga2V5IG9mZmxvYWRpbmcgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBkZXZpY2VzIGxhY2tpbmcgVHggU0FEQiwgYWRkcmVzc2VzIGRyaXZlciByZWdpc3RyYXRpb24gdmFsaWRhdGlvbiBpbiBgcHNwX2Rldl9jcmVhdGVgLCByZWZhY3RvcnMgYXNzb2NpYXRpb24gY2xlYW51cCBpbiBgcHNwX2Rldl91bnJlZ2lzdGVyYCBhbmQgYHBzcF9hc3NvY19mcmVlYCwgYW5kIHVwZGF0ZXMga2V5IGFzc2lnbm1lbnQgaW4gYHBzcF9zb2NrX2Fzc29jX3NldF90eGAuXG4qICAgKipDb25maWdzOioqIFdlIGhhdmUgYElORVRfUFNQYCBhbmQgYE5FVERFVlNJTWAuXG4qICAgKipGb2N1cyBTeW1ib2xzOioqIFRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbnMgYXJlIGBwc3Bfc29ja19hc3NvY19zZXRfdHhgLCBgcHNwX3NvY2tfc2V0X3R4X2tleWAsIGBwc3BfZGV2X3R4X2tleV9hZGRgLCBgcHNwX2Rldl90eF9rZXlfZGVsYCwgYHBzcF9hc3NvY19mcmVlYCwgYHBzcF9kZXZfY3JlYXRlYCwgYHBzcF9kZXZfdW5yZWdpc3RlcmAsIGFuZCBgbnNpbV9kb19wc3BgLlxuXG5SaWdodCwgdGhhdCBjb3ZlcnMgdGhlIGVzc2VudGlhbHMuIFRpbWUgZm9yIHRoZSB0b29sIGNhbGwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNzAwLCJPdXRwdXRUb2tlbnMiOjIxNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjQwLjgzMDI0ODUxN1oiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc4ODExMDI0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJJTkVUX1BTUFwiLFxuICAgIFwiTkVUREVWU0lNXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwicHNwX3NvY2tfYXNzb2Nfc2V0X3R4XCIsXG4gICAgXCJwc3Bfc29ja19zZXRfdHhfa2V5XCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9hZGRcIixcbiAgICBcInBzcF9kZXZfdHhfa2V5X2RlbFwiLFxuICAgIFwicHNwX2Fzc29jX2ZyZWVcIixcbiAgICBcInBzcF9kZXZfY3JlYXRlXCIsXG4gICAgXCJwc3BfZGV2X3VucmVnaXN0ZXJcIixcbiAgICBcIm5zaW1fZG9fcHNwXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgY29yZSBuZXR3b3JraW5nIFBTUCAoUFNQIFNlY3VyaXR5IFByb3RvY29sKSBzdWJzeXN0ZW0gbG9naWMgYW5kIG5ldGRldnNpbSBkZXZpY2UgZHJpdmVyIGNvZGUuIEl0IG1ha2VzIFR4IGtleSBvZmZsb2FkIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgZGV2aWNlcyB3aXRob3V0IFNBREIsIHJlZmFjdG9ycyBrZXkgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gaW4gcHNwX3NvY2suYywgdXBkYXRlcyBkZXZpY2UgcmVnaXN0cmF0aW9uIGNoZWNrcyBpbiBwc3BfbWFpbi5jLCBhbmQgcmVtb3ZlcyBvYnNvbGV0ZSBhc3NvYyB0cmFja2luZyBpbiBuZXRkZXZzaW0uIFRoZXNlIGNvZGUgcGF0aHMgYXJlIGZ1bGx5IHJlYWNoYWJsZSB2aWEgbmV0bGluayBjb21tYW5kcyBhbmQgbmV0ZGV2c2ltIGludGVyZmFjZXMgaW4gc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudHMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSU5FVF9QU1BcIixcbiAgICBcIk5FVERFVlNJTVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInBzcF9zb2NrX2Fzc29jX3NldF90eFwiLFxuICAgIFwicHNwX3NvY2tfc2V0X3R4X2tleVwiLFxuICAgIFwicHNwX2Rldl90eF9rZXlfYWRkXCIsXG4gICAgXCJwc3BfZGV2X3R4X2tleV9kZWxcIixcbiAgICBcInBzcF9hc3NvY19mcmVlXCIsXG4gICAgXCJwc3BfZGV2X2NyZWF0ZVwiLFxuICAgIFwicHNwX2Rldl91bnJlZ2lzdGVyXCIsXG4gICAgXCJuc2ltX2RvX3BzcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGNvcmUgbmV0d29ya2luZyBQU1AgKFBTUCBTZWN1cml0eSBQcm90b2NvbCkgc3Vic3lzdGVtIGxvZ2ljIGFuZCBuZXRkZXZzaW0gZGV2aWNlIGRyaXZlciBjb2RlLiBJdCBtYWtlcyBUeCBrZXkgb2ZmbG9hZCBjYWxsYmFja3Mgb3B0aW9uYWwgZm9yIGRldmljZXMgd2l0aG91dCBTQURCLCByZWZhY3RvcnMga2V5IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGluIHBzcF9zb2NrLmMsIHVwZGF0ZXMgZGV2aWNlIHJlZ2lzdHJhdGlvbiBjaGVja3MgaW4gcHNwX21haW4uYywgYW5kIHJlbW92ZXMgb2Jzb2xldGUgYXNzb2MgdHJhY2tpbmcgaW4gbmV0ZGV2c2ltLiBUaGVzZSBjb2RlIHBhdGhzIGFyZSBmdWxseSByZWFjaGFibGUgdmlhIG5ldGxpbmsgY29tbWFuZHMgYW5kIG5ldGRldnNpbSBpbnRlcmZhY2VzIGluIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnRzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0MC45MDkwNjY2MTFaIiwiU2VxIjoyNywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MzM2OTg1ODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6NDAuOTA5NTY4NjgxWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTYzMzY0NzkzMDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMjcwMjc5MGRlZjk0MTdmZTExZmU3MjQ1ZDg4NzU3M2U4NzFhZjMxYlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMTA6NTE6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmggYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbmluZGV4IDU1YWVjNDEyMzdiOWIuLjE4MWI2YmFhYmE3YWYgMTAwNjQ0XG4tLS0gYS9kcml2ZXJzL25ldC9uZXRkZXZzaW0vbmV0ZGV2c2ltLmhcbisrKyBiL2RyaXZlcnMvbmV0L25ldGRldnNpbS9uZXRkZXZzaW0uaFxuQEAgLTEyMiw3ICsxMjIsNiBAQCBzdHJ1Y3QgbmV0ZGV2c2ltIHtcbiBcdFx0c3RydWN0IGRlbnRyeSAqcmVyZWc7XG4gXHRcdHN0cnVjdCBtdXRleCByZXJlZ19sb2NrO1xuIFx0XHR1MzIgc3BpO1xuLVx0XHR1MzIgYXNzb2NfY250O1xuIFx0fSBwc3A7XG4gXG4gXHRzdHJ1Y3QgbnNpbV9idXNfZGV2ICpuc2ltX2J1c19kZXY7XG5kaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jIGIvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG5pbmRleCA2YjM1MzJiNWUzNjBkLi5iNzQ1MmM0OWI1ODFkIDEwMDY0NFxuLS0tIGEvZHJpdmVycy9uZXQvbmV0ZGV2c2ltL3BzcC5jXG4rKysgYi9kcml2ZXJzL25ldC9uZXRkZXZzaW0vcHNwLmNcbkBAIC0yMyw3ICsyMyw2IEBAIG5zaW1fZG9fcHNwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRkZXZzaW0gKm5zLFxuIFx0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0c3RydWN0IG5ldCAqbmV0O1xuIFx0aW50IHBzcF9sZW47XG4tXHR2b2lkICoqcHRyO1xuIFxuIFx0cmN1X3JlYWRfbG9jaygpO1xuIFx0cGFzID0gcHNwX3NrYl9nZXRfYXNzb2NfcmN1KHNrYik7XG5AQCAtMzcsMTIgKzM2LDYgQEAgbnNpbV9kb19wc3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGRldnNpbSAqbnMsXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbiBcbi1cdHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpO1xuLVx0aWYgKCpwdHIgIT0gbnMpIHtcbi1cdFx0cmMgPSBTS0JfRFJPUF9SRUFTT05fUFNQX09VVFBVVDtcbi1cdFx0Z290byBvdXRfdW5sb2NrO1xuLVx0fVxuLVxuIFx0bmV0ID0gc29ja19uZXQoc2tiLVx1MDAzZXNrKTtcbiBcdGlmICghcHNwX2Rldl9lbmNhcHN1bGF0ZShuZXQsIHNrYiwgcGFzLVx1MDAzZXR4LnNwaSwgcGFzLVx1MDAzZXZlcnNpb24sIDApKSB7XG4gXHRcdHJjID0gU0tCX0RST1BfUkVBU09OX1BTUF9PVVRQVVQ7XG5AQCAtMTQ5LDE5ICsxNDIsNiBAQCBuc2ltX3J4X3NwaV9hbGxvYyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCB1MzIgdmVyc2lvbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgaW50IG5zaW1fYXNzb2NfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbi1cdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdC8qIENvcHkgZHJ2X3ByaXYgZnJvbSBwc2QgdG8gYXNzb2MgKi9cbi1cdCpwdHIgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG4tXHRucy1cdTAwM2Vwc3AuYXNzb2NfY250Kys7XG4tXG4tXHRyZXR1cm4gMDtcbi19XG4tXG4gc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbiBcdHN0cnVjdCBuZXRkZXZzaW0gKm5zID0gcHNkLVx1MDAzZWRydl9wcml2O1xuQEAgLTE3NywxNSArMTU3LDYgQEAgc3RhdGljIGludCBuc2ltX2tleV9yb3RhdGUoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG5zaW1fYXNzb2NfZGVsKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbi17XG4tXHRzdHJ1Y3QgbmV0ZGV2c2ltICpucyA9IHBzZC1cdTAwM2VkcnZfcHJpdjtcbi1cdHZvaWQgKipwdHIgPSBwc3BfYXNzb2NfZHJ2X2RhdGEocGFzKTtcbi1cbi1cdCpwdHIgPSBOVUxMO1xuLVx0bnMtXHUwMDNlcHNwLmFzc29jX2NudC0tO1xuLX1cbi1cbiBzdGF0aWMgdm9pZCBuc2ltX2dldF9zdGF0cyhzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Rldl9zdGF0cyAqc3RhdHMpXG4ge1xuIFx0c3RydWN0IG5ldGRldnNpbSAqbnMgPSBwc2QtXHUwMDNlZHJ2X3ByaXY7XG5AQCAtMjA0LDggKzE3NSw2IEBAIHN0YXRpYyB2b2lkIG5zaW1fZ2V0X3N0YXRzKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfZGV2X3N0YXRzICpzdGF0cylcbiBzdGF0aWMgc3RydWN0IHBzcF9kZXZfb3BzIG5zaW1fcHNwX29wcyA9IHtcbiBcdC5zZXRfY29uZmlnXHQ9IG5zaW1fcHNwX3NldF9jb25maWcsXG4gXHQucnhfc3BpX2FsbG9jXHQ9IG5zaW1fcnhfc3BpX2FsbG9jLFxuLVx0LnR4X2tleV9hZGRcdD0gbnNpbV9hc3NvY19hZGQsXG4tXHQudHhfa2V5X2RlbFx0PSBuc2ltX2Fzc29jX2RlbCxcbiBcdC5rZXlfcm90YXRlXHQ9IG5zaW1fa2V5X3JvdGF0ZSxcbiBcdC5nZXRfc3RhdHNcdD0gbnNpbV9nZXRfc3RhdHMsXG4gfTtcbkBAIC0yMTUsNyArMTg0LDYgQEAgc3RhdGljIHN0cnVjdCBwc3BfZGV2X2NhcHMgbnNpbV9wc3BfY2FwcyA9IHtcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dNQUNfMTI4IHxcbiBcdFx0ICAgIDEgXHUwMDNjXHUwMDNjIFBTUF9WRVJTSU9OX0hEUjBfQUVTX0dDTV8yNTYgfFxuIFx0XHQgICAgMSBcdTAwM2NcdTAwM2MgUFNQX1ZFUlNJT05fSERSMF9BRVNfR01BQ18yNTYsXG4tXHQuYXNzb2NfZHJ2X3NwYyA9IHNpemVvZih2b2lkICopLFxuIH07XG4gXG4gc3RhdGljIHZvaWQgX19uc2ltX3BzcF91bmluaXQoc3RydWN0IG5ldGRldnNpbSAqbnMsIGJvb2wgdGVhcmRvd24pXG5AQCAtMjMwLDcgKzE5OCw2IEBAIHN0YXRpYyB2b2lkIF9fbnNpbV9wc3BfdW5pbml0KHN0cnVjdCBuZXRkZXZzaW0gKm5zLCBib29sIHRlYXJkb3duKVxuIFx0XHRzeW5jaHJvbml6ZV9yY3UoKTtcbiBcdFx0cHNwX2Rldl91bnJlZ2lzdGVyKHBzZCk7XG4gXHR9XG4tXHRXQVJOX09OKG5zLVx1MDAzZXBzcC5hc3NvY19jbnQpO1xuIH1cbiBcbiB2b2lkIG5zaW1fcHNwX3VuaW5pdChzdHJ1Y3QgbmV0ZGV2c2ltICpucylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmggYi9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbmluZGV4IGM1YzIzYTU0Nzc0ZTYuLmIyM2MzMDg5ODM4OWMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9wc3AvZnVuY3Rpb25zLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC9mdW5jdGlvbnMuaFxuQEAgLTI0LDExICsyNCw2IEBAIGludCBwc3BfZGV2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZGV2X2lkLCB1OCBnZW5lcmF0aW9uLCBib29sIHN0cmlwX2ljdik7XG4gLyogS2VybmVsLWZhY2luZyBBUEkgKi9cbiB2b2lkIHBzcF9hc3NvY19wdXQoc3RydWN0IHBzcF9hc3NvYyAqcGFzKTtcbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKnBzcF9hc3NvY19kcnZfZGF0YShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4te1xuLVx0cmV0dXJuIHBhcy1cdTAwM2VkcnZfZGF0YTtcbi19XG4tXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0lORVRfUFNQKVxuIHVuc2lnbmVkIGludCBwc3Bfa2V5X3NpemUodTMyIHZlcnNpb24pO1xuIHZvaWQgcHNwX3NrX2Fzc29jX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wc3AvdHlwZXMuaCBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5pbmRleCA4Nzk5MWExZWEwMmQwLi5iODkwNWVmYmQ2MDRlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9uZXQvcHNwL3R5cGVzLmhcbisrKyBiL2luY2x1ZGUvbmV0L3BzcC90eXBlcy5oXG5AQCAtMjE5LDEyICsyMTksMTYgQEAgc3RydWN0IHBzcF9kZXZfb3BzIHtcbiBcdCAqIEB0eF9rZXlfYWRkOiBhZGQgYSBUeCBrZXkgdG8gdGhlIGRldmljZVxuIFx0ICogSW5zdGFsbCBhbiBhc3NvY2lhdGlvbiBpbiB0aGUgZGV2aWNlLiBDb3JlIHdpbGwgYWxsb2NhdGUgc3BhY2VcbiBcdCAqIGZvciB0aGUgZHJpdmVyIHRvIHVzZSBhdCBkcnZfZGF0YS5cbitcdCAqIENhbiBiZSBsZWZ0IE5VTEwgaWYgZGV2aWNlIGRvZXMgbm90IHN0b3JlIFR4IGtleXMgYW5kIEB0eF9rZXlfZGVsXG4rXHQgKiBpcyBhbHNvIE5VTEwuXG4gXHQgKi9cbiBcdGludCAoKnR4X2tleV9hZGQpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdFx0XHQgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjayk7XG4gXHQvKipcbiBcdCAqIEB0eF9rZXlfZGVsOiByZW1vdmUgYSBUeCBrZXkgZnJvbSB0aGUgZGV2aWNlXG4gXHQgKiBSZW1vdmUgYW4gYXNzb2NpYXRpb24gZnJvbSB0aGUgZGV2aWNlLlxuK1x0ICogQ2FuIGJlIGxlZnQgTlVMTCBpZiBkZXZpY2UgZG9lcyBub3Qgc3RvcmUgVHgga2V5cyBhbmQgQHR4X2tleV9hZGRcbitcdCAqIGlzIGFsc28gTlVMTC5cbiBcdCAqL1xuIFx0dm9pZCAoKnR4X2tleV9kZWwpKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3AuaCBiL25ldC9wc3AvcHNwLmhcbmluZGV4IDg2ZWViYTgyM2NlZDEuLmJiYjM5ZTJmNWIwYWIgMTAwNjQ0XG4tLS0gYS9uZXQvcHNwL3BzcC5oXG4rKysgYi9uZXQvcHNwL3BzcC5oXG5AQCAtNTMsNCArNTMsMTYgQEAgc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaXNfcmVnaXN0ZXJlZChzdHJ1Y3QgcHNwX2RldiAqcHNkKVxuIFx0cmV0dXJuICEhcHNkLVx1MDAzZW9wcztcbiB9XG4gXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9kZXZfaGFzX3NhZGIoc3RydWN0IHBzcF9kZXYgKnBzZClcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbitcdHJldHVybiAhIXBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHN0cnVjdCBwc3BfYXNzb2MgKnBhcylcbit7XG4rXHRsb2NrZGVwX2Fzc2VydF9oZWxkKFx1MDAyNnBhcy1cdTAwM2Vwc2QtXHUwMDNlbG9jayk7XG4rXHRyZXR1cm4gcHNwX2Rldl9oYXNfc2FkYihwYXMtXHUwMDNlcHNkKSBcdTAwMjZcdTAwMjYgcGFzLVx1MDAzZXR4LnNwaTtcbit9XG4rXG4gI2VuZGlmIC8qIF9fUFNQX1BTUF9IICovXG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3BfbWFpbi5jIGIvbmV0L3BzcC9wc3BfbWFpbi5jXG5pbmRleCBjOWMxYTg4MjZiN2Y5Li45MTQ3M2Y5NmFkMjExIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3BfbWFpbi5jXG4rKysgYi9uZXQvcHNwL3BzcF9tYWluLmNcbkBAIC02OCw5ICs2OCw5IEBAIHBzcF9kZXZfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsXG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VzZXRfY29uZmlnIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VrZXlfcm90YXRlIHx8XG4gXHRcdCAgICAhcHNkX29wcy1cdTAwM2VyeF9zcGlfYWxsb2MgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwgfHxcbi1cdFx0ICAgICFwc2Rfb3BzLVx1MDAzZWdldF9zdGF0cykpXG4rXHRcdCAgICAhcHNkX29wcy1cdTAwM2VnZXRfc3RhdHMgfHxcbitcdFx0ICAgICghcHNkX29wcy1cdTAwM2V0eF9rZXlfYWRkICE9ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9kZWwpIHx8XG4rXHRcdCAgICAocHNkX2NhcHMtXHUwMDNlYXNzb2NfZHJ2X3NwYyBcdTAwMjZcdTAwMjYgIXBzZF9vcHMtXHUwMDNldHhfa2V5X2FkZCkpKVxuIFx0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHBzZCA9IGt6YWxsb2Nfb2JqKCpwc2QpO1xuQEAgLTE0Nyw4ICsxNDcsMTEgQEAgdm9pZCBwc3BfZGV2X3VucmVnaXN0ZXIoc3RydWN0IHBzcF9kZXYgKnBzZClcbiBcbiBcdGxpc3Rfc3BsaWNlX2luaXQoXHUwMDI2cHNkLVx1MDAzZWFjdGl2ZV9hc3NvY3MsIFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcyk7XG4gXHRsaXN0X3NwbGljZV9pbml0KFx1MDAyNnBzZC1cdTAwM2VwcmV2X2Fzc29jcywgXHUwMDI2cHNkLVx1MDAzZXN0YWxlX2Fzc29jcyk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzLCBuZXh0LCBcdTAwMjZwc2QtXHUwMDNlc3RhbGVfYXNzb2NzLCBhc3NvY3NfbGlzdClcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXMsIG5leHQsIFx1MDAyNnBzZC1cdTAwM2VzdGFsZV9hc3NvY3MsIGFzc29jc19saXN0KSB7XG4rXHRcdGlmIChwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbChwYXMpKVxuK1x0XHRcdHBzcF9kZXZfdHhfa2V5X2RlbChwc2QsIHBhcyk7XG4rXHRcdGxpc3RfZGVsKFx1MDAyNnBhcy1cdTAwM2Vhc3NvY3NfbGlzdCk7XG4rXHR9XG4gXG4gXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGVudHJ5X3RtcCwgXHUwMDI2cHNkLVx1MDAzZWFzc29jX2Rldl9saXN0LFxuIFx0XHRcdFx0IGRldl9saXN0KSB7XG5kaWZmIC0tZ2l0IGEvbmV0L3BzcC9wc3Bfc29jay5jIGIvbmV0L3BzcC9wc3Bfc29jay5jXG5pbmRleCAxYTJhNmI3NTE2YjBmLi42YTRiZWNjMzhiNTVhIDEwMDY0NFxuLS0tIGEvbmV0L3BzcC9wc3Bfc29jay5jXG4rKysgYi9uZXQvcHNwL3BzcF9zb2NrLmNcbkBAIC03OCwxNiArNzgsMzMgQEAgc3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4gfVxuIFxuIHN0YXRpYyBpbnQgcHNwX2Rldl90eF9rZXlfYWRkKHN0cnVjdCBwc3BfZGV2ICpwc2QsIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbitcdFx0XHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcbiBcdFx0XHQgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4ge1xuLVx0cmV0dXJuIHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2FkZChwc2QsIHBhcywgZXh0YWNrKTtcbitcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xuK1x0aW50IGVycjtcbitcbitcdC8qIFBhc3MgYSBmYWtlIGFzc29jaWF0aW9uIHRvIGRyaXZlcnMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3RcbitcdCAqIHRyeSB0byBzdG9yZSBwb2ludGVycyB0byBpdC4gRm9yIHJlLWtleWluZyB3ZSdsbCBuZWVkIHRvXG4rXHQgKiByZS1hbGxvY2F0ZSB0aGUgYXNzb2Mgc3RydWN0dXJlcy5cbitcdCAqL1xuK1x0ZHVtbXkgPSBwc3BfYXNzb2NfZHVtbXkocGFzKTtcbitcdGlmICghZHVtbXkpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1xuK1x0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4rXHRlcnIgPSBwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbitcdGlmICghZXJyKVxuK1x0XHRtZW1jcHkocGFzLVx1MDAzZWRydl9kYXRhLCBkdW1teS1cdTAwM2VkcnZfZGF0YSxcbitcdFx0ICAgICAgIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuK1xuK1x0a2ZyZWUoZHVtbXkpO1xuK1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gdm9pZCBwc3BfZGV2X3R4X2tleV9kZWwoc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIHtcbi1cdGlmIChwYXMtXHUwMDNldHguc3BpKVxuLVx0XHRwc2QtXHUwMDNlb3BzLVx1MDAzZXR4X2tleV9kZWwocHNkLCBwYXMpO1xuLVx0bGlzdF9kZWwoXHUwMDI2cGFzLVx1MDAzZWFzc29jc19saXN0KTtcbitcdHBzZC1cdTAwM2VvcHMtXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcbkBAIC05Niw4ICsxMTMsMTEgQEAgc3RhdGljIHZvaWQgcHNwX2Fzc29jX2ZyZWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKVxuIFx0c3RydWN0IHBzcF9kZXYgKnBzZCA9IHBhcy1cdTAwM2Vwc2Q7XG4gXG4gXHRtdXRleF9sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbi1cdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSlcbi1cdFx0cHNwX2Rldl90eF9rZXlfZGVsKHBzZCwgcGFzKTtcbitcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xuK1x0XHRpZiAocHNwX2Fzc29jX25lZWRzX3R4X2tleV9kZWwocGFzKSlcbitcdFx0XHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xuK1x0XHRsaXN0X2RlbChcdTAwMjZwYXMtXHUwMDNlYXNzb2NzX2xpc3QpO1xuK1x0fVxuIFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnBzZC1cdTAwM2Vsb2NrKTtcbiBcdHBzcF9kZXZfcHV0KHBzZCk7XG4gXHRrZnJlZShwYXMpO1xuQEAgLTE1NSw2ICsxNzUsMjIgQEAgaW50IHBzcF9zb2NrX2Fzc29jX3NldF9yeChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwc3BfYXNzb2MgKnBhcyxcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuK3N0YXRpYyBpbnQgcHNwX2Fzc29jX3NldF90eChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXG4rXHRcdFx0ICAgIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuK1x0XHRcdCAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spXG4re1xuK1x0aW50IGVycjtcbitcbitcdGlmIChwc3BfZGV2X2hhc19zYWRiKHBzZCkpIHtcbitcdFx0ZXJyID0gcHNwX2Rldl90eF9rZXlfYWRkKHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRcdGlmIChlcnIpXG4rXHRcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdG1lbWNweShcdTAwMjZwYXMtXHUwMDNldHgsIGtleSwgc2l6ZW9mKCprZXkpKTtcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgaW50IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXG4ge1xuIFx0c3RydWN0IHBzcF9za2JfZXh0ICpwc2U7XG5AQCAtMTc0LDEyICsyMTAsNDAgQEAgc3RhdGljIGludCBwc3Bfc29ja19yZWN2X3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9hc3NvYyAqcGFzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnRcbitwc3Bfc29ja19zZXRfdHhfa2V5KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCwgc3RydWN0IHBzcF9hc3NvYyAqcGFzLFxuK1x0XHQgICAgc3RydWN0IHBzcF9rZXlfcGFyc2VkICprZXksIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcbit7XG4rXHRzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2s7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gcHNwX3NvY2tfcmVjdl9xdWV1ZV9jaGVjayhzaywgcGFzKTtcbitcdGlmIChlcnIpIHtcbitcdFx0TkxfU0VUX0VSUl9NU0coZXh0YWNrLFxuK1x0XHRcdCAgICAgICBcIlNvY2tldCBoYXMgaW5jb21wYXRpYmxlIHNlZ21lbnRzIGFscmVhZHkgaW4gdGhlIHJlY3YgcXVldWVcIik7XG4rXHRcdHJldHVybiBlcnI7XG4rXHR9XG4rXG4rXHRlcnIgPSBwc3BfYXNzb2Nfc2V0X3R4KHBzZCwgcGFzLCBrZXksIGV4dGFjayk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuK1x0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbitcdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbitcbitcdGljc2sgPSBpbmV0X2Nzayhzayk7XG4rXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbitcdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIGludCBwc3Bfc29ja19hc3NvY19zZXRfdHgoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcHNwX2RldiAqcHNkLFxuIFx0XHRcdCAgdTMyIHZlcnNpb24sIHN0cnVjdCBwc3Bfa2V5X3BhcnNlZCAqa2V5LFxuIFx0XHRcdCAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKVxuIHtcbi1cdHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaztcbi1cdHN0cnVjdCBwc3BfYXNzb2MgKnBhcywgKmR1bW15O1xuK1x0c3RydWN0IHBzcF9hc3NvYyAqcGFzO1xuIFx0aW50IGVycjtcbiBcbiBcdGxvY2tfc29jayhzayk7XG5AQCAtMjA3LDQwICsyNzEsNyBAQCBpbnQgcHNwX3NvY2tfYXNzb2Nfc2V0X3R4KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBzcF9kZXYgKnBzZCxcbiBcdFx0Z290byBleGl0X3VubG9jaztcbiBcdH1cbiBcbi1cdGVyciA9IHBzcF9zb2NrX3JlY3ZfcXVldWVfY2hlY2soc2ssIHBhcyk7XG4tXHRpZiAoZXJyKSB7XG4tXHRcdE5MX1NFVF9FUlJfTVNHKGV4dGFjaywgXCJTb2NrZXQgaGFzIGluY29tcGF0aWJsZSBzZWdtZW50cyBhbHJlYWR5IGluIHRoZSByZWN2IHF1ZXVlXCIpO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxuLVx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cbi1cdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxuLVx0ICovXG4tXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xuLVx0aWYgKCFkdW1teSkge1xuLVx0XHRlcnIgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIGV4aXRfdW5sb2NrO1xuLVx0fVxuLVxuLVx0bWVtY3B5KFx1MDAyNmR1bW15LVx1MDAzZXR4LCBrZXksIHNpemVvZigqa2V5KSk7XG4tXHRlcnIgPSBwc3BfZGV2X3R4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcbi1cdGlmIChlcnIpXG4tXHRcdGdvdG8gZXhpdF9mcmVlX2R1bW15O1xuLVxuLVx0bWVtY3B5KHBhcy1cdTAwM2VkcnZfZGF0YSwgZHVtbXktXHUwMDNlZHJ2X2RhdGEsIHBzZC1cdTAwM2VjYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMpO1xuLVx0bWVtY3B5KFx1MDAyNnBhcy1cdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xuLVxuLVx0V1JJVEVfT05DRShzay1cdTAwM2Vza192YWxpZGF0ZV94bWl0X3NrYiwgcHNwX3ZhbGlkYXRlX3htaXQpO1xuLVx0dGNwX3dyaXRlX2NvbGxhcHNlX2ZlbmNlKHNrKTtcbi1cdHBhcy1cdTAwM2V1cGdyYWRlX3NlcSA9IHRjcF9zayhzayktXHUwMDNlcmN2X254dDtcbi1cbi1cdGljc2sgPSBpbmV0X2Nzayhzayk7XG4tXHRpY3NrLVx1MDAzZWljc2tfZXh0X2hkcl9sZW4gKz0gcHNwX3NrX292ZXJoZWFkKHNrKTtcbi1cdGljc2stXHUwMDNlaWNza19zeW5jX21zcyhzaywgaWNzay1cdTAwM2VpY3NrX3BtdHVfY29va2llKTtcbi1cbi1leGl0X2ZyZWVfZHVtbXk6XG4tXHRrZnJlZShkdW1teSk7XG4rXHRlcnIgPSBwc3Bfc29ja19zZXRfdHhfa2V5KHNrLCBwc2QsIHBhcywga2V5LCBleHRhY2spO1xuIGV4aXRfdW5sb2NrOlxuIFx0cmVsZWFzZV9zb2NrKHNrKTtcbiBcdHJldHVybiBlcnI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0MC45MDk1NzIxMDFaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjU1MjgwNzI2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBzZWUgaWYgaXQgaW50cm9kdWNlcyBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgdnVsbmVyYWJpbGl0aWVzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgS01TQU4gZnV6emluZy4gTXkgaW5pdGlhbCBpbXByZXNzaW9uIGlzIHRoYXQgaXQncyBhIHJlZmFjdG9yaW5nIGV4ZXJjaXNlIHdpdGhpbiB0aGUgUFNQIChQb2xpY3ktQmFzZWQgU2VjdXJpdHkgUHJvdG9jb2wpIHN1YnN5c3RlbSwgcHJpbWFyaWx5IGZvY3VzZWQgb24gc2ltcGxpZnlpbmcga2V5IG1hbmFnZW1lbnQgYW5kIGFzc29jaWF0aW9uIGhhbmRsaW5nIHdpdGhpbiB0aGUgYG5ldGRldnNpbWAgZHJpdmVyLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSB3aGF04oCZcyBiZWVuIGNoYW5nZWQuIFRoZSBwYXRjaCByZW1vdmVzIGBhc3NvY19jbnRgIGFuZCB0aGUgYHR4X2tleV9hZGRgL2B0eF9rZXlfZGVsYCBmdW5jdGlvbnMgZnJvbSB0aGUgYG5ldGRldnNpbWAgUFNQIGltcGxlbWVudGF0aW9uLiBJdCBzZWVtcyBsaWtlIHRoZSBgbmV0ZGV2c2ltYCBkcml2ZXIgaXMgYmVpbmcgYWRhcHRlZCB0byBhIG1vcmUgZ2VuZXJpYywgcG9zc2libHkgb3B0aW9uYWwsIGFwcHJvYWNoIHRvIGtleSBoYW5kbGluZy4gTm90YWJseSwgYC5hc3NvY19kcnZfc3BjID0gc2l6ZW9mKHZvaWQgKilgIGlzIHJlbW92ZWQsIHN1Z2dlc3RpbmcgYSBzaGlmdCBhd2F5IGZyb20gYSBkcml2ZXItc3BlY2lmaWMgYXNzb2NpYXRpb24gZGF0YSBzaXplLiBBbHNvLCB0aGUgY2hlY2sgYHB0ciA9IHBzcF9hc3NvY19kcnZfZGF0YShwYXMpOyBpZiAoKnB0ciAhPSBucykgLi4uYCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYG5zaW1fZG9fcHNwYCwgbGlrZWx5IHJlbGF0ZWQgdG8gdGhlIHJlbW92YWwgb2YgZHJpdmVyLXNwZWNpZmljIGRhdGEgbWFuYWdlbWVudC5cblxuVGhlIGhlYWRlciBmaWxlIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB0aGUgcmVtb3ZhbCBvZiBgcHNwX2Fzc29jX2Rydl9kYXRhKClgIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBhbGxvd2luZyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMLCByZWluZm9yY2UgdGhpcyBub3Rpb24gb2Ygb3B0aW9uYWwga2V5IG1hbmFnZW1lbnQuIE5ldyBmdW5jdGlvbnMgbGlrZSBgcHNwX2Rldl9oYXNfc2FkYigpYCBhbmQgYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKClgIGFyZSBpbnRyb2R1Y2VkLCBwcm92aWRpbmcgY29uZGl0aW9uYWwgY2hlY2tzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBTQSAoU2VjdXJpdHkgQXNzb2NpYXRpb24pIERhdGFiYXNlIGZ1bmN0aW9uYWxpdHkgYW5kIGlmIGEgVFgga2V5IG5lZWRzIHRvIGJlIGRlbGV0ZWQgZHVyaW5nIGFzc29jaWF0aW9uIGhhbmRsaW5nLlxuXG5UaGUgYHBzcF9kZXZfY3JlYXRlYCBmdW5jdGlvbidzIGNoYW5nZXMgYXJlIGNyaXRpY2FsLiBUaGUgcGF0Y2ggbm93IGFsbG93cyBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCB0byBiZSBOVUxMIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMuIEl0IHNlZW1zIHRoYXQgaWYgdGhlc2UgZnVuY3Rpb25zIGFyZSBOVUxMIGFuZCBgYXNzb2NfZHJ2X3NwY2AgaXMgMCwgdGhlIGRldmljZSBpcyBjb25zaWRlcmVkIG5vdCB0byBtYW5hZ2UgVHgga2V5cy4gVGhpcyBmZWVscyBsaWtlIGEgc2lnbmlmaWNhbnQgc2ltcGxpZmljYXRpb24sIGJ1dCB0aGlzIGlzIHdoZXJlIEkgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3Vlcy4gVGhlIGxvZ2ljIG5vdyBpbmNsdWRlcyBgKCFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQgIT0gIXBzZF9vcHMtXHUwMDNldHhfa2V5X2RlbCkgfHwgKHBzZF9jYXBzLVx1MDAzZWFzc29jX2Rydl9zcGMgXHUwMDI2XHUwMDI2ICFwc2Rfb3BzLVx1MDAzZXR4X2tleV9hZGQpYC4gSSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb21iaW5hdGlvbiBvZiB0aGVzZSBjb25kaXRpb25zIGRvZXNuJ3QgbGVhZCB0byBhbnkgdW5leHBlY3RlZCBiZWhhdmlvciwgZXNwZWNpYWxseSByZWdhcmRpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3Igd3JpdGVzIHdoZW4gdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcHJvdmlkZWQuXG5cbkluIGBwc3BfZGV2X3VucmVnaXN0ZXJgIGFuZCBgcHNwX2Fzc29jX2ZyZWVgLCB3ZSBzZWUgY29uZGl0aW9uYWwgY2FsbHMgdG8gYHBzcF9kZXZfdHhfa2V5X2RlbGAgYmFzZWQgb24gYHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKClgLiBUaGlzIG1ha2VzIHNlbnNlLCBidXQgdGhlIHJlbW92YWwgb2YgYGxpc3RfZGVsYCBmcm9tIGluc2lkZSBvZiBgcHNwX2Rldl90eF9rZXlfZGVsYCBpdHNlbGYgaW4gZmF2b3VyIG9mIHRoZSBjYWxsZXIsIGlzIHNvbWV0aGluZyBJIG5lZWQgdG8ga2VlcCBpbiBtaW5kLlxuXG5UaGUgY2hhbmdlcyBpbiBgcHNwX3NvY2suY2AgYXJlIGFsc28gaW1wb3J0YW50LiBUaGUgZHVtbXkgYWxsb2NhdGlvbiBsb2dpYyBpcyBub3cgZXhwbGljaXRseSBpbnNpZGUgYHBzcF9kZXZfdHhfa2V5X2FkZGAuIFRoZSBjYWxscyB0byBgcHNkLVx1MDAzZW9wcy1cdTAwM2V0eF9rZXlfZGVsKHBzZCwgcGFzKTtgIGFyZSBwb3RlbnRpYWxseSBwcm9ibGVtYXRpYyBpZiB0aGUgZHJpdmVycyBmb3JnZXQgdG8gaGFuZGxlIHRoZXNlIGNvcnJlY3RseS4gU3BsaXR0aW5nIG9mZiBgcHNwX2Fzc29jX3NldF90eGAgYW5kIGBwc3Bfc29ja19zZXRfdHhfa2V5YCwgYW5kIHRoZSBhc3NvY2lhdGVkIGBtZW1jcHlgIHdpdGhpbiBgcHNwX2Fzc29jX3NldF90eGAgYWxsIGxvb2sgbGlrZSBjbGVhbnVwcy5cblxuTXkgbWFpbiBhcmVhIG9mIGNvbmNlcm4gcmlnaHQgbm93IGlzIGhvdyB0aGUgXCJkdW1teVwiIGFsbG9jYXRpb24gaXMgYmVpbmcgaGFuZGxlZC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBwc3BfYXNzb2NfZHVtbXlgIHdvcmtzLCB0byB2ZXJpZnkgaWYgdGhlcmUncyBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIHdoZW4gdGhlIGtleSBoYW5kbGluZyBpcyBcImR1bW15XCIuIEknbSBnb2luZyB0byBxdWlja2x5IHVzZSBgZ3JlcHBlcmAgKG9yIGByZWFkLWZpbGVgIGlmIG5lZWQgYmUpIHRvIGV4YW1pbmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGBwc3BfYXNzb2NfZHVtbXlgIHRvIGJlIHN1cmUgdGhlcmUncyBubyBzdWJ0bGUsIGx1cmtpbmcgdnVsbmVyYWJpbGl0eSBoZXJlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBkdW1teSBhbGxvY2F0aW9uIGlzbid0IGluYWR2ZXJ0ZW50bHkgZXhwb3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkgd2hlbiB0aGUgZGV2aWNlIGNob29zZXMgbm90IHRvIHN0b3JlIHR4IGtleXMuIFRoaXMgaXMgd2hlcmUgYSBzdWJ0bGUgZmxhdyBpcyBtb3N0IGxpa2VseSB0byByZXNpZGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY2ODIsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MTMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo0Ny40NjIzODMxNDRaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE3NzcxNjk5NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwc3BfYXNzb2NfZHVtbXlcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3BzcC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3BzcC9wc3Bfc29jay5jPTQ3PXN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19jcmVhdGUoc3RydWN0IHBzcF9kZXYgKnBzZClcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYy02OC1cXG5uZXQvcHNwL3BzcF9zb2NrLmM6Njk6c3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxubmV0L3BzcC9wc3Bfc29jay5jLTcwLXtcXG4tLVxcbm5ldC9wc3AvcHNwX3NvY2suYz04MD1zdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuLS1cXG5uZXQvcHNwL3BzcF9zb2NrLmMtOTAtXFx0ICovXFxubmV0L3BzcC9wc3Bfc29jay5jOjkxOlxcdGR1bW15ID0gcHNwX2Fzc29jX2R1bW15KHBhcyk7XFxubmV0L3BzcC9wc3Bfc29jay5jLTkyLVxcdGlmICghZHVtbXkpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjQ3LjY0MDEwNTAyMVoiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNDc3OTc4NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEknbSByZWFkaW5nIGFuZCBwcm9jZXNzaW5nIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIGBwc3Bfc29jay5jYCAtIExpbmVzIDQwLTEyMCoqXG5cbk9rYXksIGxldCdzIHB1bGwgdXAgYHBzcF9zb2NrLmNgIGFuZCBmb2N1cyBvbiBsaW5lcyA0MCB0aHJvdWdoIDEyMC4gSSdtIGd1ZXNzaW5nIHRoaXMgc2VjdGlvbiBwcm9iYWJseSBkZWFscyB3aXRoIHRoZSBjb3JlIHNvY2tldCBpbml0aWFsaXphdGlvbiBvciBzb21lIGltcG9ydGFudCBzZXR1cCByb3V0aW5lLCBnaXZlbiBpdHMgcGxhY2VtZW50IGVhcmx5IGluIHRoZSBmaWxlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBzdHJ1Y3QgZGVjbGFyYXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNvY2tldCBzdHJ1Y3R1cmUgaXRzZWxmLCBhbmQgYW55IGluaXRpYWwgYXNzaWdubWVudHMgdG8gY3J1Y2lhbCB2YXJpYWJsZXMuIEknbSBleHBlY3RpbmcgdG8gc2VlIHRoaW5ncyBsaWtlIHRoZSBhbGxvY2F0aW9uIG9mIHNvY2tldCBkZXNjcmlwdG9ycywgdGhlIHNldHRpbmcgb2YgZGVmYXVsdCBvcHRpb25zIChpZiBhbnkpLCBhbmQgcG90ZW50aWFsbHkgc29tZSBlYXJseSBlcnJvciBoYW5kbGluZy4gSSdtIGFsc28gcmVhZHkgdG8gdHJhY2UgY29udHJvbCBmbG93IHRocm91Z2ggYW55IHBvdGVudGlhbCBicmFuY2hlcywgY2hlY2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzIG9yIHVudXN1YWwgcGFyYW1ldGVyIGhhbmRsaW5nIHdoaWNoIG1pZ2h0IGNhdXNlIGlzc3VlcyBkb3duIHRoZSBsaW5lLiBJJ2xsIGFsc28gYmUgZm9jdXNpbmcgb24gYW55IHVzZSBvZiBgaW9jdGxgIGNhbGxzIGFzIHRoZXkgbWF5IGluZGljYXRlIGhhcmR3YXJlIGRlcGVuZGVuY3kuIEknbSBnb2luZyB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHR5cGVzIGJlaW5nIHVzZWQgZm9yIHZhcmlvdXMgc29ja2V0IG9wdGlvbnM7IHR5cGUgbWlzbWF0Y2hlcyBjYW4gYmUgbm90b3Jpb3VzbHkgdHJpY2t5IHRvIGRlYnVnLiBBbnl0aGluZyByZWxhdGVkIHRvIHRocmVhZGluZyBhbmQgc3luY2hyb25pemF0aW9uIHdpdGhpbiB0aGUgc29ja2V0J3MgaW50ZXJuYWwgc3RydWN0dXJlcyB3b3VsZCBiZSBvZiBwYXJ0aWN1bGFyIGludGVyZXN0OyBJIG5lZWQgdG8gYmUgYXdhcmUgb2YgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMuIExldCdzIHNlZSB3aGF0J3Mgd2hhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6ODYyMiwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDEwOjUyOjUwLjExODA4Njc5MloiLCJTZXEiOjMyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NDY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvcHNwL3BzcF9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDAsXG4gIFwiTGluZUNvdW50XCI6IDgwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNDA6XFx0XFx0XFx0c2tfc2tiX3JlYXNvbl9kcm9wKHNrLCBza2IsIFNLQl9EUk9QX1JFQVNPTl9QU1BfT1VUUFVUKTtcXG4gIDQxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgNDI6XFx0XFx0fVxcbiAgNDM6XFx0XFxuICA0NDpcXHRcXHRyZXR1cm4gc2tiO1xcbiAgNDU6XFx0fVxcbiAgNDY6XFx0XFxuICA0NzpcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwc3BfYXNzb2NfY3JlYXRlKHN0cnVjdCBwc3BfZGV2ICpwc2QpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgcHNwX2Fzc29jICpwYXM7XFxuICA1MDpcXHRcXG4gIDUxOlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA1MjpcXHRcXG4gIDUzOlxcdFxcdHBhcyA9IGt6YWxsb2NfZmxleCgqcGFzLCBkcnZfZGF0YSwgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjLFxcbiAgNTQ6XFx0XFx0XFx0XFx0ICAgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4gIDU1OlxcdFxcdGlmICghcGFzKVxcbiAgNTY6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuICA1NzpcXHRcXG4gIDU4OlxcdFxcdHBhcy1cXHUwMDNlcHNkID0gcHNkO1xcbiAgNTk6XFx0XFx0cGFzLVxcdTAwM2VkZXZfaWQgPSBwc2QtXFx1MDAzZWlkO1xcbiAgNjA6XFx0XFx0cGFzLVxcdTAwM2VnZW5lcmF0aW9uID0gcHNkLVxcdTAwM2VnZW5lcmF0aW9uO1xcbiAgNjE6XFx0XFx0cHNwX2Rldl9nZXQocHNkKTtcXG4gIDYyOlxcdFxcdHJlZmNvdW50X3NldChcXHUwMDI2cGFzLVxcdTAwM2VyZWZjbnQsIDEpO1xcbiAgNjM6XFx0XFxuICA2NDpcXHRcXHRsaXN0X2FkZF90YWlsKFxcdTAwMjZwYXMtXFx1MDAzZWFzc29jc19saXN0LCBcXHUwMDI2cHNkLVxcdTAwM2VhY3RpdmVfYXNzb2NzKTtcXG4gIDY1OlxcdFxcbiAgNjY6XFx0XFx0cmV0dXJuIHBhcztcXG4gIDY3OlxcdH1cXG4gIDY4OlxcdFxcbiAgNjk6XFx0c3RhdGljIHN0cnVjdCBwc3BfYXNzb2MgKnBzcF9hc3NvY19kdW1teShzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuICA3MDpcXHR7XFxuICA3MTpcXHRcXHRzdHJ1Y3QgcHNwX2RldiAqcHNkID0gcGFzLVxcdTAwM2Vwc2Q7XFxuICA3MjpcXHRcXHRzaXplX3Qgc3o7XFxuICA3MzpcXHRcXG4gIDc0OlxcdFxcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXFx1MDAyNnBzZC1cXHUwMDNlbG9jayk7XFxuICA3NTpcXHRcXG4gIDc2OlxcdFxcdHN6ID0gc3RydWN0X3NpemUocGFzLCBkcnZfZGF0YSwgcHNkLVxcdTAwM2VjYXBzLVxcdTAwM2Vhc3NvY19kcnZfc3BjKTtcXG4gIDc3OlxcdFxcdHJldHVybiBrbWVtZHVwKHBhcywgc3osIEdGUF9LRVJORUwpO1xcbiAgNzg6XFx0fVxcbiAgNzk6XFx0XFxuICA4MDpcXHRzdGF0aWMgaW50IHBzcF9kZXZfdHhfa2V5X2FkZChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMsXFxuICA4MTpcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgcHNwX2tleV9wYXJzZWQgKmtleSxcXG4gIDgyOlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaylcXG4gIDgzOlxcdHtcXG4gIDg0OlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKmR1bW15O1xcbiAgODU6XFx0XFx0aW50IGVycjtcXG4gIDg2OlxcdFxcbiAgODc6XFx0XFx0LyogUGFzcyBhIGZha2UgYXNzb2NpYXRpb24gdG8gZHJpdmVycyB0byBtYWtlIHN1cmUgdGhleSBkb24ndFxcbiAgODg6XFx0XFx0ICogdHJ5IHRvIHN0b3JlIHBvaW50ZXJzIHRvIGl0LiBGb3IgcmUta2V5aW5nIHdlJ2xsIG5lZWQgdG9cXG4gIDg5OlxcdFxcdCAqIHJlLWFsbG9jYXRlIHRoZSBhc3NvYyBzdHJ1Y3R1cmVzLlxcbiAgOTA6XFx0XFx0ICovXFxuICA5MTpcXHRcXHRkdW1teSA9IHBzcF9hc3NvY19kdW1teShwYXMpO1xcbiAgOTI6XFx0XFx0aWYgKCFkdW1teSlcXG4gIDkzOlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAgOTQ6XFx0XFxuICA5NTpcXHRcXHRtZW1jcHkoXFx1MDAyNmR1bW15LVxcdTAwM2V0eCwga2V5LCBzaXplb2YoKmtleSkpO1xcbiAgOTY6XFx0XFx0ZXJyID0gcHNkLVxcdTAwM2VvcHMtXFx1MDAzZXR4X2tleV9hZGQocHNkLCBkdW1teSwgZXh0YWNrKTtcXG4gIDk3OlxcdFxcdGlmICghZXJyKVxcbiAgOTg6XFx0XFx0XFx0bWVtY3B5KHBhcy1cXHUwMDNlZHJ2X2RhdGEsIGR1bW15LVxcdTAwM2VkcnZfZGF0YSxcXG4gIDk5OlxcdFxcdFxcdCAgICAgICBwc2QtXFx1MDAzZWNhcHMtXFx1MDAzZWFzc29jX2Rydl9zcGMpO1xcbiAxMDA6XFx0XFxuIDEwMTpcXHRcXHRrZnJlZShkdW1teSk7XFxuIDEwMjpcXHRcXHRyZXR1cm4gZXJyO1xcbiAxMDM6XFx0fVxcbiAxMDQ6XFx0XFxuIDEwNTpcXHR2b2lkIHBzcF9kZXZfdHhfa2V5X2RlbChzdHJ1Y3QgcHNwX2RldiAqcHNkLCBzdHJ1Y3QgcHNwX2Fzc29jICpwYXMpXFxuIDEwNjpcXHR7XFxuIDEwNzpcXHRcXHRwc2QtXFx1MDAzZW9wcy1cXHUwMDNldHhfa2V5X2RlbChwc2QsIHBhcyk7XFxuIDEwODpcXHR9XFxuIDEwOTpcXHRcXG4gMTEwOlxcdHN0YXRpYyB2b2lkIHBzcF9hc3NvY19mcmVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4gMTExOlxcdHtcXG4gMTEyOlxcdFxcdHN0cnVjdCBwc3BfYXNzb2MgKnBhcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcHNwX2Fzc29jLCB3b3JrKTtcXG4gMTEzOlxcdFxcdHN0cnVjdCBwc3BfZGV2ICpwc2QgPSBwYXMtXFx1MDAzZXBzZDtcXG4gMTE0OlxcdFxcbiAxMTU6XFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2cHNkLVxcdTAwM2Vsb2NrKTtcXG4gMTE2OlxcdFxcdGlmIChwc3BfZGV2X2lzX3JlZ2lzdGVyZWQocHNkKSkge1xcbiAxMTc6XFx0XFx0XFx0aWYgKHBzcF9hc3NvY19uZWVkc190eF9rZXlfZGVsKHBhcykpXFxuIDExODpcXHRcXHRcXHRcXHRwc3BfZGV2X3R4X2tleV9kZWwocHNkLCBwYXMpO1xcbiAxMTk6XFx0XFx0XFx0bGlzdF9kZWwoXFx1MDAyNnBhcy1cXHUwMDNlYXNzb2NzX2xpc3QpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQxMDo1Mjo1MC4xMTgxNzM3NzJaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzEyNzg1MjA3OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBc3Nlc3NtZW50IG9mIFBTUCBBc3NvY2lhdGlvbiBDaGFuZ2VzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIGZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZS4gTXkgaW5pdGlhbCB0aG91Z2h0IHByb2Nlc3MgaXMgdG8gbWV0aWN1bG91c2x5IGFuYWx5emUgdGhlc2UgY2hhbmdlcyBmb3IgcG90ZW50aWFsIG1lbW9yeSBzYWZldHkgaXNzdWVzLlxuXG5GaXJzdCwgSSBuZWVkIHRvIHBpbnBvaW50IGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgbGVha3MgdGhhdCBjb3VsZCBleHBvc2Ugc2Vuc2l0aXZlIGtlcm5lbCBkYXRhIHRvIHVzZXIgc3BhY2UuIEl0IGxvb2tzIGxpa2U6XG5cbiogICBUaGUgYHBhc2Agc3RydWN0dXJlIGlzIGFsbG9jYXRlZCB3aXRoIGBremFsbG9jX2ZsZXhgIGluIGBwc3BfYXNzb2NfY3JlYXRlYCwgd2hpY2ggemVyb2VzIHRoZSBtZW1vcnkuXG4qICAgVGhlIGBkdW1teWAgaXMgY3JlYXRlZCB3aXRoIGBrbWVtZHVwYCwgZHVwbGljYXRpbmcgemVyb2VkIG1lbW9yeS5cbiogICBUaGUgYGtleWAgY29tZXMgZnJvbSBuZXRsaW5rIGlucHV0LCBhbmQgdGhpcyByZXF1aXJlcyBjYXJlZnVsIGNvbnNpZGVyYXRpb24sIGJ1dCBpdCBpcyBwYXJzZWQsIG9yIHZhbGlkYXRlZCwgYmVmb3JlIGJlaW5nIHVzZWQuXG4qICAgVGhlIHJlbW92YWwgb2YgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZnJvbSBuZXRkZXZzaW0gaW1wbGllcyBubyBuZWVkIGZvciBTQURCIG1hbmFnZW1lbnQgaW4gdGhhdCBzcGVjaWZpYyBjb250ZXh0LlxuKiAgIFRoZXJlIGFyZW4ndCBhbnkgbmV3bHkgaW50cm9kdWNlZCB1bmluaXRpYWxpemVkIHN0YWNrIHZhcmlhYmxlcywgaGVhcCBidWZmZXJzLCBvciBzdHJ1Y3QgcGFkZGluZyB0aGF0IGdldHMgY29waWVkIHRvIHVzZXIgc3BhY2UsIG5vciBhcmUgdGhlcmUgYW55IHRoYXQgYXJlIHJlYWQgaW4gY29uZGl0aW9uYWwgbG9naWMuXG4qICAgVGhlIHJlZmFjdG9yaW5nIG1ha2VzIHRoZXNlIGZ1bmN0aW9ucyBvcHRpb25hbCwgYnV0IGBwc3BfYXNzb2NfbmVlZHNfdHhfa2V5X2RlbGAgcHJvdmlkZXMgYSBjaGVjaywgdXNpbmcgYHBzcF9kZXZfaGFzX3NhZGIocGFzLVx1MDAzZXBzZCkgXHUwMDI2XHUwMDI2IHBhcy1cdTAwM2V0eC5zcGlgLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gZXhhbWluZSB0aGUgd2lkZXIgY29kZSwgZ29pbmcgYmV5b25kIHRoZSBpbW1lZGlhdGUgcGF0Y2guIEknbGwgYmUgbG9va2luZyBmb3IgYGNvcHlfdG9fdXNlcmAgY2FsbHMsIG5ldGxpbmsgYXR0cmlidXRlcywgc29ja2V0IG9wdGlvbnMsIGFuZCBhbnkgbmV3IGJyYW5jaGluZyBiYXNlZCBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGRhdGEuIEhvd2V2ZXIsIEknbSBub3Qgc2VlaW5nIGFueSByZWQgZmxhZ3MuXG5cbk5vdywgYXMgYW4gZXh0cmEgc3RlcCwgSSdsbCBxdWlja2x5IGNvbnNpZGVyIGFueSBwb3RlbnRpYWwgbWVtb3J5IGNvcnJ1cHRpb24sIFVzZS1BZnRlci1GcmVlIChVQUYpLCBvciBsb2NraW5nIHByb2JsZW1zLiBUaG9zZSBhcmUgYmV0dGVyIGFkZHJlc3NlZCBieSBLQVNBTiBhbmQgTE9DS0RFUC5cblxuVGltZSB0byBjb25maXJtIG15IGZpbmRpbmdzIGFnYWluc3QgdGhlIEtNU0FOIGNyaXRlcmlhLlxuXG4xLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlIHdoZXJlIGZpZWxkcyBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkOiBObyBjb25jZXJucyBoZXJlLlxuMi4gIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgb3Igc3RydWN0IGZpZWxkczogTm8sIGFsbCB1c2VkIHN0cnVjdCBmaWVsZHMgYXJlIGluaXRpYWxpemVkLlxuMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRoczogTm8sIHplcm9pbmcgYWxsb2NhdG9ycyBhbmQga21lbWR1cCBhcmUgdXNlZC5cbjQuICBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM6IE5vIHN1Y2ggY2FzZXMgd2VyZSBmb3VuZC5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTmAgaXMgZGVmaW5pdGVseSBgZmFsc2VgIGhlcmUuXG5cblRvIHByb3ZpZGUgYSByb2J1c3QganVzdGlmaWNhdGlvbiwgbGV0J3MgY29udHJhc3QgdGhlIEtNU0FOIGFuZCBLQVNBTiBhc3BlY3RzLiBUaGlzIHBhdGNoIHJlZmFjdG9ycyBUeCBrZXkgbWFuYWdlbWVudCB0byBtYWtlIGl0IG9wdGlvbmFsLCBzcGVjaWZpY2FsbHkgZm9yIGRldmljZXMgdGhhdCBkb24ndCB1c2UgYSBUeCBrZXkgU0FEQi4gQWxsIGludm9sdmVkIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIHVzaW5nIHplcm8gYWxsb2NhdG9ycyBsaWtlIGBremFsbG9jX29iamAsIGBremFsbG9jX2ZsZXhgLCBvciBga21lbWR1cGAuIE5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBpcyBleHBvc2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBudWxsYWJpbGl0eSBvZiB0aGUgY2FsbGJhY2tzIGlzIGNvdmVyZWQgYnkgS0FTQU4gYW5kIExPQ0tERVAsIG5vdCBLTVNBTi4gVGhlIGlzc3VlcyBhcmUgZnVuY3Rpb25hbCBidWdzLCBvciBsb2NraW5nL2xpZmVjeWNsZSBpc3N1ZXMgd2hpY2ggYXJlIHByb3Blcmx5IGNvdmVyZWQgYnkgb3RoZXIgdG9vbHMuIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpc24ndCBuZWVkZWQgaGVyZS5cblxuSSB0aGluayB3ZSdyZSByZWFkeSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxMTIsIk91dHB1dFRva2VucyI6MTY0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzA0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMTA6NTI6NTcuMjQ2MDI5MDExWiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc0NzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtYWtlcyB0aGUgYHR4X2tleV9hZGRgIGFuZCBgdHhfa2V5X2RlbGAgZHJpdmVyIGNhbGxiYWNrcyBvcHRpb25hbCBmb3IgUFNQIGRldmljZXMgd2l0aG91dCBTQURCIHN1cHBvcnQsIHJlZmFjdG9yaW5nIFR4IGtleSBhc3NvY2lhdGlvbiBtYW5hZ2VtZW50IGFuZCByZW1vdmluZyB1bnVzZWQga2V5IGhhbmRsaW5nIGhvb2tzIGZyb20gbmV0ZGV2c2ltLiBBbGwgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBjb250aW51ZSB0byBiZSBmdWxseSB6ZXJvLWluaXRpYWxpemVkIHZpYSBga3phbGxvY19mbGV4YCwgYGt6YWxsb2Nfb2JqYCwgb3IgYGttZW1kdXBgLiBUaGUgY2hhbmdlcyBkbyBub3QgaW50cm9kdWNlIG9yIGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeSwgaW5mby1sZWFrcywgb3IgcmVhZHMgb2YgdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHBvaW50ZXIgY2hlY2tzLCBsaXN0IG1hbmlwdWxhdGlvbiwgb3IgbGlmZWN5Y2xlIGhhbmRsaW5nIGZhbGwgc3RyaWN0bHkgdW5kZXIgdGhlIGRvbWFpbiBvZiBLQVNBTiBhbmQgTE9DS0RFUC4gVGhlcmVmb3JlLCBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1ha2VzIHRoZSBgdHhfa2V5X2FkZGAgYW5kIGB0eF9rZXlfZGVsYCBkcml2ZXIgY2FsbGJhY2tzIG9wdGlvbmFsIGZvciBQU1AgZGV2aWNlcyB3aXRob3V0IFNBREIgc3VwcG9ydCwgcmVmYWN0b3JpbmcgVHgga2V5IGFzc29jaWF0aW9uIG1hbmFnZW1lbnQgYW5kIHJlbW92aW5nIHVudXNlZCBrZXkgaGFuZGxpbmcgaG9va3MgZnJvbSBuZXRkZXZzaW0uIEFsbCBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRpbnVlIHRvIGJlIGZ1bGx5IHplcm8taW5pdGlhbGl6ZWQgdmlhIGBremFsbG9jX2ZsZXhgLCBga3phbGxvY19vYmpgLCBvciBga21lbWR1cGAuIFRoZSBjaGFuZ2VzIGRvIG5vdCBpbnRyb2R1Y2Ugb3IgZXhwb3NlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LCBpbmZvLWxlYWtzLCBvciByZWFkcyBvZiB1bmluaXRpYWxpemVkIHN0cnVjdCBmaWVsZHMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggcG9pbnRlciBjaGVja3MsIGxpc3QgbWFuaXB1bGF0aW9uLCBvciBsaWZlY3ljbGUgaGFuZGxpbmcgZmFsbCBzdHJpY3RseSB1bmRlciB0aGUgZG9tYWluIG9mIEtBU0FOIGFuZCBMT0NLREVQLiBUaGVyZWZvcmUsIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[1] Phase: Succeeded StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 10:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 10:53:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2] Phase: Succeeded StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 10:53:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-05 10:53:08 +0000 UTC FinishedAt: 2026-09-05 10:53:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-955703681/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-05 10:53:19 +0000 UTC FinishedAt: 2026-09-05 11:10:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-05 10:53:19 +0000 UTC FinishedAt: 2026-09-05 11:10:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4f97dd14-708b-4a38-bdfe-7a89de074089,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-955703681/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "aff17a15-6ddc-4e14-bdce-60d1474b792d", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-2941140655/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-05 10:53:19 +0000 UTC FinishedAt: 2026-09-05 11:09:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4f97dd14-708b-4a38-bdfe-7a89de074089,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-955703681/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "aff17a15-6ddc-4e14-bdce-60d1474b792d", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-2941140655/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-05 11:10:04 +0000 UTC FinishedAt: 2026-09-05 11:10:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-05 11:10:04 +0000 UTC FinishedAt: 2026-09-05 11:10:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-05 11:10:04 +0000 UTC FinishedAt: 2026-09-05 11:10:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-05 11:10:04 +0000 UTC FinishedAt: 2026-09-05 11:10:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-3381770836/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-05 11:10:15 +0000 UTC FinishedAt: 2026-09-05 11:12:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-05 11:10:15 +0000 UTC FinishedAt: 2026-09-05 11:12:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*aff17a15-6ddc-4e14-bdce-60d1474b792d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-2941140655/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-05 11:12:16 +0000 UTC FinishedAt: 2026-09-05 11:12:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-05 11:12:16 +0000 UTC FinishedAt: 2026-09-05 11:12:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-05 11:12:16 +0000 UTC FinishedAt: 2026-09-05 11:29:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-05 11:12:16 +0000 UTC FinishedAt: 2026-09-05 11:29:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4f97dd14-708b-4a38-bdfe-7a89de074089,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-3381770836/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "26cb7162-ba75-4266-b451-bf5a6674578a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-3005885984/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-05 11:12:16 +0000 UTC FinishedAt: 2026-09-05 11:29:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*4f97dd14-708b-4a38-bdfe-7a89de074089,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-3381770836/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "26cb7162-ba75-4266-b451-bf5a6674578a", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-3005885984/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-05 11:29:15 +0000 UTC FinishedAt: 2026-09-05 11:29:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-05 11:29:15 +0000 UTC FinishedAt: 2026-09-05 11:29:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-05 11:29:15 +0000 UTC FinishedAt: 2026-09-05 11:31:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-05 11:29:15 +0000 UTC FinishedAt: 2026-09-05 11:31:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*26cb7162-ba75-4266-b451-bf5a6674578a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-3005885984/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*aff17a15-6ddc-4e14-bdce-60d1474b792d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*26cb7162-ba75-4266-b451-bf5a6674578a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-2941140655/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-3005885984/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 11:31:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 11:31:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-3201906557/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 11:31:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 11:31:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-05 11:31:18 +0000 UTC FinishedAt: 2026-09-05 11:31:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-05 11:31:28 +0000 UTC FinishedAt: 2026-09-05 14:32:47 +0000 UTC Input: nil Output: nil --------- Name: series-workflowb8vth[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["psp_sock_assoc_set_tx","psp_sock_set_tx_key","psp_dev_tx_key_add","psp_dev_tx_key_del","psp_assoc_free","psp_dev_create","psp_dev_unregister","nsim_do_psp"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"6ebcf5074cff0402730c6981d2397139fee6322d","config_name":"upstream-apparmor-kasan.config","enable_configs":["INET_PSP","NETDEVSIM"],"series_id":"f905573f-bb57-4da1-91d6-b3b9c14d31c5","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-05 11:31:28 +0000 UTC FinishedAt: 2026-09-05 14:32:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*aff17a15-6ddc-4e14-bdce-60d1474b792d,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*26cb7162-ba75-4266-b451-bf5a6674578a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-2941140655/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-build-action-3005885984/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowb8vth/series-workflowb8vth-convert-artifact-3201906557/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}