Name: series-workflowbm9wk Phase: Running StartedAt: 2026-08-24 17:55:39 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[0] Phase: Succeeded StartedAt: 2026-08-24 17:55:39 +0000 UTC FinishedAt: 2026-08-24 18:09:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[0].run-triage Phase: Succeeded StartedAt: 2026-08-24 17:55:39 +0000 UTC FinishedAt: 2026-08-24 18:09:08 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "5870ce43c013ad564b3b83bae330b160e056df67", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "5870ce43c013ad564b3b83bae330b160e056df67", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP" ], "series_id": "ba203764-1732-4433-a3f5-fd29cd3ea50b" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "coredump_close_files", "coredump_task_close_files", "vfs_coredump" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE3OjU3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvcmVkdW1wX2Nsb3NlX2ZpbGVzJiMzNDssCiAgICAmIzM0O2NvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBmZWF0dXJlIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMgYmVmb3JlIGdlbmVyYXRpbmcgYSBjb3JlZHVtcCAoQ09SRURVTVBfQ0xPU0VfRklMRVMpLiBJdCBtb2RpZmllcyBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuYWdlbWVudCwgYWRkcyBhIG5ldyBlbXB0eSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgYWxsb2NhdGlvbiAod2hpY2ggaXMgZXhwbGljaXRseSB6ZXJvZWQgdXNpbmcgX19HRlBfWkVSTyksIGFuZCBhbHRlcnMgdGhlIGNvcmVkdW1wIHN5bmNocm9uaXphdGlvbiBsb2dpYy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIGNvbXBsZXggc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvaW50ZXIgc3dpdGNoaW5nLCByZWZlcmVuY2UgY291bnRpbmcsIGFuZCBmaWxlIGNsb3NpbmcsIHdoaWNoIG1pZ2h0IHJpc2sgdXNlLWFmdGVyLWZyZWUsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgaXNzdWVzLiBUaGVzZSB0eXBlcyBvZiBidWdzIGFyZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFdoZW4gYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXF1ZXN0cyB0aGlzIGZsYWcsIHRoZSBrZXJuZWwgY2xvc2VzIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlZHVtcC4gVGhpcyBpbnZvbHZlcyBuZXcgY29yZSBrZXJuZWwgbG9naWMgaW4gYGZzL2ZpbGUuY2AgYW5kIGBmcy9jb3JlZHVtcC5jYCB0byBoYW5kbGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIHN3aXRjaGluZyBhbmQgY2xvc2luZy4gVGhlIGZlYXR1cmUgaXMgcmVhY2hhYmxlIGJ5IGNyYXNoaW5nIGEgcHJvY2VzcyBhbmQgaGF2aW5nIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVwbHkgd2l0aCB0aGUgbmV3IGZsYWcsIG1ha2luZyBpdCBmdW5jdGlvbmFsbHkgaW1wYWN0ZnVsIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE3OjU3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMDk1N2QwMDBiNDVlYTQ2OWNmMjM0ZTdjYWQ0YzU3MDUxZWM1NDcxNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDI0IDE3OjU3OjA0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXG5pbmRleCBlYzkzNTllMzgyZWE1Li5hNmU3ZGEwYmMxNmE3IDEwMDY0NFxuLS0tIGEvZnMvY29yZWR1bXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuY1xuQEAgLTUyMyw3ICYjNDM7NTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50O1xuIFx0aW50IGNvcmVfd2FpdGVycyA9IC1FQlVTWTtcbiBcbi1cdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXApO1xuJiM0MztcdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuIFx0Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIudGFzayA9IHRzaztcbiBcdGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQgPSBOVUxMO1xuIFxuQEAgLTUzMSw3ICYjNDM7NTMxLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0aWYgKGNvcmVfd2FpdGVycyBcdTAwM2UgMCkge1xuIFx0XHRzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjtcbiBcbi1cdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXAsXG4mIzQzO1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbiBcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdC8qXG4gXHRcdCAqIFdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBiZWNvbWUgaW5hY3RpdmUsIHNvIHRoYXRcbkBAIC04MzcsNyAmIzQzOzgzNyw4IEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHRcdC5tYXNrXHRcdFx0PSBDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFxuIFx0XHRcdFx0XHQgIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFxuIFx0XHRcdFx0XHQgIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfFxuLVx0XHRcdFx0XHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyxcbiYjNDM7XHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHxcbiYjNDM7XHRcdFx0XHRcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXG4gXHRcdC5zaXplX2Fja1x0XHQ9IHNpemVvZihzdHJ1Y3QgY29yZWR1bXBfYWNrKSxcbiBcdFx0Lm1lbW9yeV90eXBlc1x0XHQ9IGNwcm0tXHUwMDNlbWVtb3J5X3R5cGVzLFxuIFx0XHQubWVtb3J5X3R5cGVzX21hc2tcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcbkBAIC05MDUsNiAmIzQzOzkwNiwxMiBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXHR9XG4gXG4mIzQzO1x0LyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi9cbiYjNDM7XHRpZiAoKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2IChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xuJiM0MztcdFx0Y29yZWR1bXBfc29ja19tYXJrKGNwcm0tXHUwMDNlZmlsZSwgQ09SRURVTVBfTUFSS19DT05GTElDVElORyk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmIChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfTUVNT1JZX1RZUEVTKSB7XG4gXHRcdC8qIFRoZSBtZW1vcnkgdHlwZXMgbmVlZCB0aGUgd2hvbGUgZmllbGQuICovXG4gXHRcdGlmICh1c2l6ZSBcdTAwM2MgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSkge1xuQEAgLTEyMjUsNiAmIzQzOzEyMzIsMTEgQEAgc3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG4gXHRpZiAoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpXG4gXHRcdHJldHVybjtcbiBcbiYjNDM7XHRpZiAoKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFx1MDAyNlx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xuJiM0MztcdFx0Y29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoXCYjMzQ7RmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0LyogZ2V0IHVzIGFuIHVuc2hhcmVkIGRlc2NyaXB0b3IgdGFibGU7IGFsbW9zdCBhbHdheXMgYSBuby1vcCAqL1xuIFx0LyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqL1xuIFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcbmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmNcbmluZGV4IDYyOGNhMDdkYzRiMTcuLjNiOGZjZTZlMzY5NTEgMTAwNjQ0XG4tLS0gYS9mcy9maWxlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuY1xuQEAgLTM3NSwyMSAmIzQzOzM3NSwxNSBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHNhbmVfZmR0YWJsZV9zaXplKHN0cnVjdCBmZHRhYmxlICpmZHQsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY1xuIFx0cmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7XG4gfVxuIFxuLS8qXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbi0gKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcbi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxuLSAqL1xuLXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpXG4mIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqL1xuJiM0MztzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxuIHtcbiBcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4tXHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2Zkcztcbi1cdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xuLVx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xuJiM0MztcdHN0cnVjdCBmZHRhYmxlICpuZXdfZmR0O1xuIFxuLVx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIGdmcCk7XG4gXHRpZiAoIW5ld2YpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRhdG9taWNfc2V0KFx1MDAyNm5ld2YtXHUwMDNlY291bnQsIDEpO1xuIFxuQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvXG4gXHRuZXdfZmR0LVx1MDAzZWZ1bGxfZmRzX2JpdHMgPSBuZXdmLVx1MDAzZWZ1bGxfZmRzX2JpdHNfaW5pdDtcbiBcdG5ld19mZHQtXHUwMDNlZmQgPSBcdTAwMjZuZXdmLVx1MDAzZWZkX2FycmF5WzBdO1xuIFxuJiM0MztcdHJldHVybiBuZXdmO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmFsbG9jX2ZpbGVzX3N0cnVjdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbiYjNDM7XG4mIzQzO1x0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcbiYjNDM7XHRpZiAoIW5ld2YpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0cmN1X2Fzc2lnbl9wb2ludGVyKG5ld2YtXHUwMDNlZmR0LCBcdTAwMjZuZXdmLVx1MDAzZWZkdGFiKTtcbiYjNDM7XHRyZXR1cm4gbmV3ZjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbiYjNDM7ICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4mIzQzOyAqIG9uIGZhaWx1cmUuICBGb3IgJiMzOTtwdW5jaF9ob2xlJiMzOTsgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcbiYjNDM7XHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4mIzQzO1xuJiM0MztcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIW5ld2YpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XHRuZXdfZmR0ID0gXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYjtcbiYjNDM7XG4gXHRzcGluX2xvY2soXHUwMDI2b2xkZi1cdTAwM2VmaWxlX2xvY2spO1xuIFx0b2xkX2ZkdCA9IGZpbGVzX2ZkdGFibGUob2xkZik7XG4gXHRvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7XG5AQCAtNDgwLDYgJiM0Mzs1MDcsMTEgQEAgc3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4gXHQgKi9cbiBcdHN0cnVjdCBmZHRhYmxlICpmZHQgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGZpbGVzLVx1MDAzZWZkdCk7XG4gXHR1bnNpZ25lZCBpbnQgaSwgaiA9IDA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIGtlcm5lbCB0aHJlYWQgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8gbWFrZSBwcm9ncmVzcyBvbiBzb21lXG4mIzQzO1x0ICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLlxuJiM0MztcdCAqL1xuJiM0MztcdGJvb2wgc3luYyA9ICEoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfS1RIUkVBRCk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc2V0O1xuQEAgLTQ5MSw3ICYjNDM7NTIzLDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxuIFx0XHRcdGlmIChzZXQgXHUwMDI2IDEpIHtcbiBcdFx0XHRcdHN0cnVjdCBmaWxlICpmaWxlID0gZmR0LVx1MDAzZWZkW2ldO1xuIFx0XHRcdFx0aWYgKGZpbGUpIHtcbi1cdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4mIzQzO1x0XHRcdFx0XHRpZiAoc3luYylcbiYjNDM7XHRcdFx0XHRcdFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcbiYjNDM7XHRcdFx0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4gXHRcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbkBAIC01MTUsMTYgJiM0Mzs1NTAsOTcgQEAgdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqL1xuJiM0MztzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuJiM0MztcdFx0XHRcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkO1xuJiM0MztcbiYjNDM7XHR0YXNrX2xvY2sodHNrKTtcbiYjNDM7XHRvbGQgPSB0c2stXHUwMDNlZmlsZXM7XG4mIzQzO1x0aWYgKG9sZCkge1xuJiM0MztcdFx0aWYgKGZpbGVzKVxuJiM0MztcdFx0XHRhdG9taWNfaW5jKFx1MDAyNmZpbGVzLVx1MDAzZWNvdW50KTtcbiYjNDM7XHRcdHRzay1cdTAwM2VmaWxlcyA9IGZpbGVzO1xuJiM0MztcdH1cbiYjNDM7XHR0YXNrX3VubG9jayh0c2spO1xuJiM0MztcdGlmIChvbGQpXG4mIzQzO1x0XHRwdXRfZmlsZXNfc3RydWN0KG9sZCk7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay1cdTAwM2VmaWxlcztcbiYjNDM7XHRpZiAoIXRzay1cdTAwM2VmaWxlcylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZFxuJiM0MzsgKiB0ZWxsIHRoZW0gdG8gZ2V0IHJpZCBvZiB0aGVpciBmaWxlcy5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbiYjNDM7XHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbiYjNDM7XHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xuJiM0MztcdGludCBuciA9IDA7XG4gXG4tXHRpZiAoZmlsZXMpIHtcbi1cdFx0dGFza19sb2NrKHRzayk7XG4tXHRcdHRzay1cdTAwM2VmaWxlcyA9IE5VTEw7XG4tXHRcdHRhc2tfdW5sb2NrKHRzayk7XG4tXHRcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuJiM0MztcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XG4mIzQzO1x0aWYgKCFmaWxlcylcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogVGFza3Mgd2l0aG91dCBhIHRhYmxlLCB2aG9zdCB3b3JrZXJzIHNheSwgc2l0IHRoZSBzd2l0Y2ggb3V0LiAqL1xuJiM0MztcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuJiM0MztcdFx0aWYgKGN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4mIzQzO1x0XHRcdG5yJiM0MzsmIzQzOztcbiYjNDM7XHRhdG9taWNfc2V0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xuJiM0MztcdHJlaW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4mIzQzO1xuJiM0MztcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KSB7XG4mIzQzO1x0XHRpZiAoIWN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXG4mIzQzO1x0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZjdC1cdTAwM2VmaWxlcywgZmlsZXMpO1xuJiM0MztcdFx0d2FrZV91cF9wcm9jZXNzKGN0LVx1MDAzZXRhc2spO1xuIFx0fVxuJiM0MztcbiYjNDM7XHQvKiBUaGUgZHVtcGVyJiMzOTtzIHN1YmplY3RpdmUgY3JlZHMgYXJlIHRoZSBkdW1wJiMzOTtzLCBub3QgaXRzIG93bi4gKi9cbiYjNDM7XHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuJiM0MztcdFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChucikge1xuJiM0MztcdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUsXG4mIzQzO1x0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbiYjNDM7XHRcdC8qIEJhY2sgYXNsZWVwIGJlZm9yZSB0aGUgbm90ZXMgcmVhZCB0aGVpciByZWdpc3RlcnMuICovXG4mIzQzO1x0XHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtXHUwMDNlbmV4dClcbiYjNDM7XHRcdFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVx1MDAzZXRhc2ssIFRBU0tfQU5ZKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBHZXQgcmlkIG9mIHRoZSBmaWxlcyBhbmQgc3dpdGNoIHRvIHRoZSBlbXB0eSBmaWxlIGRlc2NyaXB0b3IgdGFibGVcbiYjNDM7ICogdGhlIGR1bXBpbmcgdGhyZWFkIHB1Ymxpc2hlZCBpbiB0aGlzIHRocmVhZCYjMzk7cyBjb3JlX3RocmVhZCBlbnRyeS5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZTtcbiYjNDM7XHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbiYjNDM7XG4mIzQzO1x0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xuJiM0MztcdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbiYjNDM7XHRpZiAoIWZpbGVzIHx8ICFjdXJyZW50LVx1MDAzZWZpbGVzIHx8IGN1cnJlbnQtXHUwMDNlZmlsZXMgPT0gZmlsZXMpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbiYjNDM7XHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcbiYjNDM7XHRjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbiYjNDM7XHRpZiAoYXRvbWljX2RlY19hbmRfdGVzdChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMpKVxuJiM0MztcdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xuZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuY1xuaW5kZXggYzY4YjhjMGE0MDk3YS4uM2M3MDU5MTc2NDZiNSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jXG5AQCAtMTMsNiAmIzQzOzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Rub3RpZnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcmVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudHBvbGwuaFx1MDAzZVxuQEAgLTYwNiwxNSAmIzQzOzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuIEVYUE9SVF9TWU1CT0woX19mcHV0X3N5bmMpO1xuIFxuIC8qXG4tICogRXF1aXZhbGVudCB0byBfX2ZwdXRfc3luYygpLCBidXQgb3B0aW1pemVkIGZvciBiZWluZyBjYWxsZWQgd2l0aCB0aGUgbGFzdFxuLSAqIHJlZmVyZW5jZS5cbi0gKlxuLSAqIFNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbiYjNDM7ICogXCYjMzQ7aWRcJiMzNDsgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbiAgKi9cbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuIHtcbi1cdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbGUtXHUwMDNlZl9yZWYpKSlcbi1cdFx0X19mcHV0KGZpbGUpO1xuJiM0MztcdGludCByZXR2YWwgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcbiYjNDM7XHRcdFx0XCYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcJiMzNDssXG4mIzQzO1x0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbiYjNDM7XHRcdHJldHZhbCA9IGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaChmaWxwLCBpZCk7XG4mIzQzO1xuJiM0MztcdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4mIzQzO1x0XHRkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTtcbiYjNDM7XHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByZXR2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldHZhbDtcbiYjNDM7XG4mIzQzO1x0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4mIzQzO1x0ZnB1dF9jbG9zZShmaWxwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldHZhbDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTGlrZSBmaWxwX2Nsb3NlKCkgYnV0IHdpdGhvdXQgZGVmZXJyaW5nIHRoZSByZWxlYXNlIG9mIHRoZSBsYXN0XG4mIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLlxuJiM0MzsgKi9cbiYjNDM7aW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbiYjNDM7e1xuJiM0MztcdGludCByZXR2YWw7XG4mIzQzO1xuJiM0MztcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuJiM0MztcdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbHAtXHUwMDNlZl9yZWYpKSlcbiYjNDM7XHRcdF9fZnB1dChmaWxwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldHZhbDtcbiB9XG4gXG4gLypcbmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcbi0tLSBhL2ZzL2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ludGVybmFsLmhcbkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpXG4gXHR9XG4gfVxuIFxuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICopO1xuJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTtcbiB2b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4gXG4gLypcbkBAIC0xOTAsNiAmIzQzOzE5MCw3IEBAIHN0cnVjdCBvcGVuX2ZsYWdzIHtcbiBcdGludCBpbnRlbnQ7XG4gXHRpbnQgbG9va3VwX2ZsYWdzO1xuIH07XG4mIzQzO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZG9fZmlsZV9vcGVuKGludCBkZmQsIHN0cnVjdCBmaWxlbmFtZSAqcGF0aG5hbWUsXG4gXHRcdGNvbnN0IHN0cnVjdCBvcGVuX2ZsYWdzICpvcCk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLFxuZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uY1xuaW5kZXggNDA4OTI1ZDdiZDBiNy4uZDAzNjczNmQ1ZDQzNSAxMDA2NDRcbi0tLSBhL2ZzL29wZW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvb3Blbi5jXG5AQCAtMTQ1Myw0MSAmIzQzOzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxuIH1cbiAjZW5kaWZcbiBcbi0vKlxuLSAqIFwmIzM0O2lkXCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGVcbi0gKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbi0gKi9cbi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbCA9IDA7XG4tXG4tXHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcbi1cdFx0XHRcJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwmIzM0Oyxcbi1cdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbi1cdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbi1cbi1cdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4tXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuLVx0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuLVx0fVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbDtcbi1cbi1cdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuLVx0ZnB1dF9jbG9zZShmaWxwKTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4tfVxuLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4tXG4gLypcbiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlXG4gICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJiMzOTt0IHJlbGVhc2VcbkBAIC0xNTAyLDEzICYjNDM7MTQ2NywxMSBAQCBTWVNDQUxMX0RFRklORTEoY2xvc2UsIHVuc2lnbmVkIGludCwgZmQpXG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG4gXG4tXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuLVxuIFx0LypcbiBcdCAqIFdlJiMzOTtyZSByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4gRG9uJiMzOTt0IGJvdGhlclxuIFx0ICogd2l0aCBhbnkgZGVsYXllZCBmcHV0KCkgY2FzZXMuXG4gXHQgKi9cbi1cdGZwdXRfY2xvc2Vfc3luYyhmaWxlKTtcbiYjNDM7XHRyZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7XG4gXG4gXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcbiBcdFx0cmV0dXJuIDA7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZHRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuaW5kZXggYzQ1MzA2YTlmMDA3Mi4uZjBjMTAwM2RhOGNlOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuQEAgLTk5LDExICYjNDM7OTksMTYgQEAgc3RhdGljIGlubGluZSBib29sIGNsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBjb25zdCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxcbiBcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XG4gXG4mIzQzO3N0cnVjdCBjb3JlX3RocmVhZDtcbiYjNDM7XG4gdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcbiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZik7XG4gaW50IHVuc2hhcmVfZmlsZXModm9pZCk7XG4gc3RydWN0IGZkX3JhbmdlIHtcbiBcdHVuc2lnbmVkIGludCBmcm9tLCB0bztcbiB9O1xuJiM0MztcbiBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCBzdHJ1Y3QgZmRfcmFuZ2UgKikgX19sYXRlbnRfZW50cm9weTtcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcbiBpbnQgaXRlcmF0ZV9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHVuc2lnbmVkLFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHtcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkICpuZXh0O1xuJiM0MztcdC8qIFRoZSBlbXB0eSB0YWJsZSB0byBzd2l0Y2ggdG8sIHB1Ymxpc2hlZCBieSB0aGUgZHVtcGluZyB0aHJlYWQuICovXG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4gfTtcbiBcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XG4gXHRhdG9taWNfdCBucl90aHJlYWRzO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkIGR1bXBlcjtcbi1cdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XG4mIzQzO1x0LyogQ29tcGxldGVkIGJ5IHRoZSBsYXN0IHRocmVhZCB0byBwYXJrLCByZXVzZWQgZm9yIHRoZSB0YWJsZSBzd2l0Y2guICovXG4mIzQzO1x0c3RydWN0IGNvbXBsZXRpb24gZG9uZTtcbiB9O1xuIFxuIC8qXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuQEAgLTE5LDYgJiM0MzsxOSw5IEBAXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay1cdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXG4mIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcbiAgKi9cbiBlbnVtIHtcbiBcdENPUkVEVU1QX0tFUk5FTFx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyAwKSxcbkBAIC0yOCw2ICYjNDM7MzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbiYjNDM7XHRDT1JFRFVNUF9DTE9TRV9GSUxFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNyksXG4gfTtcbiBcbiAvKipcbkBAIC0xMzcsNiAmIzQzOzE0MSwxMCBAQCBlbnVtIHtcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbiYjNDM7ICpcbiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXG4mIzQzOyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cbiAgKi9cbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcbiBcdF9fdTMyIHNpemU7XG5kaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmNcbmluZGV4IDJjMGIxYzAyOTIwZjQuLmI2NTE2NzljMTJlOTcgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZXhpdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZXhpdC5jXG5AQCAtMjUsNiAmIzQzOzI1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9hY2N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90c2FjY3Rfa2Vybi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZkdGFibGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZyZWV6ZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L25zcHJveHkuaFx1MDAzZVxuQEAgLTQzMiw2ICYjNDM7NDMzLDcgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0c3RydWN0IGNvcmVfdGhyZWFkIHNlbGY7XG4gXG4gXHRzZWxmLnRhc2sgPSB0c2s7XG4mIzQzO1x0c2VsZi5maWxlcyA9IE5VTEw7XG4gXHRpZiAoc2VsZi50YXNrLVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9TSUdOQUxFRClcbiBcdFx0c2VsZi5uZXh0ID0geGNoZyhcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0LCBcdTAwMjZzZWxmKTtcbiBcdGVsc2VcbkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0ICogdG8gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIuXG4gXHQgKi9cbiBcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4tXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4mIzQzO1x0XHRjb21wbGV0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuIFxuIFx0Zm9yICg7Oykge1xuIFx0XHRzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lETEV8VEFTS19GUkVFWkFCTEUpO1xuIFx0XHRpZiAoIXNlbGYudGFzaykgLyogc2VlIGNvcmVkdW1wX2ZpbmlzaCgpICovXG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xuJiM0MztcdFx0aWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoXHUwMDI2c2VsZikpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFx0XHRzY2hlZHVsZSgpO1xuIFx0fVxuIFx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XG4tLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbkBAIC0xOSw2ICYjNDM7MTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuJiM0MzsgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7XG4gXHRDT1JFRFVNUF9SRUNPUkRTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA0KSxcbiBcdENPUkVEVU1QX1NQQVJTRVx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA1KSxcbiBcdENPUkVEVU1QX01FTU9SWV9UWVBFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNiksXG4mIzQzO1x0Q09SRURVTVBfQ0xPU0VfRklMRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDcpLFxuIH07XG4gXG4gLyoqXG5AQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3RcbiAgKiByYWlzZWQuIENPUkVEVU1QX01FTU9SWV9UWVBFUyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUwgYW5kIGFuIGFjayBvZlxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cbiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXG4gICovXG4gc3RydWN0IGNvcmVkdW1wX2FjayB7XG4gXHRfX3UzMiBzaXplO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbmluZGV4IGRlY2UxYTMxZDU2MWIuLmRjODQ4OWQ0MDYxODQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbkBAIC0zLDcgJiM0MzszLDggQEAgQ0ZMQUdTICYjNDM7PSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuJiM0MztcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuJiM0MztcdFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbiBcbiBpbmNsdWRlIC4uL2xpYi5ta1xuQEAgLTExLDMgJiM0MzsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4mIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdhNDE5MDZiNDY5NTJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuY1xuQEAgLTAsMCAmIzQzOzEsNTkyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvZmlsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjb3JlZHVtcF90ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTE9DS19GSUxFIFwmIzM0Oy90bXAvY29yZWR1bXAubG9ja1wmIzM0O1xuJiM0MztcbiYjNDM7LyogSWRsZSB0aHJlYWRzIHRoZSBtdWx0aS10aHJlYWRlZCBjcmFzaGluZyBjaGlsZCBzcGF3bnMuICovXG4mIzQzOyNkZWZpbmUgTlVNX0NMT1NFX1RIUkVBRFMgNFxuJiM0MztcbiYjNDM7LyogSG93IHRoZSBjcmFzaGluZyBjaGlsZCBsb2NrcyBMT0NLX0ZJTEUuICovXG4mIzQzO2VudW0gbG9ja19raW5kIHtcbiYjNDM7XHRMT0NLX0tJTkRfUE9TSVgsXG4mIzQzO1x0TE9DS19LSU5EX09GRCxcbiYjNDM7XHRMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBXaG8gZWxzZSBoYXMgYSBoYW5kbGUgb24gdGhlIGxvY2sgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlcy4gKi9cbiYjNDM7ZW51bSBsb2NrX3NoYXJlIHtcbiYjNDM7XHRMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0TE9DS19TSEFSRV9EVVAsXHRcdC8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqL1xuJiM0MztcdExPQ0tfU0hBUkVfRk9SSyxcdC8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi9cbiYjNDM7XHRMT0NLX1NIQVJFX0ZJTEVTLFx0LyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHtcbiYjNDM7XHRlbnVtIGxvY2tfa2luZCBraW5kO1xuJiM0MztcdGVudW0gbG9ja19zaGFyZSBzaGFyZTtcbiYjNDM7XHRib29sIHRocmVhZHM7XG4mIzQzO1x0Ym9vbCBjbG9zZTtcdFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cbiYjNDM7XHRib29sIHVzZXJzcGFjZTtcdFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXG4mIzQzO1x0Ym9vbCByZWxlYXNlZDtcdFx0LyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXG4mIzQzO3tcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbiYjNDM7XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4mIzQzO1x0ZmlsZSA9IGZvcGVuKFwmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4mIzQzO1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbiYjNDM7XHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQsIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhMT0NLX0ZJTEUpO1xuJiM0MztcdHVubGluayhcJiMzNDsvdG1wL2NvcmVkdW1wLnNvY2tldFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZpbGUgPSBmb3BlbihcJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwmIzM0OywgXCYjMzQ7d1wmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmaWxlKSB7XG4mIzQzO1x0XHRyZWFzb24gPSBcJiMzNDtVbmFibGUgdG8gb3BlbiBjb3JlX3BhdHRlcm5cJiMzNDs7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBmcHJpbnRmKGZpbGUsIFwmIzM0OyVzXCYjMzQ7LCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMCkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwmIzM0OztcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRyZWFzb24gPSBcJiMzNDtVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXCYjMzQ7O1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRyZXQgPSBjbG9zZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIGNsb3NlIGRldGFjaGVkIHRtcGZzXCYjMzQ7O1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm47XG4mIzQzO2ZhaWw6XG4mIzQzO1x0LyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovXG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxuXCYjMzQ7LCByZWFzb24pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBXcml0ZS1sb2NrIEBmZCB0aGUgd2F5IEBraW5kIHNheXMuICovXG4mIzQzO3N0YXRpYyBpbnQgdGFrZV9sb2NrKGludCBmZCwgZW51bSBsb2NrX2tpbmQga2luZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBmbG9jayBmbCA9IHtcbiYjNDM7XHRcdC5sX3R5cGUgPSBGX1dSTENLLFxuJiM0MztcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChraW5kKSB7XG4mIzQzO1x0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XG4mIzQzO1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssIFx1MDAyNmZsKTtcbiYjNDM7XHRjYXNlIExPQ0tfS0lORF9PRkQ6XG4mIzQzO1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcdTAwMjZmbCk7XG4mIzQzO1x0Y2FzZSBMT0NLX0tJTkRfRkxPQ0s6XG4mIzQzO1x0XHRyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xuJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZmxvY2sgZmwgPSB7XG4mIzQzO1x0XHQubF90eXBlID0gRl9XUkxDSyxcbiYjNDM7XHRcdC5sX3doZW5jZSA9IFNFRUtfU0VULFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChraW5kID09IExPQ0tfS0lORF9GTE9DSykge1xuJiM0MztcdFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xuJiM0MztcdFx0XHRmbG9jayhmZCwgTE9DS19VTik7XG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIGVycm5vID09IEVXT1VMREJMT0NLID8gMSA6IC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXG4mIzQzO1x0aWYgKGZjbnRsKGZkLCBGX0dFVExLLCBcdTAwMjZmbCkgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfZmRzKHBpZF90IHBpZCwgaW50ICpmaXJzdClcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFs2NF07XG4mIzQzO1x0c3RydWN0IGRpcmVudCAqZGU7XG4mIzQzO1x0RElSICpkaXI7XG4mIzQzO1x0aW50IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDsvcHJvYy8lZC9mZFwmIzM0OywgcGlkKTtcbiYjNDM7XHRkaXIgPSBvcGVuZGlyKHBhdGgpO1xuJiM0MztcdGlmICghZGlyKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHQqZmlyc3QgPSAtMTtcbiYjNDM7XHR3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSkge1xuJiM0MztcdFx0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRcdGlmIChkZS1cdTAwM2VkX25hbWVbMF0gPT0gJiMzOTsuJiMzOTspXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0ZmQgPSBhdG9pKGRlLVx1MDAzZWRfbmFtZSk7XG4mIzQzO1x0XHRpZiAoKmZpcnN0IFx1MDAzYyAwIHx8IGZkIFx1MDAzYyAqZmlyc3QpXG4mIzQzO1x0XHRcdCpmaXJzdCA9IGZkO1xuJiM0MztcdFx0bnImIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZWRpcihkaXIpO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQmxvY2sgdW50aWwgdGhlIHRlc3QgaGFuZ3MgdXAgQGZkX3JlbGVhc2UsIGtlZXBpbmcgZXZlcnkgaW5oZXJpdGVkIGZkXG4mIzQzOyAqIG9wZW4sIHRoZW4gcmVwb3J0IHRocm91Z2ggQGZkX3Jlc3VsdCB3aGV0aGVyIEBmZCBpcyBzdGlsbCBvcGVuLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgaG9sZF91bnRpbF9yZWxlYXNlZChpbnQgZmQsIGludCBmZF9yZWxlYXNlLCBpbnQgZmRfcmVzdWx0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjO1xuJiM0MztcbiYjNDM7XHRyZWFkX25vaW50cihmZF9yZWxlYXNlLCBcdTAwMjZjLCAxKTtcbiYjNDM7XHRjID0gZmNudGwoZmQsIEZfR0VURkQpIFx1MDAzYyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OztcbiYjNDM7XHR3cml0ZV9ub2ludHIoZmRfcmVzdWx0LCBcdTAwMjZjLCAxKTtcbiYjNDM7XHRfZXhpdChFWElUX1NVQ0NFU1MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBMb2NrIExPQ0tfRklMRSwgc2hhcmUgaXQgYXMgcmVxdWVzdGVkLCB0aGVuIGNyYXNoLiAqL1xuJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxuJiM0MztcdFx0XHRcdCAgaW50IGZkX3Jlc3VsdClcbiYjNDM7e1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWQ7XG4mIzQzO1x0aW50IGZkLCBwaWRmZCwgaTtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHRha2VfbG9jayhmZCwgdC1cdTAwM2VraW5kKSlcbiYjNDM7XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodC1cdTAwM2VzaGFyZSkge1xuJiM0MztcdGNhc2UgTE9DS19TSEFSRV9OT05FOlxuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0RVUDpcbiYjNDM7XHRcdGlmIChkdXAoZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0ZPUks6XG4mIzQzO1x0XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKVxuJiM0MztcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0ZJTEVTOlxuJiM0MztcdFx0cGlkID0gY3JlYXRlX2NoaWxkKFx1MDAyNnBpZGZkLCBDTE9ORV9GSUxFUyk7XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKVxuJiM0MztcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAodC1cdTAwM2V0aHJlYWRzKVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlVNX0NMT1NFX1RIUkVBRFM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpO1xuJiM0MztcbiYjNDM7XHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4mIzQzO1x0Kih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZVxuJiM0MzsgKiBsb2NrIGlzIGhlbGQgYW5kIHRoZSBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuIE9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZVxuJiM0MzsgKiBwb2ludCB3aGVyZSBpdCBjbG9zZXMgdGhlbSwgd2hpY2ggaXMgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkdW1wXG4mIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvclxuJiM0MzsgKiBpdCBhbmQgdGhlIGxvY2sgaXMgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9O1xuJiM0MztcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX3BlZXJfcGlkZmQgPSAtMSwgZmRfbG9jayA9IC0xO1xuJiM0MztcdGludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7XG4mIzQzO1x0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xuJiM0MztcdF9fdTY0IG1hc2s7XG4mIzQzO1x0c3NpemVfdCBieXRlcztcbiYjNDM7XHRjaGFyIGM7XG4mIzQzO1xuJiM0MztcdGZkX2xvY2sgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoZmRfbG9jayBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBvcGVuIGxvY2sgZmlsZSBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KFwmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZmRfc2VydmVyIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX25vaW50cihmZF9pcGMsIFwmIzM0OzFcJiMzNDssIDEpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZF9pcGMpO1xuJiM0MztcbiYjNDM7XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBhY2NlcHQ0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTtcbiYjNDM7XHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgXHUwMDI2cmVxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXHUwMDI2cmVxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBjaGVja19jb3JlZHVtcF9yZXEgZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi9cbiYjNDM7XHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXHUwMDNla2luZCkgIT0gMSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBsb2NrIG5vdCBoZWxkIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuJiM0MztcdGlmIChucl9mZHMgXHUwMDNjPSAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxcblwmIzM0OywgX19mdW5jX18pO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0bWFzayA9IENPUkVEVU1QX1dBSVQ7XG4mIzQzO1x0bWFzayB8PSB0LVx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcbiYjNDM7XHRpZiAodC1cdTAwM2VjbG9zZSlcbiYjNDM7XHRcdG1hc2sgfD0gQ09SRURVTVBfQ0xPU0VfRklMRVM7XG4mIzQzO1xuJiM0MztcdGlmICghc2VuZF9jb3JlZHVtcF9hY2soZmRfY29yZWR1bXAsIFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghcmVhZF9tYXJrZXIoZmRfY29yZWR1bXAsIENPUkVEVU1QX01BUktfUkVRQUNLKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgXHUwMDI2YywgMSk7XG4mIzQzO1x0aWYgKGJ5dGVzICE9ICh0LVx1MDAzZXVzZXJzcGFjZSA/IDAgOiAxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkIGFmdGVyIHRoZSBhY2sgcmV0dXJuZWQgJXpkOiAlbVxcblwmIzM0OywgX19mdW5jX18sIGJ5dGVzKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVx1MDAzZWtpbmQpICE9ICF0LVx1MDAzZXJlbGVhc2VkKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IGxvY2sgJXMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0X19mdW5jX18sIHQtXHUwMDNlcmVsZWFzZWQgPyBcJiMzNDtzdGlsbCBoZWxkXCYjMzQ7IDogXCYjMzQ7cmVsZWFzZWRcJiMzNDspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsIFx1MDAyNmZpcnN0X2ZkKTtcbiYjNDM7XHRpZiAobnJfZmRzIFx1MDAzYyAwIHx8ICFucl9mZHMgIT0gdC1cdTAwM2VjbG9zZSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiAlZCBkZXNjcmlwdG9ycyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRfX2Z1bmNfXywgbnJfZmRzKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApO1xuJiM0MztcdGlmICh0LVx1MDAzZWNsb3NlKSB7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRfX2Z1bmNfXywgZmQpO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBjb3JlZHVtcCBmYWlsZWQ6ICVtXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdF9fZnVuY19fKTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqL1xuJiM0MztcdGlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgXHUwMDI2aW5mbykpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChpbmZvLm1hc2sgXHUwMDI2IFBJREZEX0lORk9fRVhJVCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiB0YXNrIGV4aXRlZCBiZWZvcmUgdGhlIGNvcmVkdW1wIGZpbmlzaGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoOzspIHtcbiYjNDM7XHRcdGNoYXIgYnVmZmVyWzQwOTZdO1xuJiM0MztcbiYjNDM7XHRcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xuJiM0MztcdFx0aWYgKGJ5dGVzIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcmVhZCBmcm9tIGNvcmVkdW1wIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChieXRlcyA9PSAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChmZF9sb2NrIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkX2xvY2spO1xuJiM0MztcdGlmIChmZF9wZWVyX3BpZGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkX3BlZXJfcGlkZmQpO1xuJiM0MztcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZF9jb3JlZHVtcCk7XG4mIzQzO1x0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZF9zZXJ2ZXIpO1xuJiM0MztcdHJldHVybiBleGl0X2NvZGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSxcbiYjNDM7XHRcdFx0ICAgRklYVFVSRV9EQVRBKGNvcmVkdW1wKSAqc2VsZixcbiYjNDM7XHRcdFx0ICAgY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cywgaXBjX3NvY2tldHNbMl0sIHJlbGVhc2VfcGlwZVsyXSwgcmVzdWx0X3BpcGVbMl07XG4mIzQzO1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcdGNoYXIgYztcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihcJiMzNDtAQC90bXAvY29yZWR1bXAuc29ja2V0XCYjMzQ7KSk7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjQ0KTtcbiYjNDM7XHRBU1NFUlRfR0UoZmQsIDApO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbiYjNDM7XHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XG4mIzQzO1x0aWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuJiM0MztcdFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XG4mIzQzO1x0fVxuJiM0MztcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1sxXSksIDApO1xuJiM0MztcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApO1xuJiM0MztcbiYjNDM7XHQvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqL1xuJiM0MztcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xuJiM0MztcdEFTU0VSVF9FUShwaXBlMihyZXN1bHRfcGlwZSwgT19DTE9FWEVDKSwgMCk7XG4mIzQzO1xuJiM0MztcdHBpZCA9IGZvcmsoKTtcbiYjNDM7XHRBU1NFUlRfR0UocGlkLCAwKTtcbiYjNDM7XHRpZiAocGlkID09IDApIHtcbiYjNDM7XHRcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XG4mIzQzO1x0XHRjbG9zZShyZXN1bHRfcGlwZVswXSk7XG4mIzQzO1x0XHRjcmFzaGluZ19jaGlsZF9sb2NrZWQodCwgcmVsZWFzZV9waXBlWzBdLCByZXN1bHRfcGlwZVsxXSk7XG4mIzQzO1x0fVxuJiM0MztcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMV0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0NPUkVEVU1QKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiYjNDM7XG4mIzQzO1x0LyogTGV0IHRoZSBwcm9jZXNzIGhvbGRpbmcgdGhlIHNoYXJlZCBsb2NrIGdvLiAqL1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xuJiM0MztcdGlmICh0LVx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRk9SSyB8fCB0LVx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHtcbiYjNDM7XHRcdEFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgXHUwMDI2YywgMSksIDEpO1xuJiM0MztcdFx0QVNTRVJUX0VRKGMsICYjMzk7TyYjMzk7KTtcbiYjNDM7XHR9XG4mIzQzO1x0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzBdKSwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXgpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQudGhyZWFkcyA9IHRydWUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9PRkQsXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbiYjNDM7XHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuJiM0MztcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuJiM0MztcdFx0LnRocmVhZHMgPSB0cnVlLFxuJiM0MztcdFx0LmNsb3NlID0gdHJ1ZSxcbiYjNDM7XHRcdC5yZWxlYXNlZCA9IHRydWUsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0RVUCxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbiYjNDM7XHRcdC5raW5kID0gTE9DS19LSU5EX09GRCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRklMRVMsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnVzZXJzcGFjZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfbm90X3JlcXVlc3RlZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbiYjNDM7XHRcdC50aHJlYWRzID0gdHJ1ZSxcbiYjNDM7XHRcdC5jbG9zZSA9IGZhbHNlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbkBAIC0yMzc3LDYgJiM0MzsyMzc3LDEyIEBAIFRFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfbWVtb3J5X3R5cGVzX3dpdGhvdXRfa2VybmVsKVxuIFx0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTtcbiB9XG4gXG4mIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovXG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfQ0xPU0VfRklMRVMpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcbiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTE2MTIsNyAmIzQzOzE2MTIsOCBAQCBib29sIHNlbmRfY29yZWR1bXBfYWNrKGludCBmZCwgY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxLFxuICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTExcdFx0XHRcdFx0XFxcbiBcdChDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFx0XHRcdFxcXG4gXHQgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XHRcdFx0XFxcbi1cdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKVxuJiM0MztcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcbiYjNDM7XHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXG4gXG4gYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxNzo1NzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xMW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7Y29yZWR1bXBfdGFza19jbG9zZV9maWxlcyYjMzQ7LAogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGVjOTM1OWUzODJlYTUuLmE2ZTdkYTBiYzE2YTcgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtNTIzLDcgJiM0Mzs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7CiAKLQlpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtzdGFydHVwKTsKJiM0MzsJaW5pdF9jb21wbGV0aW9uKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSk7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLnRhc2sgPSB0c2s7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLm5leHQgPSBOVUxMOwogCkBAIC01MzEsNyAmIzQzOzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSkKIAlpZiAoY29yZV93YWl0ZXJzICZndDsgMCkgewogCQlzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7c3RhcnR1cCwKJiM0MzsJCXdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lLAogCQkJCQkgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTsKIAkJLyoKIAkJICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdApAQCAtODM3LDcgJiM0Mzs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKgogCQkubWFzawkJCT0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwKIAkJCQkJICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHwKIAkJCQkJICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwKLQkJCQkJICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsCiYjNDM7CQkJCQkgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8CiYjNDM7CQkJCQkgIENPUkVEVU1QX0NMT1NFX0ZJTEVTLAogCQkuc2l6ZV9hY2sJCT0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLAogCQkubWVtb3J5X3R5cGVzCQk9IGNwcm0tJmd0O21lbW9yeV90eXBlcywKIAkJLm1lbW9yeV90eXBlc19tYXNrCT0gQ09SRURVTVBfTUVNT1JZX0FMTCwKQEAgLTkwNSw2ICYjNDM7OTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKJiM0MzsJLyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi8KJiM0MzsJaWYgKChhY2subWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAoYWNrLm1hc2sgJmFtcDsgQ09SRURVTVBfUkVKRUNUKSkgewomIzQzOwkJY29yZWR1bXBfc29ja19tYXJrKGNwcm0tJmd0O2ZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiAJaWYgKGFjay5tYXNrICZhbXA7IENPUkVEVU1QX01FTU9SWV9UWVBFUykgewogCQkvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqLwogCQlpZiAodXNpemUgJmx0OyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7CkBAIC0xMjI1LDYgJiM0MzsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLAogCWlmIChjcHJtLSZndDttYXNrICZhbXA7IENPUkVEVU1QX1JFSkVDVCkKIAkJcmV0dXJuOwogCiYjNDM7CWlmICgoY3BybS0mZ3Q7bWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkgewomIzQzOwkJY29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoJiMzNDtGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmUmIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAkvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovCiAJLyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqLwogCWlmICh1bnNoYXJlX2ZpbGVzKCkpCmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuYwpAQCAtMzc1LDIxICYjNDM7Mzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jCiAJcmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpbgotICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpCi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgotICovCi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKQomIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjsKLQlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKLQl1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTsKLQlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpuZXdfZmR0OwogCi0JbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKJiM0MzsJbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApOwogCWlmICghbmV3ZikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKIAogCWF0b21pY19zZXQoJmFtcDtuZXdmLSZndDtjb3VudCwgMSk7CiAKQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvCiAJbmV3X2ZkdC0mZ3Q7ZnVsbF9mZHNfYml0cyA9IG5ld2YtJmd0O2Z1bGxfZmRzX2JpdHNfaW5pdDsKIAluZXdfZmR0LSZndDtmZCA9ICZhbXA7bmV3Zi0mZ3Q7ZmRfYXJyYXlbMF07CiAKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiYjNDM7CiYjNDM7CW5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CiYjNDM7CWlmICghbmV3ZikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0mZ3Q7ZmR0LCAmYW1wO25ld2YtJmd0O2ZkdGFiKTsKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW4KJiM0MzsgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKJiM0MzsgKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgomIzQzOyAqLwomIzQzO3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOwomIzQzOwlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKJiM0MzsJdW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDsKJiM0MzsKJiM0MzsJbmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5ld2YpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsJbmV3X2ZkdCA9ICZhbXA7bmV3Zi0mZ3Q7ZmR0YWI7CiYjNDM7CiAJc3Bpbl9sb2NrKCZhbXA7b2xkZi0mZ3Q7ZmlsZV9sb2NrKTsKIAlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAlvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7CkBAIC00ODAsNiAmIzQzOzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkgKi8KIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy0mZ3Q7ZmR0KTsKIAl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CiYjNDM7CS8qCiYjNDM7CSAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWUKJiM0MzsJICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLgomIzQzOwkgKi8KJiM0MzsJYm9vbCBzeW5jID0gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKTsKIAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyBzZXQ7CkBAIC00OTEsNyAmIzQzOzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkJCWlmIChzZXQgJmFtcDsgMSkgewogCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmR0LSZndDtmZFtpXTsKIAkJCQlpZiAoZmlsZSkgewotCQkJCQlmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTsKJiM0MzsJCQkJCWlmIChzeW5jKQomIzQzOwkJCQkJCWZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7CiYjNDM7CQkJCQllbHNlCiYjNDM7CQkJCQkJZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7CiAJCQkJCWNvbmRfcmVzY2hlZCgpOwogCQkJCX0KIAkJCX0KQEAgLTUxNSwxNiAmIzQzOzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpCiAJfQogfQogCiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqLwomIzQzO3N0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiYjNDM7CQkJCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodHNrKTsKJiM0MzsJb2xkID0gdHNrLSZndDtmaWxlczsKJiM0MzsJaWYgKG9sZCkgewomIzQzOwkJaWYgKGZpbGVzKQomIzQzOwkJCWF0b21pY19pbmMoJmFtcDtmaWxlcy0mZ3Q7Y291bnQpOwomIzQzOwkJdHNrLSZndDtmaWxlcyA9IGZpbGVzOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRzayk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlwdXRfZmlsZXNfc3RydWN0KG9sZCk7CiYjNDM7fQomIzQzOwogdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay0mZ3Q7ZmlsZXM7CiYjNDM7CWlmICghdHNrLSZndDtmaWxlcykKJiM0MzsJCXJldHVybjsKJiM0MzsJc3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZAomIzQzOyAqIHRlbGwgdGhlbSB0byBnZXQgcmlkIG9mIHRoZWlyIGZpbGVzLgomIzQzOyAqLwomIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsJc3RydWN0IGNvcmVfdGhyZWFkICpjdDsKJiM0MzsJaW50IG5yID0gMDsKIAotCWlmIChmaWxlcykgewotCQl0YXNrX2xvY2sodHNrKTsKLQkJdHNrLSZndDtmaWxlcyA9IE5VTEw7Ci0JCXRhc2tfdW5sb2NrKHRzayk7Ci0JCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwomIzQzOwlmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpOwomIzQzOwlpZiAoIWZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUYXNrcyB3aXRob3V0IGEgdGFibGUsIHZob3N0IHdvcmtlcnMgc2F5LCBzaXQgdGhlIHN3aXRjaCBvdXQuICovCiYjNDM7CWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQlpZiAoY3QtJmd0O3Rhc2stJmd0O2ZpbGVzKQomIzQzOwkJCW5yJiM0MzsmIzQzOzsKJiM0MzsJYXRvbWljX3NldCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMsIG5yKTsKJiM0MzsJcmVpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsKJiM0MzsJZm9yIChjdCA9IGNvcmVfc3RhdGUtJmd0O2R1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC0mZ3Q7bmV4dCkgewomIzQzOwkJaWYgKCFjdC0mZ3Q7dGFzay0mZ3Q7ZmlsZXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQkvKiBQYWlycyB3aXRoIHRoZSBhY3F1aXJlIGluIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoKS4gKi8KJiM0MzsJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7Y3QtJmd0O2ZpbGVzLCBmaWxlcyk7CiYjNDM7CQl3YWtlX3VwX3Byb2Nlc3MoY3QtJmd0O3Rhc2spOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGR1bXBlciYjMzk7cyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCYjMzk7cywgbm90IGl0cyBvd24uICovCiYjNDM7CXNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpCiYjNDM7CQlzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTsKJiM0MzsKJiM0MzsJaWYgKG5yKSB7CiYjNDM7CQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSwKJiM0MzsJCQkJCSAgVEFTS19VTklOVEVSUlVQVElCTEV8VEFTS19GUkVFWkFCTEUpOwomIzQzOwkJLyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi8KJiM0MzsJCWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQkJd2FpdF90YXNrX2luYWN0aXZlKGN0LSZndDt0YXNrLCBUQVNLX0FOWSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZQomIzQzOyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQmIzM5O3MgY29yZV90aHJlYWQgZW50cnkuCiYjNDM7ICovCiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsKJiM0MzsJLyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqLwomIzQzOwlmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoJmFtcDtzZWxmLSZndDtmaWxlcyk7CiYjNDM7CWlmICghZmlsZXMgfHwgIWN1cnJlbnQtJmd0O2ZpbGVzIHx8IGN1cnJlbnQtJmd0O2ZpbGVzID09IGZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiYjNDM7CXN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpOwomIzQzOwljb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsJcmV0dXJuIHRydWU7CiB9CiAKIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZWxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZG5vdGlmeS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50cG9sbC5oJmd0OwpAQCAtNjA2LDE1ICYjNDM7NjA3LDUzIEBAIHZvaWQgX19mcHV0X3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTsKIAogLyoKLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3QKLSAqIHJlZmVyZW5jZS4KLSAqCi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuCiYjNDM7ICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi4KICAqLwotdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQogewotCWlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKCZhbXA7ZmlsZS0mZ3Q7Zl9yZWYpKSkKLQkJX19mcHV0KGZpbGUpOwomIzQzOwlpbnQgcmV0dmFsID0gMDsKJiM0MzsKJiM0MzsJaWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsCiYjNDM7CQkJJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKSYjMzQ7LAomIzQzOwkJCWZpbHAtJmd0O2Zfb3ApKSB7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2gpCiYjNDM7CQlyZXR2YWwgPSBmaWxwLSZndDtmX29wLSZndDtmbHVzaChmaWxwLCBpZCk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkoIShmaWxwLSZndDtmX21vZGUgJmFtcDsgRk1PREVfUEFUSCkpKSB7CiYjNDM7CQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJZnB1dF9jbG9zZShmaWxwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdAomIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLgomIzQzOyAqLwomIzQzO2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJaWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoJmFtcDtmaWxwLSZndDtmX3JlZikpKQomIzQzOwkJX19mcHV0KGZpbHApOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiAJfQogfQogCi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTsKJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTsKIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTsKIAogLyoKQEAgLTE5MCw2ICYjNDM7MTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3MgewogCWludCBpbnRlbnQ7CiAJaW50IGxvb2t1cF9mbGFnczsKIH07CiYjNDM7CiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLAogCQljb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9vcGVuLmMKQEAgLTE0NTMsNDEgJiM0MzsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSkKIH0KICNlbmRpZgogCi0vKgotICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLgotICovCi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCwKLQkJCSYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcykmIzM0OywKLQkJCWZpbHAtJmd0O2Zfb3ApKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChmaWxwLSZndDtmX29wLSZndDtmbHVzaCkKLQkJcmV0dmFsID0gZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2goZmlscCwgaWQpOwotCi0JaWYgKGxpa2VseSghKGZpbHAtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9QQVRIKSkpIHsKLQkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7Ci0JCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKLQlmcHV0X2Nsb3NlKGZpbHApOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7Ci0KIC8qCiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlCiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4mIzM5O3QgcmVsZWFzZQpAQCAtMTUwMiwxMyAmIzQzOzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKQogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAotCXJldHZhbCA9IGZpbHBfZmx1c2goZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpOwotCiAJLyoKIAkgKiBXZSYjMzk7cmUgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuIERvbiYjMzk7dCBib3RoZXIKIAkgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy4KIAkgKi8KLQlmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7CiYjNDM7CXJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LSZndDtmaWxlcyk7CiAKIAlpZiAobGlrZWx5KHJldHZhbCA9PSAwKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaCBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCkBAIC05OSwxMSAmIzQzOzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAomIzQzO3N0cnVjdCBjb3JlX3RocmVhZDsKJiM0MzsKIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7CiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTsKIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpOwogc3RydWN0IGZkX3JhbmdlIHsKIAl1bnNpZ25lZCBpbnQgZnJvbSwgdG87CiB9OwomIzQzOwogc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7CiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTsKIGludCBpdGVyYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgdW5zaWduZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHsKIHN0cnVjdCBjb3JlX3RocmVhZCB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDsKJiM0MzsJLyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi8KJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CiB9OwogCiBzdHJ1Y3QgY29yZV9zdGF0ZSB7CiAJYXRvbWljX3QgbnJfdGhyZWFkczsKIAlzdHJ1Y3QgY29yZV90aHJlYWQgZHVtcGVyOwotCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7CiYjNDM7CS8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqLwomIzQzOwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTE5LDYgJiM0MzsxOSw5IEBACiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stJmd0O21lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTAomIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUCiAgKi8KIGVudW0gewogCUNPUkVEVU1QX0tFUk5FTAkJPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKQEAgLTI4LDYgJiM0MzszMSw3IEBAIGVudW0gewogCUNPUkVEVU1QX1JFQ09SRFMJPSAoMVVMTCAmbHQ7Jmx0OyA0KSwKIAlDT1JFRFVNUF9TUEFSU0UJCT0gKDFVTEwgJmx0OyZsdDsgNSksCiAJQ09SRURVTVBfTUVNT1JZX1RZUEVTCT0gKDFVTEwgJmx0OyZsdDsgNiksCiYjNDM7CUNPUkVEVU1QX0NMT1NFX0ZJTEVTCT0gKDFVTEwgJmx0OyZsdDsgNyksCiB9OwogCiAvKioKQEAgLTEzNyw2ICYjNDM7MTQxLDEwIEBAIGVudW0gewogICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3QKICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mCiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLgomIzQzOyAqCiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlCiYjNDM7ICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuCiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuCiAgKi8KIHN0cnVjdCBjb3JlZHVtcF9hY2sgewogCV9fdTMyIHNpemU7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9leGl0LmMKQEAgLTI1LDYgJiM0MzsyNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvYWNjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3RzYWNjdF9rZXJuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mZHRhYmxlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpbmZtdHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9uc3Byb3h5LmgmZ3Q7CkBAIC00MzIsNiAmIzQzOzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAlzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjsKIAogCXNlbGYudGFzayA9IHRzazsKJiM0MzsJc2VsZi5maWxlcyA9IE5VTEw7CiAJaWYgKHNlbGYudGFzay0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfU0lHTkFMRUQpCiAJCXNlbGYubmV4dCA9IHhjaGcoJmFtcDtjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dCwgJmFtcDtzZWxmKTsKIAllbHNlCkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCSAqIHRvIGNvcmVfc3RhdGUtJmd0O2R1bXBlci4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQotCQljb21wbGV0ZSgmYW1wO2NvcmVfc3RhdGUtJmd0O3N0YXJ0dXApOwomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKIAogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTsKIAkJaWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqLwogCQkJYnJlYWs7CiYjNDM7CQkvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqLwomIzQzOwkJaWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoJmFtcDtzZWxmKSkKJiM0MzsJCQljb250aW51ZTsKIAkJc2NoZWR1bGUoKTsKIAl9CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAppbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NAotLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaApAQCAtMTksNiAmIzQzOzE5LDkgQEAKICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpbgogICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay0mZ3Q7bWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMCiYjNDM7ICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1QKICAqLwogZW51bSB7CiAJQ09SRURVTVBfS0VSTkVMCQk9ICgxVUxMICZsdDsmbHQ7IDApLApAQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7CiAJQ09SRURVTVBfUkVDT1JEUwk9ICgxVUxMICZsdDsmbHQ7IDQpLAogCUNPUkVEVU1QX1NQQVJTRQkJPSAoMVVMTCAmbHQ7Jmx0OyA1KSwKIAlDT1JFRFVNUF9NRU1PUllfVFlQRVMJPSAoMVVMTCAmbHQ7Jmx0OyA2KSwKJiM0MzsJQ09SRURVTVBfQ0xPU0VfRklMRVMJPSAoMVVMTCAmbHQ7Jmx0OyA3KSwKIH07CiAKIC8qKgpAQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7CiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dAogICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2YKICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuCiYjNDM7ICoKJiM0MzsgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGUKJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC4KJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS4KICAqLwogc3RydWN0IGNvcmVkdW1wX2FjayB7CiAJX191MzIgc2l6ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKQEAgLTMsNyAmIzQzOzMsOCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0CiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDU5MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2RpcmVudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9maWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTE9DS19GSUxFICYjMzQ7L3RtcC9jb3JlZHVtcC5sb2NrJiMzNDsKJiM0MzsKJiM0MzsvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi8KJiM0MzsjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDQKJiM0MzsKJiM0MzsvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi8KJiM0MztlbnVtIGxvY2tfa2luZCB7CiYjNDM7CUxPQ0tfS0lORF9QT1NJWCwKJiM0MzsJTE9DS19LSU5EX09GRCwKJiM0MzsJTE9DS19LSU5EX0ZMT0NLLAomIzQzO307CiYjNDM7CiYjNDM7LyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovCiYjNDM7ZW51bSBsb2NrX3NoYXJlIHsKJiM0MzsJTE9DS19TSEFSRV9OT05FLAomIzQzOwlMT0NLX1NIQVJFX0RVUCwJCS8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqLwomIzQzOwlMT0NLX1NIQVJFX0ZPUkssCS8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi8KJiM0MzsJTE9DS19TSEFSRV9GSUxFUywJLyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi8KJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHsKJiM0MzsJZW51bSBsb2NrX2tpbmQga2luZDsKJiM0MzsJZW51bSBsb2NrX3NoYXJlIHNoYXJlOwomIzQzOwlib29sIHRocmVhZHM7CiYjNDM7CWJvb2wgY2xvc2U7CQkvKiBhY2sgd2l0aCBDT1JFRFVNUF9DTE9TRV9GSUxFUyAqLwomIzQzOwlib29sIHVzZXJzcGFjZTsJCS8qIENPUkVEVU1QX1VTRVJTUEFDRSBpbnN0ZWFkIG9mIENPUkVEVU1QX0tFUk5FTCAqLwomIzQzOwlib29sIHJlbGVhc2VkOwkJLyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi8KJiM0Mzt9OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7CiYjNDM7CUFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTsKJiM0MzsJQVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybikpOwomIzQzOwomIzQzOwlzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTsKJiM0MzsJQVNTRVJUX0dFKHNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkLCAwKTsKJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlBU1NFUlRfRVEoMCwgcmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTE9DS19GSUxFKTsKJiM0MzsJdW5saW5rKCYjMzQ7L3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi8KJiM0MztzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlzd2l0Y2ggKGtpbmQpIHsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfUE9TSVg6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssICZhbXA7ZmwpOwomIzQzOwljYXNlIExPQ0tfS0lORF9PRkQ6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAmYW1wO2ZsKTsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfRkxPQ0s6CiYjNDM7CQlyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi8KJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHsKJiM0MzsJCWlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHsKJiM0MzsJCQlmbG9jayhmZCwgTE9DS19VTik7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovCiYjNDM7CWlmIChmY250bChmZCwgRl9HRVRMSywgJmFtcDtmbCkgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi8KJiM0MztzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJRElSICpkaXI7CiYjNDM7CWludCBuciA9IDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDsvcHJvYy8lZC9mZCYjMzQ7LCBwaWQpOwomIzQzOwlkaXIgPSBvcGVuZGlyKHBhdGgpOwomIzQzOwlpZiAoIWRpcikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJKmZpcnN0ID0gLTE7CiYjNDM7CXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlpZiAoZGUtJmd0O2RfbmFtZVswXSA9PSAmIzM5Oy4mIzM5OykKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZkID0gYXRvaShkZS0mZ3Q7ZF9uYW1lKTsKJiM0MzsJCWlmICgqZmlyc3QgJmx0OyAwIHx8IGZkICZsdDsgKmZpcnN0KQomIzQzOwkJCSpmaXJzdCA9IGZkOwomIzQzOwkJbnImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGRpcik7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmQKJiM0MzsgKiBvcGVuLCB0aGVuIHJlcG9ydCB0aHJvdWdoIEBmZF9yZXN1bHQgd2hldGhlciBAZmQgaXMgc3RpbGwgb3Blbi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwljaGFyIGM7CiYjNDM7CiYjNDM7CXJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsICZhbXA7YywgMSk7CiYjNDM7CWMgPSBmY250bChmZCwgRl9HRVRGRCkgJmx0OyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OzsKJiM0MzsJd3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgJmFtcDtjLCAxKTsKJiM0MzsJX2V4aXQoRVhJVF9TVUNDRVNTKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi8KJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLAomIzQzOwkJCQkgIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgZmQsIHBpZGZkLCBpOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlpZiAodGFrZV9sb2NrKGZkLCB0LSZndDtraW5kKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CXN3aXRjaCAodC0mZ3Q7c2hhcmUpIHsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX05PTkU6CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX0RVUDoKJiM0MzsJCWlmIChkdXAoZmQpICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GT1JLOgomIzQzOwkJcGlkID0gZm9yaygpOwomIzQzOwkJaWYgKHBpZCAmbHQ7IDApCiYjNDM7CQkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsJCWlmIChwaWQgPT0gMCkKJiM0MzsJCQlob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GSUxFUzoKJiM0MzsJCXBpZCA9IGNyZWF0ZV9jaGlsZCgmYW1wO3BpZGZkLCBDTE9ORV9GSUxFUyk7CiYjNDM7CQlpZiAocGlkICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJaWYgKHBpZCA9PSAwKQomIzQzOwkJCWhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodC0mZ3Q7dGhyZWFkcykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBvbiBwdXJwb3NlICovCiYjNDM7CSoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZQomIzQzOyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlCiYjNDM7ICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcAomIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvcgomIzQzOyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9OwomIzQzOwlzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307CiYjNDM7CWludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7CiYjNDM7CWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CWludCBmZCwgZmlyc3RfZmQsIG5yX2ZkczsKJiM0MzsJX191NjQgbWFzazsKJiM0MzsJc3NpemVfdCBieXRlczsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZF9sb2NrICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwlpZiAoZmRfc2VydmVyICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwljbG9zZShmZF9pcGMpOwomIzQzOwomIzQzOwlmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpOwomIzQzOwlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogYWNjZXB0NCBmYWlsZWQ6ICVtXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTsKJiM0MzsJaWYgKGZkX3BlZXJfcGlkZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCAmYW1wO2luZm8pKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcmVhZF9jb3JlZHVtcF9yZXEgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFjaGVja19jb3JlZHVtcF9yZXEoJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi8KJiM0MzsJaWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LSZndDtraW5kKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgJmFtcDtmaXJzdF9mZCk7CiYjNDM7CWlmIChucl9mZHMgJmx0Oz0gMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbWFzayA9IENPUkVEVU1QX1dBSVQ7CiYjNDM7CW1hc2sgfD0gdC0mZ3Q7dXNlcnNwYWNlID8gQ09SRURVTVBfVVNFUlNQQUNFIDogQ09SRURVTVBfS0VSTkVMOwomIzQzOwlpZiAodC0mZ3Q7Y2xvc2UpCiYjNDM7CQltYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTOwomIzQzOwomIzQzOwlpZiAoIXNlbmRfY29yZWR1bXBfYWNrKGZkX2NvcmVkdW1wLCAmYW1wO3JlcSwgbWFzaywgMCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBzZW5kX2NvcmVkdW1wX2FjayBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCAmYW1wO2MsIDEpOwomIzQzOwlpZiAoYnl0ZXMgIT0gKHQtJmd0O3VzZXJzcGFjZSA/IDAgOiAxKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXG4mIzM0OywgX19mdW5jX18sIGJ5dGVzKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC0mZ3Q7a2luZCkgIT0gIXQtJmd0O3JlbGVhc2VkKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgdC0mZ3Q7cmVsZWFzZWQgPyAmIzM0O3N0aWxsIGhlbGQmIzM0OyA6ICYjMzQ7cmVsZWFzZWQmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsICZhbXA7Zmlyc3RfZmQpOwomIzQzOwlpZiAobnJfZmRzICZsdDsgMCB8fCAhbnJfZmRzICE9IHQtJmd0O2Nsb3NlKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxuJiMzNDssCiYjNDM7CQkJX19mdW5jX18sIG5yX2Zkcyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7CiYjNDM7CWlmICh0LSZndDtjbG9zZSkgewomIzQzOwkJaWYgKGZkICZndDs9IDAgfHwgZXJybm8gIT0gRUJBREYpIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fLCBmZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fKTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqLwomIzQzOwlpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsICZhbXA7aW5mbykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoaW5mby5tYXNrICZhbXA7IFBJREZEX0lORk9fRVhJVCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQljaGFyIGJ1ZmZlcls0MDk2XTsKJiM0MzsKJiM0MzsJCWJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwomIzQzOwkJaWYgKGJ5dGVzICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoYnl0ZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmRfbG9jayAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmRfbG9jayk7CiYjNDM7CWlmIChmZF9wZWVyX3BpZGZkICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9wZWVyX3BpZGZkKTsKJiM0MzsJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9jb3JlZHVtcCk7CiYjNDM7CWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CXJldHVybiBleGl0X2NvZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSwKJiM0MzsJCQkgICBGSVhUVVJFX0RBVEEoY29yZWR1bXApICpzZWxmLAomIzQzOwkJCSAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KQomIzQzO3sKJiM0MzsJaW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdOwomIzQzOwlwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0BAL3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0OykpOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7CiYjNDM7CUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShmZCksIDApOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CQlfZXhpdChjbG9zZV9zZXJ2ZXIodCwgaXBjX3NvY2tldHNbMV0pKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwkvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqLwomIzQzOwlBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UocGlkLCAwKTsKJiM0MzsJaWYgKHBpZCA9PSAwKSB7CiYjNDM7CQljbG9zZShyZWxlYXNlX3BpcGVbMV0pOwomIzQzOwkJY2xvc2UocmVzdWx0X3BpcGVbMF0pOwomIzQzOwkJY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpOwomIzQzOwomIzQzOwkvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovCiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTsKJiM0MzsKJiM0MzsJLyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqLwomIzQzOwlpZiAodC0mZ3Q7c2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtJmd0O3NoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHsKJiM0MzsJCUFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CQlBU1NFUlRfRVEoYywgJiMzOTtPJiMzOTspOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX1BPU0lYLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLnRocmVhZHMgPSB0cnVlLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfT0ZELAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9GTE9DSywKJiM0MzsJCS5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSwKJiM0MzsJCS50aHJlYWRzID0gdHJ1ZSwKJiM0MzsJCS5jbG9zZSA9IHRydWUsCiYjNDM7CQkucmVsZWFzZWQgPSB0cnVlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZHVwKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9EVVAsCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmRfZm9yaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9PRkQsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9zaGFyZWRfdGFibGUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfdXNlcnNwYWNlKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS51c2Vyc3BhY2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsCiYjNDM7CQkudGhyZWFkcyA9IHRydWUsCiYjNDM7CQkuY2xvc2UgPSBmYWxzZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYwppbmRleCBmNWM5YmFkODc1NDYzLi5iZWIxNjc2OThjZmRiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMKQEAgLTIzNzcsNiAmIzQzOzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpCiAJY2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTsKIH0KIAomIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9jbG9zZV9maWxlc19yZWplY3QpCiYjNDM7ewomIzQzOwljaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2VydmVyIGJ1aWx0IHdpdGggdGhlIGZpcnN0IHN0cnVjdHMgcmVhZHMgdGhlIHJlcXVlc3QgaXQga25vd3MsCiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCmluZGV4IDRlMzZlM2U0ZmI3OGYuLjY1MTMyYTBkZWNlZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCkBAIC0xNjEyLDcgJiM0MzsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSwKICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTEwJCQkJCVwKIAkoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwJCQlcCiAJIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfAkJCVwKLQkgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUykKJiM0MzsJIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMgfCBcCiYjNDM7CSBDT1JFRFVNUF9DTE9TRV9GSUxFUykKIAogYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKQogewo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxNzo1NzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQ5MwoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDM2MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIENvcmVkdW1wIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgZGlnZ2luZyBpbnRvIHRoZSBMaW51eCBrZXJuZWwmIzM5O3MgY29yZWR1bXAgc3Vic3lzdGVtLCBhbmQgaXQgbG9va3MgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBhZGRpbmcgYSBuZXcgZmxhZywgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCwgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBUaGUgY3J1Y2lhbCBiaXQgaXMgdGhhdCB3aGVuIGEgdXNlcnNwYWNlIGhhbmRsZXIgc2VuZHMgYmFjayBhbiBBQ0sgd2l0aCB0aGlzIGZsYWcgc2V0LCB0aGUga2VybmVsIHdpbGwgY2xvc2UgKmFsbCogZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY3Jhc2hpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZSBkdW1wLgoKUmlnaHQgYXdheSwgSSYjMzk7bSB0aGlua2luZzogcmVhY2hhYmxlPyBGdXp6YWJsZT8gVGhpcyBsb29rcyBwcm9taXNpbmcuIFRoZSBjb3JlZHVtcCBmdW5jdGlvbmFsaXR5IGl0c2VsZiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgbm8gcHJvYmxlbSB0aGVyZS4gQW5kIHRoaXMgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyBpcyBwYXJ0IG9mIHRoZSBVQVBJLCB3aGljaCBtZWFucyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIGNhbiB0cmlnZ2VyIGl0LiBUaGF0IG1ha2VzIGl0IHJpcGUgZm9yIGV4cGxvcmF0aW9uLgoKSSBzZWUgY2hhbmdlcyBzcHJpbmtsZWQgYWNyb3NzIHRoZSBmaWxlc3lzdGVtIGNvZGUgKGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGBmcy9maWxlX3RhYmxlLmNgLCBgZnMvaW50ZXJuYWwuaGAsIGBmcy9vcGVuLmNgLCBgaW5jbHVkZS9saW51eC9mZHRhYmxlLmhgLCBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAsIGBpbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaGApIGFuZCBldmVuIHRoZSBrZXJuZWwmIzM5O3MgZXhpdCBsb2dpYyAoYGtlcm5lbC9leGl0LmNgKS4gVGhpcyB0ZWxscyBtZSB0aGUgY29yZSBrZXJuZWwgaXMgaW52b2x2ZWQuIENsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyLCBvciBub3QsIGlzIGFsd2F5cyBhIHNlbnNpdGl2ZSBvcGVyYXRpb24uCgpNeSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBJJiMzOTtsbCB3YW50IHRvIGZvY3VzIG9uIGZvciBmdXp6aW5nLiBMb29rcyBsaWtlIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYW5kIGBmaWxwX2Nsb3NlX3N5bmNgIGFyZSB0aGUgbW9zdCByZWxldmFudCBpbiB0aGUgZmlsZXN5c3RlbSBhcmVhLiBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBhbmQgYGRvX2NvcmVkdW1wYCBuZWVkIGZ1cnRoZXIgYW5hbHlzaXMuIFRoZXNlIGFyZSBhbGwgd29ydGggYSBjbG9zZSBsb29rIGFuZCBmdXp6aW5nLgoKRmluYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBLY29uZmlnIG9wdGlvbnMuIENvcmVkdW1wcyBhcmUgZW5hYmxlZCB2aWEgYENPTkZJR19DT1JFRFVNUGAuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIHNldCwgb3RoZXJ3aXNlLCBhbGwgdGhpcyB3b3JrIGlzIGZvciBub3RoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDT1JFRFVNUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXG4tLVxuZnMvS2NvbmZpZy5iaW5mbXQtMTcwLVxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcyLVx0Ym9vbCBcJiMzNDtFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzODkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgYENPUkVEVU1QYCBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyByZWxhdGVkIHRvIGBDT1JFRFVNUGAuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZGVsdmUgaW50byB0aGUgdmFyaW91cyBsYXllcnMgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZywgaGFuZGxpbmcsIGFuZCBpbnRlcnByZXRpbmcgY29yZSBkdW1wcy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUga2VybmVsLWxldmVsIGNvbXBvbmVudHMgdGhhdCB0cmlnZ2VyIHRoZSBkdW1wIOKAkyBzaWduYWxzIGxpa2UgU0lHU0VHViwgU0lHQUJSVCwgU0lHSUxMLCBldGMuIOKAkyBhbmQgaG93IHRob3NlIGFyZSBjb25maWd1cmVkLCBwb3RlbnRpYWxseSB0aHJvdWdoIGAvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybmAgb3Igc2ltaWxhciBzeXNjdGwgc2V0dGluZ3MuCgpUaGVuLCBJJiMzOTttIGNvbnNpZGVyaW5nIHRoZSB1c2Vyc3BhY2UgdXRpbGl0aWVzOiBgZ2RiYCwgYGxsZGJgLCBgY29yZWR1bXBjdGxgLCBhbmQgdGhlIHdob2xlIHJhbmdlIG9mIGRlYnVnZ2VycyB0aGF0IGNhbiBhY3R1YWxseSAqdXNlKiB0aGUgY29yZSBmaWxlLiBXaGF0IGFyZSB0aGUga2V5IGxpYnJhcmllcyB0aGVzZSB0b29scyByZWx5IG9uIGZvciBwYXJzaW5nIHRoZSBjb3JlIGR1bXAgZm9ybWF0PyBFTEYsIERXQVJGLCB0aGUgZGVidWdnaW5nIGludGVyZmFjZSAoREJJKS4uLiBJIG5lZWQgdG8gbWFwIG91dCB0aGUgY29ubmVjdGlvbnMuIEFtIEkgZGVhbGluZyB3aXRoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCB3aGljaCBtYXkgaW5mbHVlbmNlIHRoZSBjb3JlIGZpbGUgZm9ybWF0PwoKSSYjMzk7bSBhbHNvIGNvbnNpZGVyaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGNvcmUgZHVtcCBzZXR0aW5ncyB0aGVtc2VsdmVzOiBzaXplIGxpbWl0cyAodWxpbWl0IC1jKSwgdGhlIGNvcmUgZmlsZSBuYW1pbmcgY29udmVudGlvbiAocG90ZW50aWFsbHkgaW5qZWN0aW5nIHByb2Nlc3MgSURzLCB0aW1lc3RhbXBzLCBldGMuKSwgYW5kIHdoZXRoZXIgdGhlIGR1bXAgaXMgYmVpbmcgY2FwdHVyZWQgaW4gYSBmaWxlIGF0IGFsbCwgb3IgcG90ZW50aWFsbHkgcGlwZWQgdG8gYSBkZWJ1Z2dlciBkaXJlY3RseS4KCkkgc2hvdWxkIGFsc28gZmFjdG9yIGluIHRoZSBwb3NzaWJpbGl0eSBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMg4oCTIHRvb2xzIHRoYXQgbWlnaHQgcHJlLXByb2Nlc3Mgb3IgcG9zdC1wcm9jZXNzIHRoZSBjb3JlIGR1bXBzLiBBcmUgdGhlcmUgYW55IGN1c3RvbSBzY3JpcHRzIG9yIHRvb2xzIHdpdGhpbiB0aGlzIHN5c3RlbSB0aGF0IGFyZSBpbnZvbHZlZCBpbiBjb3JlIGR1bXAgYW5hbHlzaXMgb3IgbWFuaXB1bGF0aW9uPyBVbmRlcnN0YW5kaW5nIGFueSBjdXN0b20gdG9vbHMgb3IgbW9kaWZpY2F0aW9ucyBpbiBwbGFjZSBpcyBjcnVjaWFsLgoKVWx0aW1hdGVseSwgSSBuZWVkIGEgaG9saXN0aWMgdmlldzogd2hhdCB0cmlnZ2VycyBhIGNvcmUgZHVtcCwgaG93IGlzIGl0IGdlbmVyYXRlZCwgd2hhdCBhcmUgdGhlIHJlc3RyaWN0aW9ucyBvbiB0aGUgY29yZSBkdW1wLCB3aGF0IHRvb2xzIGludGVyYWN0IHdpdGggdGhlIGNvcmUgZHVtcCwgYW5kIHdoYXQgdG9vbHMgbWF5IGFuYWx5emUgdGhlIGNvcmUgZHVtcD8gVGhpcyBpcyB0aGUgY29yZSBkZXBlbmRlbmN5IGdyYXBoIEkgbmVlZCB0byB1bmRlcnN0YW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDT1JFRFVNUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10PTE0NT1jb25maWcgQklORk1UX01JU0Ncbi0tXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXG5mcy9LY29uZmlnLmJpbmZtdDoxNzE6Y29uZmlnIENPUkVEVU1QXG5mcy9LY29uZmlnLmJpbmZtdC0xNzItXHRib29sIFwmIzM0O0VuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjkxMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoaW5raW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9uczoKCioqQW5hbHl6aW5nIHRoZSBLZXJuZWwmIzM5O3MgQmluYXJ5IEZvcm1hdCBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYGZzL0tjb25maWcuYmluZm10YCBzZWN0aW9uLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgaXRzIGhhbmRsaW5nIG9mIHZhcmlvdXMgYmluYXJ5IGZvcm1hdHMsIGxpa2UgZXhlY3V0YWJsZXMuIFRoZSBsaW5lIG51bWJlciBwcm92aWRlZCwgYXJvdW5kIDE3MSwgdXN1YWxseSBwb2ludHMgdG8gYSBzaWduaWZpY2FudCBibG9jayBvZiBjb2RlLCBvZnRlbiBkZWFsaW5nIHdpdGggdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIGhvdyB0aGUga2VybmVsIGlkZW50aWZpZXMgYW5kIGV4ZWN1dGVzIGRpZmZlcmVudCBwcm9ncmFtIHR5cGVzLiBUaGlzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmbGV4aWJpbGl0eSBhbmQgc2VjdXJpdHkgb2YgdGhlIGtlcm5lbCwgYXMgaXQgZGljdGF0ZXMgd2hhdCBjYW4gYmUgcnVuIG9uIHRoZSBzeXN0ZW0gYW5kIGhvdy4gSSBuZWVkIHRvIHNlZSB3aGF0JiMzOTtzIGJlaW5nIGNvbmZpZ3VyZWQsIHdoYXQgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCwgYW5kIGFueSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGJlIGluIHBsYWNlLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyBhYm91dCB3aGF0IG5ldyBiaW5hcnkgZm9ybWF0IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQsIGFuZCBpZiBhbnkgc2VjdXJpdHkgb3B0aW9ucyBhcmUgaW4gcGxheS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10JiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNjU6XHRcdFx0bW91bnQgYmluZm10X21pc2MgLXQgYmluZm10X21pc2MgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjXG4gMTY2Olx0XG4gMTY3Olx0XHQgIFlvdSBtYXkgc2F5IE0gaGVyZSBmb3IgbW9kdWxlIHN1cHBvcnQgYW5kIGxhdGVyIGxvYWQgdGhlIG1vZHVsZSB3aGVuXG4gMTY4Olx0XHQgIHlvdSBoYXZlIHVzZSBmb3IgaXQ7IHRoZSBtb2R1bGUgaXMgY2FsbGVkIGJpbmZtdF9taXNjLiBJZiB5b3VcbiAxNjk6XHRcdCAgZG9uJiMzOTt0IGtub3cgd2hhdCB0byBhbnN3ZXIgYXQgdGhpcyBwb2ludCwgc2F5IFkuXG4gMTcwOlx0XG4gMTcxOlx0Y29uZmlnIENPUkVEVU1QXG4gMTcyOlx0XHRib29sIFwmIzM0O0VuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFwmIzM0OyBpZiBFWFBFUlRcbiAxNzM6XHRcdGRlZmF1bHQgeVxuIDE3NDpcdFx0aGVscFxuIDE3NTpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgY29yZSBkdW1wcy4gWW91IGFsbW9zdFxuIDE3NjpcdFx0ICBjZXJ0YWlubHkgd2FudCB0byBzYXkgWSBoZXJlLiBOb3QgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBuZXZlclxuIDE3NzpcdFx0ICBuZWVkIGRlYnVnZ2luZyBvciBvbmx5IGV2ZXIgcnVuIGZsYXdsZXNzIGNvZGUuXG4gMTc4Olx0XG4gMTc5Olx0Y29uZmlnIEVYRUNfS1VOSVRfVEVTVFxuIDE4MDpcdFx0Ym9vbCBcJiMzNDtCdWlsZCBleGVjdmUgdGVzdHNcJiMzNDsgaWYgIUtVTklUX0FMTF9URVNUU1xuIDE4MTpcdFx0ZGVwZW5kcyBvbiBLVU5JVD15XG4gMTgyOlx0XHRkZWZhdWx0IEtVTklUX0FMTF9URVNUU1xuIDE4MzpcdFx0aGVscFxuIDE4NDpcdFx0ICBUaGlzIGJ1aWxkcyB0aGUgZXhlYyBLVW5pdCB0ZXN0cywgd2hpY2ggdGVzdHMgYm91bmRhcnkgY29uZGl0aW9uc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDk2CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiBDb3JlIER1bXAgQ29uZmlndXJhdGlvbiBhbmQgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gYENPUkVEVU1QYCBzZWVtcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBpdHMgYmVoYXZpb3IsIHNvIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEl0IGxvb2tzIGxpa2UgdGhlIG1haW4gY29kZSBpcyBzcHJlYWQgYWNyb3NzIGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGFuZCBga2VybmVsL2V4aXQuY2AuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUmIzM5O3MgYW55dGhpbmcgc3BlY2lmaWMgdG8gY29udHJvbCB0aGUgY2xvc2luZyBvZiBmaWxlcyBkdXJpbmcgYSBjb3JlIGR1bXA7IGlzIHRoZXJlIHNvbWV0aGluZyBsaWtlIGBDT1JFRFVNUF9DTE9TRV9GSUxFU2A/IE5vcGUsIGl0JiMzOTtzIGp1c3QgYSBzaW1wbGUgZmxhZy4KCk5vdywgSSBzaG91bGQgZXhhbWluZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYWxsIHdvcmtzLiBJJiMzOTttIGZvY3VzaW5nIG9uIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYGZpbHBfY2xvc2Vfc3luY2AsIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgLCBhbmQgYGRvX2NvcmVkdW1wYC4KCkkmIzM5O2xsIHF1aWNrbHkgdmVyaWZ5IHRoZSB2aXNpYmlsaXR5IG9mIHRoZXNlIGZ1bmN0aW9ucy4gQ2hlY2tpbmcgYGZzL2ZpbGUuY2AsIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCBhcmUgbm9uLXN0YXRpYy4gVGhlbiwgbG9va2luZyBhdCBgZnMvZmlsZV90YWJsZS5jYCwgYGZpbHBfY2xvc2Vfc3luY2AgaXMgYWxzbyBub24tc3RhdGljLiBBaGEsIGluIGBmcy9jb3JlZHVtcC5jYCwgSSBzZWUgYm90aCBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBhbmQgYGRvX2NvcmVkdW1wYC4gV2FpdCBhIHNlY29uZOKApiBpcyBgZG9fY29yZWR1bXBgIHN0YXRpYz8gSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGxhc3Qgb25lLiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZG9fY29yZWR1bXAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9MTE4OT1zdGF0aWMgaW5saW5lIGJvb2wgY29yZWR1bXBfc2tpcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIwMC1cbmZzL2NvcmVkdW1wLmM6MTIwMTpzdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbmZzL2NvcmVkdW1wLmMtMTIwMi1cdFx0XHRzaXplX3QgKiphcmd2LCBpbnQgKmFyZ2MsIGNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdClcbi0tXG5mcy9jb3JlZHVtcC5jPTEyNzk9dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbi0tXG5mcy9jb3JlZHVtcC5jLTEzMTctXHRzY29wZWRfd2l0aF9jcmVkcyhjcmVkKVxuZnMvY29yZWR1bXAuYzoxMzE4Olx0XHRkb19jb3JlZHVtcChcdTAwMjZjbiwgXHUwMDI2Y3BybSwgXHUwMDI2YXJndiwgXHUwMDI2YXJnYywgYmluZm10KTtcbmZzL2NvcmVkdW1wLmMtMTMxOS1cdGNvcmVkdW1wX2NsZWFudXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQzMgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgQ29yZSBEdW1wIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgY29yZSBkdW1wcyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgc3lzdGVtLiBUaGUgZnVuY3Rpb24gYGRvX2NvcmVkdW1wYCBpcyBkZWNsYXJlZCBhcyBgc3RhdGljYCwgd2hpY2ggaW1tZWRpYXRlbHkgdGVsbHMgbWUgaXQmIzM5O3MgbGlrZWx5IGFuIGludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24sIHByb2JhYmx5IG5vdCBzb21ldGhpbmcgZGlyZWN0bHkgZXhwb3NlZC4gVGhlIHJlYWwgZW50cnkgcG9pbnQgZm9yIHRoZSBjb3JlIGR1bXAgZnVuY3Rpb25hbGl0eSBpcyBgdmZzX2NvcmVkdW1wYC4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgYWN0aW9uICpzdGFydHMqLiBJIG5lZWQgdG8gZHJpbGwgaW50byBgdmZzX2NvcmVkdW1wYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQmIzM5O3MgZG9pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zmc19jb3JlZHVtcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTI3OC1cbmZzL2NvcmVkdW1wLmM6MTI3OTp2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxuZnMvY29yZWR1bXAuYy0xMjgwLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg3MzIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipBbmFseXppbmcgYHZmc19jb3JlZHVtcGAgYW5kIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgKioKClJpZ2h0LCBsZXQgbWUgc2VlLi4uIHNvIGB2ZnNfY29yZWR1bXBgIGlzICpub3QqIGEgc3RhdGljIGZ1bmN0aW9uLCB3aGljaCBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLiBXZSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHBvdGVudGlhbCBzY29wZSBhbmQgaW1wYWN0LiBOb3csIGxldCYjMzk7cyBjb250cmFzdCB0aGF0IHdpdGggYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgd2hpY2ggKmlzKiBzdGF0aWMuIFRoYXQmIzM5O3MgZ29vZDsgaXQgc3VnZ2VzdHMgYSBtb3JlIGxpbWl0ZWQgc2NvcGUsIGNvbnRhaW5lZCB3aXRoaW4gYSBzcGVjaWZpYyBtb2R1bGUgb3IgZmlsZS4gVGhlIG9idmlvdXMgcXVlc3Rpb24gbm93IGJlY29tZXM6IElzIHRoZXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9uIHRoYXQgZGlyZWN0bHkgY2FsbHMgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGA/IFRoYXQgd291bGQgYmUgdGhlIGNydWNpYWwgbGluayB0byBpZGVudGlmeSwgd291bGRuJiMzOTt0IGl0PyBBIG5vbi1zdGF0aWMgY2FsbGVyIG9mIGEgc3RhdGljIGZ1bmN0aW9uLi4uIGhtbS4uLiBuZWVkIHRvIHRyYWNlIHRoYXQgcG90ZW50aWFsIHBhdGguIFRoYXQgY291bGQgYmUgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZywgd291bGRuJiMzOTt0IGl0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb3JlZHVtcF9zb2NrX3JlcXVlc3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9ODIxPXN0YXRpYyBpbmxpbmUgdm9pZCBjb3JlZHVtcF9zb2NrX3NodXRkb3duKHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2NvcmVkdW1wLmMtODMyLVxuZnMvY29yZWR1bXAuYzo4MzM6c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuZnMvY29yZWR1bXAuYy04MzQte1xuLS1cbmZzL2NvcmVkdW1wLmM9OTU0PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9jb3JlZHVtcC5jLTk1OC1cbmZzL2NvcmVkdW1wLmM6OTU5Olx0cmV0dXJuIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChjbiwgY3BybSk7XG5mcy9jb3JlZHVtcC5jLTk2MC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MTkzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCBzdGFuZHM6CgoqKlN0YXRpYyBWYXJpYWJsZXMgYW5kIENhbGxlcnMqKgoKT2theSwgc28gYGNvcmVkdW1wX3NvY2tldGAgaXMgYWxzbyBkZWNsYXJlZCBhcyBgc3RhdGljYC4gVGhhdCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QuIFN0YXRpYyB2YXJpYWJsZXMgaGF2ZSBzcGVjaWZpYyBzY29waW5nIGFuZCBsaWZldGltZSBjaGFyYWN0ZXJpc3RpY3MsIHNvIHVuZGVyc3RhbmRpbmcgdGhlaXIgdXNhZ2UgaXMgY3J1Y2lhbCwgZXNwZWNpYWxseSB3aXRoaW4gYSBjcml0aWNhbCBwYXJ0IG9mIHRoZSBzeXN0ZW0gbGlrZSBhIGNvcmVkdW1wIG1lY2hhbmlzbS4gTXkgbmV4dCBpbW1lZGlhdGUgdGhvdWdodCBpczogV2hhdCAqZXhhY3RseSogY2FsbHMgYGNvcmVkdW1wX3NvY2tldGA/IEkgbmVlZCB0byB0cmFjZSBiYWNrIHRoZSB1c2FnZSB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgbWFuYWdlZC4gV2hvIGlzIHNldHRpbmcgdXAgdGhpcyBzb2NrZXQ/IFdoYXQgaXMgc2VuZGluZyBkYXRhIHRvIGl0PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb3JlZHVtcF9zb2NrZXQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9ODMzPXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9jb3JlZHVtcC5jLTk1My1cbmZzL2NvcmVkdW1wLmM6OTU0OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL2NvcmVkdW1wLmMtOTU1LXtcbi0tXG5mcy9jb3JlZHVtcC5jPTk2Mz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9XG5mcy9jb3JlZHVtcC5jOjk2NDpzdGF0aWMgaW5saW5lIGJvb2wgY29yZWR1bXBfc29ja2V0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKSB7IHJldHVybiBmYWxzZTsgfVxuZnMvY29yZWR1bXAuYy05NjUtI2VuZGlmXG4tLVxuZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIyMi1cdGNhc2UgQ09SRURVTVBfU09DSzpcbmZzL2NvcmVkdW1wLmM6MTIyMzpcdFx0aWYgKCFjb3JlZHVtcF9zb2NrZXQoY24sIGNwcm0pKVxuZnMvY29yZWR1bXAuYy0xMjI0LVx0XHRcdHJldHVybjtcbi0tXG5mcy9jb3JlZHVtcC5jPTE2NDk9dm9pZCB2YWxpZGF0ZV9jb3JlZHVtcF9zYWZldHkodm9pZClcbi0tXG5mcy9jb3JlZHVtcC5jLTE2NTktXG5mcy9jb3JlZHVtcC5jOjE2NjA6c3RhdGljIGlubGluZSBib29sIGNoZWNrX2NvcmVkdW1wX3NvY2tldCh2b2lkKVxuZnMvY29yZWR1bXAuYy0xNjYxLXtcbi0tXG5mcy9jb3JlZHVtcC5jPTE2OTk9c3RhdGljIGludCBwcm9jX2Rvc3RyaW5nX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxuZnMvY29yZWR1bXAuYy0xNzE0LVxuZnMvY29yZWR1bXAuYzoxNzE1Olx0aWYgKCFjaGVja19jb3JlZHVtcF9zb2NrZXQoKSkge1xuZnMvY29yZWR1bXAuYy0xNzE2LVx0XHRzdHJzY3B5KGNvcmVfcGF0dGVybiwgb2xkX2NvcmVfcGF0dGVybiwgcmV0dmFsICYjNDM7IDEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTg3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgc2VlIGl0OgoKKipEaWdnaW5nIGludG8gdGhlIENvcmUgRHVtcCBGbG93KioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIHRyYWNlIHRoZSBjb3JlIGR1bXAgcHJvY2Vzcy4gUmlnaHQgbm93LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBgZG9fY29yZWR1bXBgIGlzIGNvbm5lY3RlZCB0byBgY29yZWR1bXBfc29ja2V0YCwgd2hpY2ggaW4gdHVybiBjYWxscyBgY29yZWR1bXBfc29ja19yZXF1ZXN0YC4gSWYgYGRvX2NvcmVkdW1wYCBpcyBjYWxsZWQgYnkgYHZmc19jb3JlZHVtcGAsIHRoZW4gdGhhdCBzdWdnZXN0cyBgdmZzX2NvcmVkdW1wYCBpcyBwcm9iYWJseSBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgZGlnZ2luZyBkZWVwZXIgYW5kIGZvY3VzaW5nIG15IGludmVzdGlnYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoYXQgZnVuY3Rpb24uIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmaWxwX2Nsb3NlX3N5bmNgIGJlY2F1c2Ugb2YgbXkgZXhwZXJpZW5jZXMgd2l0aCByZXNvdXJjZSBjbGVhbnVwIGluIHRoaXMgYXJlYS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmlscF9jbG9zZV9zeW5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2ZpbGUuYz01MDE9c3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4tLVxuZnMvZmlsZS5jLTUyNi1cdFx0XHRcdFx0aWYgKHN5bmMpXG5mcy9maWxlLmM6NTI3Olx0XHRcdFx0XHRcdGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7XG5mcy9maWxlLmMtNTI4LVx0XHRcdFx0XHRlbHNlXG4tLVxuZnMvZmlsZV90YWJsZS5jPTY0Mj1FWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xuLS1cbmZzL2ZpbGVfdGFibGUuYy02NDctICovXG5mcy9maWxlX3RhYmxlLmM6NjQ4OmludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG5mcy9maWxlX3RhYmxlLmMtNjQ5LXtcbi0tXG5mcy9pbnRlcm5hbC5oPTEyMT1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZpbGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2ludGVybmFsLmgtMTI5LVxuZnMvaW50ZXJuYWwuaDoxMzA6aW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XG5mcy9pbnRlcm5hbC5oLTEzMS12b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4tLVxuZnMvb3Blbi5jPTE0NjE9U1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxuLS1cbmZzL29wZW4uYy0xNDczLVx0ICovXG5mcy9vcGVuLmM6MTQ3NDpcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVx1MDAzZWZpbGVzKTtcbmZzL29wZW4uYy0xNDc1LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDQ2NQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkFuYWx5emluZyBgZmlscF9jbG9zZV9zeW5jYCBhcyBhIEtleSBGb2N1cyoqCgpBbHJpZ2h0LCBiYXNlZCBvbiB0aG9zZSByZWxhdGlvbnNoaXBzLCBpdCBsb29rcyBsaWtlIGBmaWxwX2Nsb3NlX3N5bmNgIGlzIGRlZmluaXRlbHkgYSBjb3JlIGZ1bmN0aW9uIHRvIHplcm8gaW4gb24uIFRoZSBmYWN0IHRoYXQgaXQmIzM5O3MgY2FsbGVkIGJ5IGJvdGggYGNsb3NlX2ZpbGVzYCBhbmQgYHN5c19jbG9zZWAgbWFrZXMgaXQgYSBoaWdoLXZhbHVlIHN5bWJvbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBmaWxlIGNsb3NpbmcgcHJvY2Vzcy4gS25vd2luZyB0aGF0LCBJIG5lZWQgdG8gY2hlY2sgaG93IGl0IHdvcmtzIHdpdGggYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYC4gSXQgcHJvYmFibHkgZGVhbHMgd2l0aCBzb21lIG9mIHRoZSBmaW5lciBkZXRhaWxzIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0IHJlbGF0aW9uc2hpcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIzNC1cbmZzL2NvcmVkdW1wLmM6MTIzNTpcdGlmICgoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XG5mcy9jb3JlZHVtcC5jLTEyMzYtXHRcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFwmIzM0O0ZhaWxlZCB0byBjbG9zZSBmaWxlcywgYWJvcnRpbmcgY29yZVwmIzM0Oyk7XG4tLVxuZnMvZmlsZS5jPTU3MT12b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxuZnMvZmlsZS5jLTU4MS0gKi9cbmZzL2ZpbGUuYzo1ODI6Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuZnMvZmlsZS5jLTU4My17XG4tLVxuZnMvZmlsZS5jPTYyOD1ib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKVxuLS1cbmZzL2ZpbGUuYy02MzItXG5mcy9maWxlLmM6NjMzOlx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xuZnMvZmlsZS5jLTYzNC1cdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaD0xMDQ9dm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbmluY2x1ZGUvbGludXgvZmR0YWJsZS5oOjEwNTpib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xuaW5jbHVkZS9saW51eC9mZHRhYmxlLmgtMTA2LWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpO1xuLS1cbmtlcm5lbC9leGl0LmM9NDMwPXN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbi0tXG5rZXJuZWwvZXhpdC5jLTQ1MS1cdFx0XHRicmVhaztcbmtlcm5lbC9leGl0LmM6NDUyOlx0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xua2VybmVsL2V4aXQuYy00NTMtXHRcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFx1MDAyNnNlbGYpKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTQ9VEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZS02LVx0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZTo3Olx0XHQgIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3RcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlLTgtVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZT0xND0kKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZToxNTokKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjEzMzYKCQkJCQkJCW91dHB1dDogMTcKCQkJCQkJCXRob3VnaHRzOiA0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6CgoqKkFuYWx5emluZyBDb3JlIER1bXAgRmlsZSBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGhvbmluZyBpbiBvbiB0aGUgY3J1Y2lhbCBhcmVhcyBmb3IgZmlsZSBoYW5kbGluZyB3aXRoaW4gdGhlIGNvcmUgZHVtcCBwcm9jZXNzLiBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIGFuZCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgYXJlIGRlZmluaXRlbHkga2V5IGZvY3VzIHBvaW50cy4gVGhvc2UgZnVuY3Rpb24gbmFtZXMgc2NyZWFtICYjMzQ7ZmlsZSBjbGVhbnVwLCYjMzQ7IHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBiZXR0ZXIuIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgYXR0ZW50aW9uIHRvIHRoZSBhbGxvY2F0aW9uIHNpZGUgb2YgdGhpbmdzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZpbGUgc3RydWN0dXJlcyBhcmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuIExldCYjMzk7cyBkaWcgaW50byBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbmQgYGFsbG9jX2ZpbGVzYC4gVW5kZXJzdGFuZGluZyB0aGUgYWxsb2NhdGlvbiBwcm9jZXNzIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCBob3cgdGhlc2UgZmlsZSBoYW5kbGVzIGFyZSBtYW5hZ2VkIGZyb20gdGhlIHZlcnkgc3RhcnQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBwaWN0dXJlIG9mIHRoZSBlbnRpcmUgbGlmZWN5Y2xlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY19maWxlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9maWxlLmM9MzY0PXN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuLS1cbmZzL2ZpbGUuYy0zNzgtLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXG5mcy9maWxlLmM6Mzc5OnN0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXG5mcy9maWxlLmMtMzgwLXtcbi0tXG5mcy9maWxlLmMtNDA0LS8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqL1xuZnMvZmlsZS5jOjQwNTpzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXNfc3RydWN0KHZvaWQpXG5mcy9maWxlLmMtNDA2LXtcbi0tXG5mcy9maWxlLmMtNDA4LVxuZnMvZmlsZS5jOjQwOTpcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG5mcy9maWxlLmMtNDEwLVx0aWYgKCFuZXdmKVxuLS1cbmZzL2ZpbGUuYz00MjI9c3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbi0tXG5mcy9maWxlLmMtNDI4LVxuZnMvZmlsZS5jOjQyOTpcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbmZzL2ZpbGUuYy00MzAtXHRpZiAoIW5ld2YpXG4tLVxuZnMvZmlsZS5jPTU4Mj1ib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXG4tLVxuZnMvZmlsZS5jLTU4OC1cbmZzL2ZpbGUuYzo1ODk6XHRmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpO1xuZnMvZmlsZS5jLTU5MC1cdGlmICghZmlsZXMpXG4tLVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jPTM1MzI9c3RhdGljIGludFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jOjM1MzM6eGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYy0zNTM0LVx0c3RydWN0IHhmc19ibWFsbG9jYVx0KmFwLFxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYz0zNjI1PXhmc19ibWFwX2J0YWxsb2MoXG4tLVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM2NTgtXHRcdFx0eGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtXHUwMDNlaXApKVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jOjM2NTk6XHRcdGVycm9yID0geGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhhcCwgXHUwMDI2YXJncywgc3RyaXBlX2FsaWduKTtcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYy0zNjYwLVx0ZWxzZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjIwNgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkFuYWx5emluZyBGaWxlIEFsbG9jYXRpb24gU3RydWN0dXJlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgZmlsZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4gSSBzZWUgYGFsbG9jX2ZpbGVzYCBhbmQgYGFsbG9jX2ZpbGVzX3N0cnVjdGAgZGVmaW5lZCBhcyBgc3RhdGljYC4gUmlnaHQsIHRoYXQgbWVhbnMgdGhleSYjMzk7cmUgb25seSB2aXNpYmxlIHdpdGhpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIFRoYXQmIzM5O3MgZ29vZCB0byBrZWVwIGluIG1pbmQsIGl0IGxpbWl0cyB0aGVpciBzY29wZSB3aGljaCBpcyB1c3VhbGx5IGEgcG9zaXRpdmUgc2lnbiBmb3IgbW9kdWxhcml0eS4gTm93LCBsZXQgbWUgc2hpZnQgbXkgZm9jdXMgdG8gYHN3aXRjaF9maWxlc19zdHJ1Y3RgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlc2Ugb3RoZXIgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zLiBJdCYjMzk7cyBsaWtlbHkgdGhhdCBpdCBoYXMgYSByb2xlIGluIG1hbmFnaW5nIG9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBzdHJ1Y3R1cmUgaW4gc29tZSB3YXksIGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIGBhbGxvY19maWxlc2AgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZC4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N3aXRjaF9maWxlc19zdHJ1Y3QmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmlsZS5jPTU0MT12b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4tLVxuZnMvZmlsZS5jLTU1My0vKiBIYW5kIEB0c2sgdGhlIHRhYmxlIEBmaWxlcywgb3Igbm9uZSwgYW5kIGRyb3AgdGhlIG9uZSBpdCBoYWQuICovXG5mcy9maWxlLmM6NTU0OnN0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG5mcy9maWxlLmMtNTU1LVx0XHRcdFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4tLVxuZnMvZmlsZS5jPTU3MT12b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxuZnMvZmlsZS5jLTU3NC1cdFx0cmV0dXJuO1xuZnMvZmlsZS5jOjU3NTpcdHN3aXRjaF9maWxlc19zdHJ1Y3QodHNrLCBOVUxMKTtcbmZzL2ZpbGUuYy01NzYtfVxuLS1cbmZzL2ZpbGUuYz01ODI9Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuLS1cbmZzL2ZpbGUuYy02MDktXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuZnMvZmlsZS5jOjYxMDpcdFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG5mcy9maWxlLmMtNjExLVxuLS1cbmZzL2ZpbGUuYz02Mjg9Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZilcbi0tXG5mcy9maWxlLmMtNjM4LVx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuZnMvZmlsZS5jOjYzOTpcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuZnMvZmlsZS5jLTY0MC1cdGNvcmVfc3RhdGUgPSBjdXJyZW50LVx1MDAzZXNpZ25hbC1cdTAwM2Vjb3JlX3N0YXRlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjgwMwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDMxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGb2N1cyBTeW1ib2wgUmVmaW5lbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZXNlIGZvY3VzIHN5bWJvbHMuIEkmIzM5O3ZlIGdvdCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgbG9ja2VkIGluIGFzIHN0YXRpYywgc28gdGhhdCYjMzk7cyBvZmYgdGhlIHRhYmxlLiBOb3csIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyBhcmUgdGhlIG9uZXMgSSBuZWVkIHRvIGV4YW1pbmU6IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYGZpbHBfY2xvc2Vfc3luY2AsIGFuZCBgdmZzX2NvcmVkdW1wYC4KClJpZ2h0LCBsZXQmIzM5O3MgcmV2aXNpdCBgZmlscF9jbG9zZV9zeW5jYC4gSGFuZyBvbi4uLiBpdCYjMzk7cyBjYWxsZWQgYnkgYHN5c19jbG9zZWA/IFRoYXQmIzM5O3MgYSAqdmVyeSogaG90IHBhdGguIEkgbmVlZCB0byBiZSBjYXJlZnVsOyB0aGF0JiMzOTtzIHByb2JhYmx5IG5vdCBpZGVhbCBhcyBhIGZvY3VzIHN5bWJvbC4gVGhlIGtlcm5lbCBzZWVzIGEgdG9uIG9mIGBzeXNfY2xvc2VgIGNhbGxzLiBZZXAsIGByZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpO2AgaW4gYHN5c19jbG9zZWAgY29uZmlybXMgaXQuICBTbywgc2NyYXAgYGZpbHBfY2xvc2Vfc3luY2AgZnJvbSB0aGUgbGlzdDsgaXQmIzM5O3MgdG9vIGdlbmVyaWMgYW5kIGhpZ2gtZnJlcXVlbmN5LgoKTm93LCB3aGF0IGFib3V0IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYD8gVGhvc2UgYXJlIHNwZWNpZmljIHRvIGNvcmVkdW1wIGZ1bmN0aW9uYWxpdHksIHJpZ2h0PyBOb3QgYSBzdGFuZGFyZCBwYXRoLiBUaGF0IGxvb2tzIGdvb2QuIEFuZCBgdmZzX2NvcmVkdW1wYCBpcyBzaW1pbGFybHkgbmljaGUuIFRoYXQmIzM5O3MgZ29vZCB0b28uCgpBcmUgdGhlcmUgYW55IG90aGVyIG91dGxpZXJzPyAgYGZpbHBfY2xvc2VgIGlzIGV4cG9ydGVkIGFuZCBub24tc3RhdGljLCBidXQgaXQgbG9va3MgbGlrZSBhIGhvdCBwYXRoIChvciBhdCBsZWFzdCBnZW5lcmljKS4gQW5kIGBkdXBfZmRgIGlzIG1vZGlmaWVkIGJ1dCBpdCYjMzk7cyB1c2VkIGluIGZvcmssIG5vdCBhIGZvY3VzLgoKT2theSwgSSB0aGluayB3ZSYjMzk7dmUgZ290IGl0LiBUaGUgZm9jdXMgc3ltYm9scywgZ2l2ZW4gdGhlIGFuYWx5c2lzLCBzaG91bGQgYmU6CgoqICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYAoqICAgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgCiogICBgdmZzX2NvcmVkdW1wYAoKSSYjMzk7bGwgZG91YmxlLWNoZWNrIGB2ZnNfY29yZWR1bXBgIG9uZSBtb3JlIHRpbWUsIGp1c3QgdG8gYmUgc3VyZS4gSXQgZG9lcyBzZWVtIHVuaXF1ZSB0byB0aGUgY29yZWR1bXAgdXNlIGNhc2UuIEV4Y2VsbGVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTU1NT1kaWZmZXJlbnQgc2V0IG9mIGNyZWRlbnRpYWxzLiAgVGhpcyBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOlxuLS1cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NTU4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD0yNTQ9Y29uc3TmjIfpkojkuIrmk43kvZzvvIzlm6DmraTkuI3pnIDopoHov5vooYznsbvlnovovazmjaLvvIzkvYbpnIDopoHkuLTml7bmlL7lvINjb25zdOmZkOWumu+8jOS7peS+v+iDveWkn+S/ruaUuVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo0Nzg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbmZzL2NvcmVkdW1wLmM9MTIwMT1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTEyNzgtXG5mcy9jb3JlZHVtcC5jOjEyNzk6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTI4MC17XG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oPTY3PWJvb2wgZHVtcF91c2VyX3JhbmdlKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNjgtXHRcdCAgICAgdW5zaWduZWQgbG9uZyBsZW4pO1xuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjY5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pO1xuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcwLVxuLS1cbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC04OC0jZWxzZVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjg5OnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC05MC1cbi0tXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXG4tLVxua2VybmVsL3NpZ25hbC5jLTMwMzAtXHRcdFx0ICovXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcdFx0XHR2ZnNfY29yZWR1bXAoXHUwMDI2a3NpZy1cdTAwM2VpbmZvKTtcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0MTM1CgkJCQkJCQlvdXRwdXQ6IDE4MAoJCQkJCQkJdGhvdWdodHM6IDU4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBDb3JlZHVtcCBGZWF0dXJlKioKCk9rYXksIHNvIGB2ZnNfY29yZWR1bXBgIOKAkyB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBmdXp6aW5nLCBpdCYjMzk7cyBjYWxsZWQgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgc28gd2UgaGF2ZSBhIGNsZWFyIHRyaWdnZXIuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWdzIHJlbGF0ZWQgdG8gdGhpcyBhcmVhLiBJdCBsb29rcyBsaWtlIGBDT1JFRFVNUGAgaXMgdGhlIG9ubHkgb25lLiBIbW0sIGl0JiMzOTtzIGVuYWJsZWQgYnkgZGVmYXVsdCwgd2hpY2ggaXMgY29udmVuaWVudCwgYW5kIHRoaXMgaXMgdGhlIGNvbmZpZyB0aGF0IGVuYWJsZXMgdGhlIGZlYXR1cmUsIHNvIHllcywgd2Ugc2hvdWxkIGluY2x1ZGUgaXQuCgpOb3csIHdoZXJlIGVsc2UgYXJlIHRoZSBjaGFuZ2VzPyBUaGUgY2hhbmdlcyBhcmUgbWFpbmx5IGFyb3VuZCBmaWxlIGRlc2NyaXB0b3IgbWFuYWdlbWVudC4gSSYjMzk7bSBzZWVpbmcgYWRkaXRpb25zIGFuZCBtb2RpZmljYXRpb25zIGluIHNldmVyYWwgZmlsZXM6IGBmcy9maWxlX3RhYmxlLmNgICh3aXRoIGBmaWxwX2Nsb3NlYCBhbmQgYGZpbHBfY2xvc2Vfc3luY2ApLCBgZnMvb3Blbi5jYCAod2l0aCBgc3lzX2Nsb3NlYCB1c2luZyBgZmlscF9jbG9zZV9zeW5jYCksIGFuZCBgZnMvZmlsZS5jYCAod2l0aCBhIGJ1bmNoIG9mIG5ldyBmdW5jdGlvbnMgbGlrZSBgYWxsb2NfZmlsZXNgLCBgYWxsb2NfZmlsZXNfc3RydWN0YCwgYGR1cF9mZGAsIGBjbG9zZV9maWxlc2AsIGBzd2l0Y2hfZmlsZXNfc3RydWN0YCwgYGV4aXRfZmlsZXNgLCBhbmQgc3BlY2lmaWNhbGx5LCBgY29yZWR1bXBfY2xvc2VfZmlsZXNgLCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2ApLiBgZnMvY29yZWR1bXAuY2AgYWxzbyBoYXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBjb3JlZHVtcF93YWl0YCwgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAsIGFuZCBgZG9fY29yZWR1bXBgLiBGaW5hbGx5LCBga2VybmVsL2V4aXQuY2AgaGFzIGBjb3JlZHVtcF90YXNrX2V4aXRgLgoKWWVzLCB0aGlzIGlzIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudC4gVGhlIGNvcmVkdW1wIGZlYXR1cmUgaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJdCYjMzk7cyByZWFjaGFibGUgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgc3BlY2lmaWNhbGx5IGlmIHRoZSBjb3JlZHVtcCBwYXR0ZXJuIGlzIHNldCB0byBhIHBpcGUgb3Igc29ja2V0LiBUaGVuIHRoZSB1c2Vyc3BhY2UgaGFuZGxlciB3b3VsZCByZXBseSB3aXRoIGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AuIFRoaXMgc2hvdWxkIGJlIGVhc2lseSByZXByb2R1Y2libGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgoKU28sIGhlcmUmIzM5O3MgdGhlIHN1bW1hcnk6CgoqICAgKipXb3J0aEZ1enppbmcqKjogVHJ1ZQoqICAgKipGb2N1c1N5bWJvbHMqKjoKICAgICogICBgY29yZWR1bXBfY2xvc2VfZmlsZXNgCiAgICAqICAgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgCiAgICAqICAgYHZmc19jb3JlZHVtcGAKKiAgICoqRW5hYmxlQ29uZmlncyoqOgogICAgKiAgIGBDT1JFRFVNUGAKCkxldCYjMzk7cyBjaGVjayBgQ09SRURVTVBgIGZvciBkZXBlbmRlbmNpZXMuIEl0JiMzOTtzIGEgYm9vbGVhbiBvcHRpb24gY29udHJvbGxlZCBieSBgRVhQRVJUYC4gQnV0IGl0IGRvZXNuJiMzOTt0ICpkZXBlbmQqIG9uIGV4cGVydCBtb2RlLCBpdCBqdXN0ICpzaG93cyogdGhlIHByb21wdCBpbiBleHBlcnQgbW9kZS4gU28gYENPUkVEVU1QYCBpcyBmaW5lIGFzLWlzLgoKTG9va2luZyBiYWNrIGF0IHRoZSByZWFzb25pbmcuLi4gdGhlIHBhdGNoIGVzc2VudGlhbGx5IGFkZHMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXJzIHRvIGluc3RydWN0IHRoZSBrZXJuZWwgdG8gY2xvc2UgYWxsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGEgY3Jhc2hpbmcgdGFzayAqYmVmb3JlKiBkdW1waW5nIHRoZSBjb3JlLiBUaGlzIGludHJvZHVjZXMgbmV3IGxvZ2ljIGZvciBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuaXB1bGF0aW9uIGFuZCBjbG9zaW5nIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AuIFdlIGNhbiB0cmlnZ2VyIHRoaXMgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgaGFuZGxlciByZXR1cm4gdGhlIGZsYWcuCgpPa2F5LCBJJiMzOTttIHNhdGlzZmllZC4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvcmVkdW1wX2Nsb3NlX2ZpbGVzJiMzNDssCiAgICAmIzM0O2NvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7Y29yZWR1bXBfdGFza19jbG9zZV9maWxlcyYjMzQ7LAogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGVjOTM1OWUzODJlYTUuLmE2ZTdkYTBiYzE2YTcgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtNTIzLDcgJiM0Mzs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7CiAKLQlpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtzdGFydHVwKTsKJiM0MzsJaW5pdF9jb21wbGV0aW9uKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSk7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLnRhc2sgPSB0c2s7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLm5leHQgPSBOVUxMOwogCkBAIC01MzEsNyAmIzQzOzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSkKIAlpZiAoY29yZV93YWl0ZXJzICZndDsgMCkgewogCQlzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7c3RhcnR1cCwKJiM0MzsJCXdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lLAogCQkJCQkgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTsKIAkJLyoKIAkJICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdApAQCAtODM3LDcgJiM0Mzs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKgogCQkubWFzawkJCT0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwKIAkJCQkJICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHwKIAkJCQkJICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwKLQkJCQkJICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsCiYjNDM7CQkJCQkgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8CiYjNDM7CQkJCQkgIENPUkVEVU1QX0NMT1NFX0ZJTEVTLAogCQkuc2l6ZV9hY2sJCT0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLAogCQkubWVtb3J5X3R5cGVzCQk9IGNwcm0tJmd0O21lbW9yeV90eXBlcywKIAkJLm1lbW9yeV90eXBlc19tYXNrCT0gQ09SRURVTVBfTUVNT1JZX0FMTCwKQEAgLTkwNSw2ICYjNDM7OTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKJiM0MzsJLyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi8KJiM0MzsJaWYgKChhY2subWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAoYWNrLm1hc2sgJmFtcDsgQ09SRURVTVBfUkVKRUNUKSkgewomIzQzOwkJY29yZWR1bXBfc29ja19tYXJrKGNwcm0tJmd0O2ZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiAJaWYgKGFjay5tYXNrICZhbXA7IENPUkVEVU1QX01FTU9SWV9UWVBFUykgewogCQkvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqLwogCQlpZiAodXNpemUgJmx0OyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7CkBAIC0xMjI1LDYgJiM0MzsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLAogCWlmIChjcHJtLSZndDttYXNrICZhbXA7IENPUkVEVU1QX1JFSkVDVCkKIAkJcmV0dXJuOwogCiYjNDM7CWlmICgoY3BybS0mZ3Q7bWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkgewomIzQzOwkJY29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoJiMzNDtGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmUmIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAkvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovCiAJLyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqLwogCWlmICh1bnNoYXJlX2ZpbGVzKCkpCmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuYwpAQCAtMzc1LDIxICYjNDM7Mzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jCiAJcmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpbgotICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpCi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgotICovCi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKQomIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjsKLQlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKLQl1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTsKLQlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpuZXdfZmR0OwogCi0JbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKJiM0MzsJbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApOwogCWlmICghbmV3ZikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKIAogCWF0b21pY19zZXQoJmFtcDtuZXdmLSZndDtjb3VudCwgMSk7CiAKQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvCiAJbmV3X2ZkdC0mZ3Q7ZnVsbF9mZHNfYml0cyA9IG5ld2YtJmd0O2Z1bGxfZmRzX2JpdHNfaW5pdDsKIAluZXdfZmR0LSZndDtmZCA9ICZhbXA7bmV3Zi0mZ3Q7ZmRfYXJyYXlbMF07CiAKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiYjNDM7CiYjNDM7CW5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CiYjNDM7CWlmICghbmV3ZikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0mZ3Q7ZmR0LCAmYW1wO25ld2YtJmd0O2ZkdGFiKTsKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW4KJiM0MzsgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKJiM0MzsgKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgomIzQzOyAqLwomIzQzO3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOwomIzQzOwlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKJiM0MzsJdW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDsKJiM0MzsKJiM0MzsJbmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5ld2YpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsJbmV3X2ZkdCA9ICZhbXA7bmV3Zi0mZ3Q7ZmR0YWI7CiYjNDM7CiAJc3Bpbl9sb2NrKCZhbXA7b2xkZi0mZ3Q7ZmlsZV9sb2NrKTsKIAlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAlvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7CkBAIC00ODAsNiAmIzQzOzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkgKi8KIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy0mZ3Q7ZmR0KTsKIAl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CiYjNDM7CS8qCiYjNDM7CSAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWUKJiM0MzsJICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLgomIzQzOwkgKi8KJiM0MzsJYm9vbCBzeW5jID0gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKTsKIAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyBzZXQ7CkBAIC00OTEsNyAmIzQzOzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkJCWlmIChzZXQgJmFtcDsgMSkgewogCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmR0LSZndDtmZFtpXTsKIAkJCQlpZiAoZmlsZSkgewotCQkJCQlmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTsKJiM0MzsJCQkJCWlmIChzeW5jKQomIzQzOwkJCQkJCWZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7CiYjNDM7CQkJCQllbHNlCiYjNDM7CQkJCQkJZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7CiAJCQkJCWNvbmRfcmVzY2hlZCgpOwogCQkJCX0KIAkJCX0KQEAgLTUxNSwxNiAmIzQzOzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpCiAJfQogfQogCiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqLwomIzQzO3N0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiYjNDM7CQkJCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodHNrKTsKJiM0MzsJb2xkID0gdHNrLSZndDtmaWxlczsKJiM0MzsJaWYgKG9sZCkgewomIzQzOwkJaWYgKGZpbGVzKQomIzQzOwkJCWF0b21pY19pbmMoJmFtcDtmaWxlcy0mZ3Q7Y291bnQpOwomIzQzOwkJdHNrLSZndDtmaWxlcyA9IGZpbGVzOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRzayk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlwdXRfZmlsZXNfc3RydWN0KG9sZCk7CiYjNDM7fQomIzQzOwogdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay0mZ3Q7ZmlsZXM7CiYjNDM7CWlmICghdHNrLSZndDtmaWxlcykKJiM0MzsJCXJldHVybjsKJiM0MzsJc3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZAomIzQzOyAqIHRlbGwgdGhlbSB0byBnZXQgcmlkIG9mIHRoZWlyIGZpbGVzLgomIzQzOyAqLwomIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsJc3RydWN0IGNvcmVfdGhyZWFkICpjdDsKJiM0MzsJaW50IG5yID0gMDsKIAotCWlmIChmaWxlcykgewotCQl0YXNrX2xvY2sodHNrKTsKLQkJdHNrLSZndDtmaWxlcyA9IE5VTEw7Ci0JCXRhc2tfdW5sb2NrKHRzayk7Ci0JCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwomIzQzOwlmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpOwomIzQzOwlpZiAoIWZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUYXNrcyB3aXRob3V0IGEgdGFibGUsIHZob3N0IHdvcmtlcnMgc2F5LCBzaXQgdGhlIHN3aXRjaCBvdXQuICovCiYjNDM7CWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQlpZiAoY3QtJmd0O3Rhc2stJmd0O2ZpbGVzKQomIzQzOwkJCW5yJiM0MzsmIzQzOzsKJiM0MzsJYXRvbWljX3NldCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMsIG5yKTsKJiM0MzsJcmVpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsKJiM0MzsJZm9yIChjdCA9IGNvcmVfc3RhdGUtJmd0O2R1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC0mZ3Q7bmV4dCkgewomIzQzOwkJaWYgKCFjdC0mZ3Q7dGFzay0mZ3Q7ZmlsZXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQkvKiBQYWlycyB3aXRoIHRoZSBhY3F1aXJlIGluIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoKS4gKi8KJiM0MzsJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7Y3QtJmd0O2ZpbGVzLCBmaWxlcyk7CiYjNDM7CQl3YWtlX3VwX3Byb2Nlc3MoY3QtJmd0O3Rhc2spOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGR1bXBlciYjMzk7cyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCYjMzk7cywgbm90IGl0cyBvd24uICovCiYjNDM7CXNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpCiYjNDM7CQlzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTsKJiM0MzsKJiM0MzsJaWYgKG5yKSB7CiYjNDM7CQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSwKJiM0MzsJCQkJCSAgVEFTS19VTklOVEVSUlVQVElCTEV8VEFTS19GUkVFWkFCTEUpOwomIzQzOwkJLyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi8KJiM0MzsJCWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQkJd2FpdF90YXNrX2luYWN0aXZlKGN0LSZndDt0YXNrLCBUQVNLX0FOWSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZQomIzQzOyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQmIzM5O3MgY29yZV90aHJlYWQgZW50cnkuCiYjNDM7ICovCiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsKJiM0MzsJLyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqLwomIzQzOwlmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoJmFtcDtzZWxmLSZndDtmaWxlcyk7CiYjNDM7CWlmICghZmlsZXMgfHwgIWN1cnJlbnQtJmd0O2ZpbGVzIHx8IGN1cnJlbnQtJmd0O2ZpbGVzID09IGZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiYjNDM7CXN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpOwomIzQzOwljb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsJcmV0dXJuIHRydWU7CiB9CiAKIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZWxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZG5vdGlmeS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50cG9sbC5oJmd0OwpAQCAtNjA2LDE1ICYjNDM7NjA3LDUzIEBAIHZvaWQgX19mcHV0X3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTsKIAogLyoKLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3QKLSAqIHJlZmVyZW5jZS4KLSAqCi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuCiYjNDM7ICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi4KICAqLwotdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQogewotCWlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKCZhbXA7ZmlsZS0mZ3Q7Zl9yZWYpKSkKLQkJX19mcHV0KGZpbGUpOwomIzQzOwlpbnQgcmV0dmFsID0gMDsKJiM0MzsKJiM0MzsJaWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsCiYjNDM7CQkJJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKSYjMzQ7LAomIzQzOwkJCWZpbHAtJmd0O2Zfb3ApKSB7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2gpCiYjNDM7CQlyZXR2YWwgPSBmaWxwLSZndDtmX29wLSZndDtmbHVzaChmaWxwLCBpZCk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkoIShmaWxwLSZndDtmX21vZGUgJmFtcDsgRk1PREVfUEFUSCkpKSB7CiYjNDM7CQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJZnB1dF9jbG9zZShmaWxwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdAomIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLgomIzQzOyAqLwomIzQzO2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJaWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoJmFtcDtmaWxwLSZndDtmX3JlZikpKQomIzQzOwkJX19mcHV0KGZpbHApOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiAJfQogfQogCi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTsKJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTsKIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTsKIAogLyoKQEAgLTE5MCw2ICYjNDM7MTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3MgewogCWludCBpbnRlbnQ7CiAJaW50IGxvb2t1cF9mbGFnczsKIH07CiYjNDM7CiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLAogCQljb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9vcGVuLmMKQEAgLTE0NTMsNDEgJiM0MzsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSkKIH0KICNlbmRpZgogCi0vKgotICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLgotICovCi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCwKLQkJCSYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcykmIzM0OywKLQkJCWZpbHAtJmd0O2Zfb3ApKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChmaWxwLSZndDtmX29wLSZndDtmbHVzaCkKLQkJcmV0dmFsID0gZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2goZmlscCwgaWQpOwotCi0JaWYgKGxpa2VseSghKGZpbHAtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9QQVRIKSkpIHsKLQkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7Ci0JCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKLQlmcHV0X2Nsb3NlKGZpbHApOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7Ci0KIC8qCiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlCiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4mIzM5O3QgcmVsZWFzZQpAQCAtMTUwMiwxMyAmIzQzOzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKQogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAotCXJldHZhbCA9IGZpbHBfZmx1c2goZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpOwotCiAJLyoKIAkgKiBXZSYjMzk7cmUgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuIERvbiYjMzk7dCBib3RoZXIKIAkgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy4KIAkgKi8KLQlmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7CiYjNDM7CXJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LSZndDtmaWxlcyk7CiAKIAlpZiAobGlrZWx5KHJldHZhbCA9PSAwKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaCBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCkBAIC05OSwxMSAmIzQzOzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAomIzQzO3N0cnVjdCBjb3JlX3RocmVhZDsKJiM0MzsKIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7CiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTsKIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpOwogc3RydWN0IGZkX3JhbmdlIHsKIAl1bnNpZ25lZCBpbnQgZnJvbSwgdG87CiB9OwomIzQzOwogc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7CiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTsKIGludCBpdGVyYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgdW5zaWduZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHsKIHN0cnVjdCBjb3JlX3RocmVhZCB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDsKJiM0MzsJLyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi8KJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CiB9OwogCiBzdHJ1Y3QgY29yZV9zdGF0ZSB7CiAJYXRvbWljX3QgbnJfdGhyZWFkczsKIAlzdHJ1Y3QgY29yZV90aHJlYWQgZHVtcGVyOwotCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7CiYjNDM7CS8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqLwomIzQzOwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTE5LDYgJiM0MzsxOSw5IEBACiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stJmd0O21lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTAomIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUCiAgKi8KIGVudW0gewogCUNPUkVEVU1QX0tFUk5FTAkJPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKQEAgLTI4LDYgJiM0MzszMSw3IEBAIGVudW0gewogCUNPUkVEVU1QX1JFQ09SRFMJPSAoMVVMTCAmbHQ7Jmx0OyA0KSwKIAlDT1JFRFVNUF9TUEFSU0UJCT0gKDFVTEwgJmx0OyZsdDsgNSksCiAJQ09SRURVTVBfTUVNT1JZX1RZUEVTCT0gKDFVTEwgJmx0OyZsdDsgNiksCiYjNDM7CUNPUkVEVU1QX0NMT1NFX0ZJTEVTCT0gKDFVTEwgJmx0OyZsdDsgNyksCiB9OwogCiAvKioKQEAgLTEzNyw2ICYjNDM7MTQxLDEwIEBAIGVudW0gewogICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3QKICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mCiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLgomIzQzOyAqCiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlCiYjNDM7ICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuCiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuCiAgKi8KIHN0cnVjdCBjb3JlZHVtcF9hY2sgewogCV9fdTMyIHNpemU7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9leGl0LmMKQEAgLTI1LDYgJiM0MzsyNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvYWNjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3RzYWNjdF9rZXJuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mZHRhYmxlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpbmZtdHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9uc3Byb3h5LmgmZ3Q7CkBAIC00MzIsNiAmIzQzOzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAlzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjsKIAogCXNlbGYudGFzayA9IHRzazsKJiM0MzsJc2VsZi5maWxlcyA9IE5VTEw7CiAJaWYgKHNlbGYudGFzay0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfU0lHTkFMRUQpCiAJCXNlbGYubmV4dCA9IHhjaGcoJmFtcDtjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dCwgJmFtcDtzZWxmKTsKIAllbHNlCkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCSAqIHRvIGNvcmVfc3RhdGUtJmd0O2R1bXBlci4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQotCQljb21wbGV0ZSgmYW1wO2NvcmVfc3RhdGUtJmd0O3N0YXJ0dXApOwomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKIAogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTsKIAkJaWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqLwogCQkJYnJlYWs7CiYjNDM7CQkvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqLwomIzQzOwkJaWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoJmFtcDtzZWxmKSkKJiM0MzsJCQljb250aW51ZTsKIAkJc2NoZWR1bGUoKTsKIAl9CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAppbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NAotLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaApAQCAtMTksNiAmIzQzOzE5LDkgQEAKICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpbgogICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay0mZ3Q7bWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMCiYjNDM7ICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1QKICAqLwogZW51bSB7CiAJQ09SRURVTVBfS0VSTkVMCQk9ICgxVUxMICZsdDsmbHQ7IDApLApAQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7CiAJQ09SRURVTVBfUkVDT1JEUwk9ICgxVUxMICZsdDsmbHQ7IDQpLAogCUNPUkVEVU1QX1NQQVJTRQkJPSAoMVVMTCAmbHQ7Jmx0OyA1KSwKIAlDT1JFRFVNUF9NRU1PUllfVFlQRVMJPSAoMVVMTCAmbHQ7Jmx0OyA2KSwKJiM0MzsJQ09SRURVTVBfQ0xPU0VfRklMRVMJPSAoMVVMTCAmbHQ7Jmx0OyA3KSwKIH07CiAKIC8qKgpAQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7CiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dAogICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2YKICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuCiYjNDM7ICoKJiM0MzsgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGUKJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC4KJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS4KICAqLwogc3RydWN0IGNvcmVkdW1wX2FjayB7CiAJX191MzIgc2l6ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKQEAgLTMsNyAmIzQzOzMsOCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0CiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDU5MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2RpcmVudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9maWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTE9DS19GSUxFICYjMzQ7L3RtcC9jb3JlZHVtcC5sb2NrJiMzNDsKJiM0MzsKJiM0MzsvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi8KJiM0MzsjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDQKJiM0MzsKJiM0MzsvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi8KJiM0MztlbnVtIGxvY2tfa2luZCB7CiYjNDM7CUxPQ0tfS0lORF9QT1NJWCwKJiM0MzsJTE9DS19LSU5EX09GRCwKJiM0MzsJTE9DS19LSU5EX0ZMT0NLLAomIzQzO307CiYjNDM7CiYjNDM7LyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovCiYjNDM7ZW51bSBsb2NrX3NoYXJlIHsKJiM0MzsJTE9DS19TSEFSRV9OT05FLAomIzQzOwlMT0NLX1NIQVJFX0RVUCwJCS8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqLwomIzQzOwlMT0NLX1NIQVJFX0ZPUkssCS8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi8KJiM0MzsJTE9DS19TSEFSRV9GSUxFUywJLyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi8KJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHsKJiM0MzsJZW51bSBsb2NrX2tpbmQga2luZDsKJiM0MzsJZW51bSBsb2NrX3NoYXJlIHNoYXJlOwomIzQzOwlib29sIHRocmVhZHM7CiYjNDM7CWJvb2wgY2xvc2U7CQkvKiBhY2sgd2l0aCBDT1JFRFVNUF9DTE9TRV9GSUxFUyAqLwomIzQzOwlib29sIHVzZXJzcGFjZTsJCS8qIENPUkVEVU1QX1VTRVJTUEFDRSBpbnN0ZWFkIG9mIENPUkVEVU1QX0tFUk5FTCAqLwomIzQzOwlib29sIHJlbGVhc2VkOwkJLyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi8KJiM0Mzt9OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7CiYjNDM7CUFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTsKJiM0MzsJQVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybikpOwomIzQzOwomIzQzOwlzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTsKJiM0MzsJQVNTRVJUX0dFKHNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkLCAwKTsKJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlBU1NFUlRfRVEoMCwgcmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTE9DS19GSUxFKTsKJiM0MzsJdW5saW5rKCYjMzQ7L3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi8KJiM0MztzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlzd2l0Y2ggKGtpbmQpIHsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfUE9TSVg6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssICZhbXA7ZmwpOwomIzQzOwljYXNlIExPQ0tfS0lORF9PRkQ6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAmYW1wO2ZsKTsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfRkxPQ0s6CiYjNDM7CQlyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi8KJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHsKJiM0MzsJCWlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHsKJiM0MzsJCQlmbG9jayhmZCwgTE9DS19VTik7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovCiYjNDM7CWlmIChmY250bChmZCwgRl9HRVRMSywgJmFtcDtmbCkgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi8KJiM0MztzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJRElSICpkaXI7CiYjNDM7CWludCBuciA9IDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDsvcHJvYy8lZC9mZCYjMzQ7LCBwaWQpOwomIzQzOwlkaXIgPSBvcGVuZGlyKHBhdGgpOwomIzQzOwlpZiAoIWRpcikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJKmZpcnN0ID0gLTE7CiYjNDM7CXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlpZiAoZGUtJmd0O2RfbmFtZVswXSA9PSAmIzM5Oy4mIzM5OykKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZkID0gYXRvaShkZS0mZ3Q7ZF9uYW1lKTsKJiM0MzsJCWlmICgqZmlyc3QgJmx0OyAwIHx8IGZkICZsdDsgKmZpcnN0KQomIzQzOwkJCSpmaXJzdCA9IGZkOwomIzQzOwkJbnImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGRpcik7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmQKJiM0MzsgKiBvcGVuLCB0aGVuIHJlcG9ydCB0aHJvdWdoIEBmZF9yZXN1bHQgd2hldGhlciBAZmQgaXMgc3RpbGwgb3Blbi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwljaGFyIGM7CiYjNDM7CiYjNDM7CXJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsICZhbXA7YywgMSk7CiYjNDM7CWMgPSBmY250bChmZCwgRl9HRVRGRCkgJmx0OyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OzsKJiM0MzsJd3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgJmFtcDtjLCAxKTsKJiM0MzsJX2V4aXQoRVhJVF9TVUNDRVNTKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi8KJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLAomIzQzOwkJCQkgIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgZmQsIHBpZGZkLCBpOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlpZiAodGFrZV9sb2NrKGZkLCB0LSZndDtraW5kKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CXN3aXRjaCAodC0mZ3Q7c2hhcmUpIHsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX05PTkU6CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX0RVUDoKJiM0MzsJCWlmIChkdXAoZmQpICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GT1JLOgomIzQzOwkJcGlkID0gZm9yaygpOwomIzQzOwkJaWYgKHBpZCAmbHQ7IDApCiYjNDM7CQkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsJCWlmIChwaWQgPT0gMCkKJiM0MzsJCQlob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GSUxFUzoKJiM0MzsJCXBpZCA9IGNyZWF0ZV9jaGlsZCgmYW1wO3BpZGZkLCBDTE9ORV9GSUxFUyk7CiYjNDM7CQlpZiAocGlkICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJaWYgKHBpZCA9PSAwKQomIzQzOwkJCWhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodC0mZ3Q7dGhyZWFkcykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBvbiBwdXJwb3NlICovCiYjNDM7CSoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZQomIzQzOyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlCiYjNDM7ICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcAomIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvcgomIzQzOyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9OwomIzQzOwlzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307CiYjNDM7CWludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7CiYjNDM7CWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CWludCBmZCwgZmlyc3RfZmQsIG5yX2ZkczsKJiM0MzsJX191NjQgbWFzazsKJiM0MzsJc3NpemVfdCBieXRlczsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZF9sb2NrICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwlpZiAoZmRfc2VydmVyICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwljbG9zZShmZF9pcGMpOwomIzQzOwomIzQzOwlmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpOwomIzQzOwlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogYWNjZXB0NCBmYWlsZWQ6ICVtXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTsKJiM0MzsJaWYgKGZkX3BlZXJfcGlkZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCAmYW1wO2luZm8pKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcmVhZF9jb3JlZHVtcF9yZXEgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFjaGVja19jb3JlZHVtcF9yZXEoJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi8KJiM0MzsJaWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LSZndDtraW5kKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgJmFtcDtmaXJzdF9mZCk7CiYjNDM7CWlmIChucl9mZHMgJmx0Oz0gMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbWFzayA9IENPUkVEVU1QX1dBSVQ7CiYjNDM7CW1hc2sgfD0gdC0mZ3Q7dXNlcnNwYWNlID8gQ09SRURVTVBfVVNFUlNQQUNFIDogQ09SRURVTVBfS0VSTkVMOwomIzQzOwlpZiAodC0mZ3Q7Y2xvc2UpCiYjNDM7CQltYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTOwomIzQzOwomIzQzOwlpZiAoIXNlbmRfY29yZWR1bXBfYWNrKGZkX2NvcmVkdW1wLCAmYW1wO3JlcSwgbWFzaywgMCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBzZW5kX2NvcmVkdW1wX2FjayBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCAmYW1wO2MsIDEpOwomIzQzOwlpZiAoYnl0ZXMgIT0gKHQtJmd0O3VzZXJzcGFjZSA/IDAgOiAxKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXG4mIzM0OywgX19mdW5jX18sIGJ5dGVzKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC0mZ3Q7a2luZCkgIT0gIXQtJmd0O3JlbGVhc2VkKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgdC0mZ3Q7cmVsZWFzZWQgPyAmIzM0O3N0aWxsIGhlbGQmIzM0OyA6ICYjMzQ7cmVsZWFzZWQmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsICZhbXA7Zmlyc3RfZmQpOwomIzQzOwlpZiAobnJfZmRzICZsdDsgMCB8fCAhbnJfZmRzICE9IHQtJmd0O2Nsb3NlKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxuJiMzNDssCiYjNDM7CQkJX19mdW5jX18sIG5yX2Zkcyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7CiYjNDM7CWlmICh0LSZndDtjbG9zZSkgewomIzQzOwkJaWYgKGZkICZndDs9IDAgfHwgZXJybm8gIT0gRUJBREYpIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fLCBmZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fKTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqLwomIzQzOwlpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsICZhbXA7aW5mbykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoaW5mby5tYXNrICZhbXA7IFBJREZEX0lORk9fRVhJVCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQljaGFyIGJ1ZmZlcls0MDk2XTsKJiM0MzsKJiM0MzsJCWJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwomIzQzOwkJaWYgKGJ5dGVzICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoYnl0ZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmRfbG9jayAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmRfbG9jayk7CiYjNDM7CWlmIChmZF9wZWVyX3BpZGZkICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9wZWVyX3BpZGZkKTsKJiM0MzsJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9jb3JlZHVtcCk7CiYjNDM7CWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CXJldHVybiBleGl0X2NvZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSwKJiM0MzsJCQkgICBGSVhUVVJFX0RBVEEoY29yZWR1bXApICpzZWxmLAomIzQzOwkJCSAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KQomIzQzO3sKJiM0MzsJaW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdOwomIzQzOwlwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0BAL3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0OykpOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7CiYjNDM7CUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShmZCksIDApOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CQlfZXhpdChjbG9zZV9zZXJ2ZXIodCwgaXBjX3NvY2tldHNbMV0pKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwkvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqLwomIzQzOwlBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UocGlkLCAwKTsKJiM0MzsJaWYgKHBpZCA9PSAwKSB7CiYjNDM7CQljbG9zZShyZWxlYXNlX3BpcGVbMV0pOwomIzQzOwkJY2xvc2UocmVzdWx0X3BpcGVbMF0pOwomIzQzOwkJY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpOwomIzQzOwomIzQzOwkvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovCiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTsKJiM0MzsKJiM0MzsJLyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqLwomIzQzOwlpZiAodC0mZ3Q7c2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtJmd0O3NoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHsKJiM0MzsJCUFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CQlBU1NFUlRfRVEoYywgJiMzOTtPJiMzOTspOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX1BPU0lYLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLnRocmVhZHMgPSB0cnVlLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfT0ZELAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9GTE9DSywKJiM0MzsJCS5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSwKJiM0MzsJCS50aHJlYWRzID0gdHJ1ZSwKJiM0MzsJCS5jbG9zZSA9IHRydWUsCiYjNDM7CQkucmVsZWFzZWQgPSB0cnVlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZHVwKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9EVVAsCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmRfZm9yaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9PRkQsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9zaGFyZWRfdGFibGUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfdXNlcnNwYWNlKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS51c2Vyc3BhY2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsCiYjNDM7CQkudGhyZWFkcyA9IHRydWUsCiYjNDM7CQkuY2xvc2UgPSBmYWxzZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYwppbmRleCBmNWM5YmFkODc1NDYzLi5iZWIxNjc2OThjZmRiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMKQEAgLTIzNzcsNiAmIzQzOzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpCiAJY2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTsKIH0KIAomIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9jbG9zZV9maWxlc19yZWplY3QpCiYjNDM7ewomIzQzOwljaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2VydmVyIGJ1aWx0IHdpdGggdGhlIGZpcnN0IHN0cnVjdHMgcmVhZHMgdGhlIHJlcXVlc3QgaXQga25vd3MsCiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCmluZGV4IDRlMzZlM2U0ZmI3OGYuLjY1MTMyYTBkZWNlZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCkBAIC0xNjEyLDcgJiM0MzsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSwKICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTEwJCQkJCVwKIAkoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwJCQlcCiAJIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfAkJCVwKLQkgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUykKJiM0MzsJIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMgfCBcCiYjNDM7CSBDT1JFRFVNUF9DTE9TRV9GSUxFUykKIAogYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKQogewo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU0OTAKCQkJCQkJCW91dHB1dDogMTc4CgkJCQkJCQl0aG91Z2h0czogNTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZpbGUgRGVzY3JpcHRvciBDbG9zdXJlIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBmZWF0dXJlIHRvIHRoZSBjb3JlZHVtcCBtZWNoYW5pc206IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AuIFdoZW4gc2V0IGluIHRoZSBhY2tub3dsZWRnZW1lbnQgbWFzaywgdGhlIGtlcm5lbCB3aWxsIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjcmFzaGluZyB0YXNrICpiZWZvcmUqIGR1bXBpbmcgdGhlIGNvcmUuIFNtYXJ0LiBFc3NlbnRpYWxseSwgaXQmIzM5O3Mgc3dhcHBpbmcgb3V0IHRoZSBleGlzdGluZyBmaWxlIGRlc2NyaXB0b3IgdGFibGUgZm9yIGFuIGVtcHR5IG9uZS4gVGhpcyBpcyBpbnRlcmVzdGluZy4gTGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMuCgpJIHNlZSBpdCYjMzk7cyB0b3VjaGluZyBzZXZlcmFsIGZpbGVzLiBJbiBgZnMvY29yZWR1bXAuY2AsIHRoZSBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBmdW5jdGlvbiBub3cgY2hlY2tzIGZvciB0aGUgbmV3IGZsYWcsIGFuZCBgZG9fY29yZWR1bXBgIGNhbGxzIGEgbmV3IGZ1bmN0aW9uLCBgY29yZWR1bXBfY2xvc2VfZmlsZXMoKWAuCgpgZnMvZmlsZS5jYCBoYXMgc2VlbiB0aGUgYnVsayBvZiB0aGUgY2hhbmdlcy4gV2UgaGF2ZSBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbGxvY2F0aW5nIHRoZSBuZXcgZW1wdHkgdGFibGUsIGBjbG9zZV9maWxlc2AgYmVpbmcgbW9kaWZpZWQgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHdpdGggYGZpbHBfY2xvc2Vfc3luY2AgZm9yIG5vbi1rZXJuZWwgdGhyZWFkcywgYSBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgdG8gZG8gdGhlIGFjdHVhbCBzd2FwLCBhbmQgdGhlIGtleSBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggYWxsIHRocmVhZHMgaW4gdGhlIGNvcmVkdW1wIHN0YXRlIGFuZCBvcmNoZXN0cmF0ZXMgdGhlIGNsb3N1cmUsIGFsb25nIHdpdGggYSBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgdGhhdCBoYW5kbGVzIGNsZWFudXAgZHVyaW5nIHRocmVhZCBleGl0LgoKVGhleSYjMzk7dmUgYWRkZWQgYGZpbHBfY2xvc2Vfc3luY2AgaW4gYGZzL2ZpbGVfdGFibGUuY2AsIHdoaWNoIGlzIHRoZSBpbW1lZGlhdGUsIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgYGZpbHBfY2xvc2VgLiBUaGF0IG1ha2VzIHNlbnNlOyB3ZSBkb24mIzM5O3Qgd2FudCB0byBkZWZlciBmaWxlIHJlbGVhc2UgaW4gdGhpcyBzY2VuYXJpby4KCkZpbmFsbHksIGBrZXJuZWwvZXhpdC5jYCBub3cgY2FsbHMgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgIGR1cmluZyB0aGUgZXhpdCBwcm9jZXNzLCB3YWl0aW5nIGZvciB0aGUgY29yZWR1bXAgdG8gY29tcGxldGUuCgpOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGhlcmU/IExldCYjMzk7cyBzZWUuLi4gdGhlIGBhbGxvY19maWxlc19zdHJ1Y3RgIHVzZXMgYEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPYCwgc28gaXQmIzM5O3MgaW5pdGlhbGl6ZWQgdG8gemVyby4gVGhlIGBjb3JlZHVtcF9hY2tgIHN0cnVjdCBpbiBgdWFwaS9saW51eC9jb3JlZHVtcC5oYCBoYXNuJiMzOTt0IGNoYW5nZWQgc2l6ZSwgb25seSB0aGUgZW51bSBmb3IgdGhlIGZsYWdzLiBTbywgbm8gbmV3IHVzZXItc3BhY2UgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZyb20gdGhlIGNvZGUsIGl0JiMzOTtzIGFsbCBhYm91dCBmaWxlIGRlc2NyaXB0b3IgdGFibGUgcG9pbnRlcnMsIHN3aXRjaGluZywgYW5kIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycy4gTm90aGluZyBjb21wbGljYXRlZCBpcyBhbGxvY2F0ZWQgdGhhdCBJIGNhbiBzZWUsIGFuZCBub3RoaW5nIG5ldyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gSXQgc2VlbXMgd2VsbCBpc29sYXRlZC4KCkJhc2VkIG9uIHRoaXMsIEkgZG9uJiMzOTt0IHNlZSBhbnkgaW1tZWRpYXRlIHJlYXNvbiB0byBzdXNwZWN0IHRoYXQgS01TQU4gaXMgbmVlZGVkIGhlcmUuIFRoaXMgbW9zdGx5IGRlYWxzIHdpdGggcG9pbnRlcnMgYW5kIGZpbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIEtBU0FOJiMzOTtzIGFuYWx5c2lzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gYW5kIG90aGVycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGxpa2UgdXNlLWFmdGVyLWZyZWUsIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgYnVncyB0aGF0IG1pZ2h0IHNuZWFrIGluIGR1cmluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIG1hbmlwdWxhdGlvbnMuIFRoaXMgbG9va3MgcHJldHR5IHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE3OjU3OjA2LjQ5NTE0NTk1NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxMDExNjA3MjI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDT1JFRFVNUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvcmVkdW1wX2Nsb3NlX2ZpbGVzXCIsXG4gICAgXCJjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzXCIsXG4gICAgXCJ2ZnNfY29yZWR1bXBcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFdoZW4gYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXF1ZXN0cyB0aGlzIGZsYWcsIHRoZSBrZXJuZWwgY2xvc2VzIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlZHVtcC4gVGhpcyBpbnZvbHZlcyBuZXcgY29yZSBrZXJuZWwgbG9naWMgaW4gYGZzL2ZpbGUuY2AgYW5kIGBmcy9jb3JlZHVtcC5jYCB0byBoYW5kbGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIHN3aXRjaGluZyBhbmQgY2xvc2luZy4gVGhlIGZlYXR1cmUgaXMgcmVhY2hhYmxlIGJ5IGNyYXNoaW5nIGEgcHJvY2VzcyBhbmQgaGF2aW5nIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVwbHkgd2l0aCB0aGUgbmV3IGZsYWcsIG1ha2luZyBpdCBmdW5jdGlvbmFsbHkgaW1wYWN0ZnVsIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxNzo1NzowNi40OTUxNTA1MjZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0OTkwNTM5MzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwOTU3ZDAwMGI0NWVhNDY5Y2YyMzRlN2NhZDRjNTcwNTFlYzU0NzE2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDI0IDE3OjU3OjA0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXFxuaW5kZXggZWM5MzU5ZTM4MmVhNS4uYTZlN2RhMGJjMTZhNyAxMDA2NDRcXG4tLS0gYS9mcy9jb3JlZHVtcC5jXFxuKysrIGIvZnMvY29yZWR1bXAuY1xcbkBAIC01MjMsNyArNTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7XFxuIFxcdGludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7XFxuIFxcbi1cXHRpbml0X2NvbXBsZXRpb24oXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZXN0YXJ0dXApO1xcbitcXHRpbml0X2NvbXBsZXRpb24oXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZWRvbmUpO1xcbiBcXHRjb3JlX3N0YXRlLVxcdTAwM2VkdW1wZXIudGFzayA9IHRzaztcXG4gXFx0Y29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQgPSBOVUxMO1xcbiBcXG5AQCAtNTMxLDcgKzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSlcXG4gXFx0aWYgKGNvcmVfd2FpdGVycyBcXHUwMDNlIDApIHtcXG4gXFx0XFx0c3RydWN0IGNvcmVfdGhyZWFkICpwdHI7XFxuIFxcbi1cXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2VzdGFydHVwLFxcbitcXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vkb25lLFxcbiBcXHRcXHRcXHRcXHRcXHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdFxcbkBAIC04MzcsNyArODM3LDggQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcXG4gXFx0XFx0Lm1hc2tcXHRcXHRcXHQ9IENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XFxuIFxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XFxuIFxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8XFxuLVxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTLFxcbitcXHRcXHRcXHRcXHRcXHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXFxuIFxcdFxcdC5zaXplX2Fja1xcdFxcdD0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLFxcbiBcXHRcXHQubWVtb3J5X3R5cGVzXFx0XFx0PSBjcHJtLVxcdTAwM2VtZW1vcnlfdHlwZXMsXFxuIFxcdFxcdC5tZW1vcnlfdHlwZXNfbWFza1xcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcXG5AQCAtOTA1LDYgKzkwNiwxMiBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcdH1cXG4gXFxuK1xcdC8qIEEgcmVqZWN0ZWQgdGFzayBleGl0cyByaWdodCBhd2F5IGFuZCBjbG9zZXMgZXZlcnl0aGluZyBhbnl3YXkuICovXFxuK1xcdGlmICgoYWNrLm1hc2sgXFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXFx1MDAyNlxcdTAwMjYgKGFjay5tYXNrIFxcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xcbitcXHRcXHRjb3JlZHVtcF9zb2NrX21hcmsoY3BybS1cXHUwMDNlZmlsZSwgQ09SRURVTVBfTUFSS19DT05GTElDVElORyk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4gXFx0aWYgKGFjay5tYXNrIFxcdTAwMjYgQ09SRURVTVBfTUVNT1JZX1RZUEVTKSB7XFxuIFxcdFxcdC8qIFRoZSBtZW1vcnkgdHlwZXMgbmVlZCB0aGUgd2hvbGUgZmllbGQuICovXFxuIFxcdFxcdGlmICh1c2l6ZSBcXHUwMDNjIENPUkVEVU1QX0FDS19TSVpFX1ZFUjEpIHtcXG5AQCAtMTIyNSw2ICsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbiBcXHRpZiAoY3BybS1cXHUwMDNlbWFzayBcXHUwMDI2IENPUkVEVU1QX1JFSkVDVClcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4rXFx0aWYgKChjcHJtLVxcdTAwM2VtYXNrIFxcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFxcdTAwMjZcXHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XFxuK1xcdFxcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFxcXCJGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmVcXFwiKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHQvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovXFxuIFxcdC8qIFRoZSBjZWxsIHNwdWZzIGNvcmVkdW1wIGNvZGUgcmVhZHMgdGhlIGZpbGUgZGVzY3JpcHRvciB0YWJsZXMgKi9cXG4gXFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcXG5kaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jXFxuaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDRcXG4tLS0gYS9mcy9maWxlLmNcXG4rKysgYi9mcy9maWxlLmNcXG5AQCAtMzc1LDIxICszNzUsMTUgQEAgc3RhdGljIHVuc2lnbmVkIGludCBzYW5lX2ZkdGFibGVfc2l6ZShzdHJ1Y3QgZmR0YWJsZSAqZmR0LCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNcXG4gXFx0cmV0dXJuIEFMSUdOKGxhc3QgKyAxLCBCSVRTX1BFUl9MT05HKTtcXG4gfVxcbiBcXG4tLypcXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cXG4tICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXFxuLSAqIG9uIGZhaWx1cmUuICBGb3IgJ3B1bmNoX2hvbGUnIHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxcbi0gKi9cXG4tc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcXG4rLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXFxuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXFxuIHtcXG4gXFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcXG4tXFx0c3RydWN0IGZpbGUgKipvbGRfZmRzLCAqKm5ld19mZHM7XFxuLVxcdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xcbi1cXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XFxuK1xcdHN0cnVjdCBmZHRhYmxlICpuZXdfZmR0O1xcbiBcXG4tXFx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTtcXG4rXFx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApO1xcbiBcXHRpZiAoIW5ld2YpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFxuIFxcdGF0b21pY19zZXQoXFx1MDAyNm5ld2YtXFx1MDAzZWNvdW50LCAxKTtcXG4gXFxuQEAgLTQwNCw2ICszOTgsMzkgQEAgc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9cXG4gXFx0bmV3X2ZkdC1cXHUwMDNlZnVsbF9mZHNfYml0cyA9IG5ld2YtXFx1MDAzZWZ1bGxfZmRzX2JpdHNfaW5pdDtcXG4gXFx0bmV3X2ZkdC1cXHUwMDNlZmQgPSBcXHUwMDI2bmV3Zi1cXHUwMDNlZmRfYXJyYXlbMF07XFxuIFxcbitcXHRyZXR1cm4gbmV3ZjtcXG4rfVxcbitcXG4rLyogQW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UuICovXFxuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmO1xcbitcXG4rXFx0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcXG4rXFx0aWYgKCFuZXdmKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXdmLVxcdTAwM2VmZHQsIFxcdTAwMjZuZXdmLVxcdTAwM2VmZHRhYik7XFxuK1xcdHJldHVybiBuZXdmO1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpblxcbisgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcXG4rICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXFxuKyAqL1xcbitzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxcbit7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XFxuK1xcdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xcbitcXHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcXG4rXFx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xcbitcXG4rXFx0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIW5ld2YpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXHRuZXdfZmR0ID0gXFx1MDAyNm5ld2YtXFx1MDAzZWZkdGFiO1xcbitcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZvbGRmLVxcdTAwM2VmaWxlX2xvY2spO1xcbiBcXHRvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTtcXG4gXFx0b3Blbl9maWxlcyA9IHNhbmVfZmR0YWJsZV9zaXplKG9sZF9mZHQsIHB1bmNoX2hvbGUpO1xcbkBAIC00ODAsNiArNTA3LDExIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxcbiBcXHQgKi9cXG4gXFx0c3RydWN0IGZkdGFibGUgKmZkdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoZmlsZXMtXFx1MDAzZWZkdCk7XFxuIFxcdHVuc2lnbmVkIGludCBpLCBqID0gMDtcXG4rXFx0LypcXG4rXFx0ICogQSBrZXJuZWwgdGhyZWFkIHRoYXQgbWlnaHQgYmUgbmVlZGVkIHRvIG1ha2UgcHJvZ3Jlc3Mgb24gc29tZVxcbitcXHQgKiB1bW91bnQgbXVzdCBub3QgcnVuIF9fZnB1dCgpIGl0c2VsZiwgc2VlIF9fZnB1dF9zeW5jKCkuXFxuK1xcdCAqL1xcbitcXHRib29sIHN5bmMgPSAhKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfS1RIUkVBRCk7XFxuIFxcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc2V0O1xcbkBAIC00OTEsNyArNTIzLDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxcbiBcXHRcXHRcXHRpZiAoc2V0IFxcdTAwMjYgMSkge1xcbiBcXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZkdC1cXHUwMDNlZmRbaV07XFxuIFxcdFxcdFxcdFxcdGlmIChmaWxlKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xcbitcXHRcXHRcXHRcXHRcXHRpZiAoc3luYylcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcXG4rXFx0XFx0XFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRcXHRcXHRmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTtcXG4gXFx0XFx0XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0fVxcbkBAIC01MTUsMTYgKzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqL1xcbitzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcylcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGQ7XFxuK1xcbitcXHR0YXNrX2xvY2sodHNrKTtcXG4rXFx0b2xkID0gdHNrLVxcdTAwM2VmaWxlcztcXG4rXFx0aWYgKG9sZCkge1xcbitcXHRcXHRpZiAoZmlsZXMpXFxuK1xcdFxcdFxcdGF0b21pY19pbmMoXFx1MDAyNmZpbGVzLVxcdTAwM2Vjb3VudCk7XFxuK1xcdFxcdHRzay1cXHUwMDNlZmlsZXMgPSBmaWxlcztcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0c2spO1xcbitcXHRpZiAob2xkKVxcbitcXHRcXHRwdXRfZmlsZXNfc3RydWN0KG9sZCk7XFxuK31cXG4rXFxuIHZvaWQgZXhpdF9maWxlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4ge1xcbi1cXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMgPSB0c2stXFx1MDAzZWZpbGVzO1xcbitcXHRpZiAoIXRzay1cXHUwMDNlZmlsZXMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBUaGUgdGhyZWFkLWdyb3VwIGlzIHdhaXRpbmcgaW4gY29yZWR1bXBfdGFza19leGl0KCkuIFdha2UgdGhlbSBhbmRcXG4rICogdGVsbCB0aGVtIHRvIGdldCByaWQgb2YgdGhlaXIgZmlsZXMuXFxuKyAqL1xcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUgPSBjdXJyZW50LVxcdTAwM2VzaWduYWwtXFx1MDAzZWNvcmVfc3RhdGU7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xcbitcXHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xcbitcXHRpbnQgbnIgPSAwO1xcbiBcXG4tXFx0aWYgKGZpbGVzKSB7XFxuLVxcdFxcdHRhc2tfbG9jayh0c2spO1xcbi1cXHRcXHR0c2stXFx1MDAzZWZpbGVzID0gTlVMTDtcXG4tXFx0XFx0dGFza191bmxvY2sodHNrKTtcXG4tXFx0XFx0cHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7XFxuK1xcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XFxuK1xcdGlmICghZmlsZXMpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdC8qIFRhc2tzIHdpdGhvdXQgYSB0YWJsZSwgdmhvc3Qgd29ya2VycyBzYXksIHNpdCB0aGUgc3dpdGNoIG91dC4gKi9cXG4rXFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cXHUwMDNlbmV4dClcXG4rXFx0XFx0aWYgKGN0LVxcdTAwM2V0YXNrLVxcdTAwM2VmaWxlcylcXG4rXFx0XFx0XFx0bnIrKztcXG4rXFx0YXRvbWljX3NldChcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xcbitcXHRyZWluaXRfY29tcGxldGlvbihcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZG9uZSk7XFxuK1xcbitcXHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVxcdTAwM2VuZXh0KSB7XFxuK1xcdFxcdGlmICghY3QtXFx1MDAzZXRhc2stXFx1MDAzZWZpbGVzKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXFxuK1xcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZjdC1cXHUwMDNlZmlsZXMsIGZpbGVzKTtcXG4rXFx0XFx0d2FrZV91cF9wcm9jZXNzKGN0LVxcdTAwM2V0YXNrKTtcXG4gXFx0fVxcbitcXG4rXFx0LyogVGhlIGR1bXBlcidzIHN1YmplY3RpdmUgY3JlZHMgYXJlIHRoZSBkdW1wJ3MsIG5vdCBpdHMgb3duLiAqL1xcbitcXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxcbitcXHRcXHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcXG4rXFxuK1xcdGlmIChucikge1xcbitcXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vkb25lLFxcbitcXHRcXHRcXHRcXHRcXHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcXG4rXFx0XFx0LyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi9cXG4rXFx0XFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cXHUwMDNlbmV4dClcXG4rXFx0XFx0XFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVxcdTAwM2V0YXNrLCBUQVNLX0FOWSk7XFxuK1xcdH1cXG4rXFxuK1xcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLypcXG4rICogR2V0IHJpZCBvZiB0aGUgZmlsZXMgYW5kIHN3aXRjaCB0byB0aGUgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlXFxuKyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQncyBjb3JlX3RocmVhZCBlbnRyeS5cXG4rICovXFxuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuK3tcXG4rXFx0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xcbitcXG4rXFx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xcbitcXHRmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnNlbGYtXFx1MDAzZWZpbGVzKTtcXG4rXFx0aWYgKCFmaWxlcyB8fCAhY3VycmVudC1cXHUwMDNlZmlsZXMgfHwgY3VycmVudC1cXHUwMDNlZmlsZXMgPT0gZmlsZXMpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcXG4rXFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XFxuK1xcdGNvcmVfc3RhdGUgPSBjdXJyZW50LVxcdTAwM2VzaWduYWwtXFx1MDAzZWNvcmVfc3RhdGU7XFxuK1xcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vucl90aHJlYWRzKSlcXG4rXFx0XFx0Y29tcGxldGUoXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZWRvbmUpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4gfVxcbiBcXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xcbmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmNcXG5pbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NFxcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xcbisrKyBiL2ZzL2ZpbGVfdGFibGUuY1xcbkBAIC0xMyw2ICsxMyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9maWxlbG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZG5vdGlmeS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2VjdXJpdHkuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V2ZW50cG9sbC5oXFx1MDAzZVxcbkBAIC02MDYsMTUgKzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxcbiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTtcXG4gXFxuIC8qXFxuLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3RcXG4tICogcmVmZXJlbmNlLlxcbi0gKlxcbi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXFxuKyAqIFxcXCJpZFxcXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxcbisgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cXG4gICovXFxuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxcbitzdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXFxuIHtcXG4tXFx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXFx1MDAyNmZpbGUtXFx1MDAzZWZfcmVmKSkpXFxuLVxcdFxcdF9fZnB1dChmaWxlKTtcXG4rXFx0aW50IHJldHZhbCA9IDA7XFxuK1xcbitcXHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcXG4rXFx0XFx0XFx0XFxcIlZGUzogQ2xvc2U6IGZpbGUgY291bnQgaXMgMCAoZl9vcD0lcHMpXFxcIixcXG4rXFx0XFx0XFx0ZmlscC1cXHUwMDNlZl9vcCkpIHtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmaWxwLVxcdTAwM2VmX29wLVxcdTAwM2VmbHVzaClcXG4rXFx0XFx0cmV0dmFsID0gZmlscC1cXHUwMDNlZl9vcC1cXHUwMDNlZmx1c2goZmlscCwgaWQpO1xcbitcXG4rXFx0aWYgKGxpa2VseSghKGZpbHAtXFx1MDAzZWZfbW9kZSBcXHUwMDI2IEZNT0RFX1BBVEgpKSkge1xcbitcXHRcXHRkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTtcXG4rXFx0XFx0bG9ja3NfcmVtb3ZlX3Bvc2l4KGZpbHAsIGlkKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gcmV0dmFsO1xcbit9XFxuK1xcbitpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcXG4re1xcbitcXHRpbnQgcmV0dmFsO1xcbitcXG4rXFx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XFxuK1xcdGZwdXRfY2xvc2UoZmlscCk7XFxuK1xcbitcXHRyZXR1cm4gcmV0dmFsO1xcbit9XFxuK0VYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XFxuK1xcbisvKlxcbisgKiBMaWtlIGZpbHBfY2xvc2UoKSBidXQgd2l0aG91dCBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgdGhlIGxhc3RcXG4rICogcmVmZXJlbmNlLCBzZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXFxuKyAqL1xcbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbit7XFxuK1xcdGludCByZXR2YWw7XFxuK1xcbitcXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTtcXG4rXFx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXFx1MDAyNmZpbHAtXFx1MDAzZWZfcmVmKSkpXFxuK1xcdFxcdF9fZnB1dChmaWxwKTtcXG4rXFxuK1xcdHJldHVybiByZXR2YWw7XFxuIH1cXG4gXFxuIC8qXFxuZGlmZiAtLWdpdCBhL2ZzL2ludGVybmFsLmggYi9mcy9pbnRlcm5hbC5oXFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcXG4tLS0gYS9mcy9pbnRlcm5hbC5oXFxuKysrIGIvZnMvaW50ZXJuYWwuaFxcbkBAIC0xMjcsNyArMTI3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gXFx0fVxcbiB9XFxuIFxcbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTtcXG4raW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XFxuIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTtcXG4gXFxuIC8qXFxuQEAgLTE5MCw2ICsxOTAsNyBAQCBzdHJ1Y3Qgb3Blbl9mbGFncyB7XFxuIFxcdGludCBpbnRlbnQ7XFxuIFxcdGludCBsb29rdXBfZmxhZ3M7XFxuIH07XFxuK1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLFxcbiBcXHRcXHRjb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApO1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3Blbl9yb290KGNvbnN0IHN0cnVjdCBwYXRoICosXFxuZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uY1xcbmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0XFxuLS0tIGEvZnMvb3Blbi5jXFxuKysrIGIvZnMvb3Blbi5jXFxuQEAgLTE0NTMsNDEgKzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxcbiB9XFxuICNlbmRpZlxcbiBcXG4tLypcXG4tICogXFxcImlkXFxcIiBpcyB0aGUgUE9TSVggdGhyZWFkIElELiBXZSB1c2UgdGhlXFxuLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxcbi0gKi9cXG4tc3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbi17XFxuLVxcdGludCByZXR2YWwgPSAwO1xcbi1cXG4tXFx0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXFxuLVxcdFxcdFxcdFxcXCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVxcXCIsXFxuLVxcdFxcdFxcdGZpbHAtXFx1MDAzZWZfb3ApKSB7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuLVxcbi1cXHRpZiAoZmlscC1cXHUwMDNlZl9vcC1cXHUwMDNlZmx1c2gpXFxuLVxcdFxcdHJldHZhbCA9IGZpbHAtXFx1MDAzZWZfb3AtXFx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcXG4tXFxuLVxcdGlmIChsaWtlbHkoIShmaWxwLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcXG4tXFx0XFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XFxuLVxcdFxcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XFxuLVxcdH1cXG4tXFx0cmV0dXJuIHJldHZhbDtcXG4tfVxcbi1cXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXFxuLXtcXG4tXFx0aW50IHJldHZhbDtcXG4tXFxuLVxcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xcbi1cXHRmcHV0X2Nsb3NlKGZpbHApO1xcbi1cXG4tXFx0cmV0dXJuIHJldHZhbDtcXG4tfVxcbi1FWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xcbi1cXG4gLypcXG4gICogQ2FyZWZ1bCBoZXJlISBXZSB0ZXN0IHdoZXRoZXIgdGhlIGZpbGUgcG9pbnRlciBpcyBOVUxMIGJlZm9yZVxcbiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4ndCByZWxlYXNlXFxuQEAgLTE1MDIsMTMgKzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxcbiBcXHRpZiAoIWZpbGUpXFxuIFxcdFxcdHJldHVybiAtRUJBREY7XFxuIFxcbi1cXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXFx1MDAzZWZpbGVzKTtcXG4tXFxuIFxcdC8qXFxuIFxcdCAqIFdlJ3JlIHJldHVybmluZyB0byB1c2VyIHNwYWNlLiBEb24ndCBib3RoZXJcXG4gXFx0ICogd2l0aCBhbnkgZGVsYXllZCBmcHV0KCkgY2FzZXMuXFxuIFxcdCAqL1xcbi1cXHRmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7XFxuK1xcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVxcdTAwM2VmaWxlcyk7XFxuIFxcbiBcXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcXG5pbmRleCBjNDUzMDZhOWYwMDcyLi5mMGMxMDAzZGE4Y2U4IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcXG5AQCAtOTksMTEgKzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsXFxuIFxcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XFxuIFxcbitzdHJ1Y3QgY29yZV90aHJlYWQ7XFxuK1xcbiB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZnMpO1xcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xcbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTtcXG4gaW50IHVuc2hhcmVfZmlsZXModm9pZCk7XFxuIHN0cnVjdCBmZF9yYW5nZSB7XFxuIFxcdHVuc2lnbmVkIGludCBmcm9tLCB0bztcXG4gfTtcXG4rXFxuIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHN0cnVjdCBmZF9yYW5nZSAqKSBfX2xhdGVudF9lbnRyb3B5O1xcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcXG4gaW50IGl0ZXJhdGVfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCB1bnNpZ25lZCxcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXFxuQEAgLTc2LDEyICs3NiwxNSBAQCBzdHJ1Y3QgbXVsdGlwcm9jZXNzX3NpZ25hbHMge1xcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDtcXG4rXFx0LyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi9cXG4rXFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XFxuIH07XFxuIFxcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XFxuIFxcdGF0b21pY190IG5yX3RocmVhZHM7XFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCBkdW1wZXI7XFxuLVxcdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XFxuK1xcdC8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqL1xcbitcXHRzdHJ1Y3QgY29tcGxldGlvbiBkb25lO1xcbiB9O1xcbiBcXG4gLypcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbkBAIC0xOSw2ICsxOSw5IEBAXFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXBfYWNrLVxcdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxcbisgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcXG4rICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXFxuICAqL1xcbiBlbnVtIHtcXG4gXFx0Q09SRURVTVBfS0VSTkVMXFx0XFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKSxcXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcXG4gXFx0Q09SRURVTVBfUkVDT1JEU1xcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNCksXFxuIFxcdENPUkVEVU1QX1NQQVJTRVxcdFxcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNSksXFxuIFxcdENPUkVEVU1QX01FTU9SWV9UWVBFU1xcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNiksXFxuK1xcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA3KSxcXG4gfTtcXG4gXFxuIC8qKlxcbkBAIC0xMzcsNiArMTQxLDEwIEBAIGVudW0ge1xcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbid0XFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXFxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXFxuKyAqXFxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxcbisgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cXG4rICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXFxuICAqL1xcbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcXG4gXFx0X191MzIgc2l6ZTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmNcXG5pbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9leGl0LmNcXG4rKysgYi9rZXJuZWwvZXhpdC5jXFxuQEAgLTI1LDYgKzI1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FjY3QuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RzYWNjdF9rZXJuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9maWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mZHRhYmxlLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcmVlemVyLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaW5mbXRzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9uc3Byb3h5LmhcXHUwMDNlXFxuQEAgLTQzMiw2ICs0MzMsNyBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCBzZWxmO1xcbiBcXG4gXFx0c2VsZi50YXNrID0gdHNrO1xcbitcXHRzZWxmLmZpbGVzID0gTlVMTDtcXG4gXFx0aWYgKHNlbGYudGFzay1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9TSUdOQUxFRClcXG4gXFx0XFx0c2VsZi5uZXh0ID0geGNoZyhcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQsIFxcdTAwMjZzZWxmKTtcXG4gXFx0ZWxzZVxcbkBAIC00NDEsMTIgKzQ0MywxNSBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuIFxcdCAqIHRvIGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5cXG4gXFx0ICovXFxuIFxcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vucl90aHJlYWRzKSlcXG4tXFx0XFx0Y29tcGxldGUoXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZXN0YXJ0dXApO1xcbitcXHRcXHRjb21wbGV0ZShcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZG9uZSk7XFxuIFxcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSURMRXxUQVNLX0ZSRUVaQUJMRSk7XFxuIFxcdFxcdGlmICghc2VsZi50YXNrKSAvKiBzZWUgY29yZWR1bXBfZmluaXNoKCkgKi9cXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdC8qIHNlZSBjb3JlZHVtcF9jbG9zZV9maWxlcygpICovXFxuK1xcdFxcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFxcdTAwMjZzZWxmKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdHNjaGVkdWxlKCk7XFxuIFxcdH1cXG4gXFx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xcbmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcXG4tLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXFxuQEAgLTE5LDYgKzE5LDkgQEBcXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXFxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXFx1MDAzZW1lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzXFxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcXG4rICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcXG4gICovXFxuIGVudW0ge1xcbiBcXHRDT1JFRFVNUF9LRVJORUxcXHRcXHQ9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIDApLFxcbkBAIC0yOCw2ICszMSw3IEBAIGVudW0ge1xcbiBcXHRDT1JFRFVNUF9SRUNPUkRTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA0KSxcXG4gXFx0Q09SRURVTVBfU1BBUlNFXFx0XFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA1KSxcXG4gXFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA2KSxcXG4rXFx0Q09SRURVTVBfQ0xPU0VfRklMRVNcXHQ9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIDcpLFxcbiB9O1xcbiBcXG4gLyoqXFxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XFxuICAqIE5vdGUgdGhhdCBAbWVtb3J5X3R5cGVzIG11c3QgYmUgemVybyBpZiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgaXNuJ3RcXG4gICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2ZcXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cXG4rICpcXG4rICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXFxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxcbisgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cXG4gICovXFxuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xcbiBcXHRfX3UzMiBzaXplO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuQEAgLTMsNyArMyw4IEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxcbiBcXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbiBcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXFxcXG4tXFx0XFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxcbitcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG4rXFx0XFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XFxuIFRFU1RfRklMRVMgOj0gc3RhY2tkdW1wXFxuIFxcbiBpbmNsdWRlIC4uL2xpYi5ta1xcbkBAIC0xMSwzICsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXFxuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuKyQoT1VUUFVUKS9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdhNDE5MDZiNDY5NTJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXFxuQEAgLTAsMCArMSw1OTIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NkaXJlbnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zb2NrZXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNvcmVkdW1wX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgTE9DS19GSUxFIFxcXCIvdG1wL2NvcmVkdW1wLmxvY2tcXFwiXFxuK1xcbisvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi9cXG4rI2RlZmluZSBOVU1fQ0xPU0VfVEhSRUFEUyA0XFxuK1xcbisvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi9cXG4rZW51bSBsb2NrX2tpbmQge1xcbitcXHRMT0NLX0tJTkRfUE9TSVgsXFxuK1xcdExPQ0tfS0lORF9PRkQsXFxuK1xcdExPQ0tfS0lORF9GTE9DSyxcXG4rfTtcXG4rXFxuKy8qIFdobyBlbHNlIGhhcyBhIGhhbmRsZSBvbiB0aGUgbG9jayB3aGVuIHRoZSBjaGlsZCBjcmFzaGVzLiAqL1xcbitlbnVtIGxvY2tfc2hhcmUge1xcbitcXHRMT0NLX1NIQVJFX05PTkUsXFxuK1xcdExPQ0tfU0hBUkVfRFVQLFxcdFxcdC8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJ3Mgb3duIHRhYmxlICovXFxuK1xcdExPQ0tfU0hBUkVfRk9SSyxcXHQvKiBhIGZvcmtlZCBwcm9jZXNzIGtlZXBzIHRoZSBmZCBvcGVuICovXFxuK1xcdExPQ0tfU0hBUkVfRklMRVMsXFx0LyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi9cXG4rfTtcXG4rXFxuK3N0cnVjdCBjbG9zZV90ZXN0IHtcXG4rXFx0ZW51bSBsb2NrX2tpbmQga2luZDtcXG4rXFx0ZW51bSBsb2NrX3NoYXJlIHNoYXJlO1xcbitcXHRib29sIHRocmVhZHM7XFxuK1xcdGJvb2wgY2xvc2U7XFx0XFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cXG4rXFx0Ym9vbCB1c2Vyc3BhY2U7XFx0XFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXFxuK1xcdGJvb2wgcmVsZWFzZWQ7XFx0XFx0LyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi9cXG4rfTtcXG4rXFxuK0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXFxuK3tcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwiclxcXCIpO1xcbitcXHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XFxuK1xcbitcXHRyZXQgPSBmcmVhZChzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsIHNpemVvZihzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcXG4rXFx0QVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpO1xcbitcXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XFxuK1xcbitcXHRzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICdcXFxcMCc7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gY3JlYXRlX2RldGFjaGVkX3RtcGZzKCk7XFxuK1xcdEFTU0VSVF9HRShzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XFxuK1xcbitcXHRyZXQgPSBmY2xvc2UoZmlsZSk7XFxuK1xcdEFTU0VSVF9FUSgwLCByZXQpO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnJlYXNvbjtcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldCwgc3RhdHVzO1xcbitcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XFxuK1xcdFxcdHdhaXRwaWQoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdH1cXG4rXFx0dW5saW5rKExPQ0tfRklMRSk7XFxuK1xcdHVubGluayhcXFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcXFwiKTtcXG4rXFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZpbGUpIHtcXG4rXFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVyblxcXCI7XFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gZnByaW50ZihmaWxlLCBcXFwiJXNcXFwiLCBzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbitcXHRcXHRyZWFzb24gPSBcXFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblxcXCI7XFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gZmNsb3NlKGZpbGUpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoc2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRyZXQgPSBjbG9zZShzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gY2xvc2UgZGV0YWNoZWQgdG1wZnNcXFwiO1xcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0c2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuO1xcbitmYWlsOlxcbitcXHQvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi9cXG4rXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcXFxuXFxcIiwgcmVhc29uKTtcXG4rfVxcbitcXG4rLyogV3JpdGUtbG9jayBAZmQgdGhlIHdheSBAa2luZCBzYXlzLiAqL1xcbitzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXFxuK3tcXG4rXFx0c3RydWN0IGZsb2NrIGZsID0ge1xcbitcXHRcXHQubF90eXBlID0gRl9XUkxDSyxcXG4rXFx0XFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXFxuK1xcdH07XFxuK1xcbitcXHRzd2l0Y2ggKGtpbmQpIHtcXG4rXFx0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XFxuK1xcdFxcdHJldHVybiBmY250bChmZCwgRl9TRVRMSywgXFx1MDAyNmZsKTtcXG4rXFx0Y2FzZSBMT0NLX0tJTkRfT0ZEOlxcbitcXHRcXHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcXHUwMDI2ZmwpO1xcbitcXHRjYXNlIExPQ0tfS0lORF9GTE9DSzpcXG4rXFx0XFx0cmV0dXJuIGZsb2NrKGZkLCBMT0NLX0VYKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbisvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xcbitzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXFxuK3tcXG4rXFx0c3RydWN0IGZsb2NrIGZsID0ge1xcbitcXHRcXHQubF90eXBlID0gRl9XUkxDSyxcXG4rXFx0XFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXFxuK1xcdH07XFxuK1xcbitcXHRpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHtcXG4rXFx0XFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xcbitcXHRcXHRcXHRmbG9jayhmZCwgTE9DS19VTik7XFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJldHVybiBlcnJubyA9PSBFV09VTERCTE9DSyA/IDEgOiAtMTtcXG4rXFx0fVxcbitcXG4rXFx0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXFxuK1xcdGlmIChmY250bChmZCwgRl9HRVRMSywgXFx1MDAyNmZsKSBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xcbit9XFxuK1xcbisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXFxuK3N0YXRpYyBpbnQgY291bnRfZmRzKHBpZF90IHBpZCwgaW50ICpmaXJzdClcXG4re1xcbitcXHRjaGFyIHBhdGhbNjRdO1xcbitcXHRzdHJ1Y3QgZGlyZW50ICpkZTtcXG4rXFx0RElSICpkaXI7XFxuK1xcdGludCBuciA9IDA7XFxuK1xcbitcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIvcHJvYy8lZC9mZFxcXCIsIHBpZCk7XFxuK1xcdGRpciA9IG9wZW5kaXIocGF0aCk7XFxuK1xcdGlmICghZGlyKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHQqZmlyc3QgPSAtMTtcXG4rXFx0d2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHtcXG4rXFx0XFx0aW50IGZkO1xcbitcXG4rXFx0XFx0aWYgKGRlLVxcdTAwM2VkX25hbWVbMF0gPT0gJy4nKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0ZmQgPSBhdG9pKGRlLVxcdTAwM2VkX25hbWUpO1xcbitcXHRcXHRpZiAoKmZpcnN0IFxcdTAwM2MgMCB8fCBmZCBcXHUwMDNjICpmaXJzdClcXG4rXFx0XFx0XFx0KmZpcnN0ID0gZmQ7XFxuK1xcdFxcdG5yKys7XFxuK1xcdH1cXG4rXFx0Y2xvc2VkaXIoZGlyKTtcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbisvKlxcbisgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmRcXG4rICogb3BlbiwgdGhlbiByZXBvcnQgdGhyb3VnaCBAZmRfcmVzdWx0IHdoZXRoZXIgQGZkIGlzIHN0aWxsIG9wZW4uXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpXFxuK3tcXG4rXFx0Y2hhciBjO1xcbitcXG4rXFx0cmVhZF9ub2ludHIoZmRfcmVsZWFzZSwgXFx1MDAyNmMsIDEpO1xcbitcXHRjID0gZmNudGwoZmQsIEZfR0VURkQpIFxcdTAwM2MgMCA/ICdDJyA6ICdPJztcXG4rXFx0d3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgXFx1MDAyNmMsIDEpO1xcbitcXHRfZXhpdChFWElUX1NVQ0NFU1MpO1xcbit9XFxuK1xcbisvKiBMb2NrIExPQ0tfRklMRSwgc2hhcmUgaXQgYXMgcmVxdWVzdGVkLCB0aGVuIGNyYXNoLiAqL1xcbitzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxcbitcXHRcXHRcXHRcXHQgIGludCBmZF9yZXN1bHQpXFxuK3tcXG4rXFx0cHRocmVhZF90IHRocmVhZDtcXG4rXFx0aW50IGZkLCBwaWRmZCwgaTtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFxuK1xcdGlmICh0YWtlX2xvY2soZmQsIHQtXFx1MDAzZWtpbmQpKVxcbitcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXG4rXFx0c3dpdGNoICh0LVxcdTAwM2VzaGFyZSkge1xcbitcXHRjYXNlIExPQ0tfU0hBUkVfTk9ORTpcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTE9DS19TSEFSRV9EVVA6XFxuK1xcdFxcdGlmIChkdXAoZmQpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTE9DS19TSEFSRV9GT1JLOlxcbitcXHRcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdFxcdGlmIChwaWQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXHRcXHRpZiAocGlkID09IDApXFxuK1xcdFxcdFxcdGhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIExPQ0tfU0hBUkVfRklMRVM6XFxuK1xcdFxcdHBpZCA9IGNyZWF0ZV9jaGlsZChcXHUwMDI2cGlkZmQsIENMT05FX0ZJTEVTKTtcXG4rXFx0XFx0aWYgKHBpZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdF9leGl0KEVYSVRfRkFJTFVSRSk7XFxuK1xcdFxcdGlmIChwaWQgPT0gMClcXG4rXFx0XFx0XFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0LVxcdTAwM2V0aHJlYWRzKVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlVNX0NMT1NFX1RIUkVBRFM7IGkrKylcXG4rXFx0XFx0XFx0cHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZCwgTlVMTCwgZG9fbm90aGluZywgTlVMTCk7XFxuK1xcbitcXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXFxuK1xcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFNlcnZlIG9uZSBjb3JlZHVtcCBhbmQgbG9vayBhdCB0aGUgdGFzayBvbiB0aGUgd2F5LiBCZWZvcmUgdGhlIGFjayB0aGVcXG4rICogbG9jayBpcyBoZWxkIGFuZCB0aGUgZGVzY3JpcHRvcnMgYXJlIHRoZXJlLiBPbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGVcXG4rICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcFxcbisgKiBvciBiZWZvcmUgdGhlIGhhbmd1cCBpbiB1c2Vyc3BhY2UgbW9kZSwgdGhleSBhcmUgZ29uZSBpZiB3ZSBhc2tlZCBmb3JcXG4rICogaXQgYW5kIHRoZSBsb2NrIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgY2xvc2Vfc2VydmVyKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfaXBjKVxcbit7XFxuK1xcdHN0cnVjdCBjb3JlZHVtcF9yZXEgcmVxID0ge307XFxuK1xcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9wZWVyX3BpZGZkID0gLTEsIGZkX2xvY2sgPSAtMTtcXG4rXFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcXG4rXFx0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xcbitcXHRfX3U2NCBtYXNrO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XFxuK1xcdGlmIChmZF9sb2NrIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBvcGVuIGxvY2sgZmlsZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChcXFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcXFwiKTtcXG4rXFx0aWYgKGZkX3NlcnZlciBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQgZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHdyaXRlX25vaW50cihmZF9pcGMsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmRfaXBjKTtcXG4rXFxuK1xcdGZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7XFxuK1xcdGlmIChmZF9jb3JlZHVtcCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogYWNjZXB0NCBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xcbitcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFxcdTAwMjZpbmZvKSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcmVhZF9jb3JlZHVtcF9yZXEoZmRfY29yZWR1bXAsIFxcdTAwMjZyZXEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlYWRfY29yZWR1bXBfcmVxIGZhaWxlZFxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXFx1MDAyNnJlcSkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIHRhc2sgd2FpdHMgZm9yIG91ciBhbnN3ZXIgd2l0aCBldmVyeXRoaW5nIHN0aWxsIGluIHBsYWNlLiAqL1xcbitcXHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXFx1MDAzZWtpbmQpICE9IDEpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0bnJfZmRzID0gY291bnRfZmRzKGluZm8ucGlkLCBcXHUwMDI2Zmlyc3RfZmQpO1xcbitcXHRpZiAobnJfZmRzIFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbm8gZGVzY3JpcHRvcnMgZHVyaW5nIHRoZSBoYW5kc2hha2VcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGhhbmRzaGFrZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdG1hc2sgPSBDT1JFRFVNUF9XQUlUO1xcbitcXHRtYXNrIHw9IHQtXFx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcXG4rXFx0aWYgKHQtXFx1MDAzZWNsb3NlKVxcbitcXHRcXHRtYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTO1xcbitcXG4rXFx0aWYgKCFzZW5kX2NvcmVkdW1wX2FjayhmZF9jb3JlZHVtcCwgXFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogcmVhZF9tYXJrZXIgQ09SRURVTVBfTUFSS19SRVFBQ0sgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCBcXHUwMDI2YywgMSk7XFxuK1xcdGlmIChieXRlcyAhPSAodC1cXHUwMDNldXNlcnNwYWNlID8gMCA6IDEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXywgYnl0ZXMpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVxcdTAwM2VraW5kKSAhPSAhdC1cXHUwMDNlcmVsZWFzZWQpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRfX2Z1bmNfXywgdC1cXHUwMDNlcmVsZWFzZWQgPyBcXFwic3RpbGwgaGVsZFxcXCIgOiBcXFwicmVsZWFzZWRcXFwiKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXFx1MDAyNmZpcnN0X2ZkKTtcXG4rXFx0aWYgKG5yX2ZkcyBcXHUwMDNjIDAgfHwgIW5yX2ZkcyAhPSB0LVxcdTAwM2VjbG9zZSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiAlZCBkZXNjcmlwdG9ycyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRfX2Z1bmNfXywgbnJfZmRzKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcXG4rXFx0aWYgKHQtXFx1MDAzZWNsb3NlKSB7XFxuK1xcdFxcdGlmIChmZCBcXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHBpZGZkX2dldGZkIGFmdGVyIHRoZSBjbG9zZSByZXR1cm5lZCAlZDogJW1cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdF9fZnVuY19fLCBmZCk7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBjb3JlZHVtcCBmYWlsZWQ6ICVtXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRfX2Z1bmNfXyk7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQ09SRURVTVBfV0FJVCBrZWVwcyB0aGUgdGFzayBhcm91bmQgdW50aWwgd2UgaGFuZyB1cC4gKi9cXG4rXFx0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcXHUwMDI2aW5mbykpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoaW5mby5tYXNrIFxcdTAwMjYgUElERkRfSU5GT19FWElUKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0Y2hhciBidWZmZXJbNDA5Nl07XFxuK1xcbitcXHRcXHRieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTtcXG4rXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChieXRlcyA9PSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xcbitvdXQ6XFxuK1xcdGlmIChmZF9sb2NrIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkX2xvY2spO1xcbitcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcXG4rXFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkX2NvcmVkdW1wKTtcXG4rXFx0aWYgKGZkX3NlcnZlciBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZF9zZXJ2ZXIpO1xcbitcXHRyZXR1cm4gZXhpdF9jb2RlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fY2xvc2VfdGVzdChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEsXFxuK1xcdFxcdFxcdCAgIEZJWFRVUkVfREFUQShjb3JlZHVtcCkgKnNlbGYsXFxuK1xcdFxcdFxcdCAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KVxcbit7XFxuK1xcdGludCBmZCwgc3RhdHVzLCBpcGNfc29ja2V0c1syXSwgcmVsZWFzZV9waXBlWzJdLCByZXN1bHRfcGlwZVsyXTtcXG4rXFx0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFxcXCJAQC90bXAvY29yZWR1bXAuc29ja2V0XFxcIikpO1xcbitcXG4rXFx0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2NDQpO1xcbitcXHRBU1NFUlRfR0UoZmQsIDApO1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCBpcGNfc29ja2V0cyksIDApO1xcbitcXG4rXFx0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xcbitcXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcXG4rXFx0XFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XFxuK1xcdH1cXG4rXFx0c2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XFxuK1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcXG4rXFx0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCBcXHUwMDI2YywgMSksIDEpO1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcXG4rXFxuK1xcdC8qIE9ubHkgdGhlIGNyYXNoaW5nIGNoaWxkIGFuZCB3aGF0IGl0IHNwYXducyBzZWUgdGhlc2UgcGlwZXMuICovXFxuK1xcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xcbitcXHRBU1NFUlRfRVEocGlwZTIocmVzdWx0X3BpcGUsIE9fQ0xPRVhFQyksIDApO1xcbitcXG4rXFx0cGlkID0gZm9yaygpO1xcbitcXHRBU1NFUlRfR0UocGlkLCAwKTtcXG4rXFx0aWYgKHBpZCA9PSAwKSB7XFxuK1xcdFxcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XFxuK1xcdFxcdGNsb3NlKHJlc3VsdF9waXBlWzBdKTtcXG4rXFx0XFx0Y3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pO1xcbitcXHR9XFxuK1xcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7XFxuK1xcbitcXHR3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xcbitcXHRBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7XFxuK1xcbitcXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcXG4rXFxuK1xcdC8qIExldCB0aGUgcHJvY2VzcyBob2xkaW5nIHRoZSBzaGFyZWQgbG9jayBnby4gKi9cXG4rXFx0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVsxXSksIDApO1xcbitcXG4rXFx0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xcbitcXHRpZiAodC1cXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtXFx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHtcXG4rXFx0XFx0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKHJlc3VsdF9waXBlWzBdLCBcXHUwMDI2YywgMSksIDEpO1xcbitcXHRcXHRBU1NFUlRfRVEoYywgJ08nKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMF0pLCAwKTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxcbitcXHRcXHQudGhyZWFkcyA9IHRydWUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxcbitcXHRcXHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxcbitcXHRcXHQudGhyZWFkcyA9IHRydWUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXFxuK1xcdFxcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRFVQLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSB0cnVlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSB0cnVlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSBmYWxzZSxcXG4rXFx0fTtcXG4rXFxuK1xcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXFx1MDAyNnQpO1xcbit9XFxuK1xcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XFxuK1xcdFxcdC5raW5kID0gTE9DS19LSU5EX09GRCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSBmYWxzZSxcXG4rXFx0fTtcXG4rXFxuK1xcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXFx1MDAyNnQpO1xcbit9XFxuK1xcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GSUxFUyxcXG4rXFx0XFx0LmNsb3NlID0gdHJ1ZSxcXG4rXFx0XFx0LnJlbGVhc2VkID0gZmFsc2UsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXFxuK1xcdFxcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcXG4rXFx0XFx0LmNsb3NlID0gdHJ1ZSxcXG4rXFx0XFx0LnVzZXJzcGFjZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19ub3RfcmVxdWVzdGVkKVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XFxuK1xcdFxcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxcbitcXHRcXHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXFxuK1xcdFxcdC50aHJlYWRzID0gdHJ1ZSxcXG4rXFx0XFx0LmNsb3NlID0gZmFsc2UsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IGZhbHNlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfSEFSTkVTU19NQUlOXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXFxuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xcbkBAIC0yMzc3LDYgKzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpXFxuIFxcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1VTRVJTUEFDRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUyk7XFxuIH1cXG4gXFxuKy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovXFxuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxcbit7XFxuK1xcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX0NMT1NFX0ZJTEVTKTtcXG4rfVxcbitcXG4gLypcXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcXG4gICogZGlzY2FyZHMgdGhlIHJlc3QgYW5kIGFja3Mgd2l0aCB0aGUgYWNrIGl0IGtub3dzLiBJdCByYWlzZXMgbm90aGluZ1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuQEAgLTE2MTIsNyArMTYxMiw4IEBAIGJvb2wgc2VuZF9jb3JlZHVtcF9hY2soaW50IGZkLCBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEsXFxuICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTExcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdChDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFxcdFxcdFxcdFxcXFxcXG4gXFx0IENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFxcdFxcdFxcdFxcXFxcXG4tXFx0IENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpXFxuK1xcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcXFxcbitcXHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXFxuIFxcbiBib29sIGNoZWNrX2NvcmVkdW1wX3JlcShjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTc6NTc6MDcuOTk0ODk0ODk0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Njk4MDU4Njk0MjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNPUkVEVU1QXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiY29yZWR1bXBfY2xvc2VfZmlsZXNcIixcbiAgICBcImNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNcIixcbiAgICBcInZmc19jb3JlZHVtcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXG5pbmRleCBlYzkzNTllMzgyZWE1Li5hNmU3ZGEwYmMxNmE3IDEwMDY0NFxuLS0tIGEvZnMvY29yZWR1bXAuY1xuKysrIGIvZnMvY29yZWR1bXAuY1xuQEAgLTUyMyw3ICs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpXG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7XG4gXHRpbnQgY29yZV93YWl0ZXJzID0gLUVCVVNZO1xuIFxuLVx0aW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4rXHRpbml0X2NvbXBsZXRpb24oXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiBcdGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLnRhc2sgPSB0c2s7XG4gXHRjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0ID0gTlVMTDtcbiBcbkBAIC01MzEsNyArNTMxLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0aWYgKGNvcmVfd2FpdGVycyBcdTAwM2UgMCkge1xuIFx0XHRzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjtcbiBcbi1cdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXAsXG4rXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lLFxuIFx0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbiBcdFx0LypcbiBcdFx0ICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdFxuQEAgLTgzNyw3ICs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0XHQubWFza1x0XHRcdD0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHxcbiBcdFx0XHRcdFx0ICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHxcbiBcdFx0XHRcdFx0ICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHxcbi1cdFx0XHRcdFx0ICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsXG4rXHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHxcbitcdFx0XHRcdFx0ICBDT1JFRFVNUF9DTE9TRV9GSUxFUyxcbiBcdFx0LnNpemVfYWNrXHRcdD0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLFxuIFx0XHQubWVtb3J5X3R5cGVzXHRcdD0gY3BybS1cdTAwM2VtZW1vcnlfdHlwZXMsXG4gXHRcdC5tZW1vcnlfdHlwZXNfbWFza1x0PSBDT1JFRFVNUF9NRU1PUllfQUxMLFxuQEAgLTkwNSw2ICs5MDYsMTIgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0fVxuIFxuK1x0LyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi9cbitcdGlmICgoYWNrLm1hc2sgXHUwMDI2IENPUkVEVU1QX0NMT1NFX0ZJTEVTKSBcdTAwMjZcdTAwMjYgKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpKSB7XG4rXHRcdGNvcmVkdW1wX3NvY2tfbWFyayhjcHJtLVx1MDAzZWZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4gXHRpZiAoYWNrLm1hc2sgXHUwMDI2IENPUkVEVU1QX01FTU9SWV9UWVBFUykge1xuIFx0XHQvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqL1xuIFx0XHRpZiAodXNpemUgXHUwMDNjIENPUkVEVU1QX0FDS19TSVpFX1ZFUjEpIHtcbkBAIC0xMjI1LDYgKzEyMzIsMTEgQEAgc3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG4gXHRpZiAoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpXG4gXHRcdHJldHVybjtcbiBcbitcdGlmICgoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XG4rXHRcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFwiRmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXCIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4gXHQvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovXG4gXHQvKiBUaGUgY2VsbCBzcHVmcyBjb3JlZHVtcCBjb2RlIHJlYWRzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGVzICovXG4gXHRpZiAodW5zaGFyZV9maWxlcygpKVxuZGlmZiAtLWdpdCBhL2ZzL2ZpbGUuYyBiL2ZzL2ZpbGUuY1xuaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGUuY1xuKysrIGIvZnMvZmlsZS5jXG5AQCAtMzc1LDIxICszNzUsMTUgQEAgc3RhdGljIHVuc2lnbmVkIGludCBzYW5lX2ZkdGFibGVfc2l6ZShzdHJ1Y3QgZmR0YWJsZSAqZmR0LCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNcbiBcdHJldHVybiBBTElHTihsYXN0ICsgMSwgQklUU19QRVJfTE9ORyk7XG4gfVxuIFxuLS8qXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbi0gKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcbi0gKiBvbiBmYWlsdXJlLiAgRm9yICdwdW5jaF9ob2xlJyBzZWUgc2FuZV9mZHRhYmxlX3NpemUoKS5cbi0gKi9cbi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuKy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqL1xuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXG4ge1xuIFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3Zjtcbi1cdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xuLVx0dW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7XG4tXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4rXHRzdHJ1Y3QgZmR0YWJsZSAqbmV3X2ZkdDtcbiBcbi1cdG5ld2YgPSBrbWVtX2NhY2hlX2FsbG9jKGZpbGVzX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XG4rXHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIGdmcCk7XG4gXHRpZiAoIW5ld2YpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1x0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdGF0b21pY19zZXQoXHUwMDI2bmV3Zi1cdTAwM2Vjb3VudCwgMSk7XG4gXG5AQCAtNDA0LDYgKzM5OCwzOSBAQCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob1xuIFx0bmV3X2ZkdC1cdTAwM2VmdWxsX2Zkc19iaXRzID0gbmV3Zi1cdTAwM2VmdWxsX2Zkc19iaXRzX2luaXQ7XG4gXHRuZXdfZmR0LVx1MDAzZWZkID0gXHUwMDI2bmV3Zi1cdTAwM2VmZF9hcnJheVswXTtcbiBcbitcdHJldHVybiBuZXdmO1xuK31cbitcbisvKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cbitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXNfc3RydWN0KHZvaWQpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbitcbitcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG4rXHRpZiAoIW5ld2YpXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0cmN1X2Fzc2lnbl9wb2ludGVyKG5ld2YtXHUwMDNlZmR0LCBcdTAwMjZuZXdmLVx1MDAzZWZkdGFiKTtcbitcdHJldHVybiBuZXdmO1xuK31cbitcbisvKlxuKyAqIEFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3IgdGFibGUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0aGUgcGFzc2VkIGluXG4rICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4rICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4rICovXG4rc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbit7XG4rXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmO1xuK1x0c3RydWN0IGZpbGUgKipvbGRfZmRzLCAqKm5ld19mZHM7XG4rXHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcbitcdHN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDtcbitcbitcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbitcdGlmICghbmV3ZilcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4rXHRuZXdfZmR0ID0gXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYjtcbitcbiBcdHNwaW5fbG9jayhcdTAwMjZvbGRmLVx1MDAzZWZpbGVfbG9jayk7XG4gXHRvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTtcbiBcdG9wZW5fZmlsZXMgPSBzYW5lX2ZkdGFibGVfc2l6ZShvbGRfZmR0LCBwdW5jaF9ob2xlKTtcbkBAIC00ODAsNiArNTA3LDExIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxuIFx0ICovXG4gXHRzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy1cdTAwM2VmZHQpO1xuIFx0dW5zaWduZWQgaW50IGksIGogPSAwO1xuK1x0LypcbitcdCAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWVcbitcdCAqIHVtb3VudCBtdXN0IG5vdCBydW4gX19mcHV0KCkgaXRzZWxmLCBzZWUgX19mcHV0X3N5bmMoKS5cbitcdCAqL1xuK1x0Ym9vbCBzeW5jID0gIShjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9LVEhSRUFEKTtcbiBcbiBcdGZvciAoOzspIHtcbiBcdFx0dW5zaWduZWQgbG9uZyBzZXQ7XG5AQCAtNDkxLDcgKzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcylcbiBcdFx0XHRpZiAoc2V0IFx1MDAyNiAxKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZkdC1cdTAwM2VmZFtpXTtcbiBcdFx0XHRcdGlmIChmaWxlKSB7XG4tXHRcdFx0XHRcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xuK1x0XHRcdFx0XHRpZiAoc3luYylcbitcdFx0XHRcdFx0XHRmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgZmlsZXMpO1xuK1x0XHRcdFx0XHRlbHNlXG4rXHRcdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4gXHRcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbkBAIC01MTUsMTYgKzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4gXHR9XG4gfVxuIFxuKy8qIEhhbmQgQHRzayB0aGUgdGFibGUgQGZpbGVzLCBvciBub25lLCBhbmQgZHJvcCB0aGUgb25lIGl0IGhhZC4gKi9cbitzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuK1x0XHRcdFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkO1xuK1xuK1x0dGFza19sb2NrKHRzayk7XG4rXHRvbGQgPSB0c2stXHUwMDNlZmlsZXM7XG4rXHRpZiAob2xkKSB7XG4rXHRcdGlmIChmaWxlcylcbitcdFx0XHRhdG9taWNfaW5jKFx1MDAyNmZpbGVzLVx1MDAzZWNvdW50KTtcbitcdFx0dHNrLVx1MDAzZWZpbGVzID0gZmlsZXM7XG4rXHR9XG4rXHR0YXNrX3VubG9jayh0c2spO1xuK1x0aWYgKG9sZClcbitcdFx0cHV0X2ZpbGVzX3N0cnVjdChvbGQpO1xuK31cbitcbiB2b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4ge1xuLVx0c3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gdHNrLVx1MDAzZWZpbGVzO1xuK1x0aWYgKCF0c2stXHUwMDNlZmlsZXMpXG4rXHRcdHJldHVybjtcbitcdHN3aXRjaF9maWxlc19zdHJ1Y3QodHNrLCBOVUxMKTtcbit9XG4rXG4rLypcbisgKiBUaGUgdGhyZWFkLWdyb3VwIGlzIHdhaXRpbmcgaW4gY29yZWR1bXBfdGFza19leGl0KCkuIFdha2UgdGhlbSBhbmRcbisgKiB0ZWxsIHRoZW0gdG8gZ2V0IHJpZCBvZiB0aGVpciBmaWxlcy5cbisgKi9cbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXG4re1xuK1x0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUgPSBjdXJyZW50LVx1MDAzZXNpZ25hbC1cdTAwM2Vjb3JlX3N0YXRlO1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4rXHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xuK1x0aW50IG5yID0gMDtcbiBcbi1cdGlmIChmaWxlcykge1xuLVx0XHR0YXNrX2xvY2sodHNrKTtcbi1cdFx0dHNrLVx1MDAzZWZpbGVzID0gTlVMTDtcbi1cdFx0dGFza191bmxvY2sodHNrKTtcbi1cdFx0cHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7XG4rXHRmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpO1xuK1x0aWYgKCFmaWxlcylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogVGFza3Mgd2l0aG91dCBhIHRhYmxlLCB2aG9zdCB3b3JrZXJzIHNheSwgc2l0IHRoZSBzd2l0Y2ggb3V0LiAqL1xuK1x0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVx1MDAzZW5leHQpXG4rXHRcdGlmIChjdC1cdTAwM2V0YXNrLVx1MDAzZWZpbGVzKVxuK1x0XHRcdG5yKys7XG4rXHRhdG9taWNfc2V0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xuK1x0cmVpbml0X2NvbXBsZXRpb24oXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbitcbitcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KSB7XG4rXHRcdGlmICghY3QtXHUwMDNldGFzay1cdTAwM2VmaWxlcylcbitcdFx0XHRjb250aW51ZTtcbitcdFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXG4rXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNmN0LVx1MDAzZWZpbGVzLCBmaWxlcyk7XG4rXHRcdHdha2VfdXBfcHJvY2VzcyhjdC1cdTAwM2V0YXNrKTtcbiBcdH1cbitcbitcdC8qIFRoZSBkdW1wZXIncyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCdzLCBub3QgaXRzIG93bi4gKi9cbitcdHNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpXG4rXHRcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuK1xuK1x0aWYgKG5yKSB7XG4rXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lLFxuK1x0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbitcdFx0LyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi9cbitcdFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVx1MDAzZW5leHQpXG4rXHRcdFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVx1MDAzZXRhc2ssIFRBU0tfQU5ZKTtcbitcdH1cbitcbitcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogR2V0IHJpZCBvZiB0aGUgZmlsZXMgYW5kIHN3aXRjaCB0byB0aGUgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlXG4rICogdGhlIGR1bXBpbmcgdGhyZWFkIHB1Ymxpc2hlZCBpbiB0aGlzIHRocmVhZCdzIGNvcmVfdGhyZWFkIGVudHJ5LlxuKyAqL1xuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXG4re1xuK1x0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7XG4rXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbitcbitcdC8qIFBhaXJzIHdpdGggdGhlIHJlbGVhc2UgaW4gY29yZWR1bXBfY2xvc2VfZmlsZXMoKS4gKi9cbitcdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbitcdGlmICghZmlsZXMgfHwgIWN1cnJlbnQtXHUwMDNlZmlsZXMgfHwgY3VycmVudC1cdTAwM2VmaWxlcyA9PSBmaWxlcylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuK1x0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG4rXHRjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbitcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4rXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4rXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xuZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuY1xuaW5kZXggYzY4YjhjMGE0MDk3YS4uM2M3MDU5MTc2NDZiNSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xuKysrIGIvZnMvZmlsZV90YWJsZS5jXG5AQCAtMTMsNiArMTMsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGVsb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kbm90aWZ5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zZWN1cml0eS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRwb2xsLmhcdTAwM2VcbkBAIC02MDYsMTUgKzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuIEVYUE9SVF9TWU1CT0woX19mcHV0X3N5bmMpO1xuIFxuIC8qXG4tICogRXF1aXZhbGVudCB0byBfX2ZwdXRfc3luYygpLCBidXQgb3B0aW1pemVkIGZvciBiZWluZyBjYWxsZWQgd2l0aCB0aGUgbGFzdFxuLSAqIHJlZmVyZW5jZS5cbi0gKlxuLSAqIFNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbisgKiBcImlkXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuKyAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxuICAqL1xuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuK3N0YXRpYyBpbnQgZmlscF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbiB7XG4tXHRpZiAobGlrZWx5KGZpbGVfcmVmX3B1dF9jbG9zZShcdTAwMjZmaWxlLVx1MDAzZWZfcmVmKSkpXG4tXHRcdF9fZnB1dChmaWxlKTtcbitcdGludCByZXR2YWwgPSAwO1xuK1xuK1x0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXG4rXHRcdFx0XCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwiLFxuK1x0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRpZiAoZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKVxuK1x0XHRyZXR2YWwgPSBmaWxwLVx1MDAzZWZfb3AtXHUwMDNlZmx1c2goZmlscCwgaWQpO1xuK1xuK1x0aWYgKGxpa2VseSghKGZpbHAtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcbitcdFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XG4rXHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4rXHR9XG4rXHRyZXR1cm4gcmV0dmFsO1xuK31cbitcbitpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbit7XG4rXHRpbnQgcmV0dmFsO1xuK1xuK1x0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4rXHRmcHV0X2Nsb3NlKGZpbHApO1xuK1xuK1x0cmV0dXJuIHJldHZhbDtcbit9XG4rRVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcbitcbisvKlxuKyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdFxuKyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLlxuKyAqL1xuK2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4re1xuK1x0aW50IHJldHZhbDtcbitcbitcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuK1x0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXHUwMDI2ZmlscC1cdTAwM2VmX3JlZikpKVxuK1x0XHRfX2ZwdXQoZmlscCk7XG4rXG4rXHRyZXR1cm4gcmV0dmFsO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2ludGVybmFsLmggYi9mcy9pbnRlcm5hbC5oXG5pbmRleCAzNTVkOTNmOTIyMDg2Li43YmE4Y2QyNmE2OThjIDEwMDY0NFxuLS0tIGEvZnMvaW50ZXJuYWwuaFxuKysrIGIvZnMvaW50ZXJuYWwuaFxuQEAgLTEyNyw3ICsxMjcsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZpbGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0fVxuIH1cbiBcbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTtcbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTtcbiB2b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4gXG4gLypcbkBAIC0xOTAsNiArMTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3Mge1xuIFx0aW50IGludGVudDtcbiBcdGludCBsb29rdXBfZmxhZ3M7XG4gfTtcbitcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLFxuIFx0XHRjb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZG9fZmlsZV9vcGVuX3Jvb3QoY29uc3Qgc3RydWN0IHBhdGggKixcbmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmNcbmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0XG4tLS0gYS9mcy9vcGVuLmNcbisrKyBiL2ZzL29wZW4uY1xuQEAgLTE0NTMsNDEgKzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxuIH1cbiAjZW5kaWZcbiBcbi0vKlxuLSAqIFwiaWRcIiBpcyB0aGUgUE9TSVggdGhyZWFkIElELiBXZSB1c2UgdGhlXG4tICogZmlsZXMgcG9pbnRlciBmb3IgdGhpcy4uXG4tICovXG4tc3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuLXtcbi1cdGludCByZXR2YWwgPSAwO1xuLVxuLVx0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXG4tXHRcdFx0XCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwiLFxuLVx0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9XG4tXG4tXHRpZiAoZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKVxuLVx0XHRyZXR2YWwgPSBmaWxwLVx1MDAzZWZfb3AtXHUwMDNlZmx1c2goZmlscCwgaWQpO1xuLVxuLVx0aWYgKGxpa2VseSghKGZpbHAtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcbi1cdFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XG4tXHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4tXHR9XG4tXHRyZXR1cm4gcmV0dmFsO1xuLX1cbi1cbi1pbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbi17XG4tXHRpbnQgcmV0dmFsO1xuLVxuLVx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4tXHRmcHV0X2Nsb3NlKGZpbHApO1xuLVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tRVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcbi1cbiAvKlxuICAqIENhcmVmdWwgaGVyZSEgV2UgdGVzdCB3aGV0aGVyIHRoZSBmaWxlIHBvaW50ZXIgaXMgTlVMTCBiZWZvcmVcbiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4ndCByZWxlYXNlXG5AQCAtMTUwMiwxMyArMTQ2NywxMSBAQCBTWVNDQUxMX0RFRklORTEoY2xvc2UsIHVuc2lnbmVkIGludCwgZmQpXG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG4gXG4tXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuLVxuIFx0LypcbiBcdCAqIFdlJ3JlIHJldHVybmluZyB0byB1c2VyIHNwYWNlLiBEb24ndCBib3RoZXJcbiBcdCAqIHdpdGggYW55IGRlbGF5ZWQgZnB1dCgpIGNhc2VzLlxuIFx0ICovXG4tXHRmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7XG4rXHRyZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7XG4gXG4gXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcbiBcdFx0cmV0dXJuIDA7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZHRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuaW5kZXggYzQ1MzA2YTlmMDA3Mi4uZjBjMTAwM2RhOGNlOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuQEAgLTk5LDExICs5OSwxNiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbFxuIFxuIHN0cnVjdCB0YXNrX3N0cnVjdDtcbiBcbitzdHJ1Y3QgY29yZV90aHJlYWQ7XG4rXG4gdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpO1xuIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpO1xuIHN0cnVjdCBmZF9yYW5nZSB7XG4gXHR1bnNpZ25lZCBpbnQgZnJvbSwgdG87XG4gfTtcbitcbiBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCBzdHJ1Y3QgZmRfcmFuZ2UgKikgX19sYXRlbnRfZW50cm9weTtcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcbiBpbnQgaXRlcmF0ZV9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHVuc2lnbmVkLFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTc2LDEyICs3NiwxNSBAQCBzdHJ1Y3QgbXVsdGlwcm9jZXNzX3NpZ25hbHMge1xuIHN0cnVjdCBjb3JlX3RocmVhZCB7XG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XG4gXHRzdHJ1Y3QgY29yZV90aHJlYWQgKm5leHQ7XG4rXHQvKiBUaGUgZW1wdHkgdGFibGUgdG8gc3dpdGNoIHRvLCBwdWJsaXNoZWQgYnkgdGhlIGR1bXBpbmcgdGhyZWFkLiAqL1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4gfTtcbiBcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XG4gXHRhdG9taWNfdCBucl90aHJlYWRzO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkIGR1bXBlcjtcbi1cdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XG4rXHQvKiBDb21wbGV0ZWQgYnkgdGhlIGxhc3QgdGhyZWFkIHRvIHBhcmssIHJldXNlZCBmb3IgdGhlIHRhYmxlIHN3aXRjaC4gKi9cbitcdHN0cnVjdCBjb21wbGV0aW9uIGRvbmU7XG4gfTtcbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbkBAIC0xOSw2ICsxOSw5IEBAXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay1cdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXG4rICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlXG4rICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXG4rICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcbiAgKi9cbiBlbnVtIHtcbiBcdENPUkVEVU1QX0tFUk5FTFx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyAwKSxcbkBAIC0yOCw2ICszMSw3IEBAIGVudW0ge1xuIFx0Q09SRURVTVBfUkVDT1JEU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNCksXG4gXHRDT1JFRFVNUF9TUEFSU0VcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNSksXG4gXHRDT1JFRFVNUF9NRU1PUllfVFlQRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDYpLFxuK1x0Q09SRURVTVBfQ0xPU0VfRklMRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDcpLFxuIH07XG4gXG4gLyoqXG5AQCAtMTM3LDYgKzE0MSwxMCBAQCBlbnVtIHtcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbid0XG4gICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2ZcbiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLlxuKyAqXG4rICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXG4rICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuXG4rICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXG4gICovXG4gc3RydWN0IGNvcmVkdW1wX2FjayB7XG4gXHRfX3UzMiBzaXplO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jXG5pbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NFxuLS0tIGEva2VybmVsL2V4aXQuY1xuKysrIGIva2VybmVsL2V4aXQuY1xuQEAgLTI1LDYgKzI1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9hY2N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90c2FjY3Rfa2Vybi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZmR0YWJsZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbnNwcm94eS5oXHUwMDNlXG5AQCAtNDMyLDYgKzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbiBcdHN0cnVjdCBjb3JlX3RocmVhZCBzZWxmO1xuIFxuIFx0c2VsZi50YXNrID0gdHNrO1xuK1x0c2VsZi5maWxlcyA9IE5VTEw7XG4gXHRpZiAoc2VsZi50YXNrLVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9TSUdOQUxFRClcbiBcdFx0c2VsZi5uZXh0ID0geGNoZyhcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0LCBcdTAwMjZzZWxmKTtcbiBcdGVsc2VcbkBAIC00NDEsMTIgKzQ0MywxNSBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG4gXHQgKiB0byBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5cbiBcdCAqL1xuIFx0aWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vucl90aHJlYWRzKSlcbi1cdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VzdGFydHVwKTtcbitcdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiBcbiBcdGZvciAoOzspIHtcbiBcdFx0c2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTtcbiBcdFx0aWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqL1xuIFx0XHRcdGJyZWFrO1xuK1x0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xuK1x0XHRpZiAoY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhcdTAwMjZzZWxmKSlcbitcdFx0XHRjb250aW51ZTtcbiBcdFx0c2NoZWR1bGUoKTtcbiBcdH1cbiBcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5pbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NFxuLS0tIGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5AQCAtMTksNiArMTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbitcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA3KSxcbiB9O1xuIFxuIC8qKlxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24ndFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbisgKlxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuKyAqIFRoZSB0YXNrIGVuZHMgdXAgd2l0aCBhbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlLlxuICAqL1xuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xuIFx0X191MzIgc2l6ZTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG5pbmRleCBkZWNlMWEzMWQ1NjFiLi5kYzg0ODlkNDA2MTg0IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG5AQCAtMyw3ICszLDggQEAgQ0ZMQUdTICs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpXG4gXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcbiBcdFx0ICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcXFxuLVx0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0XG4rXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXFxcbitcdFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbiBcbiBpbmNsdWRlIC4uL2xpYi5ta1xuQEAgLTExLDMgKzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWtcbiAkKE9VVFBVVCkvc3RhY2tkdW1wX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcbkBAIC0wLDAgKzEsNTkyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvZmlsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF90ZXN0LmhcIlxuK1xuKyNkZWZpbmUgTE9DS19GSUxFIFwiL3RtcC9jb3JlZHVtcC5sb2NrXCJcbitcbisvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi9cbisjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDRcbitcbisvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi9cbitlbnVtIGxvY2tfa2luZCB7XG4rXHRMT0NLX0tJTkRfUE9TSVgsXG4rXHRMT0NLX0tJTkRfT0ZELFxuK1x0TE9DS19LSU5EX0ZMT0NLLFxuK307XG4rXG4rLyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovXG4rZW51bSBsb2NrX3NoYXJlIHtcbitcdExPQ0tfU0hBUkVfTk9ORSxcbitcdExPQ0tfU0hBUkVfRFVQLFx0XHQvKiBhIHNlY29uZCBzbG90IGluIHRoZSBjaGlsZCdzIG93biB0YWJsZSAqL1xuK1x0TE9DS19TSEFSRV9GT1JLLFx0LyogYSBmb3JrZWQgcHJvY2VzcyBrZWVwcyB0aGUgZmQgb3BlbiAqL1xuK1x0TE9DS19TSEFSRV9GSUxFUyxcdC8qIGEgQ0xPTkVfRklMRVMgcHJvY2VzcyBzaGFyZXMgdGhlIHRhYmxlICovXG4rfTtcbitcbitzdHJ1Y3QgY2xvc2VfdGVzdCB7XG4rXHRlbnVtIGxvY2tfa2luZCBraW5kO1xuK1x0ZW51bSBsb2NrX3NoYXJlIHNoYXJlO1xuK1x0Ym9vbCB0aHJlYWRzO1xuK1x0Ym9vbCBjbG9zZTtcdFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cbitcdGJvb2wgdXNlcnNwYWNlO1x0XHQvKiBDT1JFRFVNUF9VU0VSU1BBQ0UgaW5zdGVhZCBvZiBDT1JFRFVNUF9LRVJORUwgKi9cbitcdGJvb2wgcmVsZWFzZWQ7XHRcdC8qIHRoZSBsb2NrIGlzIGdvbmUgb25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlIGNsb3NlICovXG4rfTtcbitcbitGSVhUVVJFX1NFVFVQKGNvcmVkdW1wKVxuK3tcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0O1xuK1xuK1x0c2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIO1xuK1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJyXCIpO1xuK1x0QVNTRVJUX05FKE5VTEwsIGZpbGUpO1xuK1xuK1x0cmV0ID0gZnJlYWQoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsIHNpemVvZihzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybiksIGZpbGUpO1xuK1x0QVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpO1xuK1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4rXG4rXHRzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJ1xcMCc7XG4rXHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gY3JlYXRlX2RldGFjaGVkX3RtcGZzKCk7XG4rXHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRBU1NFUlRfRVEoMCwgcmV0KTtcbit9XG4rXG4rRklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbit7XG4rXHRjb25zdCBjaGFyICpyZWFzb247XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldCwgc3RhdHVzO1xuK1xuK1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuK1x0XHRraWxsKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XG4rXHRcdHdhaXRwaWQoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0fVxuK1x0dW5saW5rKExPQ0tfRklMRSk7XG4rXHR1bmxpbmsoXCIvdG1wL2NvcmVkdW1wLnNvY2tldFwiKTtcbitcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwid1wiKTtcbitcdGlmICghZmlsZSkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmcHJpbnRmKGZpbGUsIFwiJXNcIiwgc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byB3cml0ZSB0byBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0cmV0ID0gZmNsb3NlKGZpbGUpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXHUwMDNlPSAwKSB7XG4rXHRcdHJldCA9IGNsb3NlKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gY2xvc2UgZGV0YWNoZWQgdG1wZnNcIjtcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdH1cbitcdFx0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuO1xuK2ZhaWw6XG4rXHQvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi9cbitcdGZwcmludGYoc3RkZXJyLCBcIkZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxuXCIsIHJlYXNvbik7XG4rfVxuK1xuKy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi9cbitzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4re1xuK1x0c3RydWN0IGZsb2NrIGZsID0ge1xuK1x0XHQubF90eXBlID0gRl9XUkxDSyxcbitcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4rXHR9O1xuK1xuK1x0c3dpdGNoIChraW5kKSB7XG4rXHRjYXNlIExPQ0tfS0lORF9QT1NJWDpcbitcdFx0cmV0dXJuIGZjbnRsKGZkLCBGX1NFVExLLCBcdTAwMjZmbCk7XG4rXHRjYXNlIExPQ0tfS0lORF9PRkQ6XG4rXHRcdHJldHVybiBmY250bChmZCwgRl9PRkRfU0VUTEssIFx1MDAyNmZsKTtcbitcdGNhc2UgTE9DS19LSU5EX0ZMT0NLOlxuK1x0XHRyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xuK3N0YXRpYyBpbnQgbG9ja19oZWxkKGludCBmZCwgZW51bSBsb2NrX2tpbmQga2luZClcbit7XG4rXHRzdHJ1Y3QgZmxvY2sgZmwgPSB7XG4rXHRcdC5sX3R5cGUgPSBGX1dSTENLLFxuK1x0XHQubF93aGVuY2UgPSBTRUVLX1NFVCxcbitcdH07XG4rXG4rXHRpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHtcbitcdFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xuK1x0XHRcdGZsb2NrKGZkLCBMT0NLX1VOKTtcbitcdFx0XHRyZXR1cm4gMDtcbitcdFx0fVxuK1x0XHRyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7XG4rXHR9XG4rXG4rXHQvKiBGX0dFVExLIHJlcG9ydHMgY29uZmxpY3RpbmcgT0ZEIGxvY2tzIHRvby4gKi9cbitcdGlmIChmY250bChmZCwgRl9HRVRMSywgXHUwMDI2ZmwpIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7XG4rfVxuK1xuKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi9cbitzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpXG4re1xuK1x0Y2hhciBwYXRoWzY0XTtcbitcdHN0cnVjdCBkaXJlbnQgKmRlO1xuK1x0RElSICpkaXI7XG4rXHRpbnQgbnIgPSAwO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL2ZkXCIsIHBpZCk7XG4rXHRkaXIgPSBvcGVuZGlyKHBhdGgpO1xuK1x0aWYgKCFkaXIpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdCpmaXJzdCA9IC0xO1xuK1x0d2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHtcbitcdFx0aW50IGZkO1xuK1xuK1x0XHRpZiAoZGUtXHUwMDNlZF9uYW1lWzBdID09ICcuJylcbitcdFx0XHRjb250aW51ZTtcbitcdFx0ZmQgPSBhdG9pKGRlLVx1MDAzZWRfbmFtZSk7XG4rXHRcdGlmICgqZmlyc3QgXHUwMDNjIDAgfHwgZmQgXHUwMDNjICpmaXJzdClcbitcdFx0XHQqZmlyc3QgPSBmZDtcbitcdFx0bnIrKztcbitcdH1cbitcdGNsb3NlZGlyKGRpcik7XG4rXHRyZXR1cm4gbnI7XG4rfVxuK1xuKy8qXG4rICogQmxvY2sgdW50aWwgdGhlIHRlc3QgaGFuZ3MgdXAgQGZkX3JlbGVhc2UsIGtlZXBpbmcgZXZlcnkgaW5oZXJpdGVkIGZkXG4rICogb3BlbiwgdGhlbiByZXBvcnQgdGhyb3VnaCBAZmRfcmVzdWx0IHdoZXRoZXIgQGZkIGlzIHN0aWxsIG9wZW4uXG4rICovXG4rc3RhdGljIHZvaWQgaG9sZF91bnRpbF9yZWxlYXNlZChpbnQgZmQsIGludCBmZF9yZWxlYXNlLCBpbnQgZmRfcmVzdWx0KVxuK3tcbitcdGNoYXIgYztcbitcbitcdHJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsIFx1MDAyNmMsIDEpO1xuK1x0YyA9IGZjbnRsKGZkLCBGX0dFVEZEKSBcdTAwM2MgMCA/ICdDJyA6ICdPJztcbitcdHdyaXRlX25vaW50cihmZF9yZXN1bHQsIFx1MDAyNmMsIDEpO1xuK1x0X2V4aXQoRVhJVF9TVUNDRVNTKTtcbit9XG4rXG4rLyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi9cbitzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxuK1x0XHRcdFx0ICBpbnQgZmRfcmVzdWx0KVxuK3tcbitcdHB0aHJlYWRfdCB0aHJlYWQ7XG4rXHRpbnQgZmQsIHBpZGZkLCBpO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmICh0YWtlX2xvY2soZmQsIHQtXHUwMDNla2luZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRzd2l0Y2ggKHQtXHUwMDNlc2hhcmUpIHtcbitcdGNhc2UgTE9DS19TSEFSRV9OT05FOlxuK1x0XHRicmVhaztcbitcdGNhc2UgTE9DS19TSEFSRV9EVVA6XG4rXHRcdGlmIChkdXAoZmQpIFx1MDAzYyAwKVxuK1x0XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBMT0NLX1NIQVJFX0ZPUks6XG4rXHRcdHBpZCA9IGZvcmsoKTtcbitcdFx0aWYgKHBpZCBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRpZiAocGlkID09IDApXG4rXHRcdFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIExPQ0tfU0hBUkVfRklMRVM6XG4rXHRcdHBpZCA9IGNyZWF0ZV9jaGlsZChcdTAwMjZwaWRmZCwgQ0xPTkVfRklMRVMpO1xuK1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuK1x0XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRcdGlmIChwaWQgPT0gMClcbitcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdGlmICh0LVx1MDAzZXRocmVhZHMpXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5VTV9DTE9TRV9USFJFQURTOyBpKyspXG4rXHRcdFx0cHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkLCBOVUxMLCBkb19ub3RoaW5nLCBOVUxMKTtcbitcbitcdC8qIGNyYXNoIG9uIHB1cnBvc2UgKi9cbitcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XG4rfVxuK1xuKy8qXG4rICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZVxuKyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlXG4rICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcFxuKyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvclxuKyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuXG4rICovXG4rc3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpXG4re1xuK1x0c3RydWN0IGNvcmVkdW1wX3JlcSByZXEgPSB7fTtcbitcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcbitcdGludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7XG4rXHRpbnQgZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFO1xuK1x0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xuK1x0X191NjQgbWFzaztcbitcdHNzaXplX3QgYnl0ZXM7XG4rXHRjaGFyIGM7XG4rXG4rXHRmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmRfbG9jayBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogb3BlbiBsb2NrIGZpbGUgZmFpbGVkOiAlbVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoXCIvdG1wL2NvcmVkdW1wLnNvY2tldFwiKTtcbitcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICh3cml0ZV9ub2ludHIoZmRfaXBjLCBcIjFcIiwgMSkgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdGNsb3NlKGZkX2lwYyk7XG4rXG4rXHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0aWYgKGZkX2NvcmVkdW1wIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBhY2NlcHQ0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkX3BlZXJfcGlkZmQgPSBnZXRfcGVlcl9waWRmZChmZF9jb3JlZHVtcCk7XG4rXHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFx1MDAyNmluZm8pKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghcmVhZF9jb3JlZHVtcF9yZXEoZmRfY29yZWR1bXAsIFx1MDAyNnJlcSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHJlYWRfY29yZWR1bXBfcmVxIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXHUwMDI2cmVxKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LyogVGhlIHRhc2sgd2FpdHMgZm9yIG91ciBhbnN3ZXIgd2l0aCBldmVyeXRoaW5nIHN0aWxsIGluIHBsYWNlLiAqL1xuK1x0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVx1MDAzZWtpbmQpICE9IDEpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGxvY2sgbm90IGhlbGQgZHVyaW5nIHRoZSBoYW5kc2hha2VcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuK1x0aWYgKG5yX2ZkcyBcdTAwM2M9IDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgaGFuZHNoYWtlIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcbitcdG1hc2sgPSBDT1JFRFVNUF9XQUlUO1xuK1x0bWFzayB8PSB0LVx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcbitcdGlmICh0LVx1MDAzZWNsb3NlKVxuK1x0XHRtYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTO1xuK1xuK1x0aWYgKCFzZW5kX2NvcmVkdW1wX2FjayhmZF9jb3JlZHVtcCwgXHUwMDI2cmVxLCBtYXNrLCAwKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHJlYWRfbWFya2VyIENPUkVEVU1QX01BUktfUkVRQUNLIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgXHUwMDI2YywgMSk7XG4rXHRpZiAoYnl0ZXMgIT0gKHQtXHUwMDNldXNlcnNwYWNlID8gMCA6IDEpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkIGFmdGVyIHRoZSBhY2sgcmV0dXJuZWQgJXpkOiAlbVxcblwiLCBfX2Z1bmNfXywgYnl0ZXMpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC1cdTAwM2VraW5kKSAhPSAhdC1cdTAwM2VyZWxlYXNlZCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxuXCIsXG4rXHRcdFx0X19mdW5jX18sIHQtXHUwMDNlcmVsZWFzZWQgPyBcInN0aWxsIGhlbGRcIiA6IFwicmVsZWFzZWRcIik7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0bnJfZmRzID0gY291bnRfZmRzKGluZm8ucGlkLCBcdTAwMjZmaXJzdF9mZCk7XG4rXHRpZiAobnJfZmRzIFx1MDAzYyAwIHx8ICFucl9mZHMgIT0gdC1cdTAwM2VjbG9zZSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwiLFxuK1x0XHRcdF9fZnVuY19fLCBucl9mZHMpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcbitcdGlmICh0LVx1MDAzZWNsb3NlKSB7XG4rXHRcdGlmIChmZCBcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUJBREYpIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxcblwiLFxuK1x0XHRcdFx0X19mdW5jX18sIGZkKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxcblwiLFxuK1x0XHRcdFx0X19mdW5jX18pO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGNsb3NlKGZkKTtcbitcdH1cbitcbitcdC8qIENPUkVEVU1QX1dBSVQga2VlcHMgdGhlIHRhc2sgYXJvdW5kIHVudGlsIHdlIGhhbmcgdXAuICovXG4rXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFx1MDAyNmluZm8pKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmIChpbmZvLm1hc2sgXHUwMDI2IFBJREZEX0lORk9fRVhJVCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogdGFzayBleGl0ZWQgYmVmb3JlIHRoZSBjb3JlZHVtcCBmaW5pc2hlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRjaGFyIGJ1ZmZlcls0MDk2XTtcbitcbitcdFx0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7XG4rXHRcdGlmIChieXRlcyBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGlmIChieXRlcyA9PSAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1xuK1x0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xuK291dDpcbitcdGlmIChmZF9sb2NrIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmRfbG9jayk7XG4rXHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX3BlZXJfcGlkZmQpO1xuK1x0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuK1x0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX3NlcnZlcik7XG4rXHRyZXR1cm4gZXhpdF9jb2RlO1xuK31cbitcbitzdGF0aWMgdm9pZCBydW5fY2xvc2VfdGVzdChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEsXG4rXHRcdFx0ICAgRklYVFVSRV9EQVRBKGNvcmVkdW1wKSAqc2VsZixcbitcdFx0XHQgICBjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCAqdClcbit7XG4rXHRpbnQgZmQsIHN0YXR1cywgaXBjX3NvY2tldHNbMl0sIHJlbGVhc2VfcGlwZVsyXSwgcmVzdWx0X3BpcGVbMl07XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRjaGFyIGM7XG4rXG4rXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFwiQEAvdG1wL2NvcmVkdW1wLnNvY2tldFwiKSk7XG4rXG4rXHRmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7XG4rXHRBU1NFUlRfR0UoZmQsIDApO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7XG4rXG4rXHRBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTtcbitcbitcdHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XG4rXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XG4rXHRcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcbitcdFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XG4rXHR9XG4rXHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XG4rXHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApO1xuK1xuK1x0LyogT25seSB0aGUgY3Jhc2hpbmcgY2hpbGQgYW5kIHdoYXQgaXQgc3Bhd25zIHNlZSB0aGVzZSBwaXBlcy4gKi9cbitcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xuK1x0QVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTtcbitcbitcdHBpZCA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWQsIDApO1xuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XG4rXHRcdGNsb3NlKHJlc3VsdF9waXBlWzBdKTtcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pO1xuK1x0fVxuK1x0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVswXSksIDApO1xuK1x0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7XG4rXG4rXHR3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1x0QVNTRVJUX1RSVUUoV0NPUkVEVU1QKHN0YXR1cykpO1xuK1xuK1x0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XG4rXG4rXHQvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovXG4rXHRFWFBFQ1RfRVEoY2xvc2UocmVsZWFzZV9waXBlWzFdKSwgMCk7XG4rXG4rXHQvKiBUaGUgY3Jhc2hpbmcgY2hpbGQgaXMgZ29uZSBidXQgd2hhdCBpdCBzaGFyZWQgd2l0aCBpcyB1bnRvdWNoZWQuICovXG4rXHRpZiAodC1cdTAwM2VzaGFyZSA9PSBMT0NLX1NIQVJFX0ZPUksgfHwgdC1cdTAwM2VzaGFyZSA9PSBMT0NLX1NIQVJFX0ZJTEVTKSB7XG4rXHRcdEFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0XHRBU1NFUlRfRVEoYywgJ08nKTtcbitcdH1cbitcdEVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9PRkQsXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2R1cClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9EVVAsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfb2ZkX2ZvcmspXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfc2hhcmVkX3RhYmxlKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3VzZXJzcGFjZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQudXNlcnNwYWNlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LnRocmVhZHMgPSB0cnVlLFxuK1x0XHQuY2xvc2UgPSBmYWxzZSxcbitcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbkBAIC0yMzc3LDYgKzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpXG4gXHRjaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9VU0VSU1BBQ0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpO1xuIH1cbiBcbisvKiBBIHJlamVjdGVkIHRhc2sgY2xvc2VzIGV2ZXJ5dGhpbmcgb24gaXRzIHdheSBvdXQgYW55d2F5LiAqL1xuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxuK3tcbitcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX0NMT1NFX0ZJTEVTKTtcbit9XG4rXG4gLypcbiAgKiBBIHNlcnZlciBidWlsdCB3aXRoIHRoZSBmaXJzdCBzdHJ1Y3RzIHJlYWRzIHRoZSByZXF1ZXN0IGl0IGtub3dzLFxuICAqIGRpc2NhcmRzIHRoZSByZXN0IGFuZCBhY2tzIHdpdGggdGhlIGFjayBpdCBrbm93cy4gSXQgcmFpc2VzIG5vdGhpbmdcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5pbmRleCA0ZTM2ZTNlNGZiNzhmLi42NTEzMmEwZGVjZWRkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5AQCAtMTYxMiw3ICsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSxcbiAjZGVmaW5lIFRFU1RfUkVRX01BU0tfQUxMXHRcdFx0XHRcdFxcXG4gXHQoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHxcdFx0XHRcXFxuIFx0IENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFx0XHRcdFxcXG4tXHQgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUylcbitcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcbitcdCBDT1JFRFVNUF9DTE9TRV9GSUxFUylcbiBcbiBib29sIGNoZWNrX2NvcmVkdW1wX3JlcShjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTc6NTc6MDcuOTk0ODk1OTY0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM4Mjc2ODAxMjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoaXMgQ29yZWR1bXAgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGRpZ2dpbmcgaW50byB0aGUgTGludXgga2VybmVsJ3MgY29yZWR1bXAgc3Vic3lzdGVtLCBhbmQgaXQgbG9va3MgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCdzIGFkZGluZyBhIG5ldyBmbGFnLCBgQ09SRURVTVBfQ0xPU0VfRklMRVNgLCB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFRoZSBjcnVjaWFsIGJpdCBpcyB0aGF0IHdoZW4gYSB1c2Vyc3BhY2UgaGFuZGxlciBzZW5kcyBiYWNrIGFuIEFDSyB3aXRoIHRoaXMgZmxhZyBzZXQsIHRoZSBrZXJuZWwgd2lsbCBjbG9zZSAqYWxsKiBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjcmFzaGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAuXG5cblJpZ2h0IGF3YXksIEknbSB0aGlua2luZzogcmVhY2hhYmxlPyBGdXp6YWJsZT8gVGhpcyBsb29rcyBwcm9taXNpbmcuIFRoZSBjb3JlZHVtcCBmdW5jdGlvbmFsaXR5IGl0c2VsZiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgbm8gcHJvYmxlbSB0aGVyZS4gQW5kIHRoaXMgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyBpcyBwYXJ0IG9mIHRoZSBVQVBJLCB3aGljaCBtZWFucyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIGNhbiB0cmlnZ2VyIGl0LiBUaGF0IG1ha2VzIGl0IHJpcGUgZm9yIGV4cGxvcmF0aW9uLlxuXG5JIHNlZSBjaGFuZ2VzIHNwcmlua2xlZCBhY3Jvc3MgdGhlIGZpbGVzeXN0ZW0gY29kZSAoYGZzL2NvcmVkdW1wLmNgLCBgZnMvZmlsZS5jYCwgYGZzL2ZpbGVfdGFibGUuY2AsIGBmcy9pbnRlcm5hbC5oYCwgYGZzL29wZW4uY2AsIGBpbmNsdWRlL2xpbnV4L2ZkdGFibGUuaGAsIGBpbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oYCwgYGluY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oYCkgYW5kIGV2ZW4gdGhlIGtlcm5lbCdzIGV4aXQgbG9naWMgKGBrZXJuZWwvZXhpdC5jYCkuIFRoaXMgdGVsbHMgbWUgdGhlIGNvcmUga2VybmVsIGlzIGludm9sdmVkLiBDbG9zaW5nIGZpbGUgZGVzY3JpcHRvcnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciwgb3Igbm90LCBpcyBhbHdheXMgYSBzZW5zaXRpdmUgb3BlcmF0aW9uLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBJJ2xsIHdhbnQgdG8gZm9jdXMgb24gZm9yIGZ1enppbmcuIExvb2tzIGxpa2UgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgLCBhbmQgYGZpbHBfY2xvc2Vfc3luY2AgYXJlIHRoZSBtb3N0IHJlbGV2YW50IGluIHRoZSBmaWxlc3lzdGVtIGFyZWEuIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgIGFuZCBgZG9fY29yZWR1bXBgIG5lZWQgZnVydGhlciBhbmFseXNpcy4gVGhlc2UgYXJlIGFsbCB3b3J0aCBhIGNsb3NlIGxvb2sgYW5kIGZ1enppbmcuXG5cbkZpbmFsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBvcHRpb25zLiBDb3JlZHVtcHMgYXJlIGVuYWJsZWQgdmlhIGBDT05GSUdfQ09SRURVTVBgLiBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBzZXQsIG90aGVyd2lzZSwgYWxsIHRoaXMgd29yayBpcyBmb3Igbm90aGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU0OTMsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo0Ni4yNzE2OTk3OTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUzMDg2NTM2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ09SRURVTVBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xcbi0tXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcwLVxcbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcXG5mcy9LY29uZmlnLmJpbmZtdC0xNzItXFx0Ym9vbCBcXFwiRW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NDcuODAyNTY4NDc4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDk0ODQ2MjA3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIGBDT1JFRFVNUGAgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyByZWxhdGVkIHRvIGBDT1JFRFVNUGAuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZGVsdmUgaW50byB0aGUgdmFyaW91cyBsYXllcnMgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZywgaGFuZGxpbmcsIGFuZCBpbnRlcnByZXRpbmcgY29yZSBkdW1wcy4gSSdtIHRoaW5raW5nIGFib3V0IHRoZSBrZXJuZWwtbGV2ZWwgY29tcG9uZW50cyB0aGF0IHRyaWdnZXIgdGhlIGR1bXAg4oCTIHNpZ25hbHMgbGlrZSBTSUdTRUdWLCBTSUdBQlJULCBTSUdJTEwsIGV0Yy4g4oCTIGFuZCBob3cgdGhvc2UgYXJlIGNvbmZpZ3VyZWQsIHBvdGVudGlhbGx5IHRocm91Z2ggYC9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuYCBvciBzaW1pbGFyIHN5c2N0bCBzZXR0aW5ncy5cblxuVGhlbiwgSSdtIGNvbnNpZGVyaW5nIHRoZSB1c2Vyc3BhY2UgdXRpbGl0aWVzOiBgZ2RiYCwgYGxsZGJgLCBgY29yZWR1bXBjdGxgLCBhbmQgdGhlIHdob2xlIHJhbmdlIG9mIGRlYnVnZ2VycyB0aGF0IGNhbiBhY3R1YWxseSAqdXNlKiB0aGUgY29yZSBmaWxlLiBXaGF0IGFyZSB0aGUga2V5IGxpYnJhcmllcyB0aGVzZSB0b29scyByZWx5IG9uIGZvciBwYXJzaW5nIHRoZSBjb3JlIGR1bXAgZm9ybWF0PyBFTEYsIERXQVJGLCB0aGUgZGVidWdnaW5nIGludGVyZmFjZSAoREJJKS4uLiBJIG5lZWQgdG8gbWFwIG91dCB0aGUgY29ubmVjdGlvbnMuIEFtIEkgZGVhbGluZyB3aXRoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCB3aGljaCBtYXkgaW5mbHVlbmNlIHRoZSBjb3JlIGZpbGUgZm9ybWF0P1xuXG5JJ20gYWxzbyBjb25zaWRlcmluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBjb3JlIGR1bXAgc2V0dGluZ3MgdGhlbXNlbHZlczogc2l6ZSBsaW1pdHMgKHVsaW1pdCAtYyksIHRoZSBjb3JlIGZpbGUgbmFtaW5nIGNvbnZlbnRpb24gKHBvdGVudGlhbGx5IGluamVjdGluZyBwcm9jZXNzIElEcywgdGltZXN0YW1wcywgZXRjLiksIGFuZCB3aGV0aGVyIHRoZSBkdW1wIGlzIGJlaW5nIGNhcHR1cmVkIGluIGEgZmlsZSBhdCBhbGwsIG9yIHBvdGVudGlhbGx5IHBpcGVkIHRvIGEgZGVidWdnZXIgZGlyZWN0bHkuXG5cbkkgc2hvdWxkIGFsc28gZmFjdG9yIGluIHRoZSBwb3NzaWJpbGl0eSBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMg4oCTIHRvb2xzIHRoYXQgbWlnaHQgcHJlLXByb2Nlc3Mgb3IgcG9zdC1wcm9jZXNzIHRoZSBjb3JlIGR1bXBzLiBBcmUgdGhlcmUgYW55IGN1c3RvbSBzY3JpcHRzIG9yIHRvb2xzIHdpdGhpbiB0aGlzIHN5c3RlbSB0aGF0IGFyZSBpbnZvbHZlZCBpbiBjb3JlIGR1bXAgYW5hbHlzaXMgb3IgbWFuaXB1bGF0aW9uPyBVbmRlcnN0YW5kaW5nIGFueSBjdXN0b20gdG9vbHMgb3IgbW9kaWZpY2F0aW9ucyBpbiBwbGFjZSBpcyBjcnVjaWFsLlxuXG5VbHRpbWF0ZWx5LCBJIG5lZWQgYSBob2xpc3RpYyB2aWV3OiB3aGF0IHRyaWdnZXJzIGEgY29yZSBkdW1wLCBob3cgaXMgaXQgZ2VuZXJhdGVkLCB3aGF0IGFyZSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb3JlIGR1bXAsIHdoYXQgdG9vbHMgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBkdW1wLCBhbmQgd2hhdCB0b29scyBtYXkgYW5hbHl6ZSB0aGUgY29yZSBkdW1wPyBUaGlzIGlzIHRoZSBjb3JlIGRlcGVuZGVuY3kgZ3JhcGggSSBuZWVkIHRvIHVuZGVyc3RhbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2Mzg5LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NTIuNzUxMDMyMzEyWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NjE2Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDT1JFRFVNUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9LY29uZmlnLmJpbmZtdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXFxuLS1cXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXFxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cXHRib29sIFxcXCJFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo1Mi43OTU2NTQ5M1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1NzMwMjUxNDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoaW5raW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9uczpcblxuKipBbmFseXppbmcgdGhlIEtlcm5lbCdzIEJpbmFyeSBGb3JtYXQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZSwgc3BlY2lmaWNhbGx5IHRoZSBgZnMvS2NvbmZpZy5iaW5mbXRgIHNlY3Rpb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB0aGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgZGVmaW5lcyBpdHMgaGFuZGxpbmcgb2YgdmFyaW91cyBiaW5hcnkgZm9ybWF0cywgbGlrZSBleGVjdXRhYmxlcy4gVGhlIGxpbmUgbnVtYmVyIHByb3ZpZGVkLCBhcm91bmQgMTcxLCB1c3VhbGx5IHBvaW50cyB0byBhIHNpZ25pZmljYW50IGJsb2NrIG9mIGNvZGUsIG9mdGVuIGRlYWxpbmcgd2l0aCB0aGUgbG93LWxldmVsIGRldGFpbHMgb2YgaG93IHRoZSBrZXJuZWwgaWRlbnRpZmllcyBhbmQgZXhlY3V0ZXMgZGlmZmVyZW50IHByb2dyYW0gdHlwZXMuIFRoaXMgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGZsZXhpYmlsaXR5IGFuZCBzZWN1cml0eSBvZiB0aGUga2VybmVsLCBhcyBpdCBkaWN0YXRlcyB3aGF0IGNhbiBiZSBydW4gb24gdGhlIHN5c3RlbSBhbmQgaG93LiBJIG5lZWQgdG8gc2VlIHdoYXQncyBiZWluZyBjb25maWd1cmVkLCB3aGF0IGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQsIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBiZSBpbiBwbGFjZS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyBhYm91dCB3aGF0IG5ldyBiaW5hcnkgZm9ybWF0IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQsIGFuZCBpZiBhbnkgc2VjdXJpdHkgb3B0aW9ucyBhcmUgaW4gcGxheS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5MTAsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo1Ni4zNjg2ODE3NzVaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NjY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9LY29uZmlnLmJpbmZtdFwiLFxuICBcIkZpcnN0TGluZVwiOiAxNjUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNjU6XFx0XFx0XFx0bW91bnQgYmluZm10X21pc2MgLXQgYmluZm10X21pc2MgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjXFxuIDE2NjpcXHRcXG4gMTY3OlxcdFxcdCAgWW91IG1heSBzYXkgTSBoZXJlIGZvciBtb2R1bGUgc3VwcG9ydCBhbmQgbGF0ZXIgbG9hZCB0aGUgbW9kdWxlIHdoZW5cXG4gMTY4OlxcdFxcdCAgeW91IGhhdmUgdXNlIGZvciBpdDsgdGhlIG1vZHVsZSBpcyBjYWxsZWQgYmluZm10X21pc2MuIElmIHlvdVxcbiAxNjk6XFx0XFx0ICBkb24ndCBrbm93IHdoYXQgdG8gYW5zd2VyIGF0IHRoaXMgcG9pbnQsIHNheSBZLlxcbiAxNzA6XFx0XFxuIDE3MTpcXHRjb25maWcgQ09SRURVTVBcXG4gMTcyOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFxcXCIgaWYgRVhQRVJUXFxuIDE3MzpcXHRcXHRkZWZhdWx0IHlcXG4gMTc0OlxcdFxcdGhlbHBcXG4gMTc1OlxcdFxcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBwZXJmb3JtaW5nIGNvcmUgZHVtcHMuIFlvdSBhbG1vc3RcXG4gMTc2OlxcdFxcdCAgY2VydGFpbmx5IHdhbnQgdG8gc2F5IFkgaGVyZS4gTm90IG5lY2Vzc2FyeSBvbiBzeXN0ZW1zIHRoYXQgbmV2ZXJcXG4gMTc3OlxcdFxcdCAgbmVlZCBkZWJ1Z2dpbmcgb3Igb25seSBldmVyIHJ1biBmbGF3bGVzcyBjb2RlLlxcbiAxNzg6XFx0XFxuIDE3OTpcXHRjb25maWcgRVhFQ19LVU5JVF9URVNUXFxuIDE4MDpcXHRcXHRib29sIFxcXCJCdWlsZCBleGVjdmUgdGVzdHNcXFwiIGlmICFLVU5JVF9BTExfVEVTVFNcXG4gMTgxOlxcdFxcdGRlcGVuZHMgb24gS1VOSVQ9eVxcbiAxODI6XFx0XFx0ZGVmYXVsdCBLVU5JVF9BTExfVEVTVFNcXG4gMTgzOlxcdFxcdGhlbHBcXG4gMTg0OlxcdFxcdCAgVGhpcyBidWlsZHMgdGhlIGV4ZWMgS1VuaXQgdGVzdHMsIHdoaWNoIHRlc3RzIGJvdW5kYXJ5IGNvbmRpdGlvbnNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NTYuMzY4NzUwNDY2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODU1MjI2MzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgQ29yZSBEdW1wIENvbmZpZ3VyYXRpb24gYW5kIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgc28gYENPUkVEVU1QYCBzZWVtcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBpdHMgYmVoYXZpb3IsIHNvIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEl0IGxvb2tzIGxpa2UgdGhlIG1haW4gY29kZSBpcyBzcHJlYWQgYWNyb3NzIGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGFuZCBga2VybmVsL2V4aXQuY2AuIExldCdzIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIHNwZWNpZmljIHRvIGNvbnRyb2wgdGhlIGNsb3Npbmcgb2YgZmlsZXMgZHVyaW5nIGEgY29yZSBkdW1wOyBpcyB0aGVyZSBzb21ldGhpbmcgbGlrZSBgQ09SRURVTVBfQ0xPU0VfRklMRVNgPyBOb3BlLCBpdCdzIGp1c3QgYSBzaW1wbGUgZmxhZy5cblxuTm93LCBJIHNob3VsZCBleGFtaW5lIHRoZSByZWxldmFudCBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBhbGwgd29ya3MuIEknbSBmb2N1c2luZyBvbiBgY29yZWR1bXBfY2xvc2VfZmlsZXNgLCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AsIGBmaWxwX2Nsb3NlX3N5bmNgLCBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCwgYW5kIGBkb19jb3JlZHVtcGAuXG5cbkknbGwgcXVpY2tseSB2ZXJpZnkgdGhlIHZpc2liaWxpdHkgb2YgdGhlc2UgZnVuY3Rpb25zLiBDaGVja2luZyBgZnMvZmlsZS5jYCwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCBhbmQgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgIGFyZSBub24tc3RhdGljLiBUaGVuLCBsb29raW5nIGF0IGBmcy9maWxlX3RhYmxlLmNgLCBgZmlscF9jbG9zZV9zeW5jYCBpcyBhbHNvIG5vbi1zdGF0aWMuIEFoYSwgaW4gYGZzL2NvcmVkdW1wLmNgLCBJIHNlZSBib3RoIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgIGFuZCBgZG9fY29yZWR1bXBgLiBXYWl0IGEgc2Vjb25k4oCmIGlzIGBkb19jb3JlZHVtcGAgc3RhdGljPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgbGFzdCBvbmUuIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzQ5NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjAzOjA0LjkyMTAxNTc5N1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDI1NDc1MTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZG9fY29yZWR1bXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvY29yZWR1bXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTExODk9c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NraXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIwMC1cXG5mcy9jb3JlZHVtcC5jOjEyMDE6c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuZnMvY29yZWR1bXAuYy0xMjAyLVxcdFxcdFxcdHNpemVfdCAqKmFyZ3YsIGludCAqYXJnYywgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxcbi0tXFxuZnMvY29yZWR1bXAuYz0xMjc5PXZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEzMTctXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcXG5mcy9jb3JlZHVtcC5jOjEzMTg6XFx0XFx0ZG9fY29yZWR1bXAoXFx1MDAyNmNuLCBcXHUwMDI2Y3BybSwgXFx1MDAyNmFyZ3YsIFxcdTAwMjZhcmdjLCBiaW5mbXQpO1xcbmZzL2NvcmVkdW1wLmMtMTMxOS1cXHRjb3JlZHVtcF9jbGVhbnVwKFxcdTAwMjZjbiwgXFx1MDAyNmNwcm0pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzowNC45NjM1NjUwMTVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM3MTM3NjMyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIENvcmUgRHVtcCBMb2dpYyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBjb3JlIGR1bXBzIGFyZSBnZW5lcmF0ZWQgaW4gdGhpcyBzeXN0ZW0uIFRoZSBmdW5jdGlvbiBgZG9fY29yZWR1bXBgIGlzIGRlY2xhcmVkIGFzIGBzdGF0aWNgLCB3aGljaCBpbW1lZGlhdGVseSB0ZWxscyBtZSBpdCdzIGxpa2VseSBhbiBpbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uLCBwcm9iYWJseSBub3Qgc29tZXRoaW5nIGRpcmVjdGx5IGV4cG9zZWQuIFRoZSByZWFsIGVudHJ5IHBvaW50IGZvciB0aGUgY29yZSBkdW1wIGZ1bmN0aW9uYWxpdHkgaXMgYHZmc19jb3JlZHVtcGAuIFRoYXQncyB3aGVyZSB0aGUgYWN0aW9uICpzdGFydHMqLiBJIG5lZWQgdG8gZHJpbGwgaW50byBgdmZzX2NvcmVkdW1wYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQncyBkb2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg0MzIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzowOC4zMzQ5NTAyOTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDQyNTkxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2ZnNfY29yZWR1bXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvY29yZWR1bXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyNzgtXFxuZnMvY29yZWR1bXAuYzoxMjc5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuZnMvY29yZWR1bXAuYy0xMjgwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MDguNTg5MzgxMzY3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3ODU3NDA5NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKkFuYWx5emluZyBgdmZzX2NvcmVkdW1wYCBhbmQgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAqKlxuXG5SaWdodCwgbGV0IG1lIHNlZS4uLiBzbyBgdmZzX2NvcmVkdW1wYCBpcyAqbm90KiBhIHN0YXRpYyBmdW5jdGlvbiwgd2hpY2ggaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZy4gV2UgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBwb3RlbnRpYWwgc2NvcGUgYW5kIGltcGFjdC4gTm93LCBsZXQncyBjb250cmFzdCB0aGF0IHdpdGggYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgd2hpY2ggKmlzKiBzdGF0aWMuIFRoYXQncyBnb29kOyBpdCBzdWdnZXN0cyBhIG1vcmUgbGltaXRlZCBzY29wZSwgY29udGFpbmVkIHdpdGhpbiBhIHNwZWNpZmljIG1vZHVsZSBvciBmaWxlLiBUaGUgb2J2aW91cyBxdWVzdGlvbiBub3cgYmVjb21lczogSXMgdGhlcmUgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24gdGhhdCBkaXJlY3RseSBjYWxscyBgY29yZWR1bXBfc29ja19yZXF1ZXN0YD8gVGhhdCB3b3VsZCBiZSB0aGUgY3J1Y2lhbCBsaW5rIHRvIGlkZW50aWZ5LCB3b3VsZG4ndCBpdD8gQSBub24tc3RhdGljIGNhbGxlciBvZiBhIHN0YXRpYyBmdW5jdGlvbi4uLiBobW0uLi4gbmVlZCB0byB0cmFjZSB0aGF0IHBvdGVudGlhbCBwYXRoLiBUaGF0IGNvdWxkIGJlIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcsIHdvdWxkbid0IGl0P1xuXG5cbiIsIklucHV0VG9rZW5zIjoxODczMiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjAzOjEzLjM3NTEyNDQxNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYyNDkzMzI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wX3NvY2tfcmVxdWVzdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9ODIxPXN0YXRpYyBpbmxpbmUgdm9pZCBjb3JlZHVtcF9zb2NrX3NodXRkb3duKHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvY29yZWR1bXAuYy04MzItXFxuZnMvY29yZWR1bXAuYzo4MzM6c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbmZzL2NvcmVkdW1wLmMtODM0LXtcXG4tLVxcbmZzL2NvcmVkdW1wLmM9OTU0PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtOTU4LVxcbmZzL2NvcmVkdW1wLmM6OTU5OlxcdHJldHVybiBjb3JlZHVtcF9zb2NrX3JlcXVlc3QoY24sIGNwcm0pO1xcbmZzL2NvcmVkdW1wLmMtOTYwLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MTMuODM3NjIxOTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE4OTQxNDExOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgc3RhbmRzOlxuXG4qKlN0YXRpYyBWYXJpYWJsZXMgYW5kIENhbGxlcnMqKlxuXG5Pa2F5LCBzbyBgY29yZWR1bXBfc29ja2V0YCBpcyBhbHNvIGRlY2xhcmVkIGFzIGBzdGF0aWNgLiBUaGF0IGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdC4gU3RhdGljIHZhcmlhYmxlcyBoYXZlIHNwZWNpZmljIHNjb3BpbmcgYW5kIGxpZmV0aW1lIGNoYXJhY3RlcmlzdGljcywgc28gdW5kZXJzdGFuZGluZyB0aGVpciB1c2FnZSBpcyBjcnVjaWFsLCBlc3BlY2lhbGx5IHdpdGhpbiBhIGNyaXRpY2FsIHBhcnQgb2YgdGhlIHN5c3RlbSBsaWtlIGEgY29yZWR1bXAgbWVjaGFuaXNtLiBNeSBuZXh0IGltbWVkaWF0ZSB0aG91Z2h0IGlzOiBXaGF0ICpleGFjdGx5KiBjYWxscyBgY29yZWR1bXBfc29ja2V0YD8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgdGhlIHVzYWdlIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UgYW5kIGhvdyBpdCdzIGJlaW5nIG1hbmFnZWQuIFdobyBpcyBzZXR0aW5nIHVwIHRoaXMgc29ja2V0PyBXaGF0IGlzIHNlbmRpbmcgZGF0YSB0byBpdD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkxOTMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzoxOC4wMjcwMzg3MjlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNzc4OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wX3NvY2tldFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9ODMzPXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtOTUzLVxcbmZzL2NvcmVkdW1wLmM6OTU0OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTk1NS17XFxuLS1cXG5mcy9jb3JlZHVtcC5jPTk2Mz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9XFxuZnMvY29yZWR1bXAuYzo5NjQ6c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSkgeyByZXR1cm4gZmFsc2U7IH1cXG5mcy9jb3JlZHVtcC5jLTk2NS0jZW5kaWZcXG4tLVxcbmZzL2NvcmVkdW1wLmM9MTIwMT1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIyMi1cXHRjYXNlIENPUkVEVU1QX1NPQ0s6XFxuZnMvY29yZWR1bXAuYzoxMjIzOlxcdFxcdGlmICghY29yZWR1bXBfc29ja2V0KGNuLCBjcHJtKSlcXG5mcy9jb3JlZHVtcC5jLTEyMjQtXFx0XFx0XFx0cmV0dXJuO1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xNjQ5PXZvaWQgdmFsaWRhdGVfY29yZWR1bXBfc2FmZXR5KHZvaWQpXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTE2NTktXFxuZnMvY29yZWR1bXAuYzoxNjYwOnN0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19jb3JlZHVtcF9zb2NrZXQodm9pZClcXG5mcy9jb3JlZHVtcC5jLTE2NjEte1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xNjk5PXN0YXRpYyBpbnQgcHJvY19kb3N0cmluZ19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbi0tXFxuZnMvY29yZWR1bXAuYy0xNzE0LVxcbmZzL2NvcmVkdW1wLmM6MTcxNTpcXHRpZiAoIWNoZWNrX2NvcmVkdW1wX3NvY2tldCgpKSB7XFxuZnMvY29yZWR1bXAuYy0xNzE2LVxcdFxcdHN0cnNjcHkoY29yZV9wYXR0ZXJuLCBvbGRfY29yZV9wYXR0ZXJuLCByZXR2YWwgKyAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MTguMDY5ODIwMDA3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc5OTI3NjM5NjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6XG5cbioqRGlnZ2luZyBpbnRvIHRoZSBDb3JlIER1bXAgRmxvdyoqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gdHJhY2UgdGhlIGNvcmUgZHVtcCBwcm9jZXNzLiBSaWdodCBub3csIEknbSB0aGlua2luZyBhYm91dCBob3cgYGRvX2NvcmVkdW1wYCBpcyBjb25uZWN0ZWQgdG8gYGNvcmVkdW1wX3NvY2tldGAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAuIElmIGBkb19jb3JlZHVtcGAgaXMgY2FsbGVkIGJ5IGB2ZnNfY29yZWR1bXBgLCB0aGVuIHRoYXQgc3VnZ2VzdHMgYHZmc19jb3JlZHVtcGAgaXMgcHJvYmFibHkgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGFuZCBmb2N1c2luZyBteSBpbnZlc3RpZ2F0aW9uLiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoYXQgZnVuY3Rpb24uIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmaWxwX2Nsb3NlX3N5bmNgIGJlY2F1c2Ugb2YgbXkgZXhwZXJpZW5jZXMgd2l0aCByZXNvdXJjZSBjbGVhbnVwIGluIHRoaXMgYXJlYS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk4NzEsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowNDozNy45OTc0NjIzMjVaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MTIwNjk2NTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmlscF9jbG9zZV9zeW5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2ZpbGUuYz01MDE9c3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXFxuLS1cXG5mcy9maWxlLmMtNTI2LVxcdFxcdFxcdFxcdFxcdGlmIChzeW5jKVxcbmZzL2ZpbGUuYzo1Mjc6XFx0XFx0XFx0XFx0XFx0XFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcXG5mcy9maWxlLmMtNTI4LVxcdFxcdFxcdFxcdFxcdGVsc2VcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYz02NDI9RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYy02NDctICovXFxuZnMvZmlsZV90YWJsZS5jOjY0ODppbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbmZzL2ZpbGVfdGFibGUuYy02NDkte1xcbi0tXFxuZnMvaW50ZXJuYWwuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4tLVxcbmZzL2ludGVybmFsLmgtMTI5LVxcbmZzL2ludGVybmFsLmg6MTMwOmludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpO1xcbmZzL2ludGVybmFsLmgtMTMxLXZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTtcXG4tLVxcbmZzL29wZW4uYz0xNDYxPVNZU0NBTExfREVGSU5FMShjbG9zZSwgdW5zaWduZWQgaW50LCBmZClcXG4tLVxcbmZzL29wZW4uYy0xNDczLVxcdCAqL1xcbmZzL29wZW4uYzoxNDc0OlxcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVxcdTAwM2VmaWxlcyk7XFxuZnMvb3Blbi5jLTE0NzUtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjA0OjM5LjYwOTUzODU0OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTE5NzQwMTY0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIGBmaWxwX2Nsb3NlX3N5bmNgIGFzIGEgS2V5IEZvY3VzKipcblxuQWxyaWdodCwgYmFzZWQgb24gdGhvc2UgcmVsYXRpb25zaGlwcywgaXQgbG9va3MgbGlrZSBgZmlscF9jbG9zZV9zeW5jYCBpcyBkZWZpbml0ZWx5IGEgY29yZSBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBUaGUgZmFjdCB0aGF0IGl0J3MgY2FsbGVkIGJ5IGJvdGggYGNsb3NlX2ZpbGVzYCBhbmQgYHN5c19jbG9zZWAgbWFrZXMgaXQgYSBoaWdoLXZhbHVlIHN5bWJvbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBmaWxlIGNsb3NpbmcgcHJvY2Vzcy4gS25vd2luZyB0aGF0LCBJIG5lZWQgdG8gY2hlY2sgaG93IGl0IHdvcmtzIHdpdGggYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYC4gSXQgcHJvYmFibHkgZGVhbHMgd2l0aCBzb21lIG9mIHRoZSBmaW5lciBkZXRhaWxzIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0IHJlbGF0aW9uc2hpcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA0NjUsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowNTo1NC44MDY5NDI2NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ2ODM0MjIyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb3JlZHVtcF9jbG9zZV9maWxlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyMzQtXFxuZnMvY29yZWR1bXAuYzoxMjM1OlxcdGlmICgoY3BybS1cXHUwMDNlbWFzayBcXHUwMDI2IENPUkVEVU1QX0NMT1NFX0ZJTEVTKSBcXHUwMDI2XFx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xcbmZzL2NvcmVkdW1wLmMtMTIzNi1cXHRcXHRjb3JlZHVtcF9yZXBvcnRfZmFpbHVyZShcXFwiRmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXFxcIik7XFxuLS1cXG5mcy9maWxlLmM9NTcxPXZvaWQgZXhpdF9maWxlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmZzL2ZpbGUuYy01ODEtICovXFxuZnMvZmlsZS5jOjU4Mjpib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXFxuZnMvZmlsZS5jLTU4My17XFxuLS1cXG5mcy9maWxlLmM9NjI4PWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuLS1cXG5mcy9maWxlLmMtNjMyLVxcbmZzL2ZpbGUuYzo2MzM6XFx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xcbmZzL2ZpbGUuYy02MzQtXFx0ZmlsZXMgPSBzbXBfbG9hZF9hY3F1aXJlKFxcdTAwMjZzZWxmLVxcdTAwM2VmaWxlcyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaD0xMDQ9dm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaDoxMDU6Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaC0xMDYtYm9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZik7XFxuLS1cXG5rZXJuZWwvZXhpdC5jPTQzMD1zdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuLS1cXG5rZXJuZWwvZXhpdC5jLTQ1MS1cXHRcXHRcXHRicmVhaztcXG5rZXJuZWwvZXhpdC5jOjQ1MjpcXHRcXHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xcbmtlcm5lbC9leGl0LmMtNDUzLVxcdFxcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFxcdTAwMjZzZWxmKSlcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTQ9VEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUtNi1cXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZTo3OlxcdFxcdCAgY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlLTgtVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTE0PSQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZToxNTokKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDU6NTYuMjc1Mjg4NjA4WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0NDcyOTYyOTE0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgQ29yZSBEdW1wIEZpbGUgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gaG9uaW5nIGluIG9uIHRoZSBjcnVjaWFsIGFyZWFzIGZvciBmaWxlIGhhbmRsaW5nIHdpdGhpbiB0aGUgY29yZSBkdW1wIHByb2Nlc3MuIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCBhcmUgZGVmaW5pdGVseSBrZXkgZm9jdXMgcG9pbnRzLiBUaG9zZSBmdW5jdGlvbiBuYW1lcyBzY3JlYW0gXCJmaWxlIGNsZWFudXAsXCIgd2hpY2ggaXMgZXhhY3RseSB3aGF0IEkgbmVlZCB0byB1bmRlcnN0YW5kIGJldHRlci4gTm93LCBJIHNob3VsZCBzaGlmdCBteSBhdHRlbnRpb24gdG8gdGhlIGFsbG9jYXRpb24gc2lkZSBvZiB0aGluZ3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZmlsZSBzdHJ1Y3R1cmVzIGFyZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4gTGV0J3MgZGlnIGludG8gYGFsbG9jX2ZpbGVzX3N0cnVjdGAgYW5kIGBhbGxvY19maWxlc2AuIFVuZGVyc3RhbmRpbmcgdGhlIGFsbG9jYXRpb24gcHJvY2VzcyB3aWxsIHRlbGwgbWUgYSBsb3QgYWJvdXQgaG93IHRoZXNlIGZpbGUgaGFuZGxlcyBhcmUgbWFuYWdlZCBmcm9tIHRoZSB2ZXJ5IHN0YXJ0LiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgcGljdHVyZSBvZiB0aGUgZW50aXJlIGxpZmVjeWNsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEzMzYsIk91dHB1dFRva2VucyI6MTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODoyMS4wMDQ5MjAyNzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NTg3NjQyMjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWxsb2NfZmlsZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmlsZS5jPTM2ND1zdGF0aWMgdW5zaWduZWQgaW50IHNhbmVfZmR0YWJsZV9zaXplKHN0cnVjdCBmZHRhYmxlICpmZHQsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcXG4tLVxcbmZzL2ZpbGUuYy0zNzgtLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXFxuZnMvZmlsZS5jOjM3OTpzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxcbmZzL2ZpbGUuYy0zODAte1xcbi0tXFxuZnMvZmlsZS5jLTQwNC0vKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cXG5mcy9maWxlLmM6NDA1OnN0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZClcXG5mcy9maWxlLmMtNDA2LXtcXG4tLVxcbmZzL2ZpbGUuYy00MDgtXFxuZnMvZmlsZS5jOjQwOTpcXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xcbmZzL2ZpbGUuYy00MTAtXFx0aWYgKCFuZXdmKVxcbi0tXFxuZnMvZmlsZS5jPTQyMj1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxcbi0tXFxuZnMvZmlsZS5jLTQyOC1cXG5mcy9maWxlLmM6NDI5OlxcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcXG5mcy9maWxlLmMtNDMwLVxcdGlmICghbmV3ZilcXG4tLVxcbmZzL2ZpbGUuYz01ODI9Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxcbi0tXFxuZnMvZmlsZS5jLTU4OC1cXG5mcy9maWxlLmM6NTg5OlxcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XFxuZnMvZmlsZS5jLTU5MC1cXHRpZiAoIWZpbGVzKVxcbi0tXFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jPTM1MzI9c3RhdGljIGludFxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYzozNTMzOnhmc19ibWFwX2J0YWxsb2NfZmlsZXN0cmVhbXMoXFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM1MzQtXFx0c3RydWN0IHhmc19ibWFsbG9jYVxcdCphcCxcXG4tLVxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYz0zNjI1PXhmc19ibWFwX2J0YWxsb2MoXFxuLS1cXG5mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMtMzY1OC1cXHRcXHRcXHR4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC1cXHUwMDNlaXApKVxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYzozNjU5OlxcdFxcdGVycm9yID0geGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhhcCwgXFx1MDAyNmFyZ3MsIHN0cmlwZV9hbGlnbik7XFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM2NjAtXFx0ZWxzZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODoyMi40NjM2ODgyMDVaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUyMDE0NDU1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqQW5hbHl6aW5nIEZpbGUgQWxsb2NhdGlvbiBTdHJ1Y3R1cmVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlc2UgZmlsZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4gSSBzZWUgYGFsbG9jX2ZpbGVzYCBhbmQgYGFsbG9jX2ZpbGVzX3N0cnVjdGAgZGVmaW5lZCBhcyBgc3RhdGljYC4gUmlnaHQsIHRoYXQgbWVhbnMgdGhleSdyZSBvbmx5IHZpc2libGUgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhhdCdzIGdvb2QgdG8ga2VlcCBpbiBtaW5kLCBpdCBsaW1pdHMgdGhlaXIgc2NvcGUgd2hpY2ggaXMgdXN1YWxseSBhIHBvc2l0aXZlIHNpZ24gZm9yIG1vZHVsYXJpdHkuIE5vdywgbGV0IG1lIHNoaWZ0IG15IGZvY3VzIHRvIGBzd2l0Y2hfZmlsZXNfc3RydWN0YC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZXNlIG90aGVyIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4gSXQncyBsaWtlbHkgdGhhdCBpdCBoYXMgYSByb2xlIGluIG1hbmFnaW5nIG9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBzdHJ1Y3R1cmUgaW4gc29tZSB3YXksIGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIGBhbGxvY19maWxlc2AgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZC4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMjA2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MjUuOTgzODM0OTE0WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzkzNDcwMjA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN3aXRjaF9maWxlc19zdHJ1Y3RcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmlsZS5jPTU0MT12b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXFxuLS1cXG5mcy9maWxlLmMtNTUzLS8qIEhhbmQgQHRzayB0aGUgdGFibGUgQGZpbGVzLCBvciBub25lLCBhbmQgZHJvcCB0aGUgb25lIGl0IGhhZC4gKi9cXG5mcy9maWxlLmM6NTU0OnN0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuZnMvZmlsZS5jLTU1NS1cXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcylcXG4tLVxcbmZzL2ZpbGUuYz01NzE9dm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxuZnMvZmlsZS5jLTU3NC1cXHRcXHRyZXR1cm47XFxuZnMvZmlsZS5jOjU3NTpcXHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XFxuZnMvZmlsZS5jLTU3Ni19XFxuLS1cXG5mcy9maWxlLmM9NTgyPWJvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZClcXG4tLVxcbmZzL2ZpbGUuYy02MDktXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3VycmVudF9yZWFsX2NyZWQoKSlcXG5mcy9maWxlLmM6NjEwOlxcdFxcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xcbmZzL2ZpbGUuYy02MTEtXFxuLS1cXG5mcy9maWxlLmM9NjI4PWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuLS1cXG5mcy9maWxlLmMtNjM4LVxcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcXG5mcy9maWxlLmM6NjM5OlxcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xcbmZzL2ZpbGUuYy02NDAtXFx0Y29yZV9zdGF0ZSA9IGN1cnJlbnQtXFx1MDAzZXNpZ25hbC1cXHUwMDNlY29yZV9zdGF0ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MjcuMzc3MzA5MDhaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjI5MDk0NTcyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGb2N1cyBTeW1ib2wgUmVmaW5lbWVudCoqXG5cbk9rYXksIGxldCdzIG5haWwgZG93biB0aGVzZSBmb2N1cyBzeW1ib2xzLiBJJ3ZlIGdvdCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgbG9ja2VkIGluIGFzIHN0YXRpYywgc28gdGhhdCdzIG9mZiB0aGUgdGFibGUuIE5vdywgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyBJIG5lZWQgdG8gZXhhbWluZTogYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgLCBgZmlscF9jbG9zZV9zeW5jYCwgYW5kIGB2ZnNfY29yZWR1bXBgLlxuXG5SaWdodCwgbGV0J3MgcmV2aXNpdCBgZmlscF9jbG9zZV9zeW5jYC4gSGFuZyBvbi4uLiBpdCdzIGNhbGxlZCBieSBgc3lzX2Nsb3NlYD8gVGhhdCdzIGEgKnZlcnkqIGhvdCBwYXRoLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bDsgdGhhdCdzIHByb2JhYmx5IG5vdCBpZGVhbCBhcyBhIGZvY3VzIHN5bWJvbC4gVGhlIGtlcm5lbCBzZWVzIGEgdG9uIG9mIGBzeXNfY2xvc2VgIGNhbGxzLiBZZXAsIGByZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7YCBpbiBgc3lzX2Nsb3NlYCBjb25maXJtcyBpdC4gIFNvLCBzY3JhcCBgZmlscF9jbG9zZV9zeW5jYCBmcm9tIHRoZSBsaXN0OyBpdCdzIHRvbyBnZW5lcmljIGFuZCBoaWdoLWZyZXF1ZW5jeS5cblxuTm93LCB3aGF0IGFib3V0IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYD8gVGhvc2UgYXJlIHNwZWNpZmljIHRvIGNvcmVkdW1wIGZ1bmN0aW9uYWxpdHksIHJpZ2h0PyBOb3QgYSBzdGFuZGFyZCBwYXRoLiBUaGF0IGxvb2tzIGdvb2QuIEFuZCBgdmZzX2NvcmVkdW1wYCBpcyBzaW1pbGFybHkgbmljaGUuIFRoYXQncyBnb29kIHRvby5cblxuQXJlIHRoZXJlIGFueSBvdGhlciBvdXRsaWVycz8gIGBmaWxwX2Nsb3NlYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgYnV0IGl0IGxvb2tzIGxpa2UgYSBob3QgcGF0aCAob3IgYXQgbGVhc3QgZ2VuZXJpYykuIEFuZCBgZHVwX2ZkYCBpcyBtb2RpZmllZCBidXQgaXQncyB1c2VkIGluIGZvcmssIG5vdCBhIGZvY3VzLlxuXG5Pa2F5LCBJIHRoaW5rIHdlJ3ZlIGdvdCBpdC4gVGhlIGZvY3VzIHN5bWJvbHMsIGdpdmVuIHRoZSBhbmFseXNpcywgc2hvdWxkIGJlOlxuXG4qICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYFxuKiAgIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYFxuKiAgIGB2ZnNfY29yZWR1bXBgXG5cbkknbGwgZG91YmxlLWNoZWNrIGB2ZnNfY29yZWR1bXBgIG9uZSBtb3JlIHRpbWUsIGp1c3QgdG8gYmUgc3VyZS4gSXQgZG9lcyBzZWVtIHVuaXF1ZSB0byB0aGUgY29yZWR1bXAgdXNlIGNhc2UuIEV4Y2VsbGVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI4MDMsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MzMuNjY4MjU3MjIxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDM4MTkyNTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZmc19jb3JlZHVtcFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJEb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD01NTU9ZGlmZmVyZW50IHNldCBvZiBjcmVkZW50aWFscy4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHBsYWNlczpcXG4tLVxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0OjU1ODogKiBgYHZmc19jb3JlZHVtcCgpYGAuXFxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNTU5LSAqIG5mczRyZWNvdmVyLmMuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q9MjU0PWNvbnN05oyH6ZKI5LiK5pON5L2c77yM5Zug5q2k5LiN6ZyA6KaB6L+b6KGM57G75Z6L6L2s5o2i77yM5L2G6ZyA6KaB5Li05pe25pS+5byDY29uc3TpmZDlrprvvIzku6Xkvr/og73lpJ/kv67mlLlcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NDc4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNDc5LSAqIG5mczRyZWNvdmVyLmMuXFxuLS1cXG5mcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyNzgtXFxuZnMvY29yZWR1bXAuYzoxMjc5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuZnMvY29yZWR1bXAuYy0xMjgwLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaD02Nz1ib29sIGR1bXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC02OC1cXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgbGVuKTtcXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg6Njk6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcwLVxcbi0tXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTg4LSNlbHNlXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjg5OnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtOTAtXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cXHRcXHRcXHQgKi9cXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcXHRcXHRcXHR2ZnNfY29yZWR1bXAoXFx1MDAyNmtzaWctXFx1MDAzZWluZm8pO1xcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MzUuMTA2NDU0MDA3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwODczMzMwNjQyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZlYXR1cmUqKlxuXG5Pa2F5LCBzbyBgdmZzX2NvcmVkdW1wYCDigJMgdGhhdCdzIGRlZmluaXRlbHkgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBmdXp6aW5nLCBpdCdzIGNhbGxlZCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBzbyB3ZSBoYXZlIGEgY2xlYXIgdHJpZ2dlci4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlncyByZWxhdGVkIHRvIHRoaXMgYXJlYS4gSXQgbG9va3MgbGlrZSBgQ09SRURVTVBgIGlzIHRoZSBvbmx5IG9uZS4gSG1tLCBpdCdzIGVuYWJsZWQgYnkgZGVmYXVsdCwgd2hpY2ggaXMgY29udmVuaWVudCwgYW5kIHRoaXMgaXMgdGhlIGNvbmZpZyB0aGF0IGVuYWJsZXMgdGhlIGZlYXR1cmUsIHNvIHllcywgd2Ugc2hvdWxkIGluY2x1ZGUgaXQuXG5cbk5vdywgd2hlcmUgZWxzZSBhcmUgdGhlIGNoYW5nZXM/IFRoZSBjaGFuZ2VzIGFyZSBtYWlubHkgYXJvdW5kIGZpbGUgZGVzY3JpcHRvciBtYW5hZ2VtZW50LiBJJ20gc2VlaW5nIGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucyBpbiBzZXZlcmFsIGZpbGVzOiBgZnMvZmlsZV90YWJsZS5jYCAod2l0aCBgZmlscF9jbG9zZWAgYW5kIGBmaWxwX2Nsb3NlX3N5bmNgKSwgYGZzL29wZW4uY2AgKHdpdGggYHN5c19jbG9zZWAgdXNpbmcgYGZpbHBfY2xvc2Vfc3luY2ApLCBhbmQgYGZzL2ZpbGUuY2AgKHdpdGggYSBidW5jaCBvZiBuZXcgZnVuY3Rpb25zIGxpa2UgYGFsbG9jX2ZpbGVzYCwgYGFsbG9jX2ZpbGVzX3N0cnVjdGAsIGBkdXBfZmRgLCBgY2xvc2VfZmlsZXNgLCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAsIGBleGl0X2ZpbGVzYCwgYW5kIHNwZWNpZmljYWxseSwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgKS4gYGZzL2NvcmVkdW1wLmNgIGFsc28gaGFzIG5ldyBmdW5jdGlvbnMgbGlrZSBgY29yZWR1bXBfd2FpdGAsIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgLCBhbmQgYGRvX2NvcmVkdW1wYC4gRmluYWxseSwgYGtlcm5lbC9leGl0LmNgIGhhcyBgY29yZWR1bXBfdGFza19leGl0YC5cblxuWWVzLCB0aGlzIGlzIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudC4gVGhlIGNvcmVkdW1wIGZlYXR1cmUgaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJdCdzIHJlYWNoYWJsZSB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBzcGVjaWZpY2FsbHkgaWYgdGhlIGNvcmVkdW1wIHBhdHRlcm4gaXMgc2V0IHRvIGEgcGlwZSBvciBzb2NrZXQuIFRoZW4gdGhlIHVzZXJzcGFjZSBoYW5kbGVyIHdvdWxkIHJlcGx5IHdpdGggYENPUkVEVU1QX0NMT1NFX0ZJTEVTYC4gVGhpcyBzaG91bGQgYmUgZWFzaWx5IHJlcHJvZHVjaWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXG5cblNvLCBoZXJlJ3MgdGhlIHN1bW1hcnk6XG5cbiogICAqKldvcnRoRnV6emluZyoqOiBUcnVlXG4qICAgKipGb2N1c1N5bWJvbHMqKjpcbiAgICAqICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYFxuICAgICogICBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2BcbiAgICAqICAgYHZmc19jb3JlZHVtcGBcbiogICAqKkVuYWJsZUNvbmZpZ3MqKjpcbiAgICAqICAgYENPUkVEVU1QYFxuXG5MZXQncyBjaGVjayBgQ09SRURVTVBgIGZvciBkZXBlbmRlbmNpZXMuIEl0J3MgYSBib29sZWFuIG9wdGlvbiBjb250cm9sbGVkIGJ5IGBFWFBFUlRgLiBCdXQgaXQgZG9lc24ndCAqZGVwZW5kKiBvbiBleHBlcnQgbW9kZSwgaXQganVzdCAqc2hvd3MqIHRoZSBwcm9tcHQgaW4gZXhwZXJ0IG1vZGUuIFNvIGBDT1JFRFVNUGAgaXMgZmluZSBhcy1pcy5cblxuTG9va2luZyBiYWNrIGF0IHRoZSByZWFzb25pbmcuLi4gdGhlIHBhdGNoIGVzc2VudGlhbGx5IGFkZHMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXJzIHRvIGluc3RydWN0IHRoZSBrZXJuZWwgdG8gY2xvc2UgYWxsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGEgY3Jhc2hpbmcgdGFzayAqYmVmb3JlKiBkdW1waW5nIHRoZSBjb3JlLiBUaGlzIGludHJvZHVjZXMgbmV3IGxvZ2ljIGZvciBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuaXB1bGF0aW9uIGFuZCBjbG9zaW5nIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AuIFdlIGNhbiB0cmlnZ2VyIHRoaXMgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgaGFuZGxlciByZXR1cm4gdGhlIGZsYWcuXG5cbk9rYXksIEknbSBzYXRpc2ZpZWQuIFRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDEzNSwiT3V0cHV0VG9rZW5zIjoxODAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1ODgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDUuOTc5Nzg3NTY5WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM3OTk0MDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNPUkVEVU1QXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiY29yZWR1bXBfY2xvc2VfZmlsZXNcIixcbiAgICBcImNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNcIixcbiAgICBcInZmc19jb3JlZHVtcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb3JlZHVtcF9jbG9zZV9maWxlc1wiLFxuICAgIFwiY29yZWR1bXBfdGFza19jbG9zZV9maWxlc1wiLFxuICAgIFwidmZzX2NvcmVkdW1wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDYuMDUzNTkyODRaIiwiU2VxIjoyOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTU3NjE3MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDYuMDU0MDE1NTRaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTA1NTcxOTEyNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwOTU3ZDAwMGI0NWVhNDY5Y2YyMzRlN2NhZDRjNTcwNTFlYzU0NzE2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMjQgMTc6NTc6MDQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9jb3JlZHVtcC5jIGIvZnMvY29yZWR1bXAuY1xuaW5kZXggZWM5MzU5ZTM4MmVhNS4uYTZlN2RhMGJjMTZhNyAxMDA2NDRcbi0tLSBhL2ZzL2NvcmVkdW1wLmNcbisrKyBiL2ZzL2NvcmVkdW1wLmNcbkBAIC01MjMsNyArNTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50O1xuIFx0aW50IGNvcmVfd2FpdGVycyA9IC1FQlVTWTtcbiBcbi1cdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXApO1xuK1x0aW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4gXHRjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci50YXNrID0gdHNrO1xuIFx0Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dCA9IE5VTEw7XG4gXG5AQCAtNTMxLDcgKzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSlcbiBcdGlmIChjb3JlX3dhaXRlcnMgXHUwMDNlIDApIHtcbiBcdFx0c3RydWN0IGNvcmVfdGhyZWFkICpwdHI7XG4gXG4tXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VzdGFydHVwLFxuK1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbiBcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdC8qXG4gXHRcdCAqIFdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBiZWNvbWUgaW5hY3RpdmUsIHNvIHRoYXRcbkBAIC04MzcsNyArODM3LDggQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdFx0Lm1hc2tcdFx0XHQ9IENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XG4gXHRcdFx0XHRcdCAgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XG4gXHRcdFx0XHRcdCAgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8XG4tXHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTLFxuK1x0XHRcdFx0XHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8XG4rXHRcdFx0XHRcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXG4gXHRcdC5zaXplX2Fja1x0XHQ9IHNpemVvZihzdHJ1Y3QgY29yZWR1bXBfYWNrKSxcbiBcdFx0Lm1lbW9yeV90eXBlc1x0XHQ9IGNwcm0tXHUwMDNlbWVtb3J5X3R5cGVzLFxuIFx0XHQubWVtb3J5X3R5cGVzX21hc2tcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcbkBAIC05MDUsNiArOTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcdH1cbiBcbitcdC8qIEEgcmVqZWN0ZWQgdGFzayBleGl0cyByaWdodCBhd2F5IGFuZCBjbG9zZXMgZXZlcnl0aGluZyBhbnl3YXkuICovXG4rXHRpZiAoKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2IChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xuK1x0XHRjb3JlZHVtcF9zb2NrX21hcmsoY3BybS1cdTAwM2VmaWxlLCBDT1JFRFVNUF9NQVJLX0NPTkZMSUNUSU5HKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuIFx0aWYgKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9NRU1PUllfVFlQRVMpIHtcbiBcdFx0LyogVGhlIG1lbW9yeSB0eXBlcyBuZWVkIHRoZSB3aG9sZSBmaWVsZC4gKi9cbiBcdFx0aWYgKHVzaXplIFx1MDAzYyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7XG5AQCAtMTIyNSw2ICsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuIFx0aWYgKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKVxuIFx0XHRyZXR1cm47XG4gXG4rXHRpZiAoKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFx1MDAyNlx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xuK1x0XHRjb3JlZHVtcF9yZXBvcnRfZmFpbHVyZShcIkZhaWxlZCB0byBjbG9zZSBmaWxlcywgYWJvcnRpbmcgY29yZVwiKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0LyogZ2V0IHVzIGFuIHVuc2hhcmVkIGRlc2NyaXB0b3IgdGFibGU7IGFsbW9zdCBhbHdheXMgYSBuby1vcCAqL1xuIFx0LyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqL1xuIFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcbmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmNcbmluZGV4IDYyOGNhMDdkYzRiMTcuLjNiOGZjZTZlMzY5NTEgMTAwNjQ0XG4tLS0gYS9mcy9maWxlLmNcbisrKyBiL2ZzL2ZpbGUuY1xuQEAgLTM3NSwyMSArMzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jXG4gXHRyZXR1cm4gQUxJR04obGFzdCArIDEsIEJJVFNfUEVSX0xPTkcpO1xuIH1cbiBcbi0vKlxuLSAqIEFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3IgdGFibGUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0aGUgcGFzc2VkIGluXG4tICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4tICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4tICovXG4tc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbisvKiBBIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZSBhbmQgdGhlIGVtYmVkZGVkIGZkdGFibGUsIG5vdGhpbmcgY29waWVkIHlldC4gKi9cbitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxuIHtcbiBcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4tXHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2Zkcztcbi1cdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xuLVx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xuK1x0c3RydWN0IGZkdGFibGUgKm5ld19mZHQ7XG4gXG4tXHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIEdGUF9LRVJORUwpO1xuK1x0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApO1xuIFx0aWYgKCFuZXdmKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRhdG9taWNfc2V0KFx1MDAyNm5ld2YtXHUwMDNlY291bnQsIDEpO1xuIFxuQEAgLTQwNCw2ICszOTgsMzkgQEAgc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9cbiBcdG5ld19mZHQtXHUwMDNlZnVsbF9mZHNfYml0cyA9IG5ld2YtXHUwMDNlZnVsbF9mZHNfYml0c19pbml0O1xuIFx0bmV3X2ZkdC1cdTAwM2VmZCA9IFx1MDAyNm5ld2YtXHUwMDNlZmRfYXJyYXlbMF07XG4gXG4rXHRyZXR1cm4gbmV3Zjtcbit9XG4rXG4rLyogQW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UuICovXG4rc3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmFsbG9jX2ZpbGVzX3N0cnVjdCh2b2lkKVxuK3tcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4rXG4rXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xuK1x0aWYgKCFuZXdmKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXdmLVx1MDAzZWZkdCwgXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYik7XG4rXHRyZXR1cm4gbmV3Zjtcbit9XG4rXG4rLypcbisgKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpblxuKyAqIGluc3RhbmNlLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gY2xvbmVkIHRhYmxlIG9uIHN1Y2Nlc3MsIEVSUl9QVFIoKVxuKyAqIG9uIGZhaWx1cmUuICBGb3IgJ3B1bmNoX2hvbGUnIHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxuKyAqL1xuK3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbitcdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xuK1x0dW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7XG4rXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4rXG4rXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIW5ld2YpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1x0bmV3X2ZkdCA9IFx1MDAyNm5ld2YtXHUwMDNlZmR0YWI7XG4rXG4gXHRzcGluX2xvY2soXHUwMDI2b2xkZi1cdTAwM2VmaWxlX2xvY2spO1xuIFx0b2xkX2ZkdCA9IGZpbGVzX2ZkdGFibGUob2xkZik7XG4gXHRvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7XG5AQCAtNDgwLDYgKzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcylcbiBcdCAqL1xuIFx0c3RydWN0IGZkdGFibGUgKmZkdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoZmlsZXMtXHUwMDNlZmR0KTtcbiBcdHVuc2lnbmVkIGludCBpLCBqID0gMDtcbitcdC8qXG4rXHQgKiBBIGtlcm5lbCB0aHJlYWQgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8gbWFrZSBwcm9ncmVzcyBvbiBzb21lXG4rXHQgKiB1bW91bnQgbXVzdCBub3QgcnVuIF9fZnB1dCgpIGl0c2VsZiwgc2VlIF9fZnB1dF9zeW5jKCkuXG4rXHQgKi9cbitcdGJvb2wgc3luYyA9ICEoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfS1RIUkVBRCk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc2V0O1xuQEAgLTQ5MSw3ICs1MjMsMTAgQEAgc3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4gXHRcdFx0aWYgKHNldCBcdTAwMjYgMSkge1xuIFx0XHRcdFx0c3RydWN0IGZpbGUgKmZpbGUgPSBmZHQtXHUwMDNlZmRbaV07XG4gXHRcdFx0XHRpZiAoZmlsZSkge1xuLVx0XHRcdFx0XHRmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTtcbitcdFx0XHRcdFx0aWYgKHN5bmMpXG4rXHRcdFx0XHRcdFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcbitcdFx0XHRcdFx0ZWxzZVxuK1x0XHRcdFx0XHRcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xuIFx0XHRcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG5AQCAtNTE1LDE2ICs1NTAsOTcgQEAgdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuIFx0fVxuIH1cbiBcbisvKiBIYW5kIEB0c2sgdGhlIHRhYmxlIEBmaWxlcywgb3Igbm9uZSwgYW5kIGRyb3AgdGhlIG9uZSBpdCBoYWQuICovXG4rc3RhdGljIHZvaWQgc3dpdGNoX2ZpbGVzX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbitcdFx0XHRcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuK3tcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZDtcbitcbitcdHRhc2tfbG9jayh0c2spO1xuK1x0b2xkID0gdHNrLVx1MDAzZWZpbGVzO1xuK1x0aWYgKG9sZCkge1xuK1x0XHRpZiAoZmlsZXMpXG4rXHRcdFx0YXRvbWljX2luYyhcdTAwMjZmaWxlcy1cdTAwM2Vjb3VudCk7XG4rXHRcdHRzay1cdTAwM2VmaWxlcyA9IGZpbGVzO1xuK1x0fVxuK1x0dGFza191bmxvY2sodHNrKTtcbitcdGlmIChvbGQpXG4rXHRcdHB1dF9maWxlc19zdHJ1Y3Qob2xkKTtcbit9XG4rXG4gdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay1cdTAwM2VmaWxlcztcbitcdGlmICghdHNrLVx1MDAzZWZpbGVzKVxuK1x0XHRyZXR1cm47XG4rXHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XG4rfVxuK1xuKy8qXG4rICogVGhlIHRocmVhZC1ncm91cCBpcyB3YWl0aW5nIGluIGNvcmVkdW1wX3Rhc2tfZXhpdCgpLiBXYWtlIHRoZW0gYW5kXG4rICogdGVsbCB0aGVtIHRvIGdldCByaWQgb2YgdGhlaXIgZmlsZXMuXG4rICovXG4rYm9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuK3tcbitcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xuK1x0c3RydWN0IGNvcmVfdGhyZWFkICpjdDtcbitcdGludCBuciA9IDA7XG4gXG4tXHRpZiAoZmlsZXMpIHtcbi1cdFx0dGFza19sb2NrKHRzayk7XG4tXHRcdHRzay1cdTAwM2VmaWxlcyA9IE5VTEw7XG4tXHRcdHRhc2tfdW5sb2NrKHRzayk7XG4tXHRcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuK1x0ZmlsZXMgPSBhbGxvY19maWxlc19zdHJ1Y3QoKTtcbitcdGlmICghZmlsZXMpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qIFRhc2tzIHdpdGhvdXQgYSB0YWJsZSwgdmhvc3Qgd29ya2VycyBzYXksIHNpdCB0aGUgc3dpdGNoIG91dC4gKi9cbitcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuK1x0XHRpZiAoY3QtXHUwMDNldGFzay1cdTAwM2VmaWxlcylcbitcdFx0XHRucisrO1xuK1x0YXRvbWljX3NldChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMsIG5yKTtcbitcdHJlaW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4rXG4rXHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtXHUwMDNlbmV4dCkge1xuK1x0XHRpZiAoIWN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdC8qIFBhaXJzIHdpdGggdGhlIGFjcXVpcmUgaW4gY29yZWR1bXBfdGFza19jbG9zZV9maWxlcygpLiAqL1xuK1x0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZjdC1cdTAwM2VmaWxlcywgZmlsZXMpO1xuK1x0XHR3YWtlX3VwX3Byb2Nlc3MoY3QtXHUwMDNldGFzayk7XG4gXHR9XG4rXG4rXHQvKiBUaGUgZHVtcGVyJ3Mgc3ViamVjdGl2ZSBjcmVkcyBhcmUgdGhlIGR1bXAncywgbm90IGl0cyBvd24uICovXG4rXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuK1x0XHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcbitcbitcdGlmIChucikge1xuK1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbitcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4rXHRcdC8qIEJhY2sgYXNsZWVwIGJlZm9yZSB0aGUgbm90ZXMgcmVhZCB0aGVpciByZWdpc3RlcnMuICovXG4rXHRcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuK1x0XHRcdHdhaXRfdGFza19pbmFjdGl2ZShjdC1cdTAwM2V0YXNrLCBUQVNLX0FOWSk7XG4rXHR9XG4rXG4rXHRwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbisvKlxuKyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZVxuKyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQncyBjb3JlX3RocmVhZCBlbnRyeS5cbisgKi9cbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKVxuK3tcbitcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlO1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4rXG4rXHQvKiBQYWlycyB3aXRoIHRoZSByZWxlYXNlIGluIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKCkuICovXG4rXHRmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2c2VsZi1cdTAwM2VmaWxlcyk7XG4rXHRpZiAoIWZpbGVzIHx8ICFjdXJyZW50LVx1MDAzZWZpbGVzIHx8IGN1cnJlbnQtXHUwMDNlZmlsZXMgPT0gZmlsZXMpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbitcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuK1x0Y29yZV9zdGF0ZSA9IGN1cnJlbnQtXHUwMDNlc2lnbmFsLVx1MDAzZWNvcmVfc3RhdGU7XG4rXHRpZiAoYXRvbWljX2RlY19hbmRfdGVzdChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMpKVxuK1x0XHRjb21wbGV0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuK1x0cmV0dXJuIHRydWU7XG4gfVxuIFxuIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHtcbmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmNcbmluZGV4IGM2OGI4YzBhNDA5N2EuLjNjNzA1OTE3NjQ2YjUgMTAwNjQ0XG4tLS0gYS9mcy9maWxlX3RhYmxlLmNcbisrKyBiL2ZzL2ZpbGVfdGFibGUuY1xuQEAgLTEzLDYgKzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZG5vdGlmeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2VjdXJpdHkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2V2ZW50cG9sbC5oXHUwMDNlXG5AQCAtNjA2LDE1ICs2MDcsNTMgQEAgdm9pZCBfX2ZwdXRfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTtcbiBcbiAvKlxuLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3Rcbi0gKiByZWZlcmVuY2UuXG4tICpcbi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXG4rICogXCJpZFwiIGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGVcbisgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbiAgKi9cbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbitzdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4ge1xuLVx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXHUwMDI2ZmlsZS1cdTAwM2VmX3JlZikpKVxuLVx0XHRfX2ZwdXQoZmlsZSk7XG4rXHRpbnQgcmV0dmFsID0gMDtcbitcbitcdGlmIChDSEVDS19EQVRBX0NPUlJVUFRJT04oZmlsZV9jb3VudChmaWxwKSA9PSAwLCBmaWxwLFxuK1x0XHRcdFwiVkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcIixcbitcdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbitcdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbitcbitcdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4rXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuK1x0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuK1x0fVxuK1x0cmV0dXJuIHJldHZhbDtcbit9XG4rXG4raW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4re1xuK1x0aW50IHJldHZhbDtcbitcbitcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuK1x0ZnB1dF9jbG9zZShmaWxwKTtcbitcbitcdHJldHVybiByZXR2YWw7XG4rfVxuK0VYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4rXG4rLypcbisgKiBMaWtlIGZpbHBfY2xvc2UoKSBidXQgd2l0aG91dCBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgdGhlIGxhc3RcbisgKiByZWZlcmVuY2UsIHNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbisgKi9cbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuK3tcbitcdGludCByZXR2YWw7XG4rXG4rXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTtcbitcdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbHAtXHUwMDNlZl9yZWYpKSlcbitcdFx0X19mcHV0KGZpbHApO1xuK1xuK1x0cmV0dXJuIHJldHZhbDtcbiB9XG4gXG4gLypcbmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcbi0tLSBhL2ZzL2ludGVybmFsLmhcbisrKyBiL2ZzL2ludGVybmFsLmhcbkBAIC0xMjcsNyArMTI3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiBcdH1cbiB9XG4gXG4tdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKik7XG4raW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XG4gdm9pZCBmcHV0X2Nsb3NlKHN0cnVjdCBmaWxlICopO1xuIFxuIC8qXG5AQCAtMTkwLDYgKzE5MCw3IEBAIHN0cnVjdCBvcGVuX2ZsYWdzIHtcbiBcdGludCBpbnRlbnQ7XG4gXHRpbnQgbG9va3VwX2ZsYWdzO1xuIH07XG4rXG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW4oaW50IGRmZCwgc3RydWN0IGZpbGVuYW1lICpwYXRobmFtZSxcbiBcdFx0Y29uc3Qgc3RydWN0IG9wZW5fZmxhZ3MgKm9wKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3Blbl9yb290KGNvbnN0IHN0cnVjdCBwYXRoICosXG5kaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jXG5pbmRleCA0MDg5MjVkN2JkMGI3Li5kMDM2NzM2ZDVkNDM1IDEwMDY0NFxuLS0tIGEvZnMvb3Blbi5jXG4rKysgYi9mcy9vcGVuLmNcbkBAIC0xNDUzLDQxICsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSlcbiB9XG4gI2VuZGlmXG4gXG4tLypcbi0gKiBcImlkXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxuLSAqL1xuLXN0YXRpYyBpbnQgZmlscF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbi17XG4tXHRpbnQgcmV0dmFsID0gMDtcbi1cbi1cdGlmIChDSEVDS19EQVRBX0NPUlJVUFRJT04oZmlsZV9jb3VudChmaWxwKSA9PSAwLCBmaWxwLFxuLVx0XHRcdFwiVkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcIixcbi1cdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbi1cdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbi1cbi1cdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4tXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuLVx0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuLVx0fVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbDtcbi1cbi1cdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuLVx0ZnB1dF9jbG9zZShmaWxwKTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4tfVxuLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4tXG4gLypcbiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlXG4gICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJ3QgcmVsZWFzZVxuQEAgLTE1MDIsMTMgKzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuIFxuLVx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxlLCBjdXJyZW50LVx1MDAzZWZpbGVzKTtcbi1cbiBcdC8qXG4gXHQgKiBXZSdyZSByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4gRG9uJ3QgYm90aGVyXG4gXHQgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy5cbiBcdCAqL1xuLVx0ZnB1dF9jbG9zZV9zeW5jKGZpbGUpO1xuK1x0cmV0dmFsID0gZmlscF9jbG9zZV9zeW5jKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuIFxuIFx0aWYgKGxpa2VseShyZXR2YWwgPT0gMCkpXG4gXHRcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcbmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcbkBAIC05OSwxMSArOTksMTYgQEAgc3RhdGljIGlubGluZSBib29sIGNsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBjb25zdCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxcbiBcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XG4gXG4rc3RydWN0IGNvcmVfdGhyZWFkO1xuK1xuIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7XG4rYm9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTtcbiBpbnQgdW5zaGFyZV9maWxlcyh2b2lkKTtcbiBzdHJ1Y3QgZmRfcmFuZ2Uge1xuIFx0dW5zaWduZWQgaW50IGZyb20sIHRvO1xuIH07XG4rXG4gc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7XG4gdm9pZCBkb19jbG9zZV9vbl9leGVjKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKik7XG4gaW50IGl0ZXJhdGVfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCB1bnNpZ25lZCxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuaW5kZXggNTg0YWU4OGI0MzVlOS4uZmVkMDJhNDI3ZGUzMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbkBAIC03NiwxMiArNzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHtcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkICpuZXh0O1xuK1x0LyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi9cbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xuIH07XG4gXG4gc3RydWN0IGNvcmVfc3RhdGUge1xuIFx0YXRvbWljX3QgbnJfdGhyZWFkcztcbiBcdHN0cnVjdCBjb3JlX3RocmVhZCBkdW1wZXI7XG4tXHRzdHJ1Y3QgY29tcGxldGlvbiBzdGFydHVwO1xuK1x0LyogQ29tcGxldGVkIGJ5IHRoZSBsYXN0IHRocmVhZCB0byBwYXJrLCByZXVzZWQgZm9yIHRoZSB0YWJsZSBzd2l0Y2guICovXG4rXHRzdHJ1Y3QgY29tcGxldGlvbiBkb25lO1xuIH07XG4gXG4gLypcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5pbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5AQCAtMTksNiArMTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbitcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA3KSxcbiB9O1xuIFxuIC8qKlxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24ndFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbisgKlxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuKyAqIFRoZSB0YXNrIGVuZHMgdXAgd2l0aCBhbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlLlxuICAqL1xuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xuIFx0X191MzIgc2l6ZTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuY1xuaW5kZXggMmMwYjFjMDI5MjBmNC4uYjY1MTY3OWMxMmU5NyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9leGl0LmNcbisrKyBiL2tlcm5lbC9leGl0LmNcbkBAIC0yNSw2ICsyNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYWNjdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdHNhY2N0X2tlcm4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZkdGFibGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZyZWV6ZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L25zcHJveHkuaFx1MDAzZVxuQEAgLTQzMiw2ICs0MzMsNyBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG4gXHRzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjtcbiBcbiBcdHNlbGYudGFzayA9IHRzaztcbitcdHNlbGYuZmlsZXMgPSBOVUxMO1xuIFx0aWYgKHNlbGYudGFzay1cdTAwM2VmbGFncyBcdTAwMjYgUEZfU0lHTkFMRUQpXG4gXHRcdHNlbGYubmV4dCA9IHhjaGcoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dCwgXHUwMDI2c2VsZik7XG4gXHRlbHNlXG5AQCAtNDQxLDEyICs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0ICogdG8gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIuXG4gXHQgKi9cbiBcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4tXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4rXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSURMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdGlmICghc2VsZi50YXNrKSAvKiBzZWUgY29yZWR1bXBfZmluaXNoKCkgKi9cbiBcdFx0XHRicmVhaztcbitcdFx0Lyogc2VlIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKCkgKi9cbitcdFx0aWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoXHUwMDI2c2VsZikpXG4rXHRcdFx0Y29udGludWU7XG4gXHRcdHNjaGVkdWxlKCk7XG4gXHR9XG4gXHRfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG4rKysgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuQEAgLTE5LDYgKzE5LDkgQEBcbiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW5cbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXBfYWNrLVx1MDAzZW1lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YXNrIHNlbGVjdGVkOyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUxcbisgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIENPUkVEVU1QX1JFSkVDVFxuICAqL1xuIGVudW0ge1xuIFx0Q09SRURVTVBfS0VSTkVMXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDApLFxuQEAgLTI4LDYgKzMxLDcgQEAgZW51bSB7XG4gXHRDT1JFRFVNUF9SRUNPUkRTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA0KSxcbiBcdENPUkVEVU1QX1NQQVJTRVx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA1KSxcbiBcdENPUkVEVU1QX01FTU9SWV9UWVBFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNiksXG4rXHRDT1JFRFVNUF9DTE9TRV9GSUxFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNyksXG4gfTtcbiBcbiAvKipcbkBAIC0xMzcsNiArMTQxLDEwIEBAIGVudW0ge1xuICAqIE5vdGUgdGhhdCBAbWVtb3J5X3R5cGVzIG11c3QgYmUgemVybyBpZiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgaXNuJ3RcbiAgKiByYWlzZWQuIENPUkVEVU1QX01FTU9SWV9UWVBFUyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUwgYW5kIGFuIGFjayBvZlxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXG4rICpcbisgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGVcbisgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cbisgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cbiAgKi9cbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcbiBcdF9fdTMyIHNpemU7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMyw4IEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuK1x0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXG4rXHRcdCAgY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdFxuIFRFU1RfRklMRVMgOj0gc3RhY2tkdW1wXG4gXG4gaW5jbHVkZSAuLi9saWIubWtcbkBAIC0xMSwzICsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2E0MTkwNmI0Njk1MlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXG5AQCAtMCwwICsxLDU5MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rXG4rI2luY2x1ZGUgXHUwMDNjZGlyZW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY29yZWR1bXBfdGVzdC5oXCJcbitcbisjZGVmaW5lIExPQ0tfRklMRSBcIi90bXAvY29yZWR1bXAubG9ja1wiXG4rXG4rLyogSWRsZSB0aHJlYWRzIHRoZSBtdWx0aS10aHJlYWRlZCBjcmFzaGluZyBjaGlsZCBzcGF3bnMuICovXG4rI2RlZmluZSBOVU1fQ0xPU0VfVEhSRUFEUyA0XG4rXG4rLyogSG93IHRoZSBjcmFzaGluZyBjaGlsZCBsb2NrcyBMT0NLX0ZJTEUuICovXG4rZW51bSBsb2NrX2tpbmQge1xuK1x0TE9DS19LSU5EX1BPU0lYLFxuK1x0TE9DS19LSU5EX09GRCxcbitcdExPQ0tfS0lORF9GTE9DSyxcbit9O1xuK1xuKy8qIFdobyBlbHNlIGhhcyBhIGhhbmRsZSBvbiB0aGUgbG9jayB3aGVuIHRoZSBjaGlsZCBjcmFzaGVzLiAqL1xuK2VudW0gbG9ja19zaGFyZSB7XG4rXHRMT0NLX1NIQVJFX05PTkUsXG4rXHRMT0NLX1NIQVJFX0RVUCxcdFx0LyogYSBzZWNvbmQgc2xvdCBpbiB0aGUgY2hpbGQncyBvd24gdGFibGUgKi9cbitcdExPQ0tfU0hBUkVfRk9SSyxcdC8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi9cbitcdExPQ0tfU0hBUkVfRklMRVMsXHQvKiBhIENMT05FX0ZJTEVTIHByb2Nlc3Mgc2hhcmVzIHRoZSB0YWJsZSAqL1xuK307XG4rXG4rc3RydWN0IGNsb3NlX3Rlc3Qge1xuK1x0ZW51bSBsb2NrX2tpbmQga2luZDtcbitcdGVudW0gbG9ja19zaGFyZSBzaGFyZTtcbitcdGJvb2wgdGhyZWFkcztcbitcdGJvb2wgY2xvc2U7XHRcdC8qIGFjayB3aXRoIENPUkVEVU1QX0NMT1NFX0ZJTEVTICovXG4rXHRib29sIHVzZXJzcGFjZTtcdFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXG4rXHRib29sIHJlbGVhc2VkO1x0XHQvKiB0aGUgbG9jayBpcyBnb25lIG9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZSBjbG9zZSAqL1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbitcdEFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTtcbitcdEFTU0VSVF9MVChyZXQsIHNpemVvZihzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybikpO1xuK1xuK1x0c2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICdcXDAnO1xuK1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpO1xuK1x0QVNTRVJUX0dFKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQsIDApO1xuK1xuK1x0cmV0ID0gZmNsb3NlKGZpbGUpO1xuK1x0QVNTRVJUX0VRKDAsIHJldCk7XG4rfVxuK1xuK0ZJWFRVUkVfVEVBUkRPV04oY29yZWR1bXApXG4re1xuK1x0Y29uc3QgY2hhciAqcmVhc29uO1xuK1x0RklMRSAqZmlsZTtcbitcdGludCByZXQsIHN0YXR1cztcbitcbitcdGlmIChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXHUwMDNlIDApIHtcbitcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuK1x0XHR3YWl0cGlkKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdH1cbitcdHVubGluayhMT0NLX0ZJTEUpO1xuK1x0dW5saW5rKFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcIik7XG4rXG4rXHRmaWxlID0gZm9wZW4oXCIvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwiLCBcIndcIik7XG4rXHRpZiAoIWZpbGUpIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gb3BlbiBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0cmV0ID0gZnByaW50ZihmaWxlLCBcIiVzXCIsIHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKTtcbitcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmIChzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkIFx1MDAzZT0gMCkge1xuK1x0XHRyZXQgPSBjbG9zZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGRldGFjaGVkIHRtcGZzXCI7XG4rXHRcdFx0Z290byBmYWlsO1xuK1x0XHR9XG4rXHRcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdH1cbitcbitcdHJldHVybjtcbitmYWlsOlxuK1x0LyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovXG4rXHRmcHJpbnRmKHN0ZGVyciwgXCJGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcblwiLCByZWFzb24pO1xuK31cbitcbisvKiBXcml0ZS1sb2NrIEBmZCB0aGUgd2F5IEBraW5kIHNheXMuICovXG4rc3RhdGljIGludCB0YWtlX2xvY2soaW50IGZkLCBlbnVtIGxvY2tfa2luZCBraW5kKVxuK3tcbitcdHN0cnVjdCBmbG9jayBmbCA9IHtcbitcdFx0LmxfdHlwZSA9IEZfV1JMQ0ssXG4rXHRcdC5sX3doZW5jZSA9IFNFRUtfU0VULFxuK1x0fTtcbitcbitcdHN3aXRjaCAoa2luZCkge1xuK1x0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XG4rXHRcdHJldHVybiBmY250bChmZCwgRl9TRVRMSywgXHUwMDI2ZmwpO1xuK1x0Y2FzZSBMT0NLX0tJTkRfT0ZEOlxuK1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcdTAwMjZmbCk7XG4rXHRjYXNlIExPQ0tfS0lORF9GTE9DSzpcbitcdFx0cmV0dXJuIGZsb2NrKGZkLCBMT0NLX0VYKTtcbitcdH1cbitcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi9cbitzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4re1xuK1x0c3RydWN0IGZsb2NrIGZsID0ge1xuK1x0XHQubF90eXBlID0gRl9XUkxDSyxcbitcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4rXHR9O1xuK1xuK1x0aWYgKGtpbmQgPT0gTE9DS19LSU5EX0ZMT0NLKSB7XG4rXHRcdGlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHtcbitcdFx0XHRmbG9jayhmZCwgTE9DS19VTik7XG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdH1cbitcdFx0cmV0dXJuIGVycm5vID09IEVXT1VMREJMT0NLID8gMSA6IC0xO1xuK1x0fVxuK1xuK1x0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXG4rXHRpZiAoZmNudGwoZmQsIEZfR0VUTEssIFx1MDAyNmZsKSBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xuK31cbitcbisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXG4rc3RhdGljIGludCBjb3VudF9mZHMocGlkX3QgcGlkLCBpbnQgKmZpcnN0KVxuK3tcbitcdGNoYXIgcGF0aFs2NF07XG4rXHRzdHJ1Y3QgZGlyZW50ICpkZTtcbitcdERJUiAqZGlyO1xuK1x0aW50IG5yID0gMDtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIvcHJvYy8lZC9mZFwiLCBwaWQpO1xuK1x0ZGlyID0gb3BlbmRpcihwYXRoKTtcbitcdGlmICghZGlyKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQqZmlyc3QgPSAtMTtcbitcdHdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7XG4rXHRcdGludCBmZDtcbitcbitcdFx0aWYgKGRlLVx1MDAzZWRfbmFtZVswXSA9PSAnLicpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGZkID0gYXRvaShkZS1cdTAwM2VkX25hbWUpO1xuK1x0XHRpZiAoKmZpcnN0IFx1MDAzYyAwIHx8IGZkIFx1MDAzYyAqZmlyc3QpXG4rXHRcdFx0KmZpcnN0ID0gZmQ7XG4rXHRcdG5yKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkaXIpO1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbisvKlxuKyAqIEJsb2NrIHVudGlsIHRoZSB0ZXN0IGhhbmdzIHVwIEBmZF9yZWxlYXNlLCBrZWVwaW5nIGV2ZXJ5IGluaGVyaXRlZCBmZFxuKyAqIG9wZW4sIHRoZW4gcmVwb3J0IHRocm91Z2ggQGZkX3Jlc3VsdCB3aGV0aGVyIEBmZCBpcyBzdGlsbCBvcGVuLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGhvbGRfdW50aWxfcmVsZWFzZWQoaW50IGZkLCBpbnQgZmRfcmVsZWFzZSwgaW50IGZkX3Jlc3VsdClcbit7XG4rXHRjaGFyIGM7XG4rXG4rXHRyZWFkX25vaW50cihmZF9yZWxlYXNlLCBcdTAwMjZjLCAxKTtcbitcdGMgPSBmY250bChmZCwgRl9HRVRGRCkgXHUwMDNjIDAgPyAnQycgOiAnTyc7XG4rXHR3cml0ZV9ub2ludHIoZmRfcmVzdWx0LCBcdTAwMjZjLCAxKTtcbitcdF9leGl0KEVYSVRfU1VDQ0VTUyk7XG4rfVxuK1xuKy8qIExvY2sgTE9DS19GSUxFLCBzaGFyZSBpdCBhcyByZXF1ZXN0ZWQsIHRoZW4gY3Jhc2guICovXG4rc3RhdGljIHZvaWQgY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfcmVsZWFzZSxcbitcdFx0XHRcdCAgaW50IGZkX3Jlc3VsdClcbit7XG4rXHRwdGhyZWFkX3QgdGhyZWFkO1xuK1x0aW50IGZkLCBwaWRmZCwgaTtcbitcdHBpZF90IHBpZDtcbitcbitcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRpZiAodGFrZV9sb2NrKGZkLCB0LVx1MDAzZWtpbmQpKVxuK1x0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1xuK1x0c3dpdGNoICh0LVx1MDAzZXNoYXJlKSB7XG4rXHRjYXNlIExPQ0tfU0hBUkVfTk9ORTpcbitcdFx0YnJlYWs7XG4rXHRjYXNlIExPQ0tfU0hBUkVfRFVQOlxuK1x0XHRpZiAoZHVwKGZkKSBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTE9DS19TSEFSRV9GT1JLOlxuK1x0XHRwaWQgPSBmb3JrKCk7XG4rXHRcdGlmIChwaWQgXHUwMDNjIDApXG4rXHRcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcdFx0aWYgKHBpZCA9PSAwKVxuK1x0XHRcdGhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBMT0NLX1NIQVJFX0ZJTEVTOlxuK1x0XHRwaWQgPSBjcmVhdGVfY2hpbGQoXHUwMDI2cGlkZmQsIENMT05FX0ZJTEVTKTtcbitcdFx0aWYgKHBpZCBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRpZiAocGlkID09IDApXG4rXHRcdFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRpZiAodC1cdTAwM2V0aHJlYWRzKVxuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSsrKVxuK1x0XHRcdHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZCwgTlVMTCwgZG9fbm90aGluZywgTlVMTCk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK31cbitcbisvKlxuKyAqIFNlcnZlIG9uZSBjb3JlZHVtcCBhbmQgbG9vayBhdCB0aGUgdGFzayBvbiB0aGUgd2F5LiBCZWZvcmUgdGhlIGFjayB0aGVcbisgKiBsb2NrIGlzIGhlbGQgYW5kIHRoZSBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuIE9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZVxuKyAqIHBvaW50IHdoZXJlIGl0IGNsb3NlcyB0aGVtLCB3aGljaCBpcyBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGR1bXBcbisgKiBvciBiZWZvcmUgdGhlIGhhbmd1cCBpbiB1c2Vyc3BhY2UgbW9kZSwgdGhleSBhcmUgZ29uZSBpZiB3ZSBhc2tlZCBmb3JcbisgKiBpdCBhbmQgdGhlIGxvY2sgaXMgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLlxuKyAqL1xuK3N0YXRpYyBpbnQgY2xvc2Vfc2VydmVyKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfaXBjKVxuK3tcbitcdHN0cnVjdCBjb3JlZHVtcF9yZXEgcmVxID0ge307XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307XG4rXHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX3BlZXJfcGlkZmQgPSAtMSwgZmRfbG9jayA9IC0xO1xuK1x0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcdGludCBmZCwgZmlyc3RfZmQsIG5yX2ZkcztcbitcdF9fdTY0IG1hc2s7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1x0Y2hhciBjO1xuK1xuK1x0ZmRfbG9jayA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkX2xvY2sgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcIik7XG4rXHRpZiAoZmRfc2VydmVyIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgXCIxXCIsIDEpIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZV9ub2ludHIgdG8gaXBjIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRjbG9zZShmZF9pcGMpO1xuK1xuK1x0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcbitcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogYWNjZXB0NCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xuK1x0aWYgKGZkX3BlZXJfcGlkZmQgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGdldF9wZWVyX3BpZGZkIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXJlYWRfY29yZWR1bXBfcmVxKGZkX2NvcmVkdW1wLCBcdTAwMjZyZXEpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghY2hlY2tfY29yZWR1bXBfcmVxKFx1MDAyNnJlcSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGNoZWNrX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdC8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi9cbitcdGlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC1cdTAwM2VraW5kKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBsb2NrIG5vdCBoZWxkIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsIFx1MDAyNmZpcnN0X2ZkKTtcbitcdGlmIChucl9mZHMgXHUwMDNjPSAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBubyBkZXNjcmlwdG9ycyBkdXJpbmcgdGhlIGhhbmRzaGFrZVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGhhbmRzaGFrZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRtYXNrID0gQ09SRURVTVBfV0FJVDtcbitcdG1hc2sgfD0gdC1cdTAwM2V1c2Vyc3BhY2UgPyBDT1JFRFVNUF9VU0VSU1BBQ0UgOiBDT1JFRFVNUF9LRVJORUw7XG4rXHRpZiAodC1cdTAwM2VjbG9zZSlcbitcdFx0bWFzayB8PSBDT1JFRFVNUF9DTE9TRV9GSUxFUztcbitcbitcdGlmICghc2VuZF9jb3JlZHVtcF9hY2soZmRfY29yZWR1bXAsIFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHNlbmRfY29yZWR1bXBfYWNrIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFyZWFkX21hcmtlcihmZF9jb3JlZHVtcCwgQ09SRURVTVBfTUFSS19SRVFBQ0spKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIFx1MDAyNmMsIDEpO1xuK1x0aWYgKGJ5dGVzICE9ICh0LVx1MDAzZXVzZXJzcGFjZSA/IDAgOiAxKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcmVhZCBhZnRlciB0aGUgYWNrIHJldHVybmVkICV6ZDogJW1cXG5cIiwgX19mdW5jX18sIGJ5dGVzKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXHUwMDNla2luZCkgIT0gIXQtXHUwMDNlcmVsZWFzZWQpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGxvY2sgJXMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwiLFxuK1x0XHRcdF9fZnVuY19fLCB0LVx1MDAzZXJlbGVhc2VkID8gXCJzdGlsbCBoZWxkXCIgOiBcInJlbGVhc2VkXCIpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuK1x0aWYgKG5yX2ZkcyBcdTAwM2MgMCB8fCAhbnJfZmRzICE9IHQtXHUwMDNlY2xvc2UpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6ICVkIGRlc2NyaXB0b3JzIHdoaWxlIHRoZSBjb3JlZHVtcCBpcyBnZW5lcmF0ZWRcXG5cIixcbitcdFx0XHRfX2Z1bmNfXywgbnJfZmRzKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7XG4rXHRpZiAodC1cdTAwM2VjbG9zZSkge1xuK1x0XHRpZiAoZmQgXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGFmdGVyIHRoZSBjbG9zZSByZXR1cm5lZCAlZDogJW1cXG5cIixcbitcdFx0XHRcdF9fZnVuY19fLCBmZCk7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGNvcmVkdW1wIGZhaWxlZDogJW1cXG5cIixcbitcdFx0XHRcdF9fZnVuY19fKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4rXHR9XG4rXG4rXHQvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqL1xuK1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoaW5mby5tYXNrIFx1MDAyNiBQSURGRF9JTkZPX0VYSVQpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZvciAoOzspIHtcbitcdFx0Y2hhciBidWZmZXJbNDA5Nl07XG4rXG4rXHRcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xuK1x0XHRpZiAoYnl0ZXMgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcmVhZCBmcm9tIGNvcmVkdW1wIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoYnl0ZXMgPT0gMClcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUztcbitvdXQ6XG4rXHRpZiAoZmRfbG9jayBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX2xvY2spO1xuK1x0aWYgKGZkX3BlZXJfcGlkZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcbitcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdGlmIChmZF9zZXJ2ZXIgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZF9zZXJ2ZXIpO1xuK1x0cmV0dXJuIGV4aXRfY29kZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcnVuX2Nsb3NlX3Rlc3Qoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhLFxuK1x0XHRcdCAgIEZJWFRVUkVfREFUQShjb3JlZHVtcCkgKnNlbGYsXG4rXHRcdFx0ICAgY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQpXG4re1xuK1x0aW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdO1xuK1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1x0Y2hhciBjO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihcIkBAL3RtcC9jb3JlZHVtcC5zb2NrZXRcIikpO1xuK1xuK1x0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2NDQpO1xuK1x0QVNTRVJUX0dFKGZkLCAwKTtcbitcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsIGlwY19zb2NrZXRzKSwgMCk7XG4rXG4rXHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xuK1x0aWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkge1xuK1x0XHRjbG9zZShpcGNfc29ja2V0c1swXSk7XG4rXHRcdF9leGl0KGNsb3NlX3NlcnZlcih0LCBpcGNfc29ja2V0c1sxXSkpO1xuK1x0fVxuK1x0c2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjtcbitcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1sxXSksIDApO1xuK1x0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCBcdTAwMjZjLCAxKSwgMSk7XG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbitcbitcdC8qIE9ubHkgdGhlIGNyYXNoaW5nIGNoaWxkIGFuZCB3aGF0IGl0IHNwYXducyBzZWUgdGhlc2UgcGlwZXMuICovXG4rXHRBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTtcbitcdEFTU0VSVF9FUShwaXBlMihyZXN1bHRfcGlwZSwgT19DTE9FWEVDKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMCkge1xuK1x0XHRjbG9zZShyZWxlYXNlX3BpcGVbMV0pO1xuK1x0XHRjbG9zZShyZXN1bHRfcGlwZVswXSk7XG4rXHRcdGNyYXNoaW5nX2NoaWxkX2xvY2tlZCh0LCByZWxlYXNlX3BpcGVbMF0sIHJlc3VsdF9waXBlWzFdKTtcbitcdH1cbitcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcbitcdEVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVsxXSksIDApO1xuK1xuK1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTtcbitcdEFTU0VSVF9UUlVFKFdDT1JFRFVNUChzdGF0dXMpKTtcbitcbitcdHdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpO1xuK1xuK1x0LyogTGV0IHRoZSBwcm9jZXNzIGhvbGRpbmcgdGhlIHNoYXJlZCBsb2NrIGdvLiAqL1xuK1x0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVsxXSksIDApO1xuK1xuK1x0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xuK1x0aWYgKHQtXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GSUxFUykge1xuK1x0XHRBU1NFUlRfRVEocmVhZF9ub2ludHIocmVzdWx0X3BpcGVbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbitcdFx0QVNTRVJUX0VRKGMsICdPJyk7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMF0pLCAwKTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQudGhyZWFkcyA9IHRydWUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQudGhyZWFkcyA9IHRydWUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRFVQLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX09GRCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GSUxFUyxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnVzZXJzcGFjZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19ub3RfcmVxdWVzdGVkKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gZmFsc2UsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbmluZGV4IGY1YzliYWQ4NzU0NjMuLmJlYjE2NzY5OGNmZGIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXG5AQCAtMjM3Nyw2ICsyMzc3LDEyIEBAIFRFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfbWVtb3J5X3R5cGVzX3dpdGhvdXRfa2VybmVsKVxuIFx0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTtcbiB9XG4gXG4rLyogQSByZWplY3RlZCB0YXNrIGNsb3NlcyBldmVyeXRoaW5nIG9uIGl0cyB3YXkgb3V0IGFueXdheS4gKi9cbitURVNUX0YoY29yZWR1bXAsIHNvY2tldF9yZXF1ZXN0X2Nsb3NlX2ZpbGVzX3JlamVjdClcbit7XG4rXHRjaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7XG4rfVxuK1xuIC8qXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcbiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTE2MTIsNyArMTYxMiw4IEBAIGJvb2wgc2VuZF9jb3JlZHVtcF9hY2soaW50IGZkLCBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEsXG4gI2RlZmluZSBURVNUX1JFUV9NQVNLX0FMTFx0XHRcdFx0XHRcXFxuIFx0KENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XHRcdFx0XFxcbiBcdCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHxcdFx0XHRcXFxuLVx0IENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpXG4rXHQgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUyB8IFxcXG4rXHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXG4gXG4gYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjA4OjQ2LjA1NDAxNjUzWiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTU3MTY3MjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZpbGUgRGVzY3JpcHRvciBDbG9zdXJlIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gdGhlIGNvcmVkdW1wIG1lY2hhbmlzbTogYENPUkVEVU1QX0NMT1NFX0ZJTEVTYC4gV2hlbiBzZXQgaW4gdGhlIGFja25vd2xlZGdlbWVudCBtYXNrLCB0aGUga2VybmVsIHdpbGwgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNyYXNoaW5nIHRhc2sgKmJlZm9yZSogZHVtcGluZyB0aGUgY29yZS4gU21hcnQuIEVzc2VudGlhbGx5LCBpdCdzIHN3YXBwaW5nIG91dCB0aGUgZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGZvciBhbiBlbXB0eSBvbmUuIFRoaXMgaXMgaW50ZXJlc3RpbmcuIExldCdzIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMuXG5cbkkgc2VlIGl0J3MgdG91Y2hpbmcgc2V2ZXJhbCBmaWxlcy4gSW4gYGZzL2NvcmVkdW1wLmNgLCB0aGUgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgZnVuY3Rpb24gbm93IGNoZWNrcyBmb3IgdGhlIG5ldyBmbGFnLCBhbmQgYGRvX2NvcmVkdW1wYCBjYWxscyBhIG5ldyBmdW5jdGlvbiwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKClgLlxuXG5gZnMvZmlsZS5jYCBoYXMgc2VlbiB0aGUgYnVsayBvZiB0aGUgY2hhbmdlcy4gV2UgaGF2ZSBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbGxvY2F0aW5nIHRoZSBuZXcgZW1wdHkgdGFibGUsIGBjbG9zZV9maWxlc2AgYmVpbmcgbW9kaWZpZWQgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHdpdGggYGZpbHBfY2xvc2Vfc3luY2AgZm9yIG5vbi1rZXJuZWwgdGhyZWFkcywgYSBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgdG8gZG8gdGhlIGFjdHVhbCBzd2FwLCBhbmQgdGhlIGtleSBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggYWxsIHRocmVhZHMgaW4gdGhlIGNvcmVkdW1wIHN0YXRlIGFuZCBvcmNoZXN0cmF0ZXMgdGhlIGNsb3N1cmUsIGFsb25nIHdpdGggYSBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgdGhhdCBoYW5kbGVzIGNsZWFudXAgZHVyaW5nIHRocmVhZCBleGl0LlxuXG5UaGV5J3ZlIGFkZGVkIGBmaWxwX2Nsb3NlX3N5bmNgIGluIGBmcy9maWxlX3RhYmxlLmNgLCB3aGljaCBpcyB0aGUgaW1tZWRpYXRlLCBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGBmaWxwX2Nsb3NlYC4gVGhhdCBtYWtlcyBzZW5zZTsgd2UgZG9uJ3Qgd2FudCB0byBkZWZlciBmaWxlIHJlbGVhc2UgaW4gdGhpcyBzY2VuYXJpby5cblxuRmluYWxseSwgYGtlcm5lbC9leGl0LmNgIG5vdyBjYWxscyBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgZHVyaW5nIHRoZSBleGl0IHByb2Nlc3MsIHdhaXRpbmcgZm9yIHRoZSBjb3JlZHVtcCB0byBjb21wbGV0ZS5cblxuTm93LCB0aGUgaW1wb3J0YW50IHF1ZXN0aW9uOiBhcmUgdGhlcmUgYW55IHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBoZXJlPyBMZXQncyBzZWUuLi4gdGhlIGBhbGxvY19maWxlc19zdHJ1Y3RgIHVzZXMgYEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPYCwgc28gaXQncyBpbml0aWFsaXplZCB0byB6ZXJvLiBUaGUgYGNvcmVkdW1wX2Fja2Agc3RydWN0IGluIGB1YXBpL2xpbnV4L2NvcmVkdW1wLmhgIGhhc24ndCBjaGFuZ2VkIHNpemUsIG9ubHkgdGhlIGVudW0gZm9yIHRoZSBmbGFncy4gU28sIG5vIG5ldyB1c2VyLXNwYWNlIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHRoZSBjb2RlLCBpdCdzIGFsbCBhYm91dCBmaWxlIGRlc2NyaXB0b3IgdGFibGUgcG9pbnRlcnMsIHN3aXRjaGluZywgYW5kIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycy4gTm90aGluZyBjb21wbGljYXRlZCBpcyBhbGxvY2F0ZWQgdGhhdCBJIGNhbiBzZWUsIGFuZCBub3RoaW5nIG5ldyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gSXQgc2VlbXMgd2VsbCBpc29sYXRlZC5cblxuQmFzZWQgb24gdGhpcywgSSBkb24ndCBzZWUgYW55IGltbWVkaWF0ZSByZWFzb24gdG8gc3VzcGVjdCB0aGF0IEtNU0FOIGlzIG5lZWRlZCBoZXJlLiBUaGlzIG1vc3RseSBkZWFscyB3aXRoIHBvaW50ZXJzIGFuZCBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBvZiBLQVNBTidzIGFuYWx5c2lzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gYW5kIG90aGVycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGxpa2UgdXNlLWFmdGVyLWZyZWUsIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgYnVncyB0aGF0IG1pZ2h0IHNuZWFrIGluIGR1cmluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIG1hbmlwdWxhdGlvbnMuIFRoaXMgbG9va3MgcHJldHR5IHNvbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ5MCwiT3V0cHV0VG9rZW5zIjoxNzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODo1Ni42MTExODYwMDhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowbm9wk[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-24 17:55:39 +0000 UTC FinishedAt: 2026-08-24 18:08:59 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "5870ce43c013ad564b3b83bae330b160e056df67", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "vfs", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git", "commit_hash": "5870ce43c013ad564b3b83bae330b160e056df67", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "COREDUMP" ], "series_id": "ba203764-1732-4433-a3f5-fd29cd3ea50b" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "coredump_close_files", "coredump_task_close_files", "vfs_coredump" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE3OjU3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvcmVkdW1wX2Nsb3NlX2ZpbGVzJiMzNDssCiAgICAmIzM0O2NvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBmZWF0dXJlIHRvIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMgYmVmb3JlIGdlbmVyYXRpbmcgYSBjb3JlZHVtcCAoQ09SRURVTVBfQ0xPU0VfRklMRVMpLiBJdCBtb2RpZmllcyBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuYWdlbWVudCwgYWRkcyBhIG5ldyBlbXB0eSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgYWxsb2NhdGlvbiAod2hpY2ggaXMgZXhwbGljaXRseSB6ZXJvZWQgdXNpbmcgX19HRlBfWkVSTyksIGFuZCBhbHRlcnMgdGhlIGNvcmVkdW1wIHN5bmNocm9uaXphdGlvbiBsb2dpYy4gTm8gbmV3IGRhdGEgc3RydWN0dXJlcyBhcmUgY29waWVkIHRvIHVzZXJzcGFjZSwgYW5kIG5vIGNvbXBsZXggc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdpdGhvdXQgaW5pdGlhbGl6YXRpb24uIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIHBvaW50ZXIgc3dpdGNoaW5nLCByZWZlcmVuY2UgY291bnRpbmcsIGFuZCBmaWxlIGNsb3NpbmcsIHdoaWNoIG1pZ2h0IHJpc2sgdXNlLWFmdGVyLWZyZWUsIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgaXNzdWVzLiBUaGVzZSB0eXBlcyBvZiBidWdzIGFyZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCByZXF1aXJlIEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFdoZW4gYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXF1ZXN0cyB0aGlzIGZsYWcsIHRoZSBrZXJuZWwgY2xvc2VzIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlZHVtcC4gVGhpcyBpbnZvbHZlcyBuZXcgY29yZSBrZXJuZWwgbG9naWMgaW4gYGZzL2ZpbGUuY2AgYW5kIGBmcy9jb3JlZHVtcC5jYCB0byBoYW5kbGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIHN3aXRjaGluZyBhbmQgY2xvc2luZy4gVGhlIGZlYXR1cmUgaXMgcmVhY2hhYmxlIGJ5IGNyYXNoaW5nIGEgcHJvY2VzcyBhbmQgaGF2aW5nIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVwbHkgd2l0aCB0aGUgbmV3IGZsYWcsIG1ha2luZyBpdCBmdW5jdGlvbmFsbHkgaW1wYWN0ZnVsIGFuZCB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE3OjU3PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMDk1N2QwMDBiNDVlYTQ2OWNmMjM0ZTdjYWQ0YzU3MDUxZWM1NDcxNlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDI0IDE3OjU3OjA0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXG5pbmRleCBlYzkzNTllMzgyZWE1Li5hNmU3ZGEwYmMxNmE3IDEwMDY0NFxuLS0tIGEvZnMvY29yZWR1bXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuY1xuQEAgLTUyMyw3ICYjNDM7NTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50O1xuIFx0aW50IGNvcmVfd2FpdGVycyA9IC1FQlVTWTtcbiBcbi1cdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXApO1xuJiM0MztcdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuIFx0Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIudGFzayA9IHRzaztcbiBcdGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQgPSBOVUxMO1xuIFxuQEAgLTUzMSw3ICYjNDM7NTMxLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0aWYgKGNvcmVfd2FpdGVycyBcdTAwM2UgMCkge1xuIFx0XHRzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjtcbiBcbi1cdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXAsXG4mIzQzO1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbiBcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdC8qXG4gXHRcdCAqIFdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBiZWNvbWUgaW5hY3RpdmUsIHNvIHRoYXRcbkBAIC04MzcsNyAmIzQzOzgzNyw4IEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHRcdC5tYXNrXHRcdFx0PSBDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFxuIFx0XHRcdFx0XHQgIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFxuIFx0XHRcdFx0XHQgIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfFxuLVx0XHRcdFx0XHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyxcbiYjNDM7XHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHxcbiYjNDM7XHRcdFx0XHRcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXG4gXHRcdC5zaXplX2Fja1x0XHQ9IHNpemVvZihzdHJ1Y3QgY29yZWR1bXBfYWNrKSxcbiBcdFx0Lm1lbW9yeV90eXBlc1x0XHQ9IGNwcm0tXHUwMDNlbWVtb3J5X3R5cGVzLFxuIFx0XHQubWVtb3J5X3R5cGVzX21hc2tcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcbkBAIC05MDUsNiAmIzQzOzkwNiwxMiBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXHR9XG4gXG4mIzQzO1x0LyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi9cbiYjNDM7XHRpZiAoKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2IChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xuJiM0MztcdFx0Y29yZWR1bXBfc29ja19tYXJrKGNwcm0tXHUwMDNlZmlsZSwgQ09SRURVTVBfTUFSS19DT05GTElDVElORyk7XG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiBcdGlmIChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfTUVNT1JZX1RZUEVTKSB7XG4gXHRcdC8qIFRoZSBtZW1vcnkgdHlwZXMgbmVlZCB0aGUgd2hvbGUgZmllbGQuICovXG4gXHRcdGlmICh1c2l6ZSBcdTAwM2MgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSkge1xuQEAgLTEyMjUsNiAmIzQzOzEyMzIsMTEgQEAgc3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG4gXHRpZiAoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpXG4gXHRcdHJldHVybjtcbiBcbiYjNDM7XHRpZiAoKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFx1MDAyNlx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xuJiM0MztcdFx0Y29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoXCYjMzQ7RmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0LyogZ2V0IHVzIGFuIHVuc2hhcmVkIGRlc2NyaXB0b3IgdGFibGU7IGFsbW9zdCBhbHdheXMgYSBuby1vcCAqL1xuIFx0LyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqL1xuIFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcbmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmNcbmluZGV4IDYyOGNhMDdkYzRiMTcuLjNiOGZjZTZlMzY5NTEgMTAwNjQ0XG4tLS0gYS9mcy9maWxlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuY1xuQEAgLTM3NSwyMSAmIzQzOzM3NSwxNSBAQCBzdGF0aWMgdW5zaWduZWQgaW50IHNhbmVfZmR0YWJsZV9zaXplKHN0cnVjdCBmZHRhYmxlICpmZHQsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY1xuIFx0cmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7XG4gfVxuIFxuLS8qXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbi0gKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcbi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxuLSAqL1xuLXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpXG4mIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqL1xuJiM0MztzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxuIHtcbiBcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4tXHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2Zkcztcbi1cdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xuLVx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xuJiM0MztcdHN0cnVjdCBmZHRhYmxlICpuZXdfZmR0O1xuIFxuLVx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTtcbiYjNDM7XHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIGdmcCk7XG4gXHRpZiAoIW5ld2YpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRhdG9taWNfc2V0KFx1MDAyNm5ld2YtXHUwMDNlY291bnQsIDEpO1xuIFxuQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvXG4gXHRuZXdfZmR0LVx1MDAzZWZ1bGxfZmRzX2JpdHMgPSBuZXdmLVx1MDAzZWZ1bGxfZmRzX2JpdHNfaW5pdDtcbiBcdG5ld19mZHQtXHUwMDNlZmQgPSBcdTAwMjZuZXdmLVx1MDAzZWZkX2FycmF5WzBdO1xuIFxuJiM0MztcdHJldHVybiBuZXdmO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmFsbG9jX2ZpbGVzX3N0cnVjdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbiYjNDM7XG4mIzQzO1x0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcbiYjNDM7XHRpZiAoIW5ld2YpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XG4mIzQzO1x0cmN1X2Fzc2lnbl9wb2ludGVyKG5ld2YtXHUwMDNlZmR0LCBcdTAwMjZuZXdmLVx1MDAzZWZkdGFiKTtcbiYjNDM7XHRyZXR1cm4gbmV3ZjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbiYjNDM7ICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4mIzQzOyAqIG9uIGZhaWx1cmUuICBGb3IgJiMzOTtwdW5jaF9ob2xlJiMzOTsgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcbiYjNDM7XHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4mIzQzO1xuJiM0MztcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbiYjNDM7XHRpZiAoIW5ld2YpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiYjNDM7XHRuZXdfZmR0ID0gXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYjtcbiYjNDM7XG4gXHRzcGluX2xvY2soXHUwMDI2b2xkZi1cdTAwM2VmaWxlX2xvY2spO1xuIFx0b2xkX2ZkdCA9IGZpbGVzX2ZkdGFibGUob2xkZik7XG4gXHRvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7XG5AQCAtNDgwLDYgJiM0Mzs1MDcsMTEgQEAgc3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4gXHQgKi9cbiBcdHN0cnVjdCBmZHRhYmxlICpmZHQgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGZpbGVzLVx1MDAzZWZkdCk7XG4gXHR1bnNpZ25lZCBpbnQgaSwgaiA9IDA7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBIGtlcm5lbCB0aHJlYWQgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8gbWFrZSBwcm9ncmVzcyBvbiBzb21lXG4mIzQzO1x0ICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLlxuJiM0MztcdCAqL1xuJiM0MztcdGJvb2wgc3luYyA9ICEoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfS1RIUkVBRCk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc2V0O1xuQEAgLTQ5MSw3ICYjNDM7NTIzLDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxuIFx0XHRcdGlmIChzZXQgXHUwMDI2IDEpIHtcbiBcdFx0XHRcdHN0cnVjdCBmaWxlICpmaWxlID0gZmR0LVx1MDAzZWZkW2ldO1xuIFx0XHRcdFx0aWYgKGZpbGUpIHtcbi1cdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4mIzQzO1x0XHRcdFx0XHRpZiAoc3luYylcbiYjNDM7XHRcdFx0XHRcdFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcbiYjNDM7XHRcdFx0XHRcdGVsc2VcbiYjNDM7XHRcdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4gXHRcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbkBAIC01MTUsMTYgJiM0Mzs1NTAsOTcgQEAgdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqL1xuJiM0MztzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuJiM0MztcdFx0XHRcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkO1xuJiM0MztcbiYjNDM7XHR0YXNrX2xvY2sodHNrKTtcbiYjNDM7XHRvbGQgPSB0c2stXHUwMDNlZmlsZXM7XG4mIzQzO1x0aWYgKG9sZCkge1xuJiM0MztcdFx0aWYgKGZpbGVzKVxuJiM0MztcdFx0XHRhdG9taWNfaW5jKFx1MDAyNmZpbGVzLVx1MDAzZWNvdW50KTtcbiYjNDM7XHRcdHRzay1cdTAwM2VmaWxlcyA9IGZpbGVzO1xuJiM0MztcdH1cbiYjNDM7XHR0YXNrX3VubG9jayh0c2spO1xuJiM0MztcdGlmIChvbGQpXG4mIzQzO1x0XHRwdXRfZmlsZXNfc3RydWN0KG9sZCk7XG4mIzQzO31cbiYjNDM7XG4gdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay1cdTAwM2VmaWxlcztcbiYjNDM7XHRpZiAoIXRzay1cdTAwM2VmaWxlcylcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZFxuJiM0MzsgKiB0ZWxsIHRoZW0gdG8gZ2V0IHJpZCBvZiB0aGVpciBmaWxlcy5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbiYjNDM7XHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbiYjNDM7XHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xuJiM0MztcdGludCBuciA9IDA7XG4gXG4tXHRpZiAoZmlsZXMpIHtcbi1cdFx0dGFza19sb2NrKHRzayk7XG4tXHRcdHRzay1cdTAwM2VmaWxlcyA9IE5VTEw7XG4tXHRcdHRhc2tfdW5sb2NrKHRzayk7XG4tXHRcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuJiM0MztcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XG4mIzQzO1x0aWYgKCFmaWxlcylcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0LyogVGFza3Mgd2l0aG91dCBhIHRhYmxlLCB2aG9zdCB3b3JrZXJzIHNheSwgc2l0IHRoZSBzd2l0Y2ggb3V0LiAqL1xuJiM0MztcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuJiM0MztcdFx0aWYgKGN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4mIzQzO1x0XHRcdG5yJiM0MzsmIzQzOztcbiYjNDM7XHRhdG9taWNfc2V0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xuJiM0MztcdHJlaW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4mIzQzO1xuJiM0MztcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KSB7XG4mIzQzO1x0XHRpZiAoIWN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXG4mIzQzO1x0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZjdC1cdTAwM2VmaWxlcywgZmlsZXMpO1xuJiM0MztcdFx0d2FrZV91cF9wcm9jZXNzKGN0LVx1MDAzZXRhc2spO1xuIFx0fVxuJiM0MztcbiYjNDM7XHQvKiBUaGUgZHVtcGVyJiMzOTtzIHN1YmplY3RpdmUgY3JlZHMgYXJlIHRoZSBkdW1wJiMzOTtzLCBub3QgaXRzIG93bi4gKi9cbiYjNDM7XHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuJiM0MztcdFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG4mIzQzO1xuJiM0MztcdGlmIChucikge1xuJiM0MztcdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUsXG4mIzQzO1x0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbiYjNDM7XHRcdC8qIEJhY2sgYXNsZWVwIGJlZm9yZSB0aGUgbm90ZXMgcmVhZCB0aGVpciByZWdpc3RlcnMuICovXG4mIzQzO1x0XHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtXHUwMDNlbmV4dClcbiYjNDM7XHRcdFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVx1MDAzZXRhc2ssIFRBU0tfQU5ZKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBHZXQgcmlkIG9mIHRoZSBmaWxlcyBhbmQgc3dpdGNoIHRvIHRoZSBlbXB0eSBmaWxlIGRlc2NyaXB0b3IgdGFibGVcbiYjNDM7ICogdGhlIGR1bXBpbmcgdGhyZWFkIHB1Ymxpc2hlZCBpbiB0aGlzIHRocmVhZCYjMzk7cyBjb3JlX3RocmVhZCBlbnRyeS5cbiYjNDM7ICovXG4mIzQzO2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZTtcbiYjNDM7XHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbiYjNDM7XG4mIzQzO1x0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xuJiM0MztcdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbiYjNDM7XHRpZiAoIWZpbGVzIHx8ICFjdXJyZW50LVx1MDAzZWZpbGVzIHx8IGN1cnJlbnQtXHUwMDNlZmlsZXMgPT0gZmlsZXMpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbiYjNDM7XHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcbiYjNDM7XHRjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbiYjNDM7XHRpZiAoYXRvbWljX2RlY19hbmRfdGVzdChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMpKVxuJiM0MztcdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xuZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuY1xuaW5kZXggYzY4YjhjMGE0MDk3YS4uM2M3MDU5MTc2NDZiNSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jXG5AQCAtMTMsNiAmIzQzOzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Rub3RpZnkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jcmVkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9ldmVudHBvbGwuaFx1MDAzZVxuQEAgLTYwNiwxNSAmIzQzOzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuIEVYUE9SVF9TWU1CT0woX19mcHV0X3N5bmMpO1xuIFxuIC8qXG4tICogRXF1aXZhbGVudCB0byBfX2ZwdXRfc3luYygpLCBidXQgb3B0aW1pemVkIGZvciBiZWluZyBjYWxsZWQgd2l0aCB0aGUgbGFzdFxuLSAqIHJlZmVyZW5jZS5cbi0gKlxuLSAqIFNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbiYjNDM7ICogXCYjMzQ7aWRcJiMzNDsgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbiAgKi9cbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuIHtcbi1cdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbGUtXHUwMDNlZl9yZWYpKSlcbi1cdFx0X19mcHV0KGZpbGUpO1xuJiM0MztcdGludCByZXR2YWwgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcbiYjNDM7XHRcdFx0XCYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcJiMzNDssXG4mIzQzO1x0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbiYjNDM7XHRcdHJldHZhbCA9IGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaChmaWxwLCBpZCk7XG4mIzQzO1xuJiM0MztcdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4mIzQzO1x0XHRkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTtcbiYjNDM7XHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByZXR2YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldHZhbDtcbiYjNDM7XG4mIzQzO1x0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4mIzQzO1x0ZnB1dF9jbG9zZShmaWxwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldHZhbDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogTGlrZSBmaWxwX2Nsb3NlKCkgYnV0IHdpdGhvdXQgZGVmZXJyaW5nIHRoZSByZWxlYXNlIG9mIHRoZSBsYXN0XG4mIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLlxuJiM0MzsgKi9cbiYjNDM7aW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbiYjNDM7e1xuJiM0MztcdGludCByZXR2YWw7XG4mIzQzO1xuJiM0MztcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuJiM0MztcdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbHAtXHUwMDNlZl9yZWYpKSlcbiYjNDM7XHRcdF9fZnB1dChmaWxwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldHZhbDtcbiB9XG4gXG4gLypcbmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcbi0tLSBhL2ZzL2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ludGVybmFsLmhcbkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpXG4gXHR9XG4gfVxuIFxuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICopO1xuJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTtcbiB2b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4gXG4gLypcbkBAIC0xOTAsNiAmIzQzOzE5MCw3IEBAIHN0cnVjdCBvcGVuX2ZsYWdzIHtcbiBcdGludCBpbnRlbnQ7XG4gXHRpbnQgbG9va3VwX2ZsYWdzO1xuIH07XG4mIzQzO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZG9fZmlsZV9vcGVuKGludCBkZmQsIHN0cnVjdCBmaWxlbmFtZSAqcGF0aG5hbWUsXG4gXHRcdGNvbnN0IHN0cnVjdCBvcGVuX2ZsYWdzICpvcCk7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLFxuZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uY1xuaW5kZXggNDA4OTI1ZDdiZDBiNy4uZDAzNjczNmQ1ZDQzNSAxMDA2NDRcbi0tLSBhL2ZzL29wZW4uY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvb3Blbi5jXG5AQCAtMTQ1Myw0MSAmIzQzOzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxuIH1cbiAjZW5kaWZcbiBcbi0vKlxuLSAqIFwmIzM0O2lkXCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGVcbi0gKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbi0gKi9cbi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbCA9IDA7XG4tXG4tXHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcbi1cdFx0XHRcJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwmIzM0Oyxcbi1cdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbi1cdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbi1cbi1cdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4tXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuLVx0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuLVx0fVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbDtcbi1cbi1cdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuLVx0ZnB1dF9jbG9zZShmaWxwKTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4tfVxuLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4tXG4gLypcbiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlXG4gICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJiMzOTt0IHJlbGVhc2VcbkBAIC0xNTAyLDEzICYjNDM7MTQ2NywxMSBAQCBTWVNDQUxMX0RFRklORTEoY2xvc2UsIHVuc2lnbmVkIGludCwgZmQpXG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG4gXG4tXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuLVxuIFx0LypcbiBcdCAqIFdlJiMzOTtyZSByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4gRG9uJiMzOTt0IGJvdGhlclxuIFx0ICogd2l0aCBhbnkgZGVsYXllZCBmcHV0KCkgY2FzZXMuXG4gXHQgKi9cbi1cdGZwdXRfY2xvc2Vfc3luYyhmaWxlKTtcbiYjNDM7XHRyZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7XG4gXG4gXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcbiBcdFx0cmV0dXJuIDA7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZHRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuaW5kZXggYzQ1MzA2YTlmMDA3Mi4uZjBjMTAwM2RhOGNlOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuQEAgLTk5LDExICYjNDM7OTksMTYgQEAgc3RhdGljIGlubGluZSBib29sIGNsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBjb25zdCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxcbiBcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XG4gXG4mIzQzO3N0cnVjdCBjb3JlX3RocmVhZDtcbiYjNDM7XG4gdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcbiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZik7XG4gaW50IHVuc2hhcmVfZmlsZXModm9pZCk7XG4gc3RydWN0IGZkX3JhbmdlIHtcbiBcdHVuc2lnbmVkIGludCBmcm9tLCB0bztcbiB9O1xuJiM0MztcbiBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCBzdHJ1Y3QgZmRfcmFuZ2UgKikgX19sYXRlbnRfZW50cm9weTtcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcbiBpbnQgaXRlcmF0ZV9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHVuc2lnbmVkLFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHtcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkICpuZXh0O1xuJiM0MztcdC8qIFRoZSBlbXB0eSB0YWJsZSB0byBzd2l0Y2ggdG8sIHB1Ymxpc2hlZCBieSB0aGUgZHVtcGluZyB0aHJlYWQuICovXG4mIzQzO1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4gfTtcbiBcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XG4gXHRhdG9taWNfdCBucl90aHJlYWRzO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkIGR1bXBlcjtcbi1cdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XG4mIzQzO1x0LyogQ29tcGxldGVkIGJ5IHRoZSBsYXN0IHRocmVhZCB0byBwYXJrLCByZXVzZWQgZm9yIHRoZSB0YWJsZSBzd2l0Y2guICovXG4mIzQzO1x0c3RydWN0IGNvbXBsZXRpb24gZG9uZTtcbiB9O1xuIFxuIC8qXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuQEAgLTE5LDYgJiM0MzsxOSw5IEBAXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay1cdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXG4mIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcbiAgKi9cbiBlbnVtIHtcbiBcdENPUkVEVU1QX0tFUk5FTFx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyAwKSxcbkBAIC0yOCw2ICYjNDM7MzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbiYjNDM7XHRDT1JFRFVNUF9DTE9TRV9GSUxFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNyksXG4gfTtcbiBcbiAvKipcbkBAIC0xMzcsNiAmIzQzOzE0MSwxMCBAQCBlbnVtIHtcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbiYjNDM7ICpcbiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXG4mIzQzOyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cbiAgKi9cbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcbiBcdF9fdTMyIHNpemU7XG5kaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmNcbmluZGV4IDJjMGIxYzAyOTIwZjQuLmI2NTE2NzljMTJlOTcgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvZXhpdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvZXhpdC5jXG5AQCAtMjUsNiAmIzQzOzI1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9hY2N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90c2FjY3Rfa2Vybi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZkdGFibGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZyZWV6ZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L25zcHJveHkuaFx1MDAzZVxuQEAgLTQzMiw2ICYjNDM7NDMzLDcgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0c3RydWN0IGNvcmVfdGhyZWFkIHNlbGY7XG4gXG4gXHRzZWxmLnRhc2sgPSB0c2s7XG4mIzQzO1x0c2VsZi5maWxlcyA9IE5VTEw7XG4gXHRpZiAoc2VsZi50YXNrLVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9TSUdOQUxFRClcbiBcdFx0c2VsZi5uZXh0ID0geGNoZyhcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0LCBcdTAwMjZzZWxmKTtcbiBcdGVsc2VcbkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0ICogdG8gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIuXG4gXHQgKi9cbiBcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4tXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4mIzQzO1x0XHRjb21wbGV0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuIFxuIFx0Zm9yICg7Oykge1xuIFx0XHRzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lETEV8VEFTS19GUkVFWkFCTEUpO1xuIFx0XHRpZiAoIXNlbGYudGFzaykgLyogc2VlIGNvcmVkdW1wX2ZpbmlzaCgpICovXG4gXHRcdFx0YnJlYWs7XG4mIzQzO1x0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xuJiM0MztcdFx0aWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoXHUwMDI2c2VsZikpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuIFx0XHRzY2hlZHVsZSgpO1xuIFx0fVxuIFx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XG4tLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbkBAIC0xOSw2ICYjNDM7MTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuJiM0MzsgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcbiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7XG4gXHRDT1JFRFVNUF9SRUNPUkRTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA0KSxcbiBcdENPUkVEVU1QX1NQQVJTRVx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA1KSxcbiBcdENPUkVEVU1QX01FTU9SWV9UWVBFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNiksXG4mIzQzO1x0Q09SRURVTVBfQ0xPU0VfRklMRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDcpLFxuIH07XG4gXG4gLyoqXG5AQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3RcbiAgKiByYWlzZWQuIENPUkVEVU1QX01FTU9SWV9UWVBFUyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUwgYW5kIGFuIGFjayBvZlxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cbiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXG4gICovXG4gc3RydWN0IGNvcmVkdW1wX2FjayB7XG4gXHRfX3UzMiBzaXplO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbmluZGV4IGRlY2UxYTMxZDU2MWIuLmRjODQ4OWQ0MDYxODQgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbkBAIC0zLDcgJiM0MzszLDggQEAgQ0ZMQUdTICYjNDM7PSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuJiM0MztcdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdCBcXFxuJiM0MztcdFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbiBcbiBpbmNsdWRlIC4uL2xpYi5ta1xuQEAgLTExLDMgJiM0MzsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4mIzQzOyQoT1VUUFVUKS9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdhNDE5MDZiNDY5NTJcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuY1xuQEAgLTAsMCAmIzQzOzEsNTkyIEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvZmlsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjb3JlZHVtcF90ZXN0LmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgTE9DS19GSUxFIFwmIzM0Oy90bXAvY29yZWR1bXAubG9ja1wmIzM0O1xuJiM0MztcbiYjNDM7LyogSWRsZSB0aHJlYWRzIHRoZSBtdWx0aS10aHJlYWRlZCBjcmFzaGluZyBjaGlsZCBzcGF3bnMuICovXG4mIzQzOyNkZWZpbmUgTlVNX0NMT1NFX1RIUkVBRFMgNFxuJiM0MztcbiYjNDM7LyogSG93IHRoZSBjcmFzaGluZyBjaGlsZCBsb2NrcyBMT0NLX0ZJTEUuICovXG4mIzQzO2VudW0gbG9ja19raW5kIHtcbiYjNDM7XHRMT0NLX0tJTkRfUE9TSVgsXG4mIzQzO1x0TE9DS19LSU5EX09GRCxcbiYjNDM7XHRMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBXaG8gZWxzZSBoYXMgYSBoYW5kbGUgb24gdGhlIGxvY2sgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlcy4gKi9cbiYjNDM7ZW51bSBsb2NrX3NoYXJlIHtcbiYjNDM7XHRMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0TE9DS19TSEFSRV9EVVAsXHRcdC8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqL1xuJiM0MztcdExPQ0tfU0hBUkVfRk9SSyxcdC8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi9cbiYjNDM7XHRMT0NLX1NIQVJFX0ZJTEVTLFx0LyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHtcbiYjNDM7XHRlbnVtIGxvY2tfa2luZCBraW5kO1xuJiM0MztcdGVudW0gbG9ja19zaGFyZSBzaGFyZTtcbiYjNDM7XHRib29sIHRocmVhZHM7XG4mIzQzO1x0Ym9vbCBjbG9zZTtcdFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cbiYjNDM7XHRib29sIHVzZXJzcGFjZTtcdFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXG4mIzQzO1x0Ym9vbCByZWxlYXNlZDtcdFx0LyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXG4mIzQzO3tcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbiYjNDM7XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4mIzQzO1x0ZmlsZSA9IGZvcGVuKFwmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbiYjNDM7XHRBU1NFUlRfVFJVRShyZXQgfHwgZmVvZihmaWxlKSk7XG4mIzQzO1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4mIzQzO1xuJiM0MztcdHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuW3JldF0gPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTtcbiYjNDM7XHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgcmV0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IGNoYXIgKnJlYXNvbjtcbiYjNDM7XHRGSUxFICpmaWxlO1xuJiM0MztcdGludCByZXQsIHN0YXR1cztcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuJiM0MztcdFx0d2FpdHBpZChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0fVxuJiM0MztcdHVubGluayhMT0NLX0ZJTEUpO1xuJiM0MztcdHVubGluayhcJiMzNDsvdG1wL2NvcmVkdW1wLnNvY2tldFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZpbGUgPSBmb3BlbihcJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwmIzM0OywgXCYjMzQ7d1wmIzM0Oyk7XG4mIzQzO1x0aWYgKCFmaWxlKSB7XG4mIzQzO1x0XHRyZWFzb24gPSBcJiMzNDtVbmFibGUgdG8gb3BlbiBjb3JlX3BhdHRlcm5cJiMzNDs7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXQgPSBmcHJpbnRmKGZpbGUsIFwmIzM0OyVzXCYjMzQ7LCBzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybik7XG4mIzQzO1x0aWYgKHJldCBcdTAwM2MgMCkge1xuJiM0MztcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblwmIzM0OztcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGZjbG9zZShmaWxlKTtcbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRyZWFzb24gPSBcJiMzNDtVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXCYjMzQ7O1xuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRyZXQgPSBjbG9zZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbiYjNDM7XHRcdGlmIChyZXQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0cmVhc29uID0gXCYjMzQ7VW5hYmxlIHRvIGNsb3NlIGRldGFjaGVkIHRtcGZzXCYjMzQ7O1xuJiM0MztcdFx0XHRnb3RvIGZhaWw7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm47XG4mIzQzO2ZhaWw6XG4mIzQzO1x0LyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovXG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsIFwmIzM0O0ZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxuXCYjMzQ7LCByZWFzb24pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBXcml0ZS1sb2NrIEBmZCB0aGUgd2F5IEBraW5kIHNheXMuICovXG4mIzQzO3N0YXRpYyBpbnQgdGFrZV9sb2NrKGludCBmZCwgZW51bSBsb2NrX2tpbmQga2luZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBmbG9jayBmbCA9IHtcbiYjNDM7XHRcdC5sX3R5cGUgPSBGX1dSTENLLFxuJiM0MztcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0c3dpdGNoIChraW5kKSB7XG4mIzQzO1x0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XG4mIzQzO1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssIFx1MDAyNmZsKTtcbiYjNDM7XHRjYXNlIExPQ0tfS0lORF9PRkQ6XG4mIzQzO1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcdTAwMjZmbCk7XG4mIzQzO1x0Y2FzZSBMT0NLX0tJTkRfRkxPQ0s6XG4mIzQzO1x0XHRyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xuJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZmxvY2sgZmwgPSB7XG4mIzQzO1x0XHQubF90eXBlID0gRl9XUkxDSyxcbiYjNDM7XHRcdC5sX3doZW5jZSA9IFNFRUtfU0VULFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChraW5kID09IExPQ0tfS0lORF9GTE9DSykge1xuJiM0MztcdFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xuJiM0MztcdFx0XHRmbG9jayhmZCwgTE9DS19VTik7XG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0cmV0dXJuIGVycm5vID09IEVXT1VMREJMT0NLID8gMSA6IC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXG4mIzQzO1x0aWYgKGZjbnRsKGZkLCBGX0dFVExLLCBcdTAwMjZmbCkgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfZmRzKHBpZF90IHBpZCwgaW50ICpmaXJzdClcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFs2NF07XG4mIzQzO1x0c3RydWN0IGRpcmVudCAqZGU7XG4mIzQzO1x0RElSICpkaXI7XG4mIzQzO1x0aW50IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcJiMzNDsvcHJvYy8lZC9mZFwmIzM0OywgcGlkKTtcbiYjNDM7XHRkaXIgPSBvcGVuZGlyKHBhdGgpO1xuJiM0MztcdGlmICghZGlyKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHQqZmlyc3QgPSAtMTtcbiYjNDM7XHR3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSkge1xuJiM0MztcdFx0aW50IGZkO1xuJiM0MztcbiYjNDM7XHRcdGlmIChkZS1cdTAwM2VkX25hbWVbMF0gPT0gJiMzOTsuJiMzOTspXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0ZmQgPSBhdG9pKGRlLVx1MDAzZWRfbmFtZSk7XG4mIzQzO1x0XHRpZiAoKmZpcnN0IFx1MDAzYyAwIHx8IGZkIFx1MDAzYyAqZmlyc3QpXG4mIzQzO1x0XHRcdCpmaXJzdCA9IGZkO1xuJiM0MztcdFx0bnImIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZWRpcihkaXIpO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQmxvY2sgdW50aWwgdGhlIHRlc3QgaGFuZ3MgdXAgQGZkX3JlbGVhc2UsIGtlZXBpbmcgZXZlcnkgaW5oZXJpdGVkIGZkXG4mIzQzOyAqIG9wZW4sIHRoZW4gcmVwb3J0IHRocm91Z2ggQGZkX3Jlc3VsdCB3aGV0aGVyIEBmZCBpcyBzdGlsbCBvcGVuLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgaG9sZF91bnRpbF9yZWxlYXNlZChpbnQgZmQsIGludCBmZF9yZWxlYXNlLCBpbnQgZmRfcmVzdWx0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjO1xuJiM0MztcbiYjNDM7XHRyZWFkX25vaW50cihmZF9yZWxlYXNlLCBcdTAwMjZjLCAxKTtcbiYjNDM7XHRjID0gZmNudGwoZmQsIEZfR0VURkQpIFx1MDAzYyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OztcbiYjNDM7XHR3cml0ZV9ub2ludHIoZmRfcmVzdWx0LCBcdTAwMjZjLCAxKTtcbiYjNDM7XHRfZXhpdChFWElUX1NVQ0NFU1MpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBMb2NrIExPQ0tfRklMRSwgc2hhcmUgaXQgYXMgcmVxdWVzdGVkLCB0aGVuIGNyYXNoLiAqL1xuJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxuJiM0MztcdFx0XHRcdCAgaW50IGZkX3Jlc3VsdClcbiYjNDM7e1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWQ7XG4mIzQzO1x0aW50IGZkLCBwaWRmZCwgaTtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHRha2VfbG9jayhmZCwgdC1cdTAwM2VraW5kKSlcbiYjNDM7XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAodC1cdTAwM2VzaGFyZSkge1xuJiM0MztcdGNhc2UgTE9DS19TSEFSRV9OT05FOlxuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0RVUDpcbiYjNDM7XHRcdGlmIChkdXAoZmQpIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0ZPUks6XG4mIzQzO1x0XHRwaWQgPSBmb3JrKCk7XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKVxuJiM0MztcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBMT0NLX1NIQVJFX0ZJTEVTOlxuJiM0MztcdFx0cGlkID0gY3JlYXRlX2NoaWxkKFx1MDAyNnBpZGZkLCBDTE9ORV9GSUxFUyk7XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuJiM0MztcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKVxuJiM0MztcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAodC1cdTAwM2V0aHJlYWRzKVxuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlVNX0NMT1NFX1RIUkVBRFM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpO1xuJiM0MztcbiYjNDM7XHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4mIzQzO1x0Kih2b2xhdGlsZSBpbnQgKilOVUxMID0gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZVxuJiM0MzsgKiBsb2NrIGlzIGhlbGQgYW5kIHRoZSBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuIE9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZVxuJiM0MzsgKiBwb2ludCB3aGVyZSBpdCBjbG9zZXMgdGhlbSwgd2hpY2ggaXMgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkdW1wXG4mIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvclxuJiM0MzsgKiBpdCBhbmQgdGhlIGxvY2sgaXMgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9O1xuJiM0MztcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX3BlZXJfcGlkZmQgPSAtMSwgZmRfbG9jayA9IC0xO1xuJiM0MztcdGludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7XG4mIzQzO1x0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xuJiM0MztcdF9fdTY0IG1hc2s7XG4mIzQzO1x0c3NpemVfdCBieXRlcztcbiYjNDM7XHRjaGFyIGM7XG4mIzQzO1xuJiM0MztcdGZkX2xvY2sgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcbiYjNDM7XHRpZiAoZmRfbG9jayBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBvcGVuIGxvY2sgZmlsZSBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KFwmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0XCYjMzQ7KTtcbiYjNDM7XHRpZiAoZmRfc2VydmVyIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKHdyaXRlX25vaW50cihmZF9pcGMsIFwmIzM0OzFcJiMzNDssIDEpIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShmZF9pcGMpO1xuJiM0MztcbiYjNDM7XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuJiM0MztcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBhY2NlcHQ0IGZhaWxlZDogJW1cXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTtcbiYjNDM7XHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgXHUwMDI2cmVxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXHUwMDI2cmVxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBjaGVja19jb3JlZHVtcF9yZXEgZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi9cbiYjNDM7XHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXHUwMDNla2luZCkgIT0gMSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBsb2NrIG5vdCBoZWxkIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuJiM0MztcdGlmIChucl9mZHMgXHUwMDNjPSAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxcblwmIzM0OywgX19mdW5jX18pO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0bWFzayA9IENPUkVEVU1QX1dBSVQ7XG4mIzQzO1x0bWFzayB8PSB0LVx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcbiYjNDM7XHRpZiAodC1cdTAwM2VjbG9zZSlcbiYjNDM7XHRcdG1hc2sgfD0gQ09SRURVTVBfQ0xPU0VfRklMRVM7XG4mIzQzO1xuJiM0MztcdGlmICghc2VuZF9jb3JlZHVtcF9hY2soZmRfY29yZWR1bXAsIFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghcmVhZF9tYXJrZXIoZmRfY29yZWR1bXAsIENPUkVEVU1QX01BUktfUkVRQUNLKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgXHUwMDI2YywgMSk7XG4mIzQzO1x0aWYgKGJ5dGVzICE9ICh0LVx1MDAzZXVzZXJzcGFjZSA/IDAgOiAxKSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiByZWFkIGFmdGVyIHRoZSBhY2sgcmV0dXJuZWQgJXpkOiAlbVxcblwmIzM0OywgX19mdW5jX18sIGJ5dGVzKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVx1MDAzZWtpbmQpICE9ICF0LVx1MDAzZXJlbGVhc2VkKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IGxvY2sgJXMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0X19mdW5jX18sIHQtXHUwMDNlcmVsZWFzZWQgPyBcJiMzNDtzdGlsbCBoZWxkXCYjMzQ7IDogXCYjMzQ7cmVsZWFzZWRcJiMzNDspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsIFx1MDAyNmZpcnN0X2ZkKTtcbiYjNDM7XHRpZiAobnJfZmRzIFx1MDAzYyAwIHx8ICFucl9mZHMgIT0gdC1cdTAwM2VjbG9zZSkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiAlZCBkZXNjcmlwdG9ycyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRfX2Z1bmNfXywgbnJfZmRzKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApO1xuJiM0MztcdGlmICh0LVx1MDAzZWNsb3NlKSB7XG4mIzQzO1x0XHRpZiAoZmQgXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRfX2Z1bmNfXywgZmQpO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBjb3JlZHVtcCBmYWlsZWQ6ICVtXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdF9fZnVuY19fKTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbG9zZShmZCk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqL1xuJiM0MztcdGlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgXHUwMDI2aW5mbykpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChpbmZvLm1hc2sgXHUwMDI2IFBJREZEX0lORk9fRVhJVCkge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiB0YXNrIGV4aXRlZCBiZWZvcmUgdGhlIGNvcmVkdW1wIGZpbmlzaGVkXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoOzspIHtcbiYjNDM7XHRcdGNoYXIgYnVmZmVyWzQwOTZdO1xuJiM0MztcbiYjNDM7XHRcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xuJiM0MztcdFx0aWYgKGJ5dGVzIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogcmVhZCBmcm9tIGNvcmVkdW1wIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmIChieXRlcyA9PSAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUztcbiYjNDM7b3V0OlxuJiM0MztcdGlmIChmZF9sb2NrIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkX2xvY2spO1xuJiM0MztcdGlmIChmZF9wZWVyX3BpZGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKGZkX3BlZXJfcGlkZmQpO1xuJiM0MztcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZF9jb3JlZHVtcCk7XG4mIzQzO1x0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShmZF9zZXJ2ZXIpO1xuJiM0MztcdHJldHVybiBleGl0X2NvZGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSxcbiYjNDM7XHRcdFx0ICAgRklYVFVSRV9EQVRBKGNvcmVkdW1wKSAqc2VsZixcbiYjNDM7XHRcdFx0ICAgY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cywgaXBjX3NvY2tldHNbMl0sIHJlbGVhc2VfcGlwZVsyXSwgcmVzdWx0X3BpcGVbMl07XG4mIzQzO1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcdGNoYXIgYztcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihcJiMzNDtAQC90bXAvY29yZWR1bXAuc29ja2V0XCYjMzQ7KSk7XG4mIzQzO1xuJiM0MztcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19DTE9FWEVDLCAwNjQ0KTtcbiYjNDM7XHRBU1NFUlRfR0UoZmQsIDApO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTtcbiYjNDM7XG4mIzQzO1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbiYjNDM7XHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XG4mIzQzO1x0aWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkge1xuJiM0MztcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xuJiM0MztcdFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XG4mIzQzO1x0fVxuJiM0MztcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4mIzQzO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1sxXSksIDApO1xuJiM0MztcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXHUwMDI2YywgMSksIDEpO1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApO1xuJiM0MztcbiYjNDM7XHQvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqL1xuJiM0MztcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xuJiM0MztcdEFTU0VSVF9FUShwaXBlMihyZXN1bHRfcGlwZSwgT19DTE9FWEVDKSwgMCk7XG4mIzQzO1xuJiM0MztcdHBpZCA9IGZvcmsoKTtcbiYjNDM7XHRBU1NFUlRfR0UocGlkLCAwKTtcbiYjNDM7XHRpZiAocGlkID09IDApIHtcbiYjNDM7XHRcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XG4mIzQzO1x0XHRjbG9zZShyZXN1bHRfcGlwZVswXSk7XG4mIzQzO1x0XHRjcmFzaGluZ19jaGlsZF9sb2NrZWQodCwgcmVsZWFzZV9waXBlWzBdLCByZXN1bHRfcGlwZVsxXSk7XG4mIzQzO1x0fVxuJiM0MztcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMV0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0NPUkVEVU1QKHN0YXR1cykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiYjNDM7XG4mIzQzO1x0LyogTGV0IHRoZSBwcm9jZXNzIGhvbGRpbmcgdGhlIHNoYXJlZCBsb2NrIGdvLiAqL1xuJiM0MztcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xuJiM0MztcdGlmICh0LVx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRk9SSyB8fCB0LVx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHtcbiYjNDM7XHRcdEFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgXHUwMDI2YywgMSksIDEpO1xuJiM0MztcdFx0QVNTRVJUX0VRKGMsICYjMzk7TyYjMzk7KTtcbiYjNDM7XHR9XG4mIzQzO1x0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzBdKSwgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXgpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQudGhyZWFkcyA9IHRydWUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9PRkQsXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbiYjNDM7XHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuJiM0MztcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuJiM0MztcdFx0LnRocmVhZHMgPSB0cnVlLFxuJiM0MztcdFx0LmNsb3NlID0gdHJ1ZSxcbiYjNDM7XHRcdC5yZWxlYXNlZCA9IHRydWUsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0RVUCxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbiYjNDM7XHRcdC5raW5kID0gTE9DS19LSU5EX09GRCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRk9SSyxcbiYjNDM7XHRcdC5jbG9zZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbiYjNDM7XHR9O1xuJiM0MztcbiYjNDM7XHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRklMRVMsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuJiM0MztcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4mIzQzO1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4mIzQzO1x0XHQuY2xvc2UgPSB0cnVlLFxuJiM0MztcdFx0LnVzZXJzcGFjZSA9IHRydWUsXG4mIzQzO1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfbm90X3JlcXVlc3RlZClcbiYjNDM7e1xuJiM0MztcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4mIzQzO1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbiYjNDM7XHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbiYjNDM7XHRcdC50aHJlYWRzID0gdHJ1ZSxcbiYjNDM7XHRcdC5jbG9zZSA9IGZhbHNlLFxuJiM0MztcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4mIzQzO1x0fTtcbiYjNDM7XG4mIzQzO1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbkBAIC0yMzc3LDYgJiM0MzsyMzc3LDEyIEBAIFRFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfbWVtb3J5X3R5cGVzX3dpdGhvdXRfa2VybmVsKVxuIFx0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTtcbiB9XG4gXG4mIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovXG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxuJiM0Mzt7XG4mIzQzO1x0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfQ0xPU0VfRklMRVMpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcbiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTE2MTIsNyAmIzQzOzE2MTIsOCBAQCBib29sIHNlbmRfY29yZWR1bXBfYWNrKGludCBmZCwgY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxLFxuICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTExcdFx0XHRcdFx0XFxcbiBcdChDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFx0XHRcdFxcXG4gXHQgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XHRcdFx0XFxcbi1cdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKVxuJiM0MztcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcbiYjNDM7XHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXG4gXG4gYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxNzo1NzwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xMW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7Y29yZWR1bXBfdGFza19jbG9zZV9maWxlcyYjMzQ7LAogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGVjOTM1OWUzODJlYTUuLmE2ZTdkYTBiYzE2YTcgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtNTIzLDcgJiM0Mzs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7CiAKLQlpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtzdGFydHVwKTsKJiM0MzsJaW5pdF9jb21wbGV0aW9uKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSk7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLnRhc2sgPSB0c2s7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLm5leHQgPSBOVUxMOwogCkBAIC01MzEsNyAmIzQzOzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSkKIAlpZiAoY29yZV93YWl0ZXJzICZndDsgMCkgewogCQlzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7c3RhcnR1cCwKJiM0MzsJCXdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lLAogCQkJCQkgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTsKIAkJLyoKIAkJICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdApAQCAtODM3LDcgJiM0Mzs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKgogCQkubWFzawkJCT0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwKIAkJCQkJICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHwKIAkJCQkJICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwKLQkJCQkJICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsCiYjNDM7CQkJCQkgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8CiYjNDM7CQkJCQkgIENPUkVEVU1QX0NMT1NFX0ZJTEVTLAogCQkuc2l6ZV9hY2sJCT0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLAogCQkubWVtb3J5X3R5cGVzCQk9IGNwcm0tJmd0O21lbW9yeV90eXBlcywKIAkJLm1lbW9yeV90eXBlc19tYXNrCT0gQ09SRURVTVBfTUVNT1JZX0FMTCwKQEAgLTkwNSw2ICYjNDM7OTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKJiM0MzsJLyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi8KJiM0MzsJaWYgKChhY2subWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAoYWNrLm1hc2sgJmFtcDsgQ09SRURVTVBfUkVKRUNUKSkgewomIzQzOwkJY29yZWR1bXBfc29ja19tYXJrKGNwcm0tJmd0O2ZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiAJaWYgKGFjay5tYXNrICZhbXA7IENPUkVEVU1QX01FTU9SWV9UWVBFUykgewogCQkvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqLwogCQlpZiAodXNpemUgJmx0OyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7CkBAIC0xMjI1LDYgJiM0MzsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLAogCWlmIChjcHJtLSZndDttYXNrICZhbXA7IENPUkVEVU1QX1JFSkVDVCkKIAkJcmV0dXJuOwogCiYjNDM7CWlmICgoY3BybS0mZ3Q7bWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkgewomIzQzOwkJY29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoJiMzNDtGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmUmIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAkvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovCiAJLyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqLwogCWlmICh1bnNoYXJlX2ZpbGVzKCkpCmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuYwpAQCAtMzc1LDIxICYjNDM7Mzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jCiAJcmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpbgotICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpCi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgotICovCi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKQomIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjsKLQlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKLQl1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTsKLQlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpuZXdfZmR0OwogCi0JbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKJiM0MzsJbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApOwogCWlmICghbmV3ZikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKIAogCWF0b21pY19zZXQoJmFtcDtuZXdmLSZndDtjb3VudCwgMSk7CiAKQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvCiAJbmV3X2ZkdC0mZ3Q7ZnVsbF9mZHNfYml0cyA9IG5ld2YtJmd0O2Z1bGxfZmRzX2JpdHNfaW5pdDsKIAluZXdfZmR0LSZndDtmZCA9ICZhbXA7bmV3Zi0mZ3Q7ZmRfYXJyYXlbMF07CiAKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiYjNDM7CiYjNDM7CW5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CiYjNDM7CWlmICghbmV3ZikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0mZ3Q7ZmR0LCAmYW1wO25ld2YtJmd0O2ZkdGFiKTsKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW4KJiM0MzsgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKJiM0MzsgKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgomIzQzOyAqLwomIzQzO3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOwomIzQzOwlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKJiM0MzsJdW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDsKJiM0MzsKJiM0MzsJbmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5ld2YpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsJbmV3X2ZkdCA9ICZhbXA7bmV3Zi0mZ3Q7ZmR0YWI7CiYjNDM7CiAJc3Bpbl9sb2NrKCZhbXA7b2xkZi0mZ3Q7ZmlsZV9sb2NrKTsKIAlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAlvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7CkBAIC00ODAsNiAmIzQzOzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkgKi8KIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy0mZ3Q7ZmR0KTsKIAl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CiYjNDM7CS8qCiYjNDM7CSAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWUKJiM0MzsJICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLgomIzQzOwkgKi8KJiM0MzsJYm9vbCBzeW5jID0gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKTsKIAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyBzZXQ7CkBAIC00OTEsNyAmIzQzOzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkJCWlmIChzZXQgJmFtcDsgMSkgewogCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmR0LSZndDtmZFtpXTsKIAkJCQlpZiAoZmlsZSkgewotCQkJCQlmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTsKJiM0MzsJCQkJCWlmIChzeW5jKQomIzQzOwkJCQkJCWZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7CiYjNDM7CQkJCQllbHNlCiYjNDM7CQkJCQkJZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7CiAJCQkJCWNvbmRfcmVzY2hlZCgpOwogCQkJCX0KIAkJCX0KQEAgLTUxNSwxNiAmIzQzOzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpCiAJfQogfQogCiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqLwomIzQzO3N0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiYjNDM7CQkJCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodHNrKTsKJiM0MzsJb2xkID0gdHNrLSZndDtmaWxlczsKJiM0MzsJaWYgKG9sZCkgewomIzQzOwkJaWYgKGZpbGVzKQomIzQzOwkJCWF0b21pY19pbmMoJmFtcDtmaWxlcy0mZ3Q7Y291bnQpOwomIzQzOwkJdHNrLSZndDtmaWxlcyA9IGZpbGVzOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRzayk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlwdXRfZmlsZXNfc3RydWN0KG9sZCk7CiYjNDM7fQomIzQzOwogdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay0mZ3Q7ZmlsZXM7CiYjNDM7CWlmICghdHNrLSZndDtmaWxlcykKJiM0MzsJCXJldHVybjsKJiM0MzsJc3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZAomIzQzOyAqIHRlbGwgdGhlbSB0byBnZXQgcmlkIG9mIHRoZWlyIGZpbGVzLgomIzQzOyAqLwomIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsJc3RydWN0IGNvcmVfdGhyZWFkICpjdDsKJiM0MzsJaW50IG5yID0gMDsKIAotCWlmIChmaWxlcykgewotCQl0YXNrX2xvY2sodHNrKTsKLQkJdHNrLSZndDtmaWxlcyA9IE5VTEw7Ci0JCXRhc2tfdW5sb2NrKHRzayk7Ci0JCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwomIzQzOwlmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpOwomIzQzOwlpZiAoIWZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUYXNrcyB3aXRob3V0IGEgdGFibGUsIHZob3N0IHdvcmtlcnMgc2F5LCBzaXQgdGhlIHN3aXRjaCBvdXQuICovCiYjNDM7CWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQlpZiAoY3QtJmd0O3Rhc2stJmd0O2ZpbGVzKQomIzQzOwkJCW5yJiM0MzsmIzQzOzsKJiM0MzsJYXRvbWljX3NldCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMsIG5yKTsKJiM0MzsJcmVpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsKJiM0MzsJZm9yIChjdCA9IGNvcmVfc3RhdGUtJmd0O2R1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC0mZ3Q7bmV4dCkgewomIzQzOwkJaWYgKCFjdC0mZ3Q7dGFzay0mZ3Q7ZmlsZXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQkvKiBQYWlycyB3aXRoIHRoZSBhY3F1aXJlIGluIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoKS4gKi8KJiM0MzsJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7Y3QtJmd0O2ZpbGVzLCBmaWxlcyk7CiYjNDM7CQl3YWtlX3VwX3Byb2Nlc3MoY3QtJmd0O3Rhc2spOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGR1bXBlciYjMzk7cyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCYjMzk7cywgbm90IGl0cyBvd24uICovCiYjNDM7CXNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpCiYjNDM7CQlzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTsKJiM0MzsKJiM0MzsJaWYgKG5yKSB7CiYjNDM7CQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSwKJiM0MzsJCQkJCSAgVEFTS19VTklOVEVSUlVQVElCTEV8VEFTS19GUkVFWkFCTEUpOwomIzQzOwkJLyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi8KJiM0MzsJCWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQkJd2FpdF90YXNrX2luYWN0aXZlKGN0LSZndDt0YXNrLCBUQVNLX0FOWSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZQomIzQzOyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQmIzM5O3MgY29yZV90aHJlYWQgZW50cnkuCiYjNDM7ICovCiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsKJiM0MzsJLyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqLwomIzQzOwlmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoJmFtcDtzZWxmLSZndDtmaWxlcyk7CiYjNDM7CWlmICghZmlsZXMgfHwgIWN1cnJlbnQtJmd0O2ZpbGVzIHx8IGN1cnJlbnQtJmd0O2ZpbGVzID09IGZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiYjNDM7CXN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpOwomIzQzOwljb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsJcmV0dXJuIHRydWU7CiB9CiAKIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZWxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZG5vdGlmeS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50cG9sbC5oJmd0OwpAQCAtNjA2LDE1ICYjNDM7NjA3LDUzIEBAIHZvaWQgX19mcHV0X3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTsKIAogLyoKLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3QKLSAqIHJlZmVyZW5jZS4KLSAqCi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuCiYjNDM7ICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi4KICAqLwotdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQogewotCWlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKCZhbXA7ZmlsZS0mZ3Q7Zl9yZWYpKSkKLQkJX19mcHV0KGZpbGUpOwomIzQzOwlpbnQgcmV0dmFsID0gMDsKJiM0MzsKJiM0MzsJaWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsCiYjNDM7CQkJJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKSYjMzQ7LAomIzQzOwkJCWZpbHAtJmd0O2Zfb3ApKSB7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2gpCiYjNDM7CQlyZXR2YWwgPSBmaWxwLSZndDtmX29wLSZndDtmbHVzaChmaWxwLCBpZCk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkoIShmaWxwLSZndDtmX21vZGUgJmFtcDsgRk1PREVfUEFUSCkpKSB7CiYjNDM7CQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJZnB1dF9jbG9zZShmaWxwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdAomIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLgomIzQzOyAqLwomIzQzO2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJaWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoJmFtcDtmaWxwLSZndDtmX3JlZikpKQomIzQzOwkJX19mcHV0KGZpbHApOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiAJfQogfQogCi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTsKJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTsKIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTsKIAogLyoKQEAgLTE5MCw2ICYjNDM7MTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3MgewogCWludCBpbnRlbnQ7CiAJaW50IGxvb2t1cF9mbGFnczsKIH07CiYjNDM7CiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLAogCQljb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9vcGVuLmMKQEAgLTE0NTMsNDEgJiM0MzsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSkKIH0KICNlbmRpZgogCi0vKgotICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLgotICovCi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCwKLQkJCSYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcykmIzM0OywKLQkJCWZpbHAtJmd0O2Zfb3ApKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChmaWxwLSZndDtmX29wLSZndDtmbHVzaCkKLQkJcmV0dmFsID0gZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2goZmlscCwgaWQpOwotCi0JaWYgKGxpa2VseSghKGZpbHAtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9QQVRIKSkpIHsKLQkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7Ci0JCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKLQlmcHV0X2Nsb3NlKGZpbHApOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7Ci0KIC8qCiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlCiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4mIzM5O3QgcmVsZWFzZQpAQCAtMTUwMiwxMyAmIzQzOzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKQogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAotCXJldHZhbCA9IGZpbHBfZmx1c2goZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpOwotCiAJLyoKIAkgKiBXZSYjMzk7cmUgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuIERvbiYjMzk7dCBib3RoZXIKIAkgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy4KIAkgKi8KLQlmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7CiYjNDM7CXJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LSZndDtmaWxlcyk7CiAKIAlpZiAobGlrZWx5KHJldHZhbCA9PSAwKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaCBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCkBAIC05OSwxMSAmIzQzOzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAomIzQzO3N0cnVjdCBjb3JlX3RocmVhZDsKJiM0MzsKIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7CiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTsKIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpOwogc3RydWN0IGZkX3JhbmdlIHsKIAl1bnNpZ25lZCBpbnQgZnJvbSwgdG87CiB9OwomIzQzOwogc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7CiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTsKIGludCBpdGVyYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgdW5zaWduZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHsKIHN0cnVjdCBjb3JlX3RocmVhZCB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDsKJiM0MzsJLyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi8KJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CiB9OwogCiBzdHJ1Y3QgY29yZV9zdGF0ZSB7CiAJYXRvbWljX3QgbnJfdGhyZWFkczsKIAlzdHJ1Y3QgY29yZV90aHJlYWQgZHVtcGVyOwotCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7CiYjNDM7CS8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqLwomIzQzOwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTE5LDYgJiM0MzsxOSw5IEBACiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stJmd0O21lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTAomIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUCiAgKi8KIGVudW0gewogCUNPUkVEVU1QX0tFUk5FTAkJPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKQEAgLTI4LDYgJiM0MzszMSw3IEBAIGVudW0gewogCUNPUkVEVU1QX1JFQ09SRFMJPSAoMVVMTCAmbHQ7Jmx0OyA0KSwKIAlDT1JFRFVNUF9TUEFSU0UJCT0gKDFVTEwgJmx0OyZsdDsgNSksCiAJQ09SRURVTVBfTUVNT1JZX1RZUEVTCT0gKDFVTEwgJmx0OyZsdDsgNiksCiYjNDM7CUNPUkVEVU1QX0NMT1NFX0ZJTEVTCT0gKDFVTEwgJmx0OyZsdDsgNyksCiB9OwogCiAvKioKQEAgLTEzNyw2ICYjNDM7MTQxLDEwIEBAIGVudW0gewogICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3QKICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mCiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLgomIzQzOyAqCiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlCiYjNDM7ICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuCiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuCiAgKi8KIHN0cnVjdCBjb3JlZHVtcF9hY2sgewogCV9fdTMyIHNpemU7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9leGl0LmMKQEAgLTI1LDYgJiM0MzsyNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvYWNjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3RzYWNjdF9rZXJuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mZHRhYmxlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpbmZtdHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9uc3Byb3h5LmgmZ3Q7CkBAIC00MzIsNiAmIzQzOzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAlzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjsKIAogCXNlbGYudGFzayA9IHRzazsKJiM0MzsJc2VsZi5maWxlcyA9IE5VTEw7CiAJaWYgKHNlbGYudGFzay0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfU0lHTkFMRUQpCiAJCXNlbGYubmV4dCA9IHhjaGcoJmFtcDtjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dCwgJmFtcDtzZWxmKTsKIAllbHNlCkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCSAqIHRvIGNvcmVfc3RhdGUtJmd0O2R1bXBlci4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQotCQljb21wbGV0ZSgmYW1wO2NvcmVfc3RhdGUtJmd0O3N0YXJ0dXApOwomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKIAogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTsKIAkJaWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqLwogCQkJYnJlYWs7CiYjNDM7CQkvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqLwomIzQzOwkJaWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoJmFtcDtzZWxmKSkKJiM0MzsJCQljb250aW51ZTsKIAkJc2NoZWR1bGUoKTsKIAl9CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAppbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NAotLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaApAQCAtMTksNiAmIzQzOzE5LDkgQEAKICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpbgogICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay0mZ3Q7bWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMCiYjNDM7ICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1QKICAqLwogZW51bSB7CiAJQ09SRURVTVBfS0VSTkVMCQk9ICgxVUxMICZsdDsmbHQ7IDApLApAQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7CiAJQ09SRURVTVBfUkVDT1JEUwk9ICgxVUxMICZsdDsmbHQ7IDQpLAogCUNPUkVEVU1QX1NQQVJTRQkJPSAoMVVMTCAmbHQ7Jmx0OyA1KSwKIAlDT1JFRFVNUF9NRU1PUllfVFlQRVMJPSAoMVVMTCAmbHQ7Jmx0OyA2KSwKJiM0MzsJQ09SRURVTVBfQ0xPU0VfRklMRVMJPSAoMVVMTCAmbHQ7Jmx0OyA3KSwKIH07CiAKIC8qKgpAQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7CiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dAogICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2YKICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuCiYjNDM7ICoKJiM0MzsgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGUKJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC4KJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS4KICAqLwogc3RydWN0IGNvcmVkdW1wX2FjayB7CiAJX191MzIgc2l6ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKQEAgLTMsNyAmIzQzOzMsOCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0CiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDU5MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2RpcmVudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9maWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTE9DS19GSUxFICYjMzQ7L3RtcC9jb3JlZHVtcC5sb2NrJiMzNDsKJiM0MzsKJiM0MzsvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi8KJiM0MzsjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDQKJiM0MzsKJiM0MzsvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi8KJiM0MztlbnVtIGxvY2tfa2luZCB7CiYjNDM7CUxPQ0tfS0lORF9QT1NJWCwKJiM0MzsJTE9DS19LSU5EX09GRCwKJiM0MzsJTE9DS19LSU5EX0ZMT0NLLAomIzQzO307CiYjNDM7CiYjNDM7LyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovCiYjNDM7ZW51bSBsb2NrX3NoYXJlIHsKJiM0MzsJTE9DS19TSEFSRV9OT05FLAomIzQzOwlMT0NLX1NIQVJFX0RVUCwJCS8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqLwomIzQzOwlMT0NLX1NIQVJFX0ZPUkssCS8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi8KJiM0MzsJTE9DS19TSEFSRV9GSUxFUywJLyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi8KJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHsKJiM0MzsJZW51bSBsb2NrX2tpbmQga2luZDsKJiM0MzsJZW51bSBsb2NrX3NoYXJlIHNoYXJlOwomIzQzOwlib29sIHRocmVhZHM7CiYjNDM7CWJvb2wgY2xvc2U7CQkvKiBhY2sgd2l0aCBDT1JFRFVNUF9DTE9TRV9GSUxFUyAqLwomIzQzOwlib29sIHVzZXJzcGFjZTsJCS8qIENPUkVEVU1QX1VTRVJTUEFDRSBpbnN0ZWFkIG9mIENPUkVEVU1QX0tFUk5FTCAqLwomIzQzOwlib29sIHJlbGVhc2VkOwkJLyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi8KJiM0Mzt9OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7CiYjNDM7CUFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTsKJiM0MzsJQVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybikpOwomIzQzOwomIzQzOwlzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTsKJiM0MzsJQVNTRVJUX0dFKHNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkLCAwKTsKJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlBU1NFUlRfRVEoMCwgcmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTE9DS19GSUxFKTsKJiM0MzsJdW5saW5rKCYjMzQ7L3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi8KJiM0MztzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlzd2l0Y2ggKGtpbmQpIHsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfUE9TSVg6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssICZhbXA7ZmwpOwomIzQzOwljYXNlIExPQ0tfS0lORF9PRkQ6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAmYW1wO2ZsKTsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfRkxPQ0s6CiYjNDM7CQlyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi8KJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHsKJiM0MzsJCWlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHsKJiM0MzsJCQlmbG9jayhmZCwgTE9DS19VTik7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovCiYjNDM7CWlmIChmY250bChmZCwgRl9HRVRMSywgJmFtcDtmbCkgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi8KJiM0MztzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJRElSICpkaXI7CiYjNDM7CWludCBuciA9IDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDsvcHJvYy8lZC9mZCYjMzQ7LCBwaWQpOwomIzQzOwlkaXIgPSBvcGVuZGlyKHBhdGgpOwomIzQzOwlpZiAoIWRpcikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJKmZpcnN0ID0gLTE7CiYjNDM7CXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlpZiAoZGUtJmd0O2RfbmFtZVswXSA9PSAmIzM5Oy4mIzM5OykKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZkID0gYXRvaShkZS0mZ3Q7ZF9uYW1lKTsKJiM0MzsJCWlmICgqZmlyc3QgJmx0OyAwIHx8IGZkICZsdDsgKmZpcnN0KQomIzQzOwkJCSpmaXJzdCA9IGZkOwomIzQzOwkJbnImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGRpcik7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmQKJiM0MzsgKiBvcGVuLCB0aGVuIHJlcG9ydCB0aHJvdWdoIEBmZF9yZXN1bHQgd2hldGhlciBAZmQgaXMgc3RpbGwgb3Blbi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwljaGFyIGM7CiYjNDM7CiYjNDM7CXJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsICZhbXA7YywgMSk7CiYjNDM7CWMgPSBmY250bChmZCwgRl9HRVRGRCkgJmx0OyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OzsKJiM0MzsJd3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgJmFtcDtjLCAxKTsKJiM0MzsJX2V4aXQoRVhJVF9TVUNDRVNTKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi8KJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLAomIzQzOwkJCQkgIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgZmQsIHBpZGZkLCBpOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlpZiAodGFrZV9sb2NrKGZkLCB0LSZndDtraW5kKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CXN3aXRjaCAodC0mZ3Q7c2hhcmUpIHsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX05PTkU6CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX0RVUDoKJiM0MzsJCWlmIChkdXAoZmQpICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GT1JLOgomIzQzOwkJcGlkID0gZm9yaygpOwomIzQzOwkJaWYgKHBpZCAmbHQ7IDApCiYjNDM7CQkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsJCWlmIChwaWQgPT0gMCkKJiM0MzsJCQlob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GSUxFUzoKJiM0MzsJCXBpZCA9IGNyZWF0ZV9jaGlsZCgmYW1wO3BpZGZkLCBDTE9ORV9GSUxFUyk7CiYjNDM7CQlpZiAocGlkICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJaWYgKHBpZCA9PSAwKQomIzQzOwkJCWhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodC0mZ3Q7dGhyZWFkcykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBvbiBwdXJwb3NlICovCiYjNDM7CSoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZQomIzQzOyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlCiYjNDM7ICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcAomIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvcgomIzQzOyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9OwomIzQzOwlzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307CiYjNDM7CWludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7CiYjNDM7CWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CWludCBmZCwgZmlyc3RfZmQsIG5yX2ZkczsKJiM0MzsJX191NjQgbWFzazsKJiM0MzsJc3NpemVfdCBieXRlczsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZF9sb2NrICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwlpZiAoZmRfc2VydmVyICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwljbG9zZShmZF9pcGMpOwomIzQzOwomIzQzOwlmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpOwomIzQzOwlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogYWNjZXB0NCBmYWlsZWQ6ICVtXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTsKJiM0MzsJaWYgKGZkX3BlZXJfcGlkZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCAmYW1wO2luZm8pKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcmVhZF9jb3JlZHVtcF9yZXEgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFjaGVja19jb3JlZHVtcF9yZXEoJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi8KJiM0MzsJaWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LSZndDtraW5kKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgJmFtcDtmaXJzdF9mZCk7CiYjNDM7CWlmIChucl9mZHMgJmx0Oz0gMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbWFzayA9IENPUkVEVU1QX1dBSVQ7CiYjNDM7CW1hc2sgfD0gdC0mZ3Q7dXNlcnNwYWNlID8gQ09SRURVTVBfVVNFUlNQQUNFIDogQ09SRURVTVBfS0VSTkVMOwomIzQzOwlpZiAodC0mZ3Q7Y2xvc2UpCiYjNDM7CQltYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTOwomIzQzOwomIzQzOwlpZiAoIXNlbmRfY29yZWR1bXBfYWNrKGZkX2NvcmVkdW1wLCAmYW1wO3JlcSwgbWFzaywgMCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBzZW5kX2NvcmVkdW1wX2FjayBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCAmYW1wO2MsIDEpOwomIzQzOwlpZiAoYnl0ZXMgIT0gKHQtJmd0O3VzZXJzcGFjZSA/IDAgOiAxKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXG4mIzM0OywgX19mdW5jX18sIGJ5dGVzKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC0mZ3Q7a2luZCkgIT0gIXQtJmd0O3JlbGVhc2VkKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgdC0mZ3Q7cmVsZWFzZWQgPyAmIzM0O3N0aWxsIGhlbGQmIzM0OyA6ICYjMzQ7cmVsZWFzZWQmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsICZhbXA7Zmlyc3RfZmQpOwomIzQzOwlpZiAobnJfZmRzICZsdDsgMCB8fCAhbnJfZmRzICE9IHQtJmd0O2Nsb3NlKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxuJiMzNDssCiYjNDM7CQkJX19mdW5jX18sIG5yX2Zkcyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7CiYjNDM7CWlmICh0LSZndDtjbG9zZSkgewomIzQzOwkJaWYgKGZkICZndDs9IDAgfHwgZXJybm8gIT0gRUJBREYpIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fLCBmZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fKTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqLwomIzQzOwlpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsICZhbXA7aW5mbykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoaW5mby5tYXNrICZhbXA7IFBJREZEX0lORk9fRVhJVCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQljaGFyIGJ1ZmZlcls0MDk2XTsKJiM0MzsKJiM0MzsJCWJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwomIzQzOwkJaWYgKGJ5dGVzICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoYnl0ZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmRfbG9jayAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmRfbG9jayk7CiYjNDM7CWlmIChmZF9wZWVyX3BpZGZkICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9wZWVyX3BpZGZkKTsKJiM0MzsJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9jb3JlZHVtcCk7CiYjNDM7CWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CXJldHVybiBleGl0X2NvZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSwKJiM0MzsJCQkgICBGSVhUVVJFX0RBVEEoY29yZWR1bXApICpzZWxmLAomIzQzOwkJCSAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KQomIzQzO3sKJiM0MzsJaW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdOwomIzQzOwlwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0BAL3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0OykpOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7CiYjNDM7CUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShmZCksIDApOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CQlfZXhpdChjbG9zZV9zZXJ2ZXIodCwgaXBjX3NvY2tldHNbMV0pKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwkvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqLwomIzQzOwlBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UocGlkLCAwKTsKJiM0MzsJaWYgKHBpZCA9PSAwKSB7CiYjNDM7CQljbG9zZShyZWxlYXNlX3BpcGVbMV0pOwomIzQzOwkJY2xvc2UocmVzdWx0X3BpcGVbMF0pOwomIzQzOwkJY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpOwomIzQzOwomIzQzOwkvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovCiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTsKJiM0MzsKJiM0MzsJLyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqLwomIzQzOwlpZiAodC0mZ3Q7c2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtJmd0O3NoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHsKJiM0MzsJCUFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CQlBU1NFUlRfRVEoYywgJiMzOTtPJiMzOTspOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX1BPU0lYLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLnRocmVhZHMgPSB0cnVlLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfT0ZELAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9GTE9DSywKJiM0MzsJCS5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSwKJiM0MzsJCS50aHJlYWRzID0gdHJ1ZSwKJiM0MzsJCS5jbG9zZSA9IHRydWUsCiYjNDM7CQkucmVsZWFzZWQgPSB0cnVlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZHVwKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9EVVAsCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmRfZm9yaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9PRkQsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9zaGFyZWRfdGFibGUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfdXNlcnNwYWNlKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS51c2Vyc3BhY2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsCiYjNDM7CQkudGhyZWFkcyA9IHRydWUsCiYjNDM7CQkuY2xvc2UgPSBmYWxzZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYwppbmRleCBmNWM5YmFkODc1NDYzLi5iZWIxNjc2OThjZmRiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMKQEAgLTIzNzcsNiAmIzQzOzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpCiAJY2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTsKIH0KIAomIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9jbG9zZV9maWxlc19yZWplY3QpCiYjNDM7ewomIzQzOwljaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2VydmVyIGJ1aWx0IHdpdGggdGhlIGZpcnN0IHN0cnVjdHMgcmVhZHMgdGhlIHJlcXVlc3QgaXQga25vd3MsCiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCmluZGV4IDRlMzZlM2U0ZmI3OGYuLjY1MTMyYTBkZWNlZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCkBAIC0xNjEyLDcgJiM0MzsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSwKICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTEwJCQkJCVwKIAkoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwJCQlcCiAJIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfAkJCVwKLQkgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUykKJiM0MzsJIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMgfCBcCiYjNDM7CSBDT1JFRFVNUF9DTE9TRV9GSUxFUykKIAogYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKQogewo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxNzo1NzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+NW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTQ5MwoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDM2MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGlzIENvcmVkdW1wIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgZGlnZ2luZyBpbnRvIHRoZSBMaW51eCBrZXJuZWwmIzM5O3MgY29yZWR1bXAgc3Vic3lzdGVtLCBhbmQgaXQgbG9va3MgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBhZGRpbmcgYSBuZXcgZmxhZywgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCwgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBUaGUgY3J1Y2lhbCBiaXQgaXMgdGhhdCB3aGVuIGEgdXNlcnNwYWNlIGhhbmRsZXIgc2VuZHMgYmFjayBhbiBBQ0sgd2l0aCB0aGlzIGZsYWcgc2V0LCB0aGUga2VybmVsIHdpbGwgY2xvc2UgKmFsbCogZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY3Jhc2hpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZSBkdW1wLgoKUmlnaHQgYXdheSwgSSYjMzk7bSB0aGlua2luZzogcmVhY2hhYmxlPyBGdXp6YWJsZT8gVGhpcyBsb29rcyBwcm9taXNpbmcuIFRoZSBjb3JlZHVtcCBmdW5jdGlvbmFsaXR5IGl0c2VsZiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgbm8gcHJvYmxlbSB0aGVyZS4gQW5kIHRoaXMgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyBpcyBwYXJ0IG9mIHRoZSBVQVBJLCB3aGljaCBtZWFucyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIGNhbiB0cmlnZ2VyIGl0LiBUaGF0IG1ha2VzIGl0IHJpcGUgZm9yIGV4cGxvcmF0aW9uLgoKSSBzZWUgY2hhbmdlcyBzcHJpbmtsZWQgYWNyb3NzIHRoZSBmaWxlc3lzdGVtIGNvZGUgKGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGBmcy9maWxlX3RhYmxlLmNgLCBgZnMvaW50ZXJuYWwuaGAsIGBmcy9vcGVuLmNgLCBgaW5jbHVkZS9saW51eC9mZHRhYmxlLmhgLCBgaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaGAsIGBpbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaGApIGFuZCBldmVuIHRoZSBrZXJuZWwmIzM5O3MgZXhpdCBsb2dpYyAoYGtlcm5lbC9leGl0LmNgKS4gVGhpcyB0ZWxscyBtZSB0aGUgY29yZSBrZXJuZWwgaXMgaW52b2x2ZWQuIENsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyLCBvciBub3QsIGlzIGFsd2F5cyBhIHNlbnNpdGl2ZSBvcGVyYXRpb24uCgpNeSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBJJiMzOTtsbCB3YW50IHRvIGZvY3VzIG9uIGZvciBmdXp6aW5nLiBMb29rcyBsaWtlIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYW5kIGBmaWxwX2Nsb3NlX3N5bmNgIGFyZSB0aGUgbW9zdCByZWxldmFudCBpbiB0aGUgZmlsZXN5c3RlbSBhcmVhLiBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBhbmQgYGRvX2NvcmVkdW1wYCBuZWVkIGZ1cnRoZXIgYW5hbHlzaXMuIFRoZXNlIGFyZSBhbGwgd29ydGggYSBjbG9zZSBsb29rIGFuZCBmdXp6aW5nLgoKRmluYWxseSwgSSBuZWVkIHRvIGNoZWNrIHRoZSBLY29uZmlnIG9wdGlvbnMuIENvcmVkdW1wcyBhcmUgZW5hYmxlZCB2aWEgYENPTkZJR19DT1JFRFVNUGAuIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIHNldCwgb3RoZXJ3aXNlLCBhbGwgdGhpcyB3b3JrIGlzIGZvciBub3RoaW5nLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDT1JFRFVNUCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXG4tLVxuZnMvS2NvbmZpZy5iaW5mbXQtMTcwLVxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcyLVx0Ym9vbCBcJiMzNDtFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcJiMzNDsgaWYgRVhQRVJUXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzODkKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkFuYWx5emluZyB0aGUgYENPUkVEVU1QYCBEZXBlbmRlbmNpZXMqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyByZWxhdGVkIHRvIGBDT1JFRFVNUGAuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZGVsdmUgaW50byB0aGUgdmFyaW91cyBsYXllcnMgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZywgaGFuZGxpbmcsIGFuZCBpbnRlcnByZXRpbmcgY29yZSBkdW1wcy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUga2VybmVsLWxldmVsIGNvbXBvbmVudHMgdGhhdCB0cmlnZ2VyIHRoZSBkdW1wIOKAkyBzaWduYWxzIGxpa2UgU0lHU0VHViwgU0lHQUJSVCwgU0lHSUxMLCBldGMuIOKAkyBhbmQgaG93IHRob3NlIGFyZSBjb25maWd1cmVkLCBwb3RlbnRpYWxseSB0aHJvdWdoIGAvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybmAgb3Igc2ltaWxhciBzeXNjdGwgc2V0dGluZ3MuCgpUaGVuLCBJJiMzOTttIGNvbnNpZGVyaW5nIHRoZSB1c2Vyc3BhY2UgdXRpbGl0aWVzOiBgZ2RiYCwgYGxsZGJgLCBgY29yZWR1bXBjdGxgLCBhbmQgdGhlIHdob2xlIHJhbmdlIG9mIGRlYnVnZ2VycyB0aGF0IGNhbiBhY3R1YWxseSAqdXNlKiB0aGUgY29yZSBmaWxlLiBXaGF0IGFyZSB0aGUga2V5IGxpYnJhcmllcyB0aGVzZSB0b29scyByZWx5IG9uIGZvciBwYXJzaW5nIHRoZSBjb3JlIGR1bXAgZm9ybWF0PyBFTEYsIERXQVJGLCB0aGUgZGVidWdnaW5nIGludGVyZmFjZSAoREJJKS4uLiBJIG5lZWQgdG8gbWFwIG91dCB0aGUgY29ubmVjdGlvbnMuIEFtIEkgZGVhbGluZyB3aXRoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCB3aGljaCBtYXkgaW5mbHVlbmNlIHRoZSBjb3JlIGZpbGUgZm9ybWF0PwoKSSYjMzk7bSBhbHNvIGNvbnNpZGVyaW5nIHRoZSBpbXBsaWNhdGlvbnMgb2YgdGhlIGNvcmUgZHVtcCBzZXR0aW5ncyB0aGVtc2VsdmVzOiBzaXplIGxpbWl0cyAodWxpbWl0IC1jKSwgdGhlIGNvcmUgZmlsZSBuYW1pbmcgY29udmVudGlvbiAocG90ZW50aWFsbHkgaW5qZWN0aW5nIHByb2Nlc3MgSURzLCB0aW1lc3RhbXBzLCBldGMuKSwgYW5kIHdoZXRoZXIgdGhlIGR1bXAgaXMgYmVpbmcgY2FwdHVyZWQgaW4gYSBmaWxlIGF0IGFsbCwgb3IgcG90ZW50aWFsbHkgcGlwZWQgdG8gYSBkZWJ1Z2dlciBkaXJlY3RseS4KCkkgc2hvdWxkIGFsc28gZmFjdG9yIGluIHRoZSBwb3NzaWJpbGl0eSBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMg4oCTIHRvb2xzIHRoYXQgbWlnaHQgcHJlLXByb2Nlc3Mgb3IgcG9zdC1wcm9jZXNzIHRoZSBjb3JlIGR1bXBzLiBBcmUgdGhlcmUgYW55IGN1c3RvbSBzY3JpcHRzIG9yIHRvb2xzIHdpdGhpbiB0aGlzIHN5c3RlbSB0aGF0IGFyZSBpbnZvbHZlZCBpbiBjb3JlIGR1bXAgYW5hbHlzaXMgb3IgbWFuaXB1bGF0aW9uPyBVbmRlcnN0YW5kaW5nIGFueSBjdXN0b20gdG9vbHMgb3IgbW9kaWZpY2F0aW9ucyBpbiBwbGFjZSBpcyBjcnVjaWFsLgoKVWx0aW1hdGVseSwgSSBuZWVkIGEgaG9saXN0aWMgdmlldzogd2hhdCB0cmlnZ2VycyBhIGNvcmUgZHVtcCwgaG93IGlzIGl0IGdlbmVyYXRlZCwgd2hhdCBhcmUgdGhlIHJlc3RyaWN0aW9ucyBvbiB0aGUgY29yZSBkdW1wLCB3aGF0IHRvb2xzIGludGVyYWN0IHdpdGggdGhlIGNvcmUgZHVtcCwgYW5kIHdoYXQgdG9vbHMgbWF5IGFuYWx5emUgdGhlIGNvcmUgZHVtcD8gVGhpcyBpcyB0aGUgY29yZSBkZXBlbmRlbmN5IGdyYXBoIEkgbmVlZCB0byB1bmRlcnN0YW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDT1JFRFVNUCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10PTE0NT1jb25maWcgQklORk1UX01JU0Ncbi0tXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXG5mcy9LY29uZmlnLmJpbmZtdDoxNzE6Y29uZmlnIENPUkVEVU1QXG5mcy9LY29uZmlnLmJpbmZtdC0xNzItXHRib29sIFwmIzM0O0VuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjkxMAoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoaW5raW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9uczoKCioqQW5hbHl6aW5nIHRoZSBLZXJuZWwmIzM5O3MgQmluYXJ5IEZvcm1hdCBDb25maWd1cmF0aW9uKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYGZzL0tjb25maWcuYmluZm10YCBzZWN0aW9uLiBNeSBleHBlcmllbmNlIHRlbGxzIG1lIHRoYXQgdGhpcyBpcyB3aGVyZSB0aGUga2VybmVsIGRlZmluZXMgaXRzIGhhbmRsaW5nIG9mIHZhcmlvdXMgYmluYXJ5IGZvcm1hdHMsIGxpa2UgZXhlY3V0YWJsZXMuIFRoZSBsaW5lIG51bWJlciBwcm92aWRlZCwgYXJvdW5kIDE3MSwgdXN1YWxseSBwb2ludHMgdG8gYSBzaWduaWZpY2FudCBibG9jayBvZiBjb2RlLCBvZnRlbiBkZWFsaW5nIHdpdGggdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIGhvdyB0aGUga2VybmVsIGlkZW50aWZpZXMgYW5kIGV4ZWN1dGVzIGRpZmZlcmVudCBwcm9ncmFtIHR5cGVzLiBUaGlzIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmbGV4aWJpbGl0eSBhbmQgc2VjdXJpdHkgb2YgdGhlIGtlcm5lbCwgYXMgaXQgZGljdGF0ZXMgd2hhdCBjYW4gYmUgcnVuIG9uIHRoZSBzeXN0ZW0gYW5kIGhvdy4gSSBuZWVkIHRvIHNlZSB3aGF0JiMzOTtzIGJlaW5nIGNvbmZpZ3VyZWQsIHdoYXQgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCwgYW5kIGFueSBjb25kaXRpb25hbCBsb2dpYyB0aGF0IG1pZ2h0IGJlIGluIHBsYWNlLiBJJiMzOTttIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyBhYm91dCB3aGF0IG5ldyBiaW5hcnkgZm9ybWF0IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQsIGFuZCBpZiBhbnkgc2VjdXJpdHkgb3B0aW9ucyBhcmUgaW4gcGxheS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL0tjb25maWcuYmluZm10JiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTY1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNjU6XHRcdFx0bW91bnQgYmluZm10X21pc2MgLXQgYmluZm10X21pc2MgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjXG4gMTY2Olx0XG4gMTY3Olx0XHQgIFlvdSBtYXkgc2F5IE0gaGVyZSBmb3IgbW9kdWxlIHN1cHBvcnQgYW5kIGxhdGVyIGxvYWQgdGhlIG1vZHVsZSB3aGVuXG4gMTY4Olx0XHQgIHlvdSBoYXZlIHVzZSBmb3IgaXQ7IHRoZSBtb2R1bGUgaXMgY2FsbGVkIGJpbmZtdF9taXNjLiBJZiB5b3VcbiAxNjk6XHRcdCAgZG9uJiMzOTt0IGtub3cgd2hhdCB0byBhbnN3ZXIgYXQgdGhpcyBwb2ludCwgc2F5IFkuXG4gMTcwOlx0XG4gMTcxOlx0Y29uZmlnIENPUkVEVU1QXG4gMTcyOlx0XHRib29sIFwmIzM0O0VuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFwmIzM0OyBpZiBFWFBFUlRcbiAxNzM6XHRcdGRlZmF1bHQgeVxuIDE3NDpcdFx0aGVscFxuIDE3NTpcdFx0ICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgY29yZSBkdW1wcy4gWW91IGFsbW9zdFxuIDE3NjpcdFx0ICBjZXJ0YWlubHkgd2FudCB0byBzYXkgWSBoZXJlLiBOb3QgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBuZXZlclxuIDE3NzpcdFx0ICBuZWVkIGRlYnVnZ2luZyBvciBvbmx5IGV2ZXIgcnVuIGZsYXdsZXNzIGNvZGUuXG4gMTc4Olx0XG4gMTc5Olx0Y29uZmlnIEVYRUNfS1VOSVRfVEVTVFxuIDE4MDpcdFx0Ym9vbCBcJiMzNDtCdWlsZCBleGVjdmUgdGVzdHNcJiMzNDsgaWYgIUtVTklUX0FMTF9URVNUU1xuIDE4MTpcdFx0ZGVwZW5kcyBvbiBLVU5JVD15XG4gMTgyOlx0XHRkZWZhdWx0IEtVTklUX0FMTF9URVNUU1xuIDE4MzpcdFx0aGVscFxuIDE4NDpcdFx0ICBUaGlzIGJ1aWxkcyB0aGUgZXhlYyBLVW5pdCB0ZXN0cywgd2hpY2ggdGVzdHMgYm91bmRhcnkgY29uZGl0aW9uc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDk2CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzQxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiBDb3JlIER1bXAgQ29uZmlndXJhdGlvbiBhbmQgSW1wbGVtZW50YXRpb24qKgoKT2theSwgc28gYENPUkVEVU1QYCBzZWVtcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBpdHMgYmVoYXZpb3IsIHNvIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEl0IGxvb2tzIGxpa2UgdGhlIG1haW4gY29kZSBpcyBzcHJlYWQgYWNyb3NzIGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGFuZCBga2VybmVsL2V4aXQuY2AuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUmIzM5O3MgYW55dGhpbmcgc3BlY2lmaWMgdG8gY29udHJvbCB0aGUgY2xvc2luZyBvZiBmaWxlcyBkdXJpbmcgYSBjb3JlIGR1bXA7IGlzIHRoZXJlIHNvbWV0aGluZyBsaWtlIGBDT1JFRFVNUF9DTE9TRV9GSUxFU2A/IE5vcGUsIGl0JiMzOTtzIGp1c3QgYSBzaW1wbGUgZmxhZy4KCk5vdywgSSBzaG91bGQgZXhhbWluZSB0aGUgcmVsZXZhbnQgZnVuY3Rpb25zIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgYWxsIHdvcmtzLiBJJiMzOTttIGZvY3VzaW5nIG9uIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYGZpbHBfY2xvc2Vfc3luY2AsIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgLCBhbmQgYGRvX2NvcmVkdW1wYC4KCkkmIzM5O2xsIHF1aWNrbHkgdmVyaWZ5IHRoZSB2aXNpYmlsaXR5IG9mIHRoZXNlIGZ1bmN0aW9ucy4gQ2hlY2tpbmcgYGZzL2ZpbGUuY2AsIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCBhcmUgbm9uLXN0YXRpYy4gVGhlbiwgbG9va2luZyBhdCBgZnMvZmlsZV90YWJsZS5jYCwgYGZpbHBfY2xvc2Vfc3luY2AgaXMgYWxzbyBub24tc3RhdGljLiBBaGEsIGluIGBmcy9jb3JlZHVtcC5jYCwgSSBzZWUgYm90aCBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBhbmQgYGRvX2NvcmVkdW1wYC4gV2FpdCBhIHNlY29uZOKApiBpcyBgZG9fY29yZWR1bXBgIHN0YXRpYz8gSSBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGF0IGxhc3Qgb25lLiBUaGlzIG1pZ2h0IGJlIGltcG9ydGFudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZG9fY29yZWR1bXAmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9MTE4OT1zdGF0aWMgaW5saW5lIGJvb2wgY29yZWR1bXBfc2tpcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIwMC1cbmZzL2NvcmVkdW1wLmM6MTIwMTpzdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbmZzL2NvcmVkdW1wLmMtMTIwMi1cdFx0XHRzaXplX3QgKiphcmd2LCBpbnQgKmFyZ2MsIGNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdClcbi0tXG5mcy9jb3JlZHVtcC5jPTEyNzk9dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbi0tXG5mcy9jb3JlZHVtcC5jLTEzMTctXHRzY29wZWRfd2l0aF9jcmVkcyhjcmVkKVxuZnMvY29yZWR1bXAuYzoxMzE4Olx0XHRkb19jb3JlZHVtcChcdTAwMjZjbiwgXHUwMDI2Y3BybSwgXHUwMDI2YXJndiwgXHUwMDI2YXJnYywgYmluZm10KTtcbmZzL2NvcmVkdW1wLmMtMTMxOS1cdGNvcmVkdW1wX2NsZWFudXAoXHUwMDI2Y24sIFx1MDAyNmNwcm0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxODQzMgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDMyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgQ29yZSBEdW1wIExvZ2ljKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgY29yZSBkdW1wcyBhcmUgZ2VuZXJhdGVkIGluIHRoaXMgc3lzdGVtLiBUaGUgZnVuY3Rpb24gYGRvX2NvcmVkdW1wYCBpcyBkZWNsYXJlZCBhcyBgc3RhdGljYCwgd2hpY2ggaW1tZWRpYXRlbHkgdGVsbHMgbWUgaXQmIzM5O3MgbGlrZWx5IGFuIGludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24sIHByb2JhYmx5IG5vdCBzb21ldGhpbmcgZGlyZWN0bHkgZXhwb3NlZC4gVGhlIHJlYWwgZW50cnkgcG9pbnQgZm9yIHRoZSBjb3JlIGR1bXAgZnVuY3Rpb25hbGl0eSBpcyBgdmZzX2NvcmVkdW1wYC4gVGhhdCYjMzk7cyB3aGVyZSB0aGUgYWN0aW9uICpzdGFydHMqLiBJIG5lZWQgdG8gZHJpbGwgaW50byBgdmZzX2NvcmVkdW1wYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQmIzM5O3MgZG9pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3Zmc19jb3JlZHVtcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTI3OC1cbmZzL2NvcmVkdW1wLmM6MTI3OTp2b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxuZnMvY29yZWR1bXAuYy0xMjgwLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg3MzIKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipBbmFseXppbmcgYHZmc19jb3JlZHVtcGAgYW5kIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgKioKClJpZ2h0LCBsZXQgbWUgc2VlLi4uIHNvIGB2ZnNfY29yZWR1bXBgIGlzICpub3QqIGEgc3RhdGljIGZ1bmN0aW9uLCB3aGljaCBpbW1lZGlhdGVseSByYWlzZXMgYSBmbGFnLiBXZSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHBvdGVudGlhbCBzY29wZSBhbmQgaW1wYWN0LiBOb3csIGxldCYjMzk7cyBjb250cmFzdCB0aGF0IHdpdGggYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgd2hpY2ggKmlzKiBzdGF0aWMuIFRoYXQmIzM5O3MgZ29vZDsgaXQgc3VnZ2VzdHMgYSBtb3JlIGxpbWl0ZWQgc2NvcGUsIGNvbnRhaW5lZCB3aXRoaW4gYSBzcGVjaWZpYyBtb2R1bGUgb3IgZmlsZS4gVGhlIG9idmlvdXMgcXVlc3Rpb24gbm93IGJlY29tZXM6IElzIHRoZXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9uIHRoYXQgZGlyZWN0bHkgY2FsbHMgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGA/IFRoYXQgd291bGQgYmUgdGhlIGNydWNpYWwgbGluayB0byBpZGVudGlmeSwgd291bGRuJiMzOTt0IGl0PyBBIG5vbi1zdGF0aWMgY2FsbGVyIG9mIGEgc3RhdGljIGZ1bmN0aW9uLi4uIGhtbS4uLiBuZWVkIHRvIHRyYWNlIHRoYXQgcG90ZW50aWFsIHBhdGguIFRoYXQgY291bGQgYmUgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZywgd291bGRuJiMzOTt0IGl0PwoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb3JlZHVtcF9zb2NrX3JlcXVlc3QmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9ODIxPXN0YXRpYyBpbmxpbmUgdm9pZCBjb3JlZHVtcF9zb2NrX3NodXRkb3duKHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2NvcmVkdW1wLmMtODMyLVxuZnMvY29yZWR1bXAuYzo4MzM6c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuZnMvY29yZWR1bXAuYy04MzQte1xuLS1cbmZzL2NvcmVkdW1wLmM9OTU0PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9jb3JlZHVtcC5jLTk1OC1cbmZzL2NvcmVkdW1wLmM6OTU5Olx0cmV0dXJuIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChjbiwgY3BybSk7XG5mcy9jb3JlZHVtcC5jLTk2MC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjAzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE5MTkzCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCBzdGFuZHM6CgoqKlN0YXRpYyBWYXJpYWJsZXMgYW5kIENhbGxlcnMqKgoKT2theSwgc28gYGNvcmVkdW1wX3NvY2tldGAgaXMgYWxzbyBkZWNsYXJlZCBhcyBgc3RhdGljYC4gVGhhdCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QuIFN0YXRpYyB2YXJpYWJsZXMgaGF2ZSBzcGVjaWZpYyBzY29waW5nIGFuZCBsaWZldGltZSBjaGFyYWN0ZXJpc3RpY3MsIHNvIHVuZGVyc3RhbmRpbmcgdGhlaXIgdXNhZ2UgaXMgY3J1Y2lhbCwgZXNwZWNpYWxseSB3aXRoaW4gYSBjcml0aWNhbCBwYXJ0IG9mIHRoZSBzeXN0ZW0gbGlrZSBhIGNvcmVkdW1wIG1lY2hhbmlzbS4gTXkgbmV4dCBpbW1lZGlhdGUgdGhvdWdodCBpczogV2hhdCAqZXhhY3RseSogY2FsbHMgYGNvcmVkdW1wX3NvY2tldGA/IEkgbmVlZCB0byB0cmFjZSBiYWNrIHRoZSB1c2FnZSB0byB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIGFuZCBob3cgaXQmIzM5O3MgYmVpbmcgbWFuYWdlZC4gV2hvIGlzIHNldHRpbmcgdXAgdGhpcyBzb2NrZXQ/IFdoYXQgaXMgc2VuZGluZyBkYXRhIHRvIGl0PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29udHJvbCBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb3JlZHVtcF9zb2NrZXQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2NvcmVkdW1wLmM9ODMzPXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9jb3JlZHVtcC5jLTk1My1cbmZzL2NvcmVkdW1wLmM6OTU0OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL2NvcmVkdW1wLmMtOTU1LXtcbi0tXG5mcy9jb3JlZHVtcC5jPTk2Mz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9XG5mcy9jb3JlZHVtcC5jOjk2NDpzdGF0aWMgaW5saW5lIGJvb2wgY29yZWR1bXBfc29ja2V0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKSB7IHJldHVybiBmYWxzZTsgfVxuZnMvY29yZWR1bXAuYy05NjUtI2VuZGlmXG4tLVxuZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIyMi1cdGNhc2UgQ09SRURVTVBfU09DSzpcbmZzL2NvcmVkdW1wLmM6MTIyMzpcdFx0aWYgKCFjb3JlZHVtcF9zb2NrZXQoY24sIGNwcm0pKVxuZnMvY29yZWR1bXAuYy0xMjI0LVx0XHRcdHJldHVybjtcbi0tXG5mcy9jb3JlZHVtcC5jPTE2NDk9dm9pZCB2YWxpZGF0ZV9jb3JlZHVtcF9zYWZldHkodm9pZClcbi0tXG5mcy9jb3JlZHVtcC5jLTE2NTktXG5mcy9jb3JlZHVtcC5jOjE2NjA6c3RhdGljIGlubGluZSBib29sIGNoZWNrX2NvcmVkdW1wX3NvY2tldCh2b2lkKVxuZnMvY29yZWR1bXAuYy0xNjYxLXtcbi0tXG5mcy9jb3JlZHVtcC5jPTE2OTk9c3RhdGljIGludCBwcm9jX2Rvc3RyaW5nX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG4tLVxuZnMvY29yZWR1bXAuYy0xNzE0LVxuZnMvY29yZWR1bXAuYzoxNzE1Olx0aWYgKCFjaGVja19jb3JlZHVtcF9zb2NrZXQoKSkge1xuZnMvY29yZWR1bXAuYy0xNzE2LVx0XHRzdHJzY3B5KGNvcmVfcGF0dGVybiwgb2xkX2NvcmVfcGF0dGVybiwgcmV0dmFsICYjNDM7IDEpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxOTg3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgc2VlIGl0OgoKKipEaWdnaW5nIGludG8gdGhlIENvcmUgRHVtcCBGbG93KioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIHRyYWNlIHRoZSBjb3JlIGR1bXAgcHJvY2Vzcy4gUmlnaHQgbm93LCBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBgZG9fY29yZWR1bXBgIGlzIGNvbm5lY3RlZCB0byBgY29yZWR1bXBfc29ja2V0YCwgd2hpY2ggaW4gdHVybiBjYWxscyBgY29yZWR1bXBfc29ja19yZXF1ZXN0YC4gSWYgYGRvX2NvcmVkdW1wYCBpcyBjYWxsZWQgYnkgYHZmc19jb3JlZHVtcGAsIHRoZW4gdGhhdCBzdWdnZXN0cyBgdmZzX2NvcmVkdW1wYCBpcyBwcm9iYWJseSBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgZGlnZ2luZyBkZWVwZXIgYW5kIGZvY3VzaW5nIG15IGludmVzdGlnYXRpb24uIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoYXQgZnVuY3Rpb24uIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmaWxwX2Nsb3NlX3N5bmNgIGJlY2F1c2Ugb2YgbXkgZXhwZXJpZW5jZXMgd2l0aCByZXNvdXJjZSBjbGVhbnVwIGluIHRoaXMgYXJlYS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZmlscF9jbG9zZV9zeW5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2ZpbGUuYz01MDE9c3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4tLVxuZnMvZmlsZS5jLTUyNi1cdFx0XHRcdFx0aWYgKHN5bmMpXG5mcy9maWxlLmM6NTI3Olx0XHRcdFx0XHRcdGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7XG5mcy9maWxlLmMtNTI4LVx0XHRcdFx0XHRlbHNlXG4tLVxuZnMvZmlsZV90YWJsZS5jPTY0Mj1FWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xuLS1cbmZzL2ZpbGVfdGFibGUuYy02NDctICovXG5mcy9maWxlX3RhYmxlLmM6NjQ4OmludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG5mcy9maWxlX3RhYmxlLmMtNjQ5LXtcbi0tXG5mcy9pbnRlcm5hbC5oPTEyMT1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZpbGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlKVxuLS1cbmZzL2ludGVybmFsLmgtMTI5LVxuZnMvaW50ZXJuYWwuaDoxMzA6aW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XG5mcy9pbnRlcm5hbC5oLTEzMS12b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4tLVxuZnMvb3Blbi5jPTE0NjE9U1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxuLS1cbmZzL29wZW4uYy0xNDczLVx0ICovXG5mcy9vcGVuLmM6MTQ3NDpcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVx1MDAzZWZpbGVzKTtcbmZzL29wZW4uYy0xNDc1LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDQ2NQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDUyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKkFuYWx5emluZyBgZmlscF9jbG9zZV9zeW5jYCBhcyBhIEtleSBGb2N1cyoqCgpBbHJpZ2h0LCBiYXNlZCBvbiB0aG9zZSByZWxhdGlvbnNoaXBzLCBpdCBsb29rcyBsaWtlIGBmaWxwX2Nsb3NlX3N5bmNgIGlzIGRlZmluaXRlbHkgYSBjb3JlIGZ1bmN0aW9uIHRvIHplcm8gaW4gb24uIFRoZSBmYWN0IHRoYXQgaXQmIzM5O3MgY2FsbGVkIGJ5IGJvdGggYGNsb3NlX2ZpbGVzYCBhbmQgYHN5c19jbG9zZWAgbWFrZXMgaXQgYSBoaWdoLXZhbHVlIHN5bWJvbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBmaWxlIGNsb3NpbmcgcHJvY2Vzcy4gS25vd2luZyB0aGF0LCBJIG5lZWQgdG8gY2hlY2sgaG93IGl0IHdvcmtzIHdpdGggYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYC4gSXQgcHJvYmFibHkgZGVhbHMgd2l0aCBzb21lIG9mIHRoZSBmaW5lciBkZXRhaWxzIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0IHJlbGF0aW9uc2hpcC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvY29yZWR1bXAuYz0xMjAxPXN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIzNC1cbmZzL2NvcmVkdW1wLmM6MTIzNTpcdGlmICgoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XG5mcy9jb3JlZHVtcC5jLTEyMzYtXHRcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFwmIzM0O0ZhaWxlZCB0byBjbG9zZSBmaWxlcywgYWJvcnRpbmcgY29yZVwmIzM0Oyk7XG4tLVxuZnMvZmlsZS5jPTU3MT12b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxuZnMvZmlsZS5jLTU4MS0gKi9cbmZzL2ZpbGUuYzo1ODI6Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuZnMvZmlsZS5jLTU4My17XG4tLVxuZnMvZmlsZS5jPTYyOD1ib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKVxuLS1cbmZzL2ZpbGUuYy02MzItXG5mcy9maWxlLmM6NjMzOlx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xuZnMvZmlsZS5jLTYzNC1cdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaD0xMDQ9dm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbmluY2x1ZGUvbGludXgvZmR0YWJsZS5oOjEwNTpib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xuaW5jbHVkZS9saW51eC9mZHRhYmxlLmgtMTA2LWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpO1xuLS1cbmtlcm5lbC9leGl0LmM9NDMwPXN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbi0tXG5rZXJuZWwvZXhpdC5jLTQ1MS1cdFx0XHRicmVhaztcbmtlcm5lbC9leGl0LmM6NDUyOlx0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xua2VybmVsL2V4aXQuYy00NTMtXHRcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFx1MDAyNnNlbGYpKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTQ9VEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZS02LVx0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZTo3Olx0XHQgIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3RcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlLTgtVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZT0xND0kKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZToxNTokKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjEzMzYKCQkJCQkJCW91dHB1dDogMTcKCQkJCQkJCXRob3VnaHRzOiA0MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgdGhlc2UgdGhvdWdodHM6CgoqKkFuYWx5emluZyBDb3JlIER1bXAgRmlsZSBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGhvbmluZyBpbiBvbiB0aGUgY3J1Y2lhbCBhcmVhcyBmb3IgZmlsZSBoYW5kbGluZyB3aXRoaW4gdGhlIGNvcmUgZHVtcCBwcm9jZXNzLiBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIGFuZCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgYXJlIGRlZmluaXRlbHkga2V5IGZvY3VzIHBvaW50cy4gVGhvc2UgZnVuY3Rpb24gbmFtZXMgc2NyZWFtICYjMzQ7ZmlsZSBjbGVhbnVwLCYjMzQ7IHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBiZXR0ZXIuIE5vdywgSSBzaG91bGQgc2hpZnQgbXkgYXR0ZW50aW9uIHRvIHRoZSBhbGxvY2F0aW9uIHNpZGUgb2YgdGhpbmdzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGZpbGUgc3RydWN0dXJlcyBhcmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuIExldCYjMzk7cyBkaWcgaW50byBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbmQgYGFsbG9jX2ZpbGVzYC4gVW5kZXJzdGFuZGluZyB0aGUgYWxsb2NhdGlvbiBwcm9jZXNzIHdpbGwgdGVsbCBtZSBhIGxvdCBhYm91dCBob3cgdGhlc2UgZmlsZSBoYW5kbGVzIGFyZSBtYW5hZ2VkIGZyb20gdGhlIHZlcnkgc3RhcnQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBwaWN0dXJlIG9mIHRoZSBlbnRpcmUgbGlmZWN5Y2xlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDthbGxvY19maWxlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9maWxlLmM9MzY0PXN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuLS1cbmZzL2ZpbGUuYy0zNzgtLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXG5mcy9maWxlLmM6Mzc5OnN0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXG5mcy9maWxlLmMtMzgwLXtcbi0tXG5mcy9maWxlLmMtNDA0LS8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqL1xuZnMvZmlsZS5jOjQwNTpzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXNfc3RydWN0KHZvaWQpXG5mcy9maWxlLmMtNDA2LXtcbi0tXG5mcy9maWxlLmMtNDA4LVxuZnMvZmlsZS5jOjQwOTpcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG5mcy9maWxlLmMtNDEwLVx0aWYgKCFuZXdmKVxuLS1cbmZzL2ZpbGUuYz00MjI9c3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbi0tXG5mcy9maWxlLmMtNDI4LVxuZnMvZmlsZS5jOjQyOTpcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbmZzL2ZpbGUuYy00MzAtXHRpZiAoIW5ld2YpXG4tLVxuZnMvZmlsZS5jPTU4Mj1ib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXG4tLVxuZnMvZmlsZS5jLTU4OC1cbmZzL2ZpbGUuYzo1ODk6XHRmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpO1xuZnMvZmlsZS5jLTU5MC1cdGlmICghZmlsZXMpXG4tLVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jPTM1MzI9c3RhdGljIGludFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jOjM1MzM6eGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYy0zNTM0LVx0c3RydWN0IHhmc19ibWFsbG9jYVx0KmFwLFxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYz0zNjI1PXhmc19ibWFwX2J0YWxsb2MoXG4tLVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM2NTgtXHRcdFx0eGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtXHUwMDNlaXApKVxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jOjM2NTk6XHRcdGVycm9yID0geGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhhcCwgXHUwMDI2YXJncywgc3RyaXBlX2FsaWduKTtcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYy0zNjYwLVx0ZWxzZVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjIwNgoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246CgoqKkFuYWx5emluZyBGaWxlIEFsbG9jYXRpb24gU3RydWN0dXJlcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhlc2UgZmlsZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4gSSBzZWUgYGFsbG9jX2ZpbGVzYCBhbmQgYGFsbG9jX2ZpbGVzX3N0cnVjdGAgZGVmaW5lZCBhcyBgc3RhdGljYC4gUmlnaHQsIHRoYXQgbWVhbnMgdGhleSYjMzk7cmUgb25seSB2aXNpYmxlIHdpdGhpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuIFRoYXQmIzM5O3MgZ29vZCB0byBrZWVwIGluIG1pbmQsIGl0IGxpbWl0cyB0aGVpciBzY29wZSB3aGljaCBpcyB1c3VhbGx5IGEgcG9zaXRpdmUgc2lnbiBmb3IgbW9kdWxhcml0eS4gTm93LCBsZXQgbWUgc2hpZnQgbXkgZm9jdXMgdG8gYHN3aXRjaF9maWxlc19zdHJ1Y3RgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlc2Ugb3RoZXIgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zLiBJdCYjMzk7cyBsaWtlbHkgdGhhdCBpdCBoYXMgYSByb2xlIGluIG1hbmFnaW5nIG9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBzdHJ1Y3R1cmUgaW4gc29tZSB3YXksIGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIGBhbGxvY19maWxlc2AgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZC4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N3aXRjaF9maWxlc19zdHJ1Y3QmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZmlsZS5jPTU0MT12b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4tLVxuZnMvZmlsZS5jLTU1My0vKiBIYW5kIEB0c2sgdGhlIHRhYmxlIEBmaWxlcywgb3Igbm9uZSwgYW5kIGRyb3AgdGhlIG9uZSBpdCBoYWQuICovXG5mcy9maWxlLmM6NTU0OnN0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG5mcy9maWxlLmMtNTU1LVx0XHRcdFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4tLVxuZnMvZmlsZS5jPTU3MT12b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxuZnMvZmlsZS5jLTU3NC1cdFx0cmV0dXJuO1xuZnMvZmlsZS5jOjU3NTpcdHN3aXRjaF9maWxlc19zdHJ1Y3QodHNrLCBOVUxMKTtcbmZzL2ZpbGUuYy01NzYtfVxuLS1cbmZzL2ZpbGUuYz01ODI9Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuLS1cbmZzL2ZpbGUuYy02MDktXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuZnMvZmlsZS5jOjYxMDpcdFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG5mcy9maWxlLmMtNjExLVxuLS1cbmZzL2ZpbGUuYz02Mjg9Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZilcbi0tXG5mcy9maWxlLmMtNjM4LVx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuZnMvZmlsZS5jOjYzOTpcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuZnMvZmlsZS5jLTY0MC1cdGNvcmVfc3RhdGUgPSBjdXJyZW50LVx1MDAzZXNpZ25hbC1cdTAwM2Vjb3JlX3N0YXRlO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjgwMwoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDMxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGb2N1cyBTeW1ib2wgUmVmaW5lbWVudCoqCgpPa2F5LCBsZXQmIzM5O3MgbmFpbCBkb3duIHRoZXNlIGZvY3VzIHN5bWJvbHMuIEkmIzM5O3ZlIGdvdCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgbG9ja2VkIGluIGFzIHN0YXRpYywgc28gdGhhdCYjMzk7cyBvZmYgdGhlIHRhYmxlLiBOb3csIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyBhcmUgdGhlIG9uZXMgSSBuZWVkIHRvIGV4YW1pbmU6IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AsIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCwgYGZpbHBfY2xvc2Vfc3luY2AsIGFuZCBgdmZzX2NvcmVkdW1wYC4KClJpZ2h0LCBsZXQmIzM5O3MgcmV2aXNpdCBgZmlscF9jbG9zZV9zeW5jYC4gSGFuZyBvbi4uLiBpdCYjMzk7cyBjYWxsZWQgYnkgYHN5c19jbG9zZWA/IFRoYXQmIzM5O3MgYSAqdmVyeSogaG90IHBhdGguIEkgbmVlZCB0byBiZSBjYXJlZnVsOyB0aGF0JiMzOTtzIHByb2JhYmx5IG5vdCBpZGVhbCBhcyBhIGZvY3VzIHN5bWJvbC4gVGhlIGtlcm5lbCBzZWVzIGEgdG9uIG9mIGBzeXNfY2xvc2VgIGNhbGxzLiBZZXAsIGByZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpO2AgaW4gYHN5c19jbG9zZWAgY29uZmlybXMgaXQuICBTbywgc2NyYXAgYGZpbHBfY2xvc2Vfc3luY2AgZnJvbSB0aGUgbGlzdDsgaXQmIzM5O3MgdG9vIGdlbmVyaWMgYW5kIGhpZ2gtZnJlcXVlbmN5LgoKTm93LCB3aGF0IGFib3V0IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYD8gVGhvc2UgYXJlIHNwZWNpZmljIHRvIGNvcmVkdW1wIGZ1bmN0aW9uYWxpdHksIHJpZ2h0PyBOb3QgYSBzdGFuZGFyZCBwYXRoLiBUaGF0IGxvb2tzIGdvb2QuIEFuZCBgdmZzX2NvcmVkdW1wYCBpcyBzaW1pbGFybHkgbmljaGUuIFRoYXQmIzM5O3MgZ29vZCB0b28uCgpBcmUgdGhlcmUgYW55IG90aGVyIG91dGxpZXJzPyAgYGZpbHBfY2xvc2VgIGlzIGV4cG9ydGVkIGFuZCBub24tc3RhdGljLCBidXQgaXQgbG9va3MgbGlrZSBhIGhvdCBwYXRoIChvciBhdCBsZWFzdCBnZW5lcmljKS4gQW5kIGBkdXBfZmRgIGlzIG1vZGlmaWVkIGJ1dCBpdCYjMzk7cyB1c2VkIGluIGZvcmssIG5vdCBhIGZvY3VzLgoKT2theSwgSSB0aGluayB3ZSYjMzk7dmUgZ290IGl0LiBUaGUgZm9jdXMgc3ltYm9scywgZ2l2ZW4gdGhlIGFuYWx5c2lzLCBzaG91bGQgYmU6CgoqICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYAoqICAgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgCiogICBgdmZzX2NvcmVkdW1wYAoKSSYjMzk7bGwgZG91YmxlLWNoZWNrIGB2ZnNfY29yZWR1bXBgIG9uZSBtb3JlIHRpbWUsIGp1c3QgdG8gYmUgc3VyZS4gSXQgZG9lcyBzZWVtIHVuaXF1ZSB0byB0aGUgY29yZWR1bXAgdXNlIGNhc2UuIEV4Y2VsbGVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0PTU1NT1kaWZmZXJlbnQgc2V0IG9mIGNyZWRlbnRpYWxzLiAgVGhpcyBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgcGxhY2VzOlxuLS1cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NTU4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD0yNTQ9Y29uc3TmjIfpkojkuIrmk43kvZzvvIzlm6DmraTkuI3pnIDopoHov5vooYznsbvlnovovazmjaLvvIzkvYbpnIDopoHkuLTml7bmlL7lvINjb25zdOmZkOWumu+8jOS7peS+v+iDveWkn+S/ruaUuVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdDo0Nzg6ICogYGB2ZnNfY29yZWR1bXAoKWBgLlxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTQ3OS0gKiBuZnM0cmVjb3Zlci5jLlxuLS1cbmZzL2NvcmVkdW1wLmM9MTIwMT1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbi0tXG5mcy9jb3JlZHVtcC5jLTEyNzgtXG5mcy9jb3JlZHVtcC5jOjEyNzk6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbylcbmZzL2NvcmVkdW1wLmMtMTI4MC17XG4tLVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oPTY3PWJvb2wgZHVtcF91c2VyX3JhbmdlKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtNjgtXHRcdCAgICAgdW5zaWduZWQgbG9uZyBsZW4pO1xuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjY5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pO1xuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcwLVxuLS1cbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC04OC0jZWxzZVxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjg5OnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC05MC1cbi0tXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXG4tLVxua2VybmVsL3NpZ25hbC5jLTMwMzAtXHRcdFx0ICovXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcdFx0XHR2ZnNfY29yZWR1bXAoXHUwMDI2a3NpZy1cdTAwM2VpbmZvKTtcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVx0XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0MTM1CgkJCQkJCQlvdXRwdXQ6IDE4MAoJCQkJCQkJdGhvdWdodHM6IDU4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBDb3JlZHVtcCBGZWF0dXJlKioKCk9rYXksIHNvIGB2ZnNfY29yZWR1bXBgIOKAkyB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBmdXp6aW5nLCBpdCYjMzk7cyBjYWxsZWQgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgc28gd2UgaGF2ZSBhIGNsZWFyIHRyaWdnZXIuIExldCYjMzk7cyBzZWUgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBjb25maWdzIHJlbGF0ZWQgdG8gdGhpcyBhcmVhLiBJdCBsb29rcyBsaWtlIGBDT1JFRFVNUGAgaXMgdGhlIG9ubHkgb25lLiBIbW0sIGl0JiMzOTtzIGVuYWJsZWQgYnkgZGVmYXVsdCwgd2hpY2ggaXMgY29udmVuaWVudCwgYW5kIHRoaXMgaXMgdGhlIGNvbmZpZyB0aGF0IGVuYWJsZXMgdGhlIGZlYXR1cmUsIHNvIHllcywgd2Ugc2hvdWxkIGluY2x1ZGUgaXQuCgpOb3csIHdoZXJlIGVsc2UgYXJlIHRoZSBjaGFuZ2VzPyBUaGUgY2hhbmdlcyBhcmUgbWFpbmx5IGFyb3VuZCBmaWxlIGRlc2NyaXB0b3IgbWFuYWdlbWVudC4gSSYjMzk7bSBzZWVpbmcgYWRkaXRpb25zIGFuZCBtb2RpZmljYXRpb25zIGluIHNldmVyYWwgZmlsZXM6IGBmcy9maWxlX3RhYmxlLmNgICh3aXRoIGBmaWxwX2Nsb3NlYCBhbmQgYGZpbHBfY2xvc2Vfc3luY2ApLCBgZnMvb3Blbi5jYCAod2l0aCBgc3lzX2Nsb3NlYCB1c2luZyBgZmlscF9jbG9zZV9zeW5jYCksIGFuZCBgZnMvZmlsZS5jYCAod2l0aCBhIGJ1bmNoIG9mIG5ldyBmdW5jdGlvbnMgbGlrZSBgYWxsb2NfZmlsZXNgLCBgYWxsb2NfZmlsZXNfc3RydWN0YCwgYGR1cF9mZGAsIGBjbG9zZV9maWxlc2AsIGBzd2l0Y2hfZmlsZXNfc3RydWN0YCwgYGV4aXRfZmlsZXNgLCBhbmQgc3BlY2lmaWNhbGx5LCBgY29yZWR1bXBfY2xvc2VfZmlsZXNgLCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2ApLiBgZnMvY29yZWR1bXAuY2AgYWxzbyBoYXMgbmV3IGZ1bmN0aW9ucyBsaWtlIGBjb3JlZHVtcF93YWl0YCwgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAsIGFuZCBgZG9fY29yZWR1bXBgLiBGaW5hbGx5LCBga2VybmVsL2V4aXQuY2AgaGFzIGBjb3JlZHVtcF90YXNrX2V4aXRgLgoKWWVzLCB0aGlzIGlzIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudC4gVGhlIGNvcmVkdW1wIGZlYXR1cmUgaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJdCYjMzk7cyByZWFjaGFibGUgd2hlbiBhIHByb2Nlc3MgY3Jhc2hlcywgc3BlY2lmaWNhbGx5IGlmIHRoZSBjb3JlZHVtcCBwYXR0ZXJuIGlzIHNldCB0byBhIHBpcGUgb3Igc29ja2V0LiBUaGVuIHRoZSB1c2Vyc3BhY2UgaGFuZGxlciB3b3VsZCByZXBseSB3aXRoIGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AuIFRoaXMgc2hvdWxkIGJlIGVhc2lseSByZXByb2R1Y2libGUgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzLgoKU28sIGhlcmUmIzM5O3MgdGhlIHN1bW1hcnk6CgoqICAgKipXb3J0aEZ1enppbmcqKjogVHJ1ZQoqICAgKipGb2N1c1N5bWJvbHMqKjoKICAgICogICBgY29yZWR1bXBfY2xvc2VfZmlsZXNgCiAgICAqICAgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgCiAgICAqICAgYHZmc19jb3JlZHVtcGAKKiAgICoqRW5hYmxlQ29uZmlncyoqOgogICAgKiAgIGBDT1JFRFVNUGAKCkxldCYjMzk7cyBjaGVjayBgQ09SRURVTVBgIGZvciBkZXBlbmRlbmNpZXMuIEl0JiMzOTtzIGEgYm9vbGVhbiBvcHRpb24gY29udHJvbGxlZCBieSBgRVhQRVJUYC4gQnV0IGl0IGRvZXNuJiMzOTt0ICpkZXBlbmQqIG9uIGV4cGVydCBtb2RlLCBpdCBqdXN0ICpzaG93cyogdGhlIHByb21wdCBpbiBleHBlcnQgbW9kZS4gU28gYENPUkVEVU1QYCBpcyBmaW5lIGFzLWlzLgoKTG9va2luZyBiYWNrIGF0IHRoZSByZWFzb25pbmcuLi4gdGhlIHBhdGNoIGVzc2VudGlhbGx5IGFkZHMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXJzIHRvIGluc3RydWN0IHRoZSBrZXJuZWwgdG8gY2xvc2UgYWxsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGEgY3Jhc2hpbmcgdGFzayAqYmVmb3JlKiBkdW1waW5nIHRoZSBjb3JlLiBUaGlzIGludHJvZHVjZXMgbmV3IGxvZ2ljIGZvciBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuaXB1bGF0aW9uIGFuZCBjbG9zaW5nIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AuIFdlIGNhbiB0cmlnZ2VyIHRoaXMgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgaGFuZGxlciByZXR1cm4gdGhlIGZsYWcuCgpPa2F5LCBJJiMzOTttIHNhdGlzZmllZC4gVGltZSB0byBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI0IDE4OjA4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDT1JFRFVNUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2NvcmVkdW1wX2Nsb3NlX2ZpbGVzJiMzNDssCiAgICAmIzM0O2NvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7dmZzX2NvcmVkdW1wJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7Y29yZWR1bXBfY2xvc2VfZmlsZXMmIzM0OywKICAgICYjMzQ7Y29yZWR1bXBfdGFza19jbG9zZV9maWxlcyYjMzQ7LAogICAgJiMzNDt2ZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGVjOTM1OWUzODJlYTUuLmE2ZTdkYTBiYzE2YTcgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvY29yZWR1bXAuYwpAQCAtNTIzLDcgJiM0Mzs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpCiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7CiAKLQlpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtzdGFydHVwKTsKJiM0MzsJaW5pdF9jb21wbGV0aW9uKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSk7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLnRhc2sgPSB0c2s7CiAJY29yZV9zdGF0ZS0mZ3Q7ZHVtcGVyLm5leHQgPSBOVUxMOwogCkBAIC01MzEsNyAmIzQzOzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSkKIAlpZiAoY29yZV93YWl0ZXJzICZndDsgMCkgewogCQlzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjsKIAotCQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7c3RhcnR1cCwKJiM0MzsJCXdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lLAogCQkJCQkgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTsKIAkJLyoKIAkJICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdApAQCAtODM3LDcgJiM0Mzs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKgogCQkubWFzawkJCT0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwKIAkJCQkJICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHwKIAkJCQkJICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwKLQkJCQkJICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsCiYjNDM7CQkJCQkgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8CiYjNDM7CQkJCQkgIENPUkVEVU1QX0NMT1NFX0ZJTEVTLAogCQkuc2l6ZV9hY2sJCT0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLAogCQkubWVtb3J5X3R5cGVzCQk9IGNwcm0tJmd0O21lbW9yeV90eXBlcywKIAkJLm1lbW9yeV90eXBlc19tYXNrCT0gQ09SRURVTVBfTUVNT1JZX0FMTCwKQEAgLTkwNSw2ICYjNDM7OTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKJiM0MzsJLyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi8KJiM0MzsJaWYgKChhY2subWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAoYWNrLm1hc2sgJmFtcDsgQ09SRURVTVBfUkVKRUNUKSkgewomIzQzOwkJY29yZWR1bXBfc29ja19tYXJrKGNwcm0tJmd0O2ZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiAJaWYgKGFjay5tYXNrICZhbXA7IENPUkVEVU1QX01FTU9SWV9UWVBFUykgewogCQkvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqLwogCQlpZiAodXNpemUgJmx0OyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7CkBAIC0xMjI1LDYgJiM0MzsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLAogCWlmIChjcHJtLSZndDttYXNrICZhbXA7IENPUkVEVU1QX1JFSkVDVCkKIAkJcmV0dXJuOwogCiYjNDM7CWlmICgoY3BybS0mZ3Q7bWFzayAmYW1wOyBDT1JFRFVNUF9DTE9TRV9GSUxFUykgJmFtcDsmYW1wOyAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkgewomIzQzOwkJY29yZWR1bXBfcmVwb3J0X2ZhaWx1cmUoJiMzNDtGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmUmIzM0Oyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKIAkvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovCiAJLyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqLwogCWlmICh1bnNoYXJlX2ZpbGVzKCkpCmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2ZpbGUuYwpAQCAtMzc1LDIxICYjNDM7Mzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jCiAJcmV0dXJuIEFMSUdOKGxhc3QgJiM0MzsgMSwgQklUU19QRVJfTE9ORyk7CiB9CiAKLS8qCi0gKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpbgotICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpCi0gKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgotICovCi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKQomIzQzOy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApCiB7CiAJc3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjsKLQlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKLQl1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTsKLQlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpuZXdfZmR0OwogCi0JbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTsKJiM0MzsJbmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApOwogCWlmICghbmV3ZikKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiYjNDM7CQlyZXR1cm4gTlVMTDsKIAogCWF0b21pY19zZXQoJmFtcDtuZXdmLSZndDtjb3VudCwgMSk7CiAKQEAgLTQwNCw2ICYjNDM7Mzk4LDM5IEBAIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvCiAJbmV3X2ZkdC0mZ3Q7ZnVsbF9mZHNfYml0cyA9IG5ld2YtJmd0O2Z1bGxfZmRzX2JpdHNfaW5pdDsKIAluZXdfZmR0LSZndDtmZCA9ICZhbXA7bmV3Zi0mZ3Q7ZmRfYXJyYXlbMF07CiAKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qIEFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlLiAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7CiYjNDM7CiYjNDM7CW5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CiYjNDM7CWlmICghbmV3ZikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlyY3VfYXNzaWduX3BvaW50ZXIobmV3Zi0mZ3Q7ZmR0LCAmYW1wO25ld2YtJmd0O2ZkdGFiKTsKJiM0MzsJcmV0dXJuIG5ld2Y7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW4KJiM0MzsgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKCkKJiM0MzsgKiBvbiBmYWlsdXJlLiAgRm9yICYjMzk7cHVuY2hfaG9sZSYjMzk7IHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLgomIzQzOyAqLwomIzQzO3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmOwomIzQzOwlzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2ZkczsKJiM0MzsJdW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7CiYjNDM7CXN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDsKJiM0MzsKJiM0MzsJbmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIW5ld2YpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKJiM0MzsJbmV3X2ZkdCA9ICZhbXA7bmV3Zi0mZ3Q7ZmR0YWI7CiYjNDM7CiAJc3Bpbl9sb2NrKCZhbXA7b2xkZi0mZ3Q7ZmlsZV9sb2NrKTsKIAlvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTsKIAlvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7CkBAIC00ODAsNiAmIzQzOzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkgKi8KIAlzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy0mZ3Q7ZmR0KTsKIAl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CiYjNDM7CS8qCiYjNDM7CSAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWUKJiM0MzsJICogdW1vdW50IG11c3Qgbm90IHJ1biBfX2ZwdXQoKSBpdHNlbGYsIHNlZSBfX2ZwdXRfc3luYygpLgomIzQzOwkgKi8KJiM0MzsJYm9vbCBzeW5jID0gIShjdXJyZW50LSZndDtmbGFncyAmYW1wOyBQRl9LVEhSRUFEKTsKIAogCWZvciAoOzspIHsKIAkJdW5zaWduZWQgbG9uZyBzZXQ7CkBAIC00OTEsNyAmIzQzOzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcykKIAkJCWlmIChzZXQgJmFtcDsgMSkgewogCQkJCXN0cnVjdCBmaWxlICpmaWxlID0gZmR0LSZndDtmZFtpXTsKIAkJCQlpZiAoZmlsZSkgewotCQkJCQlmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTsKJiM0MzsJCQkJCWlmIChzeW5jKQomIzQzOwkJCQkJCWZpbHBfY2xvc2Vfc3luYyhmaWxlLCBmaWxlcyk7CiYjNDM7CQkJCQllbHNlCiYjNDM7CQkJCQkJZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7CiAJCQkJCWNvbmRfcmVzY2hlZCgpOwogCQkJCX0KIAkJCX0KQEAgLTUxNSwxNiAmIzQzOzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpCiAJfQogfQogCiYjNDM7LyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqLwomIzQzO3N0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiYjNDM7CQkJCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKQomIzQzO3sKJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkOwomIzQzOwomIzQzOwl0YXNrX2xvY2sodHNrKTsKJiM0MzsJb2xkID0gdHNrLSZndDtmaWxlczsKJiM0MzsJaWYgKG9sZCkgewomIzQzOwkJaWYgKGZpbGVzKQomIzQzOwkJCWF0b21pY19pbmMoJmFtcDtmaWxlcy0mZ3Q7Y291bnQpOwomIzQzOwkJdHNrLSZndDtmaWxlcyA9IGZpbGVzOwomIzQzOwl9CiYjNDM7CXRhc2tfdW5sb2NrKHRzayk7CiYjNDM7CWlmIChvbGQpCiYjNDM7CQlwdXRfZmlsZXNfc3RydWN0KG9sZCk7CiYjNDM7fQomIzQzOwogdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay0mZ3Q7ZmlsZXM7CiYjNDM7CWlmICghdHNrLSZndDtmaWxlcykKJiM0MzsJCXJldHVybjsKJiM0MzsJc3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB0aHJlYWQtZ3JvdXAgaXMgd2FpdGluZyBpbiBjb3JlZHVtcF90YXNrX2V4aXQoKS4gV2FrZSB0aGVtIGFuZAomIzQzOyAqIHRlbGwgdGhlbSB0byBnZXQgcmlkIG9mIHRoZWlyIGZpbGVzLgomIzQzOyAqLwomIzQzO2Jvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsJc3RydWN0IGNvcmVfdGhyZWFkICpjdDsKJiM0MzsJaW50IG5yID0gMDsKIAotCWlmIChmaWxlcykgewotCQl0YXNrX2xvY2sodHNrKTsKLQkJdHNrLSZndDtmaWxlcyA9IE5VTEw7Ci0JCXRhc2tfdW5sb2NrKHRzayk7Ci0JCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwomIzQzOwlmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpOwomIzQzOwlpZiAoIWZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBUYXNrcyB3aXRob3V0IGEgdGFibGUsIHZob3N0IHdvcmtlcnMgc2F5LCBzaXQgdGhlIHN3aXRjaCBvdXQuICovCiYjNDM7CWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQlpZiAoY3QtJmd0O3Rhc2stJmd0O2ZpbGVzKQomIzQzOwkJCW5yJiM0MzsmIzQzOzsKJiM0MzsJYXRvbWljX3NldCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMsIG5yKTsKJiM0MzsJcmVpbml0X2NvbXBsZXRpb24oJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsKJiM0MzsJZm9yIChjdCA9IGNvcmVfc3RhdGUtJmd0O2R1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC0mZ3Q7bmV4dCkgewomIzQzOwkJaWYgKCFjdC0mZ3Q7dGFzay0mZ3Q7ZmlsZXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQkvKiBQYWlycyB3aXRoIHRoZSBhY3F1aXJlIGluIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoKS4gKi8KJiM0MzsJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7Y3QtJmd0O2ZpbGVzLCBmaWxlcyk7CiYjNDM7CQl3YWtlX3VwX3Byb2Nlc3MoY3QtJmd0O3Rhc2spOwogCX0KJiM0MzsKJiM0MzsJLyogVGhlIGR1bXBlciYjMzk7cyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCYjMzk7cywgbm90IGl0cyBvd24uICovCiYjNDM7CXNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpCiYjNDM7CQlzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTsKJiM0MzsKJiM0MzsJaWYgKG5yKSB7CiYjNDM7CQl3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKCZhbXA7Y29yZV9zdGF0ZS0mZ3Q7ZG9uZSwKJiM0MzsJCQkJCSAgVEFTS19VTklOVEVSUlVQVElCTEV8VEFTS19GUkVFWkFCTEUpOwomIzQzOwkJLyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi8KJiM0MzsJCWZvciAoY3QgPSBjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtJmd0O25leHQpCiYjNDM7CQkJd2FpdF90YXNrX2luYWN0aXZlKGN0LSZndDt0YXNrLCBUQVNLX0FOWSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZQomIzQzOyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQmIzM5O3MgY29yZV90aHJlYWQgZW50cnkuCiYjNDM7ICovCiYjNDM7Ym9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlOwomIzQzOwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKJiM0MzsKJiM0MzsJLyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqLwomIzQzOwlmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoJmFtcDtzZWxmLSZndDtmaWxlcyk7CiYjNDM7CWlmICghZmlsZXMgfHwgIWN1cnJlbnQtJmd0O2ZpbGVzIHx8IGN1cnJlbnQtJmd0O2ZpbGVzID09IGZpbGVzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiYjNDM7CXN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpOwomIzQzOwljb3JlX3N0YXRlID0gY3VycmVudC0mZ3Q7c2lnbmFsLSZndDtjb3JlX3N0YXRlOwomIzQzOwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKJiM0MzsJcmV0dXJuIHRydWU7CiB9CiAKIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHsKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xMyw2ICYjNDM7MTMsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2ZzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZWxvY2suaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZG5vdGlmeS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2V2ZW50cG9sbC5oJmd0OwpAQCAtNjA2LDE1ICYjNDM7NjA3LDUzIEBAIHZvaWQgX19mcHV0X3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTsKIAogLyoKLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3QKLSAqIHJlZmVyZW5jZS4KLSAqCi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuCiYjNDM7ICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKJiM0MzsgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi4KICAqLwotdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbGUpCiYjNDM7c3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQogewotCWlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKCZhbXA7ZmlsZS0mZ3Q7Zl9yZWYpKSkKLQkJX19mcHV0KGZpbGUpOwomIzQzOwlpbnQgcmV0dmFsID0gMDsKJiM0MzsKJiM0MzsJaWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsCiYjNDM7CQkJJiMzNDtWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKSYjMzQ7LAomIzQzOwkJCWZpbHAtJmd0O2Zfb3ApKSB7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2gpCiYjNDM7CQlyZXR2YWwgPSBmaWxwLSZndDtmX29wLSZndDtmbHVzaChmaWxwLCBpZCk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkoIShmaWxwLSZndDtmX21vZGUgJmFtcDsgRk1PREVfUEFUSCkpKSB7CiYjNDM7CQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJZnB1dF9jbG9zZShmaWxwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldHZhbDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdAomIzQzOyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLgomIzQzOyAqLwomIzQzO2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0dmFsOwomIzQzOwomIzQzOwlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKJiM0MzsJaWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoJmFtcDtmaWxwLSZndDtmX3JlZikpKQomIzQzOwkJX19mcHV0KGZpbHApOwomIzQzOwomIzQzOwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMjcsNyAmIzQzOzEyNyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZmlsZV9hY2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiAJfQogfQogCi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTsKJiM0MztpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTsKIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTsKIAogLyoKQEAgLTE5MCw2ICYjNDM7MTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3MgewogCWludCBpbnRlbnQ7CiAJaW50IGxvb2t1cF9mbGFnczsKIH07CiYjNDM7CiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLAogCQljb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW5fcm9vdChjb25zdCBzdHJ1Y3QgcGF0aCAqLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9vcGVuLmMKQEAgLTE0NTMsNDEgJiM0MzsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSkKIH0KICNlbmRpZgogCi0vKgotICogJiMzNDtpZCYjMzQ7IGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLgotICovCi1zdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCwKLQkJCSYjMzQ7VkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcykmIzM0OywKLQkJCWZpbHAtJmd0O2Zfb3ApKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChmaWxwLSZndDtmX29wLSZndDtmbHVzaCkKLQkJcmV0dmFsID0gZmlscC0mZ3Q7Zl9vcC0mZ3Q7Zmx1c2goZmlscCwgaWQpOwotCi0JaWYgKGxpa2VseSghKGZpbHAtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9QQVRIKSkpIHsKLQkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7Ci0JCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWludCBmaWxwX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQotewotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTsKLQlmcHV0X2Nsb3NlKGZpbHApOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7Ci0KIC8qCiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlCiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4mIzM5O3QgcmVsZWFzZQpAQCAtMTUwMiwxMyAmIzQzOzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKQogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAotCXJldHZhbCA9IGZpbHBfZmx1c2goZmlsZSwgY3VycmVudC0mZ3Q7ZmlsZXMpOwotCiAJLyoKIAkgKiBXZSYjMzk7cmUgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuIERvbiYjMzk7dCBib3RoZXIKIAkgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy4KIAkgKi8KLQlmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7CiYjNDM7CXJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LSZndDtmaWxlcyk7CiAKIAlpZiAobGlrZWx5KHJldHZhbCA9PSAwKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaCBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oCkBAIC05OSwxMSAmIzQzOzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKIAomIzQzO3N0cnVjdCBjb3JlX3RocmVhZDsKJiM0MzsKIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7CiYjNDM7Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTsKJiM0Mztib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTsKIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpOwogc3RydWN0IGZkX3JhbmdlIHsKIAl1bnNpZ25lZCBpbnQgZnJvbSwgdG87CiB9OwomIzQzOwogc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7CiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTsKIGludCBpdGVyYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgdW5zaWduZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTc2LDEyICYjNDM7NzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHsKIHN0cnVjdCBjb3JlX3RocmVhZCB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDsKJiM0MzsJLyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi8KJiM0MzsJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CiB9OwogCiBzdHJ1Y3QgY29yZV9zdGF0ZSB7CiAJYXRvbWljX3QgbnJfdGhyZWFkczsKIAlzdHJ1Y3QgY29yZV90aHJlYWQgZHVtcGVyOwotCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7CiYjNDM7CS8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqLwomIzQzOwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTE5LDYgJiM0MzsxOSw5IEBACiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stJmd0O21lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTAomIzQzOyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aAomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUCiAgKi8KIGVudW0gewogCUNPUkVEVU1QX0tFUk5FTAkJPSAoMVVMTCAmbHQ7Jmx0OyAwKSwKQEAgLTI4LDYgJiM0MzszMSw3IEBAIGVudW0gewogCUNPUkVEVU1QX1JFQ09SRFMJPSAoMVVMTCAmbHQ7Jmx0OyA0KSwKIAlDT1JFRFVNUF9TUEFSU0UJCT0gKDFVTEwgJmx0OyZsdDsgNSksCiAJQ09SRURVTVBfTUVNT1JZX1RZUEVTCT0gKDFVTEwgJmx0OyZsdDsgNiksCiYjNDM7CUNPUkVEVU1QX0NMT1NFX0ZJTEVTCT0gKDFVTEwgJmx0OyZsdDsgNyksCiB9OwogCiAvKioKQEAgLTEzNyw2ICYjNDM7MTQxLDEwIEBAIGVudW0gewogICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24mIzM5O3QKICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mCiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLgomIzQzOyAqCiYjNDM7ICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlCiYjNDM7ICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuCiYjNDM7ICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuCiAgKi8KIHN0cnVjdCBjb3JlZHVtcF9hY2sgewogCV9fdTMyIHNpemU7CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9leGl0LmMKQEAgLTI1LDYgJiM0MzsyNSw3IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvYWNjdC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L3RzYWNjdF9rZXJuLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZmlsZS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mZHRhYmxlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JpbmZtdHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9uc3Byb3h5LmgmZ3Q7CkBAIC00MzIsNiAmIzQzOzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAlzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjsKIAogCXNlbGYudGFzayA9IHRzazsKJiM0MzsJc2VsZi5maWxlcyA9IE5VTEw7CiAJaWYgKHNlbGYudGFzay0mZ3Q7ZmxhZ3MgJmFtcDsgUEZfU0lHTkFMRUQpCiAJCXNlbGYubmV4dCA9IHhjaGcoJmFtcDtjb3JlX3N0YXRlLSZndDtkdW1wZXIubmV4dCwgJmFtcDtzZWxmKTsKIAllbHNlCkBAIC00NDEsMTIgJiM0Mzs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCSAqIHRvIGNvcmVfc3RhdGUtJmd0O2R1bXBlci4KIAkgKi8KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYW1wO2NvcmVfc3RhdGUtJmd0O25yX3RocmVhZHMpKQotCQljb21wbGV0ZSgmYW1wO2NvcmVfc3RhdGUtJmd0O3N0YXJ0dXApOwomIzQzOwkJY29tcGxldGUoJmFtcDtjb3JlX3N0YXRlLSZndDtkb25lKTsKIAogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTsKIAkJaWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqLwogCQkJYnJlYWs7CiYjNDM7CQkvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqLwomIzQzOwkJaWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoJmFtcDtzZWxmKSkKJiM0MzsJCQljb250aW51ZTsKIAkJc2NoZWR1bGUoKTsKIAl9CiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAppbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NAotLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaApAQCAtMTksNiAmIzQzOzE5LDkgQEAKICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpbgogICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay0mZ3Q7bWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMCiYjNDM7ICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoCiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1QKICAqLwogZW51bSB7CiAJQ09SRURVTVBfS0VSTkVMCQk9ICgxVUxMICZsdDsmbHQ7IDApLApAQCAtMjgsNiAmIzQzOzMxLDcgQEAgZW51bSB7CiAJQ09SRURVTVBfUkVDT1JEUwk9ICgxVUxMICZsdDsmbHQ7IDQpLAogCUNPUkVEVU1QX1NQQVJTRQkJPSAoMVVMTCAmbHQ7Jmx0OyA1KSwKIAlDT1JFRFVNUF9NRU1PUllfVFlQRVMJPSAoMVVMTCAmbHQ7Jmx0OyA2KSwKJiM0MzsJQ09SRURVTVBfQ0xPU0VfRklMRVMJPSAoMVVMTCAmbHQ7Jmx0OyA3KSwKIH07CiAKIC8qKgpAQCAtMTM3LDYgJiM0MzsxNDEsMTAgQEAgZW51bSB7CiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbiYjMzk7dAogICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2YKICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuCiYjNDM7ICoKJiM0MzsgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGUKJiM0MzsgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC4KJiM0MzsgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS4KICAqLwogc3RydWN0IGNvcmVkdW1wX2FjayB7CiAJX191MzIgc2l6ZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUKQEAgLTMsNyAmIzQzOzMsOCBAQCBDRkxBR1MgJiM0Mzs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpCiAKIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFwKIAkJICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcCi0JCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QKJiM0MzsJCSAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXAomIzQzOwkJICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0CiBURVNUX0ZJTEVTIDo9IHN0YWNrZHVtcAogCiBpbmNsdWRlIC4uL2xpYi5tawpAQCAtMTEsMyAmIzQzOzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWsKICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKJiM0MzskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jCkBAIC0wLDAgJiM0MzsxLDU5MiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJmx0O2RpcmVudC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtwdGhyZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9maWxlLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zb2NrZXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjb3JlZHVtcF90ZXN0LmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgTE9DS19GSUxFICYjMzQ7L3RtcC9jb3JlZHVtcC5sb2NrJiMzNDsKJiM0MzsKJiM0MzsvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi8KJiM0MzsjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDQKJiM0MzsKJiM0MzsvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi8KJiM0MztlbnVtIGxvY2tfa2luZCB7CiYjNDM7CUxPQ0tfS0lORF9QT1NJWCwKJiM0MzsJTE9DS19LSU5EX09GRCwKJiM0MzsJTE9DS19LSU5EX0ZMT0NLLAomIzQzO307CiYjNDM7CiYjNDM7LyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovCiYjNDM7ZW51bSBsb2NrX3NoYXJlIHsKJiM0MzsJTE9DS19TSEFSRV9OT05FLAomIzQzOwlMT0NLX1NIQVJFX0RVUCwJCS8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJiMzOTtzIG93biB0YWJsZSAqLwomIzQzOwlMT0NLX1NIQVJFX0ZPUkssCS8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi8KJiM0MzsJTE9DS19TSEFSRV9GSUxFUywJLyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi8KJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjbG9zZV90ZXN0IHsKJiM0MzsJZW51bSBsb2NrX2tpbmQga2luZDsKJiM0MzsJZW51bSBsb2NrX3NoYXJlIHNoYXJlOwomIzQzOwlib29sIHRocmVhZHM7CiYjNDM7CWJvb2wgY2xvc2U7CQkvKiBhY2sgd2l0aCBDT1JFRFVNUF9DTE9TRV9GSUxFUyAqLwomIzQzOwlib29sIHVzZXJzcGFjZTsJCS8qIENPUkVEVU1QX1VTRVJTUEFDRSBpbnN0ZWFkIG9mIENPUkVEVU1QX0tFUk5FTCAqLwomIzQzOwlib29sIHJlbGVhc2VkOwkJLyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi8KJiM0Mzt9OwomIzQzOwomIzQzO0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApCiYjNDM7ewomIzQzOwlGSUxFICpmaWxlOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIOwomIzQzOwlzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCA9IC0xOwomIzQzOwlmaWxlID0gZm9wZW4oJiMzNDsvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVybiYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CUFTU0VSVF9ORShOVUxMLCBmaWxlKTsKJiM0MzsKJiM0MzsJcmV0ID0gZnJlYWQoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi0mZ3Q7b3JpZ2luYWxfY29yZV9wYXR0ZXJuKSwgZmlsZSk7CiYjNDM7CUFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTsKJiM0MzsJQVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtJmd0O29yaWdpbmFsX2NvcmVfcGF0dGVybikpOwomIzQzOwomIzQzOwlzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgPSBjcmVhdGVfZGV0YWNoZWRfdG1wZnMoKTsKJiM0MzsJQVNTRVJUX0dFKHNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkLCAwKTsKJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlBU1NFUlRfRVEoMCwgcmV0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7RklYVFVSRV9URUFSRE9XTihjb3JlZHVtcCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGNoYXIgKnJlYXNvbjsKJiM0MzsJRklMRSAqZmlsZTsKJiM0MzsJaW50IHJldCwgc3RhdHVzOwomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwoc2VsZi0mZ3Q7cGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7CiYjNDM7CQl3YWl0cGlkKHNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJfQomIzQzOwl1bmxpbmsoTE9DS19GSUxFKTsKJiM0MzsJdW5saW5rKCYjMzQ7L3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0Oyk7CiYjNDM7CiYjNDM7CWZpbGUgPSBmb3BlbigmIzM0Oy9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuJiMzNDssICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmaWxlKSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVybiYjMzQ7OwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGZwcmludGYoZmlsZSwgJiMzNDslcyYjMzQ7LCBzZWxmLSZndDtvcmlnaW5hbF9jb3JlX3BhdHRlcm4pOwomIzQzOwlpZiAocmV0ICZsdDsgMCkgewomIzQzOwkJcmVhc29uID0gJiMzNDtVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuJiMzNDs7CiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gZmNsb3NlKGZpbGUpOwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm4mIzM0OzsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQgJmd0Oz0gMCkgewomIzQzOwkJcmV0ID0gY2xvc2Uoc2VsZi0mZ3Q7ZmRfdG1wZnNfZGV0YWNoZWQpOwomIzQzOwkJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCQlyZWFzb24gPSAmIzM0O1VuYWJsZSB0byBjbG9zZSBkZXRhY2hlZCB0bXBmcyYjMzQ7OwomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCX0KJiM0MzsJCXNlbGYtJmd0O2ZkX3RtcGZzX2RldGFjaGVkID0gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuOwomIzQzO2ZhaWw6CiYjNDM7CS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwomIzQzOwlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xuJiMzNDssIHJlYXNvbik7CiYjNDM7fQomIzQzOwomIzQzOy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi8KJiM0MztzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlzd2l0Y2ggKGtpbmQpIHsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfUE9TSVg6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfU0VUTEssICZhbXA7ZmwpOwomIzQzOwljYXNlIExPQ0tfS0lORF9PRkQ6CiYjNDM7CQlyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCAmYW1wO2ZsKTsKJiM0MzsJY2FzZSBMT0NLX0tJTkRfRkxPQ0s6CiYjNDM7CQlyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi8KJiM0MztzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmxvY2sgZmwgPSB7CiYjNDM7CQkubF90eXBlID0gRl9XUkxDSywKJiM0MzsJCS5sX3doZW5jZSA9IFNFRUtfU0VULAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHsKJiM0MzsJCWlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHsKJiM0MzsJCQlmbG9jayhmZCwgTE9DS19VTik7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CQlyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovCiYjNDM7CWlmIChmY250bChmZCwgRl9HRVRMSywgJmFtcDtmbCkgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7CiYjNDM7fQomIzQzOwomIzQzOy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi8KJiM0MztzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpCiYjNDM7ewomIzQzOwljaGFyIHBhdGhbNjRdOwomIzQzOwlzdHJ1Y3QgZGlyZW50ICpkZTsKJiM0MzsJRElSICpkaXI7CiYjNDM7CWludCBuciA9IDA7CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgJiMzNDsvcHJvYy8lZC9mZCYjMzQ7LCBwaWQpOwomIzQzOwlkaXIgPSBvcGVuZGlyKHBhdGgpOwomIzQzOwlpZiAoIWRpcikKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJKmZpcnN0ID0gLTE7CiYjNDM7CXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7CiYjNDM7CQlpbnQgZmQ7CiYjNDM7CiYjNDM7CQlpZiAoZGUtJmd0O2RfbmFtZVswXSA9PSAmIzM5Oy4mIzM5OykKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZkID0gYXRvaShkZS0mZ3Q7ZF9uYW1lKTsKJiM0MzsJCWlmICgqZmlyc3QgJmx0OyAwIHx8IGZkICZsdDsgKmZpcnN0KQomIzQzOwkJCSpmaXJzdCA9IGZkOwomIzQzOwkJbnImIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWNsb3NlZGlyKGRpcik7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmQKJiM0MzsgKiBvcGVuLCB0aGVuIHJlcG9ydCB0aHJvdWdoIEBmZF9yZXN1bHQgd2hldGhlciBAZmQgaXMgc3RpbGwgb3Blbi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwljaGFyIGM7CiYjNDM7CiYjNDM7CXJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsICZhbXA7YywgMSk7CiYjNDM7CWMgPSBmY250bChmZCwgRl9HRVRGRCkgJmx0OyAwID8gJiMzOTtDJiMzOTsgOiAmIzM5O08mIzM5OzsKJiM0MzsJd3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgJmFtcDtjLCAxKTsKJiM0MzsJX2V4aXQoRVhJVF9TVUNDRVNTKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi8KJiM0MztzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLAomIzQzOwkJCQkgIGludCBmZF9yZXN1bHQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgZmQsIHBpZGZkLCBpOwomIzQzOwlwaWRfdCBwaWQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwomIzQzOwlpZiAodGFrZV9sb2NrKGZkLCB0LSZndDtraW5kKSkKJiM0MzsJCV9leGl0KEVYSVRfRkFJTFVSRSk7CiYjNDM7CiYjNDM7CXN3aXRjaCAodC0mZ3Q7c2hhcmUpIHsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX05PTkU6CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBMT0NLX1NIQVJFX0RVUDoKJiM0MzsJCWlmIChkdXAoZmQpICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GT1JLOgomIzQzOwkJcGlkID0gZm9yaygpOwomIzQzOwkJaWYgKHBpZCAmbHQ7IDApCiYjNDM7CQkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKJiM0MzsJCWlmIChwaWQgPT0gMCkKJiM0MzsJCQlob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpOwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgTE9DS19TSEFSRV9GSUxFUzoKJiM0MzsJCXBpZCA9IGNyZWF0ZV9jaGlsZCgmYW1wO3BpZGZkLCBDTE9ORV9GSUxFUyk7CiYjNDM7CQlpZiAocGlkICZsdDsgMCkKJiM0MzsJCQlfZXhpdChFWElUX0ZBSUxVUkUpOwomIzQzOwkJaWYgKHBpZCA9PSAwKQomIzQzOwkJCWhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7CiYjNDM7CQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAodC0mZ3Q7dGhyZWFkcykKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSYjNDM7JiM0MzspCiYjNDM7CQkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBvbiBwdXJwb3NlICovCiYjNDM7CSoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZQomIzQzOyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlCiYjNDM7ICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcAomIzQzOyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvcgomIzQzOyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgY29yZWR1bXBfcmVxIHJlcSA9IHt9OwomIzQzOwlzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307CiYjNDM7CWludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7CiYjNDM7CWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CWludCBmZCwgZmlyc3RfZmQsIG5yX2ZkczsKJiM0MzsJX191NjQgbWFzazsKJiM0MzsJc3NpemVfdCBieXRlczsKJiM0MzsJY2hhciBjOwomIzQzOwomIzQzOwlmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiYjNDM7CWlmIChmZF9sb2NrICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwlpZiAoZmRfc2VydmVyICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgJiMzNDsxJiMzNDssIDEpICZsdDsgMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwljbG9zZShmZF9pcGMpOwomIzQzOwomIzQzOwlmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpOwomIzQzOwlpZiAoZmRfY29yZWR1bXAgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogYWNjZXB0NCBmYWlsZWQ6ICVtXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTsKJiM0MzsJaWYgKGZkX3BlZXJfcGlkZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCAmYW1wO2luZm8pKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFyZWFkX2NvcmVkdW1wX3JlcShmZF9jb3JlZHVtcCwgJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcmVhZF9jb3JlZHVtcF9yZXEgZmFpbGVkXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFjaGVja19jb3JlZHVtcF9yZXEoJmFtcDtyZXEpKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi8KJiM0MzsJaWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LSZndDtraW5kKSAhPSAxKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgJmFtcDtmaXJzdF9mZCk7CiYjNDM7CWlmIChucl9mZHMgJmx0Oz0gMCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApOwomIzQzOwlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBoYW5kc2hha2UgZmFpbGVkOiAlbVxuJiMzNDssIF9fZnVuY19fKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbWFzayA9IENPUkVEVU1QX1dBSVQ7CiYjNDM7CW1hc2sgfD0gdC0mZ3Q7dXNlcnNwYWNlID8gQ09SRURVTVBfVVNFUlNQQUNFIDogQ09SRURVTVBfS0VSTkVMOwomIzQzOwlpZiAodC0mZ3Q7Y2xvc2UpCiYjNDM7CQltYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTOwomIzQzOwomIzQzOwlpZiAoIXNlbmRfY29yZWR1bXBfYWNrKGZkX2NvcmVkdW1wLCAmYW1wO3JlcSwgbWFzaywgMCkpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBzZW5kX2NvcmVkdW1wX2FjayBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCAmYW1wO2MsIDEpOwomIzQzOwlpZiAoYnl0ZXMgIT0gKHQtJmd0O3VzZXJzcGFjZSA/IDAgOiAxKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXG4mIzM0OywgX19mdW5jX18sIGJ5dGVzKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC0mZ3Q7a2luZCkgIT0gIXQtJmd0O3JlbGVhc2VkKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXG4mIzM0OywKJiM0MzsJCQlfX2Z1bmNfXywgdC0mZ3Q7cmVsZWFzZWQgPyAmIzM0O3N0aWxsIGhlbGQmIzM0OyA6ICYjMzQ7cmVsZWFzZWQmIzM0Oyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsICZhbXA7Zmlyc3RfZmQpOwomIzQzOwlpZiAobnJfZmRzICZsdDsgMCB8fCAhbnJfZmRzICE9IHQtJmd0O2Nsb3NlKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxuJiMzNDssCiYjNDM7CQkJX19mdW5jX18sIG5yX2Zkcyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7CiYjNDM7CWlmICh0LSZndDtjbG9zZSkgewomIzQzOwkJaWYgKGZkICZndDs9IDAgfHwgZXJybm8gIT0gRUJBREYpIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDslczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fLCBmZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoZmQgJmx0OyAwKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxuJiMzNDssCiYjNDM7CQkJCV9fZnVuY19fKTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqLwomIzQzOwlpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsICZhbXA7aW5mbykpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoaW5mby5tYXNrICZhbXA7IFBJREZEX0lORk9fRVhJVCkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlmb3IgKDs7KSB7CiYjNDM7CQljaGFyIGJ1ZmZlcls0MDk2XTsKJiM0MzsKJiM0MzsJCWJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwomIzQzOwkJaWYgKGJ5dGVzICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoYnl0ZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsJfQomIzQzOwomIzQzOwlleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7CiYjNDM7b3V0OgomIzQzOwlpZiAoZmRfbG9jayAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UoZmRfbG9jayk7CiYjNDM7CWlmIChmZF9wZWVyX3BpZGZkICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9wZWVyX3BpZGZkKTsKJiM0MzsJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQljbG9zZShmZF9jb3JlZHVtcCk7CiYjNDM7CWlmIChmZF9zZXJ2ZXIgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CXJldHVybiBleGl0X2NvZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHJ1bl9jbG9zZV90ZXN0KHN0cnVjdCBfX3Rlc3RfbWV0YWRhdGEgKmNvbnN0IF9tZXRhZGF0YSwKJiM0MzsJCQkgICBGSVhUVVJFX0RBVEEoY29yZWR1bXApICpzZWxmLAomIzQzOwkJCSAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KQomIzQzO3sKJiM0MzsJaW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdOwomIzQzOwlwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0BAL3RtcC9jb3JlZHVtcC5zb2NrZXQmIzM0OykpOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7CiYjNDM7CUFTU0VSVF9HRShmZCwgMCk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShmZCksIDApOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApOwomIzQzOwlpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CQlfZXhpdChjbG9zZV9zZXJ2ZXIodCwgaXBjX3NvY2tldHNbMV0pKTsKJiM0MzsJfQomIzQzOwlzZWxmLSZndDtwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7CiYjNDM7CUFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CUVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApOwomIzQzOwomIzQzOwkvKiBPbmx5IHRoZSBjcmFzaGluZyBjaGlsZCBhbmQgd2hhdCBpdCBzcGF3bnMgc2VlIHRoZXNlIHBpcGVzLiAqLwomIzQzOwlBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTsKJiM0MzsKJiM0MzsJcGlkID0gZm9yaygpOwomIzQzOwlBU1NFUlRfR0UocGlkLCAwKTsKJiM0MzsJaWYgKHBpZCA9PSAwKSB7CiYjNDM7CQljbG9zZShyZWxlYXNlX3BpcGVbMV0pOwomIzQzOwkJY2xvc2UocmVzdWx0X3BpcGVbMF0pOwomIzQzOwkJY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpOwomIzQzOwomIzQzOwkvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovCiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMV0pLCAwKTsKJiM0MzsKJiM0MzsJLyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqLwomIzQzOwlpZiAodC0mZ3Q7c2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtJmd0O3NoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHsKJiM0MzsJCUFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgJmFtcDtjLCAxKSwgMSk7CiYjNDM7CQlBU1NFUlRfRVEoYywgJiMzOTtPJiMzOTspOwomIzQzOwl9CiYjNDM7CUVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX1BPU0lYLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLnRocmVhZHMgPSB0cnVlLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfT0ZELAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IHRydWUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9GTE9DSywKJiM0MzsJCS5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSwKJiM0MzsJCS50aHJlYWRzID0gdHJ1ZSwKJiM0MzsJCS5jbG9zZSA9IHRydWUsCiYjNDM7CQkucmVsZWFzZWQgPSB0cnVlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZHVwKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9EVVAsCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2ZvcmspCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmRfZm9yaykKJiM0Mzt7CiYjNDM7CWNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7CiYjNDM7CQkua2luZCA9IExPQ0tfS0lORF9PRkQsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssCiYjNDM7CQkuY2xvc2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gZmFsc2UsCiYjNDM7CX07CiYjNDM7CiYjNDM7CXJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgJmFtcDt0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9zaGFyZWRfdGFibGUpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfUE9TSVgsCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfdXNlcnNwYWNlKQomIzQzO3sKJiM0MzsJY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHsKJiM0MzsJCS5raW5kID0gTE9DS19LSU5EX0ZMT0NLLAomIzQzOwkJLnNoYXJlID0gTE9DS19TSEFSRV9OT05FLAomIzQzOwkJLmNsb3NlID0gdHJ1ZSwKJiM0MzsJCS51c2Vyc3BhY2UgPSB0cnVlLAomIzQzOwkJLnJlbGVhc2VkID0gdHJ1ZSwKJiM0MzsJfTsKJiM0MzsKJiM0MzsJcnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCAmYW1wO3QpOwomIzQzO30KJiM0MzsKJiM0MztURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpCiYjNDM7ewomIzQzOwljb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0gewomIzQzOwkJLmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssCiYjNDM7CQkuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsCiYjNDM7CQkudGhyZWFkcyA9IHRydWUsCiYjNDM7CQkuY2xvc2UgPSBmYWxzZSwKJiM0MzsJCS5yZWxlYXNlZCA9IGZhbHNlLAomIzQzOwl9OwomIzQzOwomIzQzOwlydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsICZhbXA7dCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1RfSEFSTkVTU19NQUlOCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYwppbmRleCBmNWM5YmFkODc1NDYzLi5iZWIxNjc2OThjZmRiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMKQEAgLTIzNzcsNiAmIzQzOzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpCiAJY2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTsKIH0KIAomIzQzOy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovCiYjNDM7VEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9jbG9zZV9maWxlc19yZWplY3QpCiYjNDM7ewomIzQzOwljaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2VydmVyIGJ1aWx0IHdpdGggdGhlIGZpcnN0IHN0cnVjdHMgcmVhZHMgdGhlIHJlcXVlc3QgaXQga25vd3MsCiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCmluZGV4IDRlMzZlM2U0ZmI3OGYuLjY1MTMyYTBkZWNlZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jCkBAIC0xNjEyLDcgJiM0MzsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSwKICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTEwJCQkJCVwKIAkoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHwJCQlcCiAJIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfAkJCVwKLQkgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUykKJiM0MzsJIENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMgfCBcCiYjNDM7CSBDT1JFRFVNUF9DTE9TRV9GSUxFUykKIAogYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKQogewo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjQgMTg6MDg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU0OTAKCQkJCQkJCW91dHB1dDogMTc4CgkJCQkJCQl0aG91Z2h0czogNTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZpbGUgRGVzY3JpcHRvciBDbG9zdXJlIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBmZWF0dXJlIHRvIHRoZSBjb3JlZHVtcCBtZWNoYW5pc206IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AuIFdoZW4gc2V0IGluIHRoZSBhY2tub3dsZWRnZW1lbnQgbWFzaywgdGhlIGtlcm5lbCB3aWxsIGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjcmFzaGluZyB0YXNrICpiZWZvcmUqIGR1bXBpbmcgdGhlIGNvcmUuIFNtYXJ0LiBFc3NlbnRpYWxseSwgaXQmIzM5O3Mgc3dhcHBpbmcgb3V0IHRoZSBleGlzdGluZyBmaWxlIGRlc2NyaXB0b3IgdGFibGUgZm9yIGFuIGVtcHR5IG9uZS4gVGhpcyBpcyBpbnRlcmVzdGluZy4gTGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMuCgpJIHNlZSBpdCYjMzk7cyB0b3VjaGluZyBzZXZlcmFsIGZpbGVzLiBJbiBgZnMvY29yZWR1bXAuY2AsIHRoZSBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCBmdW5jdGlvbiBub3cgY2hlY2tzIGZvciB0aGUgbmV3IGZsYWcsIGFuZCBgZG9fY29yZWR1bXBgIGNhbGxzIGEgbmV3IGZ1bmN0aW9uLCBgY29yZWR1bXBfY2xvc2VfZmlsZXMoKWAuCgpgZnMvZmlsZS5jYCBoYXMgc2VlbiB0aGUgYnVsayBvZiB0aGUgY2hhbmdlcy4gV2UgaGF2ZSBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbGxvY2F0aW5nIHRoZSBuZXcgZW1wdHkgdGFibGUsIGBjbG9zZV9maWxlc2AgYmVpbmcgbW9kaWZpZWQgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHdpdGggYGZpbHBfY2xvc2Vfc3luY2AgZm9yIG5vbi1rZXJuZWwgdGhyZWFkcywgYSBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgdG8gZG8gdGhlIGFjdHVhbCBzd2FwLCBhbmQgdGhlIGtleSBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggYWxsIHRocmVhZHMgaW4gdGhlIGNvcmVkdW1wIHN0YXRlIGFuZCBvcmNoZXN0cmF0ZXMgdGhlIGNsb3N1cmUsIGFsb25nIHdpdGggYSBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgdGhhdCBoYW5kbGVzIGNsZWFudXAgZHVyaW5nIHRocmVhZCBleGl0LgoKVGhleSYjMzk7dmUgYWRkZWQgYGZpbHBfY2xvc2Vfc3luY2AgaW4gYGZzL2ZpbGVfdGFibGUuY2AsIHdoaWNoIGlzIHRoZSBpbW1lZGlhdGUsIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgYGZpbHBfY2xvc2VgLiBUaGF0IG1ha2VzIHNlbnNlOyB3ZSBkb24mIzM5O3Qgd2FudCB0byBkZWZlciBmaWxlIHJlbGVhc2UgaW4gdGhpcyBzY2VuYXJpby4KCkZpbmFsbHksIGBrZXJuZWwvZXhpdC5jYCBub3cgY2FsbHMgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgIGR1cmluZyB0aGUgZXhpdCBwcm9jZXNzLCB3YWl0aW5nIGZvciB0aGUgY29yZWR1bXAgdG8gY29tcGxldGUuCgpOb3csIHRoZSBpbXBvcnRhbnQgcXVlc3Rpb246IGFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGhlcmU/IExldCYjMzk7cyBzZWUuLi4gdGhlIGBhbGxvY19maWxlc19zdHJ1Y3RgIHVzZXMgYEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPYCwgc28gaXQmIzM5O3MgaW5pdGlhbGl6ZWQgdG8gemVyby4gVGhlIGBjb3JlZHVtcF9hY2tgIHN0cnVjdCBpbiBgdWFwaS9saW51eC9jb3JlZHVtcC5oYCBoYXNuJiMzOTt0IGNoYW5nZWQgc2l6ZSwgb25seSB0aGUgZW51bSBmb3IgdGhlIGZsYWdzLiBTbywgbm8gbmV3IHVzZXItc3BhY2UgZXhwb3N1cmUgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIEZyb20gdGhlIGNvZGUsIGl0JiMzOTtzIGFsbCBhYm91dCBmaWxlIGRlc2NyaXB0b3IgdGFibGUgcG9pbnRlcnMsIHN3aXRjaGluZywgYW5kIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycy4gTm90aGluZyBjb21wbGljYXRlZCBpcyBhbGxvY2F0ZWQgdGhhdCBJIGNhbiBzZWUsIGFuZCBub3RoaW5nIG5ldyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gSXQgc2VlbXMgd2VsbCBpc29sYXRlZC4KCkJhc2VkIG9uIHRoaXMsIEkgZG9uJiMzOTt0IHNlZSBhbnkgaW1tZWRpYXRlIHJlYXNvbiB0byBzdXNwZWN0IHRoYXQgS01TQU4gaXMgbmVlZGVkIGhlcmUuIFRoaXMgbW9zdGx5IGRlYWxzIHdpdGggcG9pbnRlcnMgYW5kIGZpbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIEtBU0FOJiMzOTtzIGFuYWx5c2lzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gYW5kIG90aGVycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGxpa2UgdXNlLWFmdGVyLWZyZWUsIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgYnVncyB0aGF0IG1pZ2h0IHNuZWFrIGluIGR1cmluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIG1hbmlwdWxhdGlvbnMuIFRoaXMgbG9va3MgcHJldHR5IHNvbGlkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNCAxODowODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE3OjU3OjA2LjQ5NTE0NTk1NloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxMDExNjA3MjI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDT1JFRFVNUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImNvcmVkdW1wX2Nsb3NlX2ZpbGVzXCIsXG4gICAgXCJjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzXCIsXG4gICAgXCJ2ZnNfY29yZWR1bXBcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFdoZW4gYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXF1ZXN0cyB0aGlzIGZsYWcsIHRoZSBrZXJuZWwgY2xvc2VzIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlZHVtcC4gVGhpcyBpbnZvbHZlcyBuZXcgY29yZSBrZXJuZWwgbG9naWMgaW4gYGZzL2ZpbGUuY2AgYW5kIGBmcy9jb3JlZHVtcC5jYCB0byBoYW5kbGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIHN3aXRjaGluZyBhbmQgY2xvc2luZy4gVGhlIGZlYXR1cmUgaXMgcmVhY2hhYmxlIGJ5IGNyYXNoaW5nIGEgcHJvY2VzcyBhbmQgaGF2aW5nIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVwbHkgd2l0aCB0aGUgbmV3IGZsYWcsIG1ha2luZyBpdCBmdW5jdGlvbmFsbHkgaW1wYWN0ZnVsIGFuZCB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxNzo1NzowNi40OTUxNTA1MjZaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0OTkwNTM5MzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwOTU3ZDAwMGI0NWVhNDY5Y2YyMzRlN2NhZDRjNTcwNTFlYzU0NzE2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gQXVnIDI0IDE3OjU3OjA0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXFxuaW5kZXggZWM5MzU5ZTM4MmVhNS4uYTZlN2RhMGJjMTZhNyAxMDA2NDRcXG4tLS0gYS9mcy9jb3JlZHVtcC5jXFxuKysrIGIvZnMvY29yZWR1bXAuY1xcbkBAIC01MjMsNyArNTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7XFxuIFxcdGludCBjb3JlX3dhaXRlcnMgPSAtRUJVU1k7XFxuIFxcbi1cXHRpbml0X2NvbXBsZXRpb24oXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZXN0YXJ0dXApO1xcbitcXHRpbml0X2NvbXBsZXRpb24oXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZWRvbmUpO1xcbiBcXHRjb3JlX3N0YXRlLVxcdTAwM2VkdW1wZXIudGFzayA9IHRzaztcXG4gXFx0Y29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQgPSBOVUxMO1xcbiBcXG5AQCAtNTMxLDcgKzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSlcXG4gXFx0aWYgKGNvcmVfd2FpdGVycyBcXHUwMDNlIDApIHtcXG4gXFx0XFx0c3RydWN0IGNvcmVfdGhyZWFkICpwdHI7XFxuIFxcbi1cXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2VzdGFydHVwLFxcbitcXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vkb25lLFxcbiBcXHRcXHRcXHRcXHRcXHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdFxcbkBAIC04MzcsNyArODM3LDggQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcXG4gXFx0XFx0Lm1hc2tcXHRcXHRcXHQ9IENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XFxuIFxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XFxuIFxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8XFxuLVxcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTLFxcbitcXHRcXHRcXHRcXHRcXHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8XFxuK1xcdFxcdFxcdFxcdFxcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXFxuIFxcdFxcdC5zaXplX2Fja1xcdFxcdD0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLFxcbiBcXHRcXHQubWVtb3J5X3R5cGVzXFx0XFx0PSBjcHJtLVxcdTAwM2VtZW1vcnlfdHlwZXMsXFxuIFxcdFxcdC5tZW1vcnlfdHlwZXNfbWFza1xcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcXG5AQCAtOTA1LDYgKzkwNiwxMiBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcdH1cXG4gXFxuK1xcdC8qIEEgcmVqZWN0ZWQgdGFzayBleGl0cyByaWdodCBhd2F5IGFuZCBjbG9zZXMgZXZlcnl0aGluZyBhbnl3YXkuICovXFxuK1xcdGlmICgoYWNrLm1hc2sgXFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXFx1MDAyNlxcdTAwMjYgKGFjay5tYXNrIFxcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xcbitcXHRcXHRjb3JlZHVtcF9zb2NrX21hcmsoY3BybS1cXHUwMDNlZmlsZSwgQ09SRURVTVBfTUFSS19DT05GTElDVElORyk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4gXFx0aWYgKGFjay5tYXNrIFxcdTAwMjYgQ09SRURVTVBfTUVNT1JZX1RZUEVTKSB7XFxuIFxcdFxcdC8qIFRoZSBtZW1vcnkgdHlwZXMgbmVlZCB0aGUgd2hvbGUgZmllbGQuICovXFxuIFxcdFxcdGlmICh1c2l6ZSBcXHUwMDNjIENPUkVEVU1QX0FDS19TSVpFX1ZFUjEpIHtcXG5AQCAtMTIyNSw2ICsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbiBcXHRpZiAoY3BybS1cXHUwMDNlbWFzayBcXHUwMDI2IENPUkVEVU1QX1JFSkVDVClcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4rXFx0aWYgKChjcHJtLVxcdTAwM2VtYXNrIFxcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFxcdTAwMjZcXHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XFxuK1xcdFxcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFxcXCJGYWlsZWQgdG8gY2xvc2UgZmlsZXMsIGFib3J0aW5nIGNvcmVcXFwiKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHQvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovXFxuIFxcdC8qIFRoZSBjZWxsIHNwdWZzIGNvcmVkdW1wIGNvZGUgcmVhZHMgdGhlIGZpbGUgZGVzY3JpcHRvciB0YWJsZXMgKi9cXG4gXFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcXG5kaWZmIC0tZ2l0IGEvZnMvZmlsZS5jIGIvZnMvZmlsZS5jXFxuaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDRcXG4tLS0gYS9mcy9maWxlLmNcXG4rKysgYi9mcy9maWxlLmNcXG5AQCAtMzc1LDIxICszNzUsMTUgQEAgc3RhdGljIHVuc2lnbmVkIGludCBzYW5lX2ZkdGFibGVfc2l6ZShzdHJ1Y3QgZmR0YWJsZSAqZmR0LCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNcXG4gXFx0cmV0dXJuIEFMSUdOKGxhc3QgKyAxLCBCSVRTX1BFUl9MT05HKTtcXG4gfVxcbiBcXG4tLypcXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cXG4tICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXFxuLSAqIG9uIGZhaWx1cmUuICBGb3IgJ3B1bmNoX2hvbGUnIHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxcbi0gKi9cXG4tc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcXG4rLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXFxuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXFxuIHtcXG4gXFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcXG4tXFx0c3RydWN0IGZpbGUgKipvbGRfZmRzLCAqKm5ld19mZHM7XFxuLVxcdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xcbi1cXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XFxuK1xcdHN0cnVjdCBmZHRhYmxlICpuZXdfZmR0O1xcbiBcXG4tXFx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKTtcXG4rXFx0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApO1xcbiBcXHRpZiAoIW5ld2YpXFxuLVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFxuIFxcdGF0b21pY19zZXQoXFx1MDAyNm5ld2YtXFx1MDAzZWNvdW50LCAxKTtcXG4gXFxuQEAgLTQwNCw2ICszOTgsMzkgQEAgc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9cXG4gXFx0bmV3X2ZkdC1cXHUwMDNlZnVsbF9mZHNfYml0cyA9IG5ld2YtXFx1MDAzZWZ1bGxfZmRzX2JpdHNfaW5pdDtcXG4gXFx0bmV3X2ZkdC1cXHUwMDNlZmQgPSBcXHUwMDI2bmV3Zi1cXHUwMDNlZmRfYXJyYXlbMF07XFxuIFxcbitcXHRyZXR1cm4gbmV3ZjtcXG4rfVxcbitcXG4rLyogQW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UuICovXFxuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmO1xcbitcXG4rXFx0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTtcXG4rXFx0aWYgKCFuZXdmKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXdmLVxcdTAwM2VmZHQsIFxcdTAwMjZuZXdmLVxcdTAwM2VmZHRhYik7XFxuK1xcdHJldHVybiBuZXdmO1xcbit9XFxuK1xcbisvKlxcbisgKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpblxcbisgKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcXG4rICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXFxuKyAqL1xcbitzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxcbit7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XFxuK1xcdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xcbitcXHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcXG4rXFx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xcbitcXG4rXFx0bmV3ZiA9IGFsbG9jX2ZpbGVzKEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIW5ld2YpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbitcXHRuZXdfZmR0ID0gXFx1MDAyNm5ld2YtXFx1MDAzZWZkdGFiO1xcbitcXG4gXFx0c3Bpbl9sb2NrKFxcdTAwMjZvbGRmLVxcdTAwM2VmaWxlX2xvY2spO1xcbiBcXHRvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTtcXG4gXFx0b3Blbl9maWxlcyA9IHNhbmVfZmR0YWJsZV9zaXplKG9sZF9mZHQsIHB1bmNoX2hvbGUpO1xcbkBAIC00ODAsNiArNTA3LDExIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxcbiBcXHQgKi9cXG4gXFx0c3RydWN0IGZkdGFibGUgKmZkdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoZmlsZXMtXFx1MDAzZWZkdCk7XFxuIFxcdHVuc2lnbmVkIGludCBpLCBqID0gMDtcXG4rXFx0LypcXG4rXFx0ICogQSBrZXJuZWwgdGhyZWFkIHRoYXQgbWlnaHQgYmUgbmVlZGVkIHRvIG1ha2UgcHJvZ3Jlc3Mgb24gc29tZVxcbitcXHQgKiB1bW91bnQgbXVzdCBub3QgcnVuIF9fZnB1dCgpIGl0c2VsZiwgc2VlIF9fZnB1dF9zeW5jKCkuXFxuK1xcdCAqL1xcbitcXHRib29sIHN5bmMgPSAhKGN1cnJlbnQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgUEZfS1RIUkVBRCk7XFxuIFxcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHVuc2lnbmVkIGxvbmcgc2V0O1xcbkBAIC00OTEsNyArNTIzLDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxcbiBcXHRcXHRcXHRpZiAoc2V0IFxcdTAwMjYgMSkge1xcbiBcXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZkdC1cXHUwMDNlZmRbaV07XFxuIFxcdFxcdFxcdFxcdGlmIChmaWxlKSB7XFxuLVxcdFxcdFxcdFxcdFxcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xcbitcXHRcXHRcXHRcXHRcXHRpZiAoc3luYylcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcXG4rXFx0XFx0XFx0XFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRcXHRcXHRcXHRmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTtcXG4gXFx0XFx0XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0fVxcbkBAIC01MTUsMTYgKzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLyogSGFuZCBAdHNrIHRoZSB0YWJsZSBAZmlsZXMsIG9yIG5vbmUsIGFuZCBkcm9wIHRoZSBvbmUgaXQgaGFkLiAqL1xcbitzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcylcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGQ7XFxuK1xcbitcXHR0YXNrX2xvY2sodHNrKTtcXG4rXFx0b2xkID0gdHNrLVxcdTAwM2VmaWxlcztcXG4rXFx0aWYgKG9sZCkge1xcbitcXHRcXHRpZiAoZmlsZXMpXFxuK1xcdFxcdFxcdGF0b21pY19pbmMoXFx1MDAyNmZpbGVzLVxcdTAwM2Vjb3VudCk7XFxuK1xcdFxcdHRzay1cXHUwMDNlZmlsZXMgPSBmaWxlcztcXG4rXFx0fVxcbitcXHR0YXNrX3VubG9jayh0c2spO1xcbitcXHRpZiAob2xkKVxcbitcXHRcXHRwdXRfZmlsZXNfc3RydWN0KG9sZCk7XFxuK31cXG4rXFxuIHZvaWQgZXhpdF9maWxlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4ge1xcbi1cXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMgPSB0c2stXFx1MDAzZWZpbGVzO1xcbitcXHRpZiAoIXRzay1cXHUwMDNlZmlsZXMpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0c3dpdGNoX2ZpbGVzX3N0cnVjdCh0c2ssIE5VTEwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBUaGUgdGhyZWFkLWdyb3VwIGlzIHdhaXRpbmcgaW4gY29yZWR1bXBfdGFza19leGl0KCkuIFdha2UgdGhlbSBhbmRcXG4rICogdGVsbCB0aGVtIHRvIGdldCByaWQgb2YgdGhlaXIgZmlsZXMuXFxuKyAqL1xcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUgPSBjdXJyZW50LVxcdTAwM2VzaWduYWwtXFx1MDAzZWNvcmVfc3RhdGU7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xcbitcXHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xcbitcXHRpbnQgbnIgPSAwO1xcbiBcXG4tXFx0aWYgKGZpbGVzKSB7XFxuLVxcdFxcdHRhc2tfbG9jayh0c2spO1xcbi1cXHRcXHR0c2stXFx1MDAzZWZpbGVzID0gTlVMTDtcXG4tXFx0XFx0dGFza191bmxvY2sodHNrKTtcXG4tXFx0XFx0cHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7XFxuK1xcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XFxuK1xcdGlmICghZmlsZXMpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdC8qIFRhc2tzIHdpdGhvdXQgYSB0YWJsZSwgdmhvc3Qgd29ya2VycyBzYXksIHNpdCB0aGUgc3dpdGNoIG91dC4gKi9cXG4rXFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cXHUwMDNlbmV4dClcXG4rXFx0XFx0aWYgKGN0LVxcdTAwM2V0YXNrLVxcdTAwM2VmaWxlcylcXG4rXFx0XFx0XFx0bnIrKztcXG4rXFx0YXRvbWljX3NldChcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xcbitcXHRyZWluaXRfY29tcGxldGlvbihcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZG9uZSk7XFxuK1xcbitcXHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVxcdTAwM2VuZXh0KSB7XFxuK1xcdFxcdGlmICghY3QtXFx1MDAzZXRhc2stXFx1MDAzZWZpbGVzKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXFxuK1xcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZjdC1cXHUwMDNlZmlsZXMsIGZpbGVzKTtcXG4rXFx0XFx0d2FrZV91cF9wcm9jZXNzKGN0LVxcdTAwM2V0YXNrKTtcXG4gXFx0fVxcbitcXG4rXFx0LyogVGhlIGR1bXBlcidzIHN1YmplY3RpdmUgY3JlZHMgYXJlIHRoZSBkdW1wJ3MsIG5vdCBpdHMgb3duLiAqL1xcbitcXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxcbitcXHRcXHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcXG4rXFxuK1xcdGlmIChucikge1xcbitcXHRcXHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vkb25lLFxcbitcXHRcXHRcXHRcXHRcXHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcXG4rXFx0XFx0LyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi9cXG4rXFx0XFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cXHUwMDNlbmV4dClcXG4rXFx0XFx0XFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVxcdTAwM2V0YXNrLCBUQVNLX0FOWSk7XFxuK1xcdH1cXG4rXFxuK1xcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLypcXG4rICogR2V0IHJpZCBvZiB0aGUgZmlsZXMgYW5kIHN3aXRjaCB0byB0aGUgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlXFxuKyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQncyBjb3JlX3RocmVhZCBlbnRyeS5cXG4rICovXFxuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuK3tcXG4rXFx0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7XFxuK1xcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xcbitcXG4rXFx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xcbitcXHRmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnNlbGYtXFx1MDAzZWZpbGVzKTtcXG4rXFx0aWYgKCFmaWxlcyB8fCAhY3VycmVudC1cXHUwMDNlZmlsZXMgfHwgY3VycmVudC1cXHUwMDNlZmlsZXMgPT0gZmlsZXMpXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcXG4rXFx0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XFxuK1xcdGNvcmVfc3RhdGUgPSBjdXJyZW50LVxcdTAwM2VzaWduYWwtXFx1MDAzZWNvcmVfc3RhdGU7XFxuK1xcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vucl90aHJlYWRzKSlcXG4rXFx0XFx0Y29tcGxldGUoXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZWRvbmUpO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4gfVxcbiBcXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xcbmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmNcXG5pbmRleCBjNjhiOGMwYTQwOTdhLi4zYzcwNTkxNzY0NmI1IDEwMDY0NFxcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xcbisrKyBiL2ZzL2ZpbGVfdGFibGUuY1xcbkBAIC0xMyw2ICsxMyw3IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9maWxlbG9jay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvZG5vdGlmeS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvc2VjdXJpdHkuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyZWQuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2V2ZW50cG9sbC5oXFx1MDAzZVxcbkBAIC02MDYsMTUgKzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxcbiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTtcXG4gXFxuIC8qXFxuLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3RcXG4tICogcmVmZXJlbmNlLlxcbi0gKlxcbi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXFxuKyAqIFxcXCJpZFxcXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxcbisgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cXG4gICovXFxuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxcbitzdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXFxuIHtcXG4tXFx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXFx1MDAyNmZpbGUtXFx1MDAzZWZfcmVmKSkpXFxuLVxcdFxcdF9fZnB1dChmaWxlKTtcXG4rXFx0aW50IHJldHZhbCA9IDA7XFxuK1xcbitcXHRpZiAoQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKGZpbGVfY291bnQoZmlscCkgPT0gMCwgZmlscCxcXG4rXFx0XFx0XFx0XFxcIlZGUzogQ2xvc2U6IGZpbGUgY291bnQgaXMgMCAoZl9vcD0lcHMpXFxcIixcXG4rXFx0XFx0XFx0ZmlscC1cXHUwMDNlZl9vcCkpIHtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChmaWxwLVxcdTAwM2VmX29wLVxcdTAwM2VmbHVzaClcXG4rXFx0XFx0cmV0dmFsID0gZmlscC1cXHUwMDNlZl9vcC1cXHUwMDNlZmx1c2goZmlscCwgaWQpO1xcbitcXG4rXFx0aWYgKGxpa2VseSghKGZpbHAtXFx1MDAzZWZfbW9kZSBcXHUwMDI2IEZNT0RFX1BBVEgpKSkge1xcbitcXHRcXHRkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTtcXG4rXFx0XFx0bG9ja3NfcmVtb3ZlX3Bvc2l4KGZpbHAsIGlkKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gcmV0dmFsO1xcbit9XFxuK1xcbitpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcXG4re1xcbitcXHRpbnQgcmV0dmFsO1xcbitcXG4rXFx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XFxuK1xcdGZwdXRfY2xvc2UoZmlscCk7XFxuK1xcbitcXHRyZXR1cm4gcmV0dmFsO1xcbit9XFxuK0VYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XFxuK1xcbisvKlxcbisgKiBMaWtlIGZpbHBfY2xvc2UoKSBidXQgd2l0aG91dCBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgdGhlIGxhc3RcXG4rICogcmVmZXJlbmNlLCBzZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXFxuKyAqL1xcbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbit7XFxuK1xcdGludCByZXR2YWw7XFxuK1xcbitcXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTtcXG4rXFx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXFx1MDAyNmZpbHAtXFx1MDAzZWZfcmVmKSkpXFxuK1xcdFxcdF9fZnB1dChmaWxwKTtcXG4rXFxuK1xcdHJldHVybiByZXR2YWw7XFxuIH1cXG4gXFxuIC8qXFxuZGlmZiAtLWdpdCBhL2ZzL2ludGVybmFsLmggYi9mcy9pbnRlcm5hbC5oXFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcXG4tLS0gYS9mcy9pbnRlcm5hbC5oXFxuKysrIGIvZnMvaW50ZXJuYWwuaFxcbkBAIC0xMjcsNyArMTI3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4gXFx0fVxcbiB9XFxuIFxcbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTtcXG4raW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XFxuIHZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTtcXG4gXFxuIC8qXFxuQEAgLTE5MCw2ICsxOTAsNyBAQCBzdHJ1Y3Qgb3Blbl9mbGFncyB7XFxuIFxcdGludCBpbnRlbnQ7XFxuIFxcdGludCBsb29rdXBfZmxhZ3M7XFxuIH07XFxuK1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLFxcbiBcXHRcXHRjb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApO1xcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3Blbl9yb290KGNvbnN0IHN0cnVjdCBwYXRoICosXFxuZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uY1xcbmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0XFxuLS0tIGEvZnMvb3Blbi5jXFxuKysrIGIvZnMvb3Blbi5jXFxuQEAgLTE0NTMsNDEgKzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxcbiB9XFxuICNlbmRpZlxcbiBcXG4tLypcXG4tICogXFxcImlkXFxcIiBpcyB0aGUgUE9TSVggdGhyZWFkIElELiBXZSB1c2UgdGhlXFxuLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxcbi0gKi9cXG4tc3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbi17XFxuLVxcdGludCByZXR2YWwgPSAwO1xcbi1cXG4tXFx0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXFxuLVxcdFxcdFxcdFxcXCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVxcXCIsXFxuLVxcdFxcdFxcdGZpbHAtXFx1MDAzZWZfb3ApKSB7XFxuLVxcdFxcdHJldHVybiAwO1xcbi1cXHR9XFxuLVxcbi1cXHRpZiAoZmlscC1cXHUwMDNlZl9vcC1cXHUwMDNlZmx1c2gpXFxuLVxcdFxcdHJldHZhbCA9IGZpbHAtXFx1MDAzZWZfb3AtXFx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcXG4tXFxuLVxcdGlmIChsaWtlbHkoIShmaWxwLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcXG4tXFx0XFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XFxuLVxcdFxcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XFxuLVxcdH1cXG4tXFx0cmV0dXJuIHJldHZhbDtcXG4tfVxcbi1cXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXFxuLXtcXG4tXFx0aW50IHJldHZhbDtcXG4tXFxuLVxcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xcbi1cXHRmcHV0X2Nsb3NlKGZpbHApO1xcbi1cXG4tXFx0cmV0dXJuIHJldHZhbDtcXG4tfVxcbi1FWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpO1xcbi1cXG4gLypcXG4gICogQ2FyZWZ1bCBoZXJlISBXZSB0ZXN0IHdoZXRoZXIgdGhlIGZpbGUgcG9pbnRlciBpcyBOVUxMIGJlZm9yZVxcbiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4ndCByZWxlYXNlXFxuQEAgLTE1MDIsMTMgKzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxcbiBcXHRpZiAoIWZpbGUpXFxuIFxcdFxcdHJldHVybiAtRUJBREY7XFxuIFxcbi1cXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXFx1MDAzZWZpbGVzKTtcXG4tXFxuIFxcdC8qXFxuIFxcdCAqIFdlJ3JlIHJldHVybmluZyB0byB1c2VyIHNwYWNlLiBEb24ndCBib3RoZXJcXG4gXFx0ICogd2l0aCBhbnkgZGVsYXllZCBmcHV0KCkgY2FzZXMuXFxuIFxcdCAqL1xcbi1cXHRmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7XFxuK1xcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVxcdTAwM2VmaWxlcyk7XFxuIFxcbiBcXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcXG4gXFx0XFx0cmV0dXJuIDA7XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcXG5pbmRleCBjNDUzMDZhOWYwMDcyLi5mMGMxMDAzZGE4Y2U4IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcXG5AQCAtOTksMTEgKzk5LDE2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBjbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgY29uc3Qgc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsXFxuIFxcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XFxuIFxcbitzdHJ1Y3QgY29yZV90aHJlYWQ7XFxuK1xcbiB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZnMpO1xcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xcbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTtcXG4gaW50IHVuc2hhcmVfZmlsZXModm9pZCk7XFxuIHN0cnVjdCBmZF9yYW5nZSB7XFxuIFxcdHVuc2lnbmVkIGludCBmcm9tLCB0bztcXG4gfTtcXG4rXFxuIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHN0cnVjdCBmZF9yYW5nZSAqKSBfX2xhdGVudF9lbnRyb3B5O1xcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcXG4gaW50IGl0ZXJhdGVfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCB1bnNpZ25lZCxcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXFxuQEAgLTc2LDEyICs3NiwxNSBAQCBzdHJ1Y3QgbXVsdGlwcm9jZXNzX3NpZ25hbHMge1xcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xcbiBcXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCAqbmV4dDtcXG4rXFx0LyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi9cXG4rXFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XFxuIH07XFxuIFxcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XFxuIFxcdGF0b21pY190IG5yX3RocmVhZHM7XFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCBkdW1wZXI7XFxuLVxcdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XFxuK1xcdC8qIENvbXBsZXRlZCBieSB0aGUgbGFzdCB0aHJlYWQgdG8gcGFyaywgcmV1c2VkIGZvciB0aGUgdGFibGUgc3dpdGNoLiAqL1xcbitcXHRzdHJ1Y3QgY29tcGxldGlvbiBkb25lO1xcbiB9O1xcbiBcXG4gLypcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcXG4rKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbkBAIC0xOSw2ICsxOSw5IEBAXFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXBfYWNrLVxcdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxcbisgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcXG4rICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXFxuICAqL1xcbiBlbnVtIHtcXG4gXFx0Q09SRURVTVBfS0VSTkVMXFx0XFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyAwKSxcXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcXG4gXFx0Q09SRURVTVBfUkVDT1JEU1xcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNCksXFxuIFxcdENPUkVEVU1QX1NQQVJTRVxcdFxcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNSksXFxuIFxcdENPUkVEVU1QX01FTU9SWV9UWVBFU1xcdD0gKDFVTEwgXFx1MDAzY1xcdTAwM2MgNiksXFxuK1xcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA3KSxcXG4gfTtcXG4gXFxuIC8qKlxcbkBAIC0xMzcsNiArMTQxLDEwIEBAIGVudW0ge1xcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbid0XFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXFxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXFxuKyAqXFxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxcbisgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cXG4rICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXFxuICAqL1xcbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcXG4gXFx0X191MzIgc2l6ZTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmNcXG5pbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9leGl0LmNcXG4rKysgYi9rZXJuZWwvZXhpdC5jXFxuQEAgLTI1LDYgKzI1LDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2FjY3QuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3RzYWNjdF9rZXJuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9maWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mZHRhYmxlLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcmVlemVyLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9iaW5mbXRzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9uc3Byb3h5LmhcXHUwMDNlXFxuQEAgLTQzMiw2ICs0MzMsNyBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuIFxcdHN0cnVjdCBjb3JlX3RocmVhZCBzZWxmO1xcbiBcXG4gXFx0c2VsZi50YXNrID0gdHNrO1xcbitcXHRzZWxmLmZpbGVzID0gTlVMTDtcXG4gXFx0aWYgKHNlbGYudGFzay1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9TSUdOQUxFRClcXG4gXFx0XFx0c2VsZi5uZXh0ID0geGNoZyhcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZHVtcGVyLm5leHQsIFxcdTAwMjZzZWxmKTtcXG4gXFx0ZWxzZVxcbkBAIC00NDEsMTIgKzQ0MywxNSBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuIFxcdCAqIHRvIGNvcmVfc3RhdGUtXFx1MDAzZWR1bXBlci5cXG4gXFx0ICovXFxuIFxcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFxcdTAwMjZjb3JlX3N0YXRlLVxcdTAwM2Vucl90aHJlYWRzKSlcXG4tXFx0XFx0Y29tcGxldGUoXFx1MDAyNmNvcmVfc3RhdGUtXFx1MDAzZXN0YXJ0dXApO1xcbitcXHRcXHRjb21wbGV0ZShcXHUwMDI2Y29yZV9zdGF0ZS1cXHUwMDNlZG9uZSk7XFxuIFxcbiBcXHRmb3IgKDs7KSB7XFxuIFxcdFxcdHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSURMRXxUQVNLX0ZSRUVaQUJMRSk7XFxuIFxcdFxcdGlmICghc2VsZi50YXNrKSAvKiBzZWUgY29yZWR1bXBfZmluaXNoKCkgKi9cXG4gXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdC8qIHNlZSBjb3JlZHVtcF9jbG9zZV9maWxlcygpICovXFxuK1xcdFxcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFxcdTAwMjZzZWxmKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuIFxcdFxcdHNjaGVkdWxlKCk7XFxuIFxcdH1cXG4gXFx0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xcbmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcXG4tLS0gYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxcbisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXFxuQEAgLTE5LDYgKzE5LDkgQEBcXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXFxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXFx1MDAzZW1lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzXFxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcXG4rICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcXG4gICovXFxuIGVudW0ge1xcbiBcXHRDT1JFRFVNUF9LRVJORUxcXHRcXHQ9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIDApLFxcbkBAIC0yOCw2ICszMSw3IEBAIGVudW0ge1xcbiBcXHRDT1JFRFVNUF9SRUNPUkRTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA0KSxcXG4gXFx0Q09SRURVTVBfU1BBUlNFXFx0XFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA1KSxcXG4gXFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXFx0PSAoMVVMTCBcXHUwMDNjXFx1MDAzYyA2KSxcXG4rXFx0Q09SRURVTVBfQ0xPU0VfRklMRVNcXHQ9ICgxVUxMIFxcdTAwM2NcXHUwMDNjIDcpLFxcbiB9O1xcbiBcXG4gLyoqXFxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XFxuICAqIE5vdGUgdGhhdCBAbWVtb3J5X3R5cGVzIG11c3QgYmUgemVybyBpZiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgaXNuJ3RcXG4gICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2ZcXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cXG4rICpcXG4rICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXFxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxcbisgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cXG4gICovXFxuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xcbiBcXHRfX3UzMiBzaXplO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXFxuQEAgLTMsNyArMyw4IEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxcbiBcXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbiBcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF90ZXN0IFxcXFxcXG4tXFx0XFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxcbitcXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG4rXFx0XFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XFxuIFRFU1RfRklMRVMgOj0gc3RhY2tkdW1wXFxuIFxcbiBpbmNsdWRlIC4uL2xpYi5ta1xcbkBAIC0xMSwzICsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXFxuICQoT1VUUFVUKS9zdGFja2R1bXBfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuKyQoT1VUUFVUKS9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdhNDE5MDZiNDY5NTJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXFxuQEAgLTAsMCArMSw1OTIgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NkaXJlbnQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NwdGhyZWFkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3N0YXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zb2NrZXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImNvcmVkdW1wX3Rlc3QuaFxcXCJcXG4rXFxuKyNkZWZpbmUgTE9DS19GSUxFIFxcXCIvdG1wL2NvcmVkdW1wLmxvY2tcXFwiXFxuK1xcbisvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi9cXG4rI2RlZmluZSBOVU1fQ0xPU0VfVEhSRUFEUyA0XFxuK1xcbisvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi9cXG4rZW51bSBsb2NrX2tpbmQge1xcbitcXHRMT0NLX0tJTkRfUE9TSVgsXFxuK1xcdExPQ0tfS0lORF9PRkQsXFxuK1xcdExPQ0tfS0lORF9GTE9DSyxcXG4rfTtcXG4rXFxuKy8qIFdobyBlbHNlIGhhcyBhIGhhbmRsZSBvbiB0aGUgbG9jayB3aGVuIHRoZSBjaGlsZCBjcmFzaGVzLiAqL1xcbitlbnVtIGxvY2tfc2hhcmUge1xcbitcXHRMT0NLX1NIQVJFX05PTkUsXFxuK1xcdExPQ0tfU0hBUkVfRFVQLFxcdFxcdC8qIGEgc2Vjb25kIHNsb3QgaW4gdGhlIGNoaWxkJ3Mgb3duIHRhYmxlICovXFxuK1xcdExPQ0tfU0hBUkVfRk9SSyxcXHQvKiBhIGZvcmtlZCBwcm9jZXNzIGtlZXBzIHRoZSBmZCBvcGVuICovXFxuK1xcdExPQ0tfU0hBUkVfRklMRVMsXFx0LyogYSBDTE9ORV9GSUxFUyBwcm9jZXNzIHNoYXJlcyB0aGUgdGFibGUgKi9cXG4rfTtcXG4rXFxuK3N0cnVjdCBjbG9zZV90ZXN0IHtcXG4rXFx0ZW51bSBsb2NrX2tpbmQga2luZDtcXG4rXFx0ZW51bSBsb2NrX3NoYXJlIHNoYXJlO1xcbitcXHRib29sIHRocmVhZHM7XFxuK1xcdGJvb2wgY2xvc2U7XFx0XFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cXG4rXFx0Ym9vbCB1c2Vyc3BhY2U7XFx0XFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXFxuK1xcdGJvb2wgcmVsZWFzZWQ7XFx0XFx0LyogdGhlIGxvY2sgaXMgZ29uZSBvbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGUgY2xvc2UgKi9cXG4rfTtcXG4rXFxuK0ZJWFRVUkVfU0VUVVAoY29yZWR1bXApXFxuK3tcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSAtRVNSQ0g7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gLTE7XFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwiclxcXCIpO1xcbitcXHRBU1NFUlRfTkUoTlVMTCwgZmlsZSk7XFxuK1xcbitcXHRyZXQgPSBmcmVhZChzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsIHNpemVvZihzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcXG4rXFx0QVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpO1xcbitcXHRBU1NFUlRfTFQocmV0LCBzaXplb2Yoc2VsZi1cXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XFxuK1xcbitcXHRzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICdcXFxcMCc7XFxuK1xcdHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gY3JlYXRlX2RldGFjaGVkX3RtcGZzKCk7XFxuK1xcdEFTU0VSVF9HRShzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XFxuK1xcbitcXHRyZXQgPSBmY2xvc2UoZmlsZSk7XFxuK1xcdEFTU0VSVF9FUSgwLCByZXQpO1xcbit9XFxuK1xcbitGSVhUVVJFX1RFQVJET1dOKGNvcmVkdW1wKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnJlYXNvbjtcXG4rXFx0RklMRSAqZmlsZTtcXG4rXFx0aW50IHJldCwgc3RhdHVzO1xcbitcXG4rXFx0aWYgKHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XFxuK1xcdFxcdHdhaXRwaWQoc2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdH1cXG4rXFx0dW5saW5rKExPQ0tfRklMRSk7XFxuK1xcdHVubGluayhcXFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcXFwiKTtcXG4rXFxuK1xcdGZpbGUgPSBmb3BlbihcXFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cXFwiLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZpbGUpIHtcXG4rXFx0XFx0cmVhc29uID0gXFxcIlVuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVyblxcXCI7XFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gZnByaW50ZihmaWxlLCBcXFwiJXNcXFwiLCBzZWxmLVxcdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbitcXHRcXHRyZWFzb24gPSBcXFwiVW5hYmxlIHRvIHdyaXRlIHRvIGNvcmVfcGF0dGVyblxcXCI7XFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gZmNsb3NlKGZpbGUpO1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXFxcIjtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoc2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRyZXQgPSBjbG9zZShzZWxmLVxcdTAwM2VmZF90bXBmc19kZXRhY2hlZCk7XFxuK1xcdFxcdGlmIChyZXQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdHJlYXNvbiA9IFxcXCJVbmFibGUgdG8gY2xvc2UgZGV0YWNoZWQgdG1wZnNcXFwiO1xcbitcXHRcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0c2VsZi1cXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuO1xcbitmYWlsOlxcbitcXHQvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi9cXG4rXFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcXFxuXFxcIiwgcmVhc29uKTtcXG4rfVxcbitcXG4rLyogV3JpdGUtbG9jayBAZmQgdGhlIHdheSBAa2luZCBzYXlzLiAqL1xcbitzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXFxuK3tcXG4rXFx0c3RydWN0IGZsb2NrIGZsID0ge1xcbitcXHRcXHQubF90eXBlID0gRl9XUkxDSyxcXG4rXFx0XFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXFxuK1xcdH07XFxuK1xcbitcXHRzd2l0Y2ggKGtpbmQpIHtcXG4rXFx0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XFxuK1xcdFxcdHJldHVybiBmY250bChmZCwgRl9TRVRMSywgXFx1MDAyNmZsKTtcXG4rXFx0Y2FzZSBMT0NLX0tJTkRfT0ZEOlxcbitcXHRcXHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcXHUwMDI2ZmwpO1xcbitcXHRjYXNlIExPQ0tfS0lORF9GTE9DSzpcXG4rXFx0XFx0cmV0dXJuIGZsb2NrKGZkLCBMT0NLX0VYKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbisvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xcbitzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXFxuK3tcXG4rXFx0c3RydWN0IGZsb2NrIGZsID0ge1xcbitcXHRcXHQubF90eXBlID0gRl9XUkxDSyxcXG4rXFx0XFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXFxuK1xcdH07XFxuK1xcbitcXHRpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHtcXG4rXFx0XFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xcbitcXHRcXHRcXHRmbG9jayhmZCwgTE9DS19VTik7XFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJldHVybiBlcnJubyA9PSBFV09VTERCTE9DSyA/IDEgOiAtMTtcXG4rXFx0fVxcbitcXG4rXFx0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXFxuK1xcdGlmIChmY250bChmZCwgRl9HRVRMSywgXFx1MDAyNmZsKSBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xcbit9XFxuK1xcbisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXFxuK3N0YXRpYyBpbnQgY291bnRfZmRzKHBpZF90IHBpZCwgaW50ICpmaXJzdClcXG4re1xcbitcXHRjaGFyIHBhdGhbNjRdO1xcbitcXHRzdHJ1Y3QgZGlyZW50ICpkZTtcXG4rXFx0RElSICpkaXI7XFxuK1xcdGludCBuciA9IDA7XFxuK1xcbitcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIvcHJvYy8lZC9mZFxcXCIsIHBpZCk7XFxuK1xcdGRpciA9IG9wZW5kaXIocGF0aCk7XFxuK1xcdGlmICghZGlyKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHQqZmlyc3QgPSAtMTtcXG4rXFx0d2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHtcXG4rXFx0XFx0aW50IGZkO1xcbitcXG4rXFx0XFx0aWYgKGRlLVxcdTAwM2VkX25hbWVbMF0gPT0gJy4nKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0ZmQgPSBhdG9pKGRlLVxcdTAwM2VkX25hbWUpO1xcbitcXHRcXHRpZiAoKmZpcnN0IFxcdTAwM2MgMCB8fCBmZCBcXHUwMDNjICpmaXJzdClcXG4rXFx0XFx0XFx0KmZpcnN0ID0gZmQ7XFxuK1xcdFxcdG5yKys7XFxuK1xcdH1cXG4rXFx0Y2xvc2VkaXIoZGlyKTtcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbisvKlxcbisgKiBCbG9jayB1bnRpbCB0aGUgdGVzdCBoYW5ncyB1cCBAZmRfcmVsZWFzZSwga2VlcGluZyBldmVyeSBpbmhlcml0ZWQgZmRcXG4rICogb3BlbiwgdGhlbiByZXBvcnQgdGhyb3VnaCBAZmRfcmVzdWx0IHdoZXRoZXIgQGZkIGlzIHN0aWxsIG9wZW4uXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBob2xkX3VudGlsX3JlbGVhc2VkKGludCBmZCwgaW50IGZkX3JlbGVhc2UsIGludCBmZF9yZXN1bHQpXFxuK3tcXG4rXFx0Y2hhciBjO1xcbitcXG4rXFx0cmVhZF9ub2ludHIoZmRfcmVsZWFzZSwgXFx1MDAyNmMsIDEpO1xcbitcXHRjID0gZmNudGwoZmQsIEZfR0VURkQpIFxcdTAwM2MgMCA/ICdDJyA6ICdPJztcXG4rXFx0d3JpdGVfbm9pbnRyKGZkX3Jlc3VsdCwgXFx1MDAyNmMsIDEpO1xcbitcXHRfZXhpdChFWElUX1NVQ0NFU1MpO1xcbit9XFxuK1xcbisvKiBMb2NrIExPQ0tfRklMRSwgc2hhcmUgaXQgYXMgcmVxdWVzdGVkLCB0aGVuIGNyYXNoLiAqL1xcbitzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxcbitcXHRcXHRcXHRcXHQgIGludCBmZF9yZXN1bHQpXFxuK3tcXG4rXFx0cHRocmVhZF90IHRocmVhZDtcXG4rXFx0aW50IGZkLCBwaWRmZCwgaTtcXG4rXFx0cGlkX3QgcGlkO1xcbitcXG4rXFx0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFxuK1xcdGlmICh0YWtlX2xvY2soZmQsIHQtXFx1MDAzZWtpbmQpKVxcbitcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXG4rXFx0c3dpdGNoICh0LVxcdTAwM2VzaGFyZSkge1xcbitcXHRjYXNlIExPQ0tfU0hBUkVfTk9ORTpcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTE9DS19TSEFSRV9EVVA6XFxuK1xcdFxcdGlmIChkdXAoZmQpIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgTE9DS19TSEFSRV9GT1JLOlxcbitcXHRcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdFxcdGlmIChwaWQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRfZXhpdChFWElUX0ZBSUxVUkUpO1xcbitcXHRcXHRpZiAocGlkID09IDApXFxuK1xcdFxcdFxcdGhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXHRjYXNlIExPQ0tfU0hBUkVfRklMRVM6XFxuK1xcdFxcdHBpZCA9IGNyZWF0ZV9jaGlsZChcXHUwMDI2cGlkZmQsIENMT05FX0ZJTEVTKTtcXG4rXFx0XFx0aWYgKHBpZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdF9leGl0KEVYSVRfRkFJTFVSRSk7XFxuK1xcdFxcdGlmIChwaWQgPT0gMClcXG4rXFx0XFx0XFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh0LVxcdTAwM2V0aHJlYWRzKVxcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlVNX0NMT1NFX1RIUkVBRFM7IGkrKylcXG4rXFx0XFx0XFx0cHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZCwgTlVMTCwgZG9fbm90aGluZywgTlVMTCk7XFxuK1xcbitcXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXFxuK1xcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFNlcnZlIG9uZSBjb3JlZHVtcCBhbmQgbG9vayBhdCB0aGUgdGFzayBvbiB0aGUgd2F5LiBCZWZvcmUgdGhlIGFjayB0aGVcXG4rICogbG9jayBpcyBoZWxkIGFuZCB0aGUgZGVzY3JpcHRvcnMgYXJlIHRoZXJlLiBPbmNlIHRoZSBrZXJuZWwgaXMgcGFzdCB0aGVcXG4rICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcFxcbisgKiBvciBiZWZvcmUgdGhlIGhhbmd1cCBpbiB1c2Vyc3BhY2UgbW9kZSwgdGhleSBhcmUgZ29uZSBpZiB3ZSBhc2tlZCBmb3JcXG4rICogaXQgYW5kIHRoZSBsb2NrIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZS5cXG4rICovXFxuK3N0YXRpYyBpbnQgY2xvc2Vfc2VydmVyKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfaXBjKVxcbit7XFxuK1xcdHN0cnVjdCBjb3JlZHVtcF9yZXEgcmVxID0ge307XFxuK1xcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9wZWVyX3BpZGZkID0gLTEsIGZkX2xvY2sgPSAtMTtcXG4rXFx0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcXG4rXFx0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xcbitcXHRfX3U2NCBtYXNrO1xcbitcXHRzc2l6ZV90IGJ5dGVzO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XFxuK1xcdGlmIChmZF9sb2NrIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBvcGVuIGxvY2sgZmlsZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChcXFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcXFwiKTtcXG4rXFx0aWYgKGZkX3NlcnZlciBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQgZmFpbGVkOiAlbVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHdyaXRlX25vaW50cihmZF9pcGMsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmRfaXBjKTtcXG4rXFxuK1xcdGZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7XFxuK1xcdGlmIChmZF9jb3JlZHVtcCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogYWNjZXB0NCBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xcbitcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFxcdTAwMjZpbmZvKSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghcmVhZF9jb3JlZHVtcF9yZXEoZmRfY29yZWR1bXAsIFxcdTAwMjZyZXEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlYWRfY29yZWR1bXBfcmVxIGZhaWxlZFxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXFx1MDAyNnJlcSkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0LyogVGhlIHRhc2sgd2FpdHMgZm9yIG91ciBhbnN3ZXIgd2l0aCBldmVyeXRoaW5nIHN0aWxsIGluIHBsYWNlLiAqL1xcbitcXHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXFx1MDAzZWtpbmQpICE9IDEpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbG9jayBub3QgaGVsZCBkdXJpbmcgdGhlIGhhbmRzaGFrZVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0bnJfZmRzID0gY291bnRfZmRzKGluZm8ucGlkLCBcXHUwMDI2Zmlyc3RfZmQpO1xcbitcXHRpZiAobnJfZmRzIFxcdTAwM2M9IDApIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbm8gZGVzY3JpcHRvcnMgZHVyaW5nIHRoZSBoYW5kc2hha2VcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGhhbmRzaGFrZSBmYWlsZWQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdG1hc2sgPSBDT1JFRFVNUF9XQUlUO1xcbitcXHRtYXNrIHw9IHQtXFx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcXG4rXFx0aWYgKHQtXFx1MDAzZWNsb3NlKVxcbitcXHRcXHRtYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTO1xcbitcXG4rXFx0aWYgKCFzZW5kX2NvcmVkdW1wX2FjayhmZF9jb3JlZHVtcCwgXFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogcmVhZF9tYXJrZXIgQ09SRURVTVBfTUFSS19SRVFBQ0sgZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCBcXHUwMDI2YywgMSk7XFxuK1xcdGlmIChieXRlcyAhPSAodC1cXHUwMDNldXNlcnNwYWNlID8gMCA6IDEpKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHJlYWQgYWZ0ZXIgdGhlIGFjayByZXR1cm5lZCAlemQ6ICVtXFxcXG5cXFwiLCBfX2Z1bmNfXywgYnl0ZXMpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVxcdTAwM2VraW5kKSAhPSAhdC1cXHUwMDNlcmVsZWFzZWQpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRfX2Z1bmNfXywgdC1cXHUwMDNlcmVsZWFzZWQgPyBcXFwic3RpbGwgaGVsZFxcXCIgOiBcXFwicmVsZWFzZWRcXFwiKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXFx1MDAyNmZpcnN0X2ZkKTtcXG4rXFx0aWYgKG5yX2ZkcyBcXHUwMDNjIDAgfHwgIW5yX2ZkcyAhPSB0LVxcdTAwM2VjbG9zZSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiAlZCBkZXNjcmlwdG9ycyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRfX2Z1bmNfXywgbnJfZmRzKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcXG4rXFx0aWYgKHQtXFx1MDAzZWNsb3NlKSB7XFxuK1xcdFxcdGlmIChmZCBcXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHBpZGZkX2dldGZkIGFmdGVyIHRoZSBjbG9zZSByZXR1cm5lZCAlZDogJW1cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdF9fZnVuY19fLCBmZCk7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogcGlkZmRfZ2V0ZmQgZHVyaW5nIHRoZSBjb3JlZHVtcCBmYWlsZWQ6ICVtXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRfX2Z1bmNfXyk7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGNsb3NlKGZkKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogQ09SRURVTVBfV0FJVCBrZWVwcyB0aGUgdGFzayBhcm91bmQgdW50aWwgd2UgaGFuZyB1cC4gKi9cXG4rXFx0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcXHUwMDI2aW5mbykpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRpZiAoaW5mby5tYXNrIFxcdTAwMjYgUElERkRfSU5GT19FWElUKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0Y2hhciBidWZmZXJbNDA5Nl07XFxuK1xcbitcXHRcXHRieXRlcyA9IHJlYWRfbm9pbnRyKGZkX2NvcmVkdW1wLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTtcXG4rXFx0XFx0aWYgKGJ5dGVzIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChieXRlcyA9PSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xcbitvdXQ6XFxuK1xcdGlmIChmZF9sb2NrIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkX2xvY2spO1xcbitcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcXG4rXFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKGZkX2NvcmVkdW1wKTtcXG4rXFx0aWYgKGZkX3NlcnZlciBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShmZF9zZXJ2ZXIpO1xcbitcXHRyZXR1cm4gZXhpdF9jb2RlO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBydW5fY2xvc2VfdGVzdChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEsXFxuK1xcdFxcdFxcdCAgIEZJWFRVUkVfREFUQShjb3JlZHVtcCkgKnNlbGYsXFxuK1xcdFxcdFxcdCAgIGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0KVxcbit7XFxuK1xcdGludCBmZCwgc3RhdHVzLCBpcGNfc29ja2V0c1syXSwgcmVsZWFzZV9waXBlWzJdLCByZXN1bHRfcGlwZVsyXTtcXG4rXFx0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFxcXCJAQC90bXAvY29yZWR1bXAuc29ja2V0XFxcIikpO1xcbitcXG4rXFx0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2NDQpO1xcbitcXHRBU1NFUlRfR0UoZmQsIDApO1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoZmQpLCAwKTtcXG4rXFxuK1xcdEFTU0VSVF9FUShzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCBpcGNfc29ja2V0cyksIDApO1xcbitcXG4rXFx0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xcbitcXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XFxuK1xcdFxcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcXG4rXFx0XFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XFxuK1xcdH1cXG4rXFx0c2VsZi1cXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XFxuK1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcXG4rXFx0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCBcXHUwMDI2YywgMSksIDEpO1xcbitcXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcXG4rXFxuK1xcdC8qIE9ubHkgdGhlIGNyYXNoaW5nIGNoaWxkIGFuZCB3aGF0IGl0IHNwYXducyBzZWUgdGhlc2UgcGlwZXMuICovXFxuK1xcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xcbitcXHRBU1NFUlRfRVEocGlwZTIocmVzdWx0X3BpcGUsIE9fQ0xPRVhFQyksIDApO1xcbitcXG4rXFx0cGlkID0gZm9yaygpO1xcbitcXHRBU1NFUlRfR0UocGlkLCAwKTtcXG4rXFx0aWYgKHBpZCA9PSAwKSB7XFxuK1xcdFxcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XFxuK1xcdFxcdGNsb3NlKHJlc3VsdF9waXBlWzBdKTtcXG4rXFx0XFx0Y3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pO1xcbitcXHR9XFxuK1xcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7XFxuK1xcbitcXHR3YWl0cGlkKHBpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xcbitcXHRBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7XFxuK1xcbitcXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcXG4rXFxuK1xcdC8qIExldCB0aGUgcHJvY2VzcyBob2xkaW5nIHRoZSBzaGFyZWQgbG9jayBnby4gKi9cXG4rXFx0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVsxXSksIDApO1xcbitcXG4rXFx0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xcbitcXHRpZiAodC1cXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtXFx1MDAzZXNoYXJlID09IExPQ0tfU0hBUkVfRklMRVMpIHtcXG4rXFx0XFx0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKHJlc3VsdF9waXBlWzBdLCBcXHUwMDI2YywgMSksIDEpO1xcbitcXHRcXHRBU1NFUlRfRVEoYywgJ08nKTtcXG4rXFx0fVxcbitcXHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMF0pLCAwKTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeClcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxcbitcXHRcXHQudGhyZWFkcyA9IHRydWUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxcbitcXHRcXHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxcbitcXHRcXHQudGhyZWFkcyA9IHRydWUsXFxuK1xcdFxcdC5jbG9zZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXFxuK1xcdFxcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRFVQLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSB0cnVlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSB0cnVlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSBmYWxzZSxcXG4rXFx0fTtcXG4rXFxuK1xcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXFx1MDAyNnQpO1xcbit9XFxuK1xcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XFxuK1xcdFxcdC5raW5kID0gTE9DS19LSU5EX09GRCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxcbitcXHRcXHQuY2xvc2UgPSB0cnVlLFxcbitcXHRcXHQucmVsZWFzZWQgPSBmYWxzZSxcXG4rXFx0fTtcXG4rXFxuK1xcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXFx1MDAyNnQpO1xcbit9XFxuK1xcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcXG4re1xcbitcXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xcbitcXHRcXHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcXG4rXFx0XFx0LnNoYXJlID0gTE9DS19TSEFSRV9GSUxFUyxcXG4rXFx0XFx0LmNsb3NlID0gdHJ1ZSxcXG4rXFx0XFx0LnJlbGVhc2VkID0gZmFsc2UsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXFxuK3tcXG4rXFx0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcXG4rXFx0XFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXFxuK1xcdFxcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcXG4rXFx0XFx0LmNsb3NlID0gdHJ1ZSxcXG4rXFx0XFx0LnVzZXJzcGFjZSA9IHRydWUsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IHRydWUsXFxuK1xcdH07XFxuK1xcbitcXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFxcdTAwMjZ0KTtcXG4rfVxcbitcXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19ub3RfcmVxdWVzdGVkKVxcbit7XFxuK1xcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XFxuK1xcdFxcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxcbitcXHRcXHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXFxuK1xcdFxcdC50aHJlYWRzID0gdHJ1ZSxcXG4rXFx0XFx0LmNsb3NlID0gZmFsc2UsXFxuK1xcdFxcdC5yZWxlYXNlZCA9IGZhbHNlLFxcbitcXHR9O1xcbitcXG4rXFx0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcXHUwMDI2dCk7XFxuK31cXG4rXFxuK1RFU1RfSEFSTkVTU19NQUlOXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXFxuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xcbkBAIC0yMzc3LDYgKzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpXFxuIFxcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1VTRVJTUEFDRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUyk7XFxuIH1cXG4gXFxuKy8qIEEgcmVqZWN0ZWQgdGFzayBjbG9zZXMgZXZlcnl0aGluZyBvbiBpdHMgd2F5IG91dCBhbnl3YXkuICovXFxuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxcbit7XFxuK1xcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX0NMT1NFX0ZJTEVTKTtcXG4rfVxcbitcXG4gLypcXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcXG4gICogZGlzY2FyZHMgdGhlIHJlc3QgYW5kIGFja3Mgd2l0aCB0aGUgYWNrIGl0IGtub3dzLiBJdCByYWlzZXMgbm90aGluZ1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuQEAgLTE2MTIsNyArMTYxMiw4IEBAIGJvb2wgc2VuZF9jb3JlZHVtcF9hY2soaW50IGZkLCBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEsXFxuICNkZWZpbmUgVEVTVF9SRVFfTUFTS19BTExcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIFxcdChDT1JFRFVNUF9LRVJORUwgfCBDT1JFRFVNUF9VU0VSU1BBQ0UgfFxcdFxcdFxcdFxcXFxcXG4gXFx0IENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFxcdFxcdFxcdFxcXFxcXG4tXFx0IENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpXFxuK1xcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcXFxcbitcXHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXFxuIFxcbiBib29sIGNoZWNrX2NvcmVkdW1wX3JlcShjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTc6NTc6MDcuOTk0ODk0ODk0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6Njk4MDU4Njk0MjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNPUkVEVU1QXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiY29yZWR1bXBfY2xvc2VfZmlsZXNcIixcbiAgICBcImNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNcIixcbiAgICBcInZmc19jb3JlZHVtcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDA5NTdkMDAwYjQ1ZWE0NjljZjIzNGU3Y2FkNGM1NzA1MWVjNTQ3MTZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAyNCAxNzo1NzowNCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXG5pbmRleCBlYzkzNTllMzgyZWE1Li5hNmU3ZGEwYmMxNmE3IDEwMDY0NFxuLS0tIGEvZnMvY29yZWR1bXAuY1xuKysrIGIvZnMvY29yZWR1bXAuY1xuQEAgLTUyMyw3ICs1MjMsNyBAQCBzdGF0aWMgaW50IGNvcmVkdW1wX3dhaXQoaW50IGV4aXRfY29kZSwgc3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUpXG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7XG4gXHRpbnQgY29yZV93YWl0ZXJzID0gLUVCVVNZO1xuIFxuLVx0aW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4rXHRpbml0X2NvbXBsZXRpb24oXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiBcdGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLnRhc2sgPSB0c2s7XG4gXHRjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0ID0gTlVMTDtcbiBcbkBAIC01MzEsNyArNTMxLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0aWYgKGNvcmVfd2FpdGVycyBcdTAwM2UgMCkge1xuIFx0XHRzdHJ1Y3QgY29yZV90aHJlYWQgKnB0cjtcbiBcbi1cdFx0d2FpdF9mb3JfY29tcGxldGlvbl9zdGF0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXAsXG4rXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lLFxuIFx0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbiBcdFx0LypcbiBcdFx0ICogV2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGJlY29tZSBpbmFjdGl2ZSwgc28gdGhhdFxuQEAgLTgzNyw3ICs4MzcsOCBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX3JlcXVlc3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0XHQubWFza1x0XHRcdD0gQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHxcbiBcdFx0XHRcdFx0ICBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHxcbiBcdFx0XHRcdFx0ICBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHxcbi1cdFx0XHRcdFx0ICBDT1JFRFVNUF9NRU1PUllfVFlQRVMsXG4rXHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHxcbitcdFx0XHRcdFx0ICBDT1JFRFVNUF9DTE9TRV9GSUxFUyxcbiBcdFx0LnNpemVfYWNrXHRcdD0gc2l6ZW9mKHN0cnVjdCBjb3JlZHVtcF9hY2spLFxuIFx0XHQubWVtb3J5X3R5cGVzXHRcdD0gY3BybS1cdTAwM2VtZW1vcnlfdHlwZXMsXG4gXHRcdC5tZW1vcnlfdHlwZXNfbWFza1x0PSBDT1JFRFVNUF9NRU1PUllfQUxMLFxuQEAgLTkwNSw2ICs5MDYsMTIgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0fVxuIFxuK1x0LyogQSByZWplY3RlZCB0YXNrIGV4aXRzIHJpZ2h0IGF3YXkgYW5kIGNsb3NlcyBldmVyeXRoaW5nIGFueXdheS4gKi9cbitcdGlmICgoYWNrLm1hc2sgXHUwMDI2IENPUkVEVU1QX0NMT1NFX0ZJTEVTKSBcdTAwMjZcdTAwMjYgKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpKSB7XG4rXHRcdGNvcmVkdW1wX3NvY2tfbWFyayhjcHJtLVx1MDAzZWZpbGUsIENPUkVEVU1QX01BUktfQ09ORkxJQ1RJTkcpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4gXHRpZiAoYWNrLm1hc2sgXHUwMDI2IENPUkVEVU1QX01FTU9SWV9UWVBFUykge1xuIFx0XHQvKiBUaGUgbWVtb3J5IHR5cGVzIG5lZWQgdGhlIHdob2xlIGZpZWxkLiAqL1xuIFx0XHRpZiAodXNpemUgXHUwMDNjIENPUkVEVU1QX0FDS19TSVpFX1ZFUjEpIHtcbkBAIC0xMjI1LDYgKzEyMzIsMTEgQEAgc3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG4gXHRpZiAoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9SRUpFQ1QpXG4gXHRcdHJldHVybjtcbiBcbitcdGlmICgoY3BybS1cdTAwM2VtYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2ICFjb3JlZHVtcF9jbG9zZV9maWxlcygpKSB7XG4rXHRcdGNvcmVkdW1wX3JlcG9ydF9mYWlsdXJlKFwiRmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXCIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4gXHQvKiBnZXQgdXMgYW4gdW5zaGFyZWQgZGVzY3JpcHRvciB0YWJsZTsgYWxtb3N0IGFsd2F5cyBhIG5vLW9wICovXG4gXHQvKiBUaGUgY2VsbCBzcHVmcyBjb3JlZHVtcCBjb2RlIHJlYWRzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdGFibGVzICovXG4gXHRpZiAodW5zaGFyZV9maWxlcygpKVxuZGlmZiAtLWdpdCBhL2ZzL2ZpbGUuYyBiL2ZzL2ZpbGUuY1xuaW5kZXggNjI4Y2EwN2RjNGIxNy4uM2I4ZmNlNmUzNjk1MSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGUuY1xuKysrIGIvZnMvZmlsZS5jXG5AQCAtMzc1LDIxICszNzUsMTUgQEAgc3RhdGljIHVuc2lnbmVkIGludCBzYW5lX2ZkdGFibGVfc2l6ZShzdHJ1Y3QgZmR0YWJsZSAqZmR0LCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNcbiBcdHJldHVybiBBTElHTihsYXN0ICsgMSwgQklUU19QRVJfTE9ORyk7XG4gfVxuIFxuLS8qXG4tICogQWxsb2NhdGUgYSBuZXcgZGVzY3JpcHRvciB0YWJsZSBhbmQgY29weSBjb250ZW50cyBmcm9tIHRoZSBwYXNzZWQgaW5cbi0gKiBpbnN0YW5jZS4gIFJldHVybnMgYSBwb2ludGVyIHRvIGNsb25lZCB0YWJsZSBvbiBzdWNjZXNzLCBFUlJfUFRSKClcbi0gKiBvbiBmYWlsdXJlLiAgRm9yICdwdW5jaF9ob2xlJyBzZWUgc2FuZV9mZHRhYmxlX3NpemUoKS5cbi0gKi9cbi1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxuKy8qIEEgdGFibGUgd2l0aCBvbmUgcmVmZXJlbmNlIGFuZCB0aGUgZW1iZWRkZWQgZmR0YWJsZSwgbm90aGluZyBjb3BpZWQgeWV0LiAqL1xuK3N0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlcyhnZnBfdCBnZnApXG4ge1xuIFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3Zjtcbi1cdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xuLVx0dW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7XG4tXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4rXHRzdHJ1Y3QgZmR0YWJsZSAqbmV3X2ZkdDtcbiBcbi1cdG5ld2YgPSBrbWVtX2NhY2hlX2FsbG9jKGZpbGVzX2NhY2hlcCwgR0ZQX0tFUk5FTCk7XG4rXHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIGdmcCk7XG4gXHRpZiAoIW5ld2YpXG4tXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1x0XHRyZXR1cm4gTlVMTDtcbiBcbiBcdGF0b21pY19zZXQoXHUwMDI2bmV3Zi1cdTAwM2Vjb3VudCwgMSk7XG4gXG5AQCAtNDA0LDYgKzM5OCwzOSBAQCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob1xuIFx0bmV3X2ZkdC1cdTAwM2VmdWxsX2Zkc19iaXRzID0gbmV3Zi1cdTAwM2VmdWxsX2Zkc19iaXRzX2luaXQ7XG4gXHRuZXdfZmR0LVx1MDAzZWZkID0gXHUwMDI2bmV3Zi1cdTAwM2VmZF9hcnJheVswXTtcbiBcbitcdHJldHVybiBuZXdmO1xuK31cbitcbisvKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cbitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXNfc3RydWN0KHZvaWQpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbitcbitcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XG4rXHRpZiAoIW5ld2YpXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0cmN1X2Fzc2lnbl9wb2ludGVyKG5ld2YtXHUwMDNlZmR0LCBcdTAwMjZuZXdmLVx1MDAzZWZkdGFiKTtcbitcdHJldHVybiBuZXdmO1xuK31cbitcbisvKlxuKyAqIEFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3IgdGFibGUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0aGUgcGFzc2VkIGluXG4rICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4rICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4rICovXG4rc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbit7XG4rXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpuZXdmO1xuK1x0c3RydWN0IGZpbGUgKipvbGRfZmRzLCAqKm5ld19mZHM7XG4rXHR1bnNpZ25lZCBpbnQgb3Blbl9maWxlcywgaTtcbitcdHN0cnVjdCBmZHRhYmxlICpvbGRfZmR0LCAqbmV3X2ZkdDtcbitcbitcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcbitcdGlmICghbmV3ZilcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4rXHRuZXdfZmR0ID0gXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYjtcbitcbiBcdHNwaW5fbG9jayhcdTAwMjZvbGRmLVx1MDAzZWZpbGVfbG9jayk7XG4gXHRvbGRfZmR0ID0gZmlsZXNfZmR0YWJsZShvbGRmKTtcbiBcdG9wZW5fZmlsZXMgPSBzYW5lX2ZkdGFibGVfc2l6ZShvbGRfZmR0LCBwdW5jaF9ob2xlKTtcbkBAIC00ODAsNiArNTA3LDExIEBAIHN0YXRpYyBzdHJ1Y3QgZmR0YWJsZSAqY2xvc2VfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKVxuIFx0ICovXG4gXHRzdHJ1Y3QgZmR0YWJsZSAqZmR0ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhmaWxlcy1cdTAwM2VmZHQpO1xuIFx0dW5zaWduZWQgaW50IGksIGogPSAwO1xuK1x0LypcbitcdCAqIEEga2VybmVsIHRocmVhZCB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0byBtYWtlIHByb2dyZXNzIG9uIHNvbWVcbitcdCAqIHVtb3VudCBtdXN0IG5vdCBydW4gX19mcHV0KCkgaXRzZWxmLCBzZWUgX19mcHV0X3N5bmMoKS5cbitcdCAqL1xuK1x0Ym9vbCBzeW5jID0gIShjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9LVEhSRUFEKTtcbiBcbiBcdGZvciAoOzspIHtcbiBcdFx0dW5zaWduZWQgbG9uZyBzZXQ7XG5AQCAtNDkxLDcgKzUyMywxMCBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcylcbiBcdFx0XHRpZiAoc2V0IFx1MDAyNiAxKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZkdC1cdTAwM2VmZFtpXTtcbiBcdFx0XHRcdGlmIChmaWxlKSB7XG4tXHRcdFx0XHRcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xuK1x0XHRcdFx0XHRpZiAoc3luYylcbitcdFx0XHRcdFx0XHRmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgZmlsZXMpO1xuK1x0XHRcdFx0XHRlbHNlXG4rXHRcdFx0XHRcdFx0ZmlscF9jbG9zZShmaWxlLCBmaWxlcyk7XG4gXHRcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbkBAIC01MTUsMTYgKzU1MCw5NyBAQCB2b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4gXHR9XG4gfVxuIFxuKy8qIEhhbmQgQHRzayB0aGUgdGFibGUgQGZpbGVzLCBvciBub25lLCBhbmQgZHJvcCB0aGUgb25lIGl0IGhhZC4gKi9cbitzdGF0aWMgdm9pZCBzd2l0Y2hfZmlsZXNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuK1x0XHRcdFx0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkO1xuK1xuK1x0dGFza19sb2NrKHRzayk7XG4rXHRvbGQgPSB0c2stXHUwMDNlZmlsZXM7XG4rXHRpZiAob2xkKSB7XG4rXHRcdGlmIChmaWxlcylcbitcdFx0XHRhdG9taWNfaW5jKFx1MDAyNmZpbGVzLVx1MDAzZWNvdW50KTtcbitcdFx0dHNrLVx1MDAzZWZpbGVzID0gZmlsZXM7XG4rXHR9XG4rXHR0YXNrX3VubG9jayh0c2spO1xuK1x0aWYgKG9sZClcbitcdFx0cHV0X2ZpbGVzX3N0cnVjdChvbGQpO1xuK31cbitcbiB2b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4ge1xuLVx0c3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gdHNrLVx1MDAzZWZpbGVzO1xuK1x0aWYgKCF0c2stXHUwMDNlZmlsZXMpXG4rXHRcdHJldHVybjtcbitcdHN3aXRjaF9maWxlc19zdHJ1Y3QodHNrLCBOVUxMKTtcbit9XG4rXG4rLypcbisgKiBUaGUgdGhyZWFkLWdyb3VwIGlzIHdhaXRpbmcgaW4gY29yZWR1bXBfdGFza19leGl0KCkuIFdha2UgdGhlbSBhbmRcbisgKiB0ZWxsIHRoZW0gdG8gZ2V0IHJpZCBvZiB0aGVpciBmaWxlcy5cbisgKi9cbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXG4re1xuK1x0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGUgPSBjdXJyZW50LVx1MDAzZXNpZ25hbC1cdTAwM2Vjb3JlX3N0YXRlO1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4rXHRzdHJ1Y3QgY29yZV90aHJlYWQgKmN0O1xuK1x0aW50IG5yID0gMDtcbiBcbi1cdGlmIChmaWxlcykge1xuLVx0XHR0YXNrX2xvY2sodHNrKTtcbi1cdFx0dHNrLVx1MDAzZWZpbGVzID0gTlVMTDtcbi1cdFx0dGFza191bmxvY2sodHNrKTtcbi1cdFx0cHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7XG4rXHRmaWxlcyA9IGFsbG9jX2ZpbGVzX3N0cnVjdCgpO1xuK1x0aWYgKCFmaWxlcylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogVGFza3Mgd2l0aG91dCBhIHRhYmxlLCB2aG9zdCB3b3JrZXJzIHNheSwgc2l0IHRoZSBzd2l0Y2ggb3V0LiAqL1xuK1x0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVx1MDAzZW5leHQpXG4rXHRcdGlmIChjdC1cdTAwM2V0YXNrLVx1MDAzZWZpbGVzKVxuK1x0XHRcdG5yKys7XG4rXHRhdG9taWNfc2V0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcywgbnIpO1xuK1x0cmVpbml0X2NvbXBsZXRpb24oXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbitcbitcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KSB7XG4rXHRcdGlmICghY3QtXHUwMDNldGFzay1cdTAwM2VmaWxlcylcbitcdFx0XHRjb250aW51ZTtcbitcdFx0LyogUGFpcnMgd2l0aCB0aGUgYWNxdWlyZSBpbiBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKCkuICovXG4rXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNmN0LVx1MDAzZWZpbGVzLCBmaWxlcyk7XG4rXHRcdHdha2VfdXBfcHJvY2VzcyhjdC1cdTAwM2V0YXNrKTtcbiBcdH1cbitcbitcdC8qIFRoZSBkdW1wZXIncyBzdWJqZWN0aXZlIGNyZWRzIGFyZSB0aGUgZHVtcCdzLCBub3QgaXRzIG93bi4gKi9cbitcdHNjb3BlZF93aXRoX2NyZWRzKGN1cnJlbnRfcmVhbF9jcmVkKCkpXG4rXHRcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuK1xuK1x0aWYgKG5yKSB7XG4rXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lLFxuK1x0XHRcdFx0XHQgIFRBU0tfVU5JTlRFUlJVUFRJQkxFfFRBU0tfRlJFRVpBQkxFKTtcbitcdFx0LyogQmFjayBhc2xlZXAgYmVmb3JlIHRoZSBub3RlcyByZWFkIHRoZWlyIHJlZ2lzdGVycy4gKi9cbitcdFx0Zm9yIChjdCA9IGNvcmVfc3RhdGUtXHUwMDNlZHVtcGVyLm5leHQ7IGN0OyBjdCA9IGN0LVx1MDAzZW5leHQpXG4rXHRcdFx0d2FpdF90YXNrX2luYWN0aXZlKGN0LVx1MDAzZXRhc2ssIFRBU0tfQU5ZKTtcbitcdH1cbitcbitcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogR2V0IHJpZCBvZiB0aGUgZmlsZXMgYW5kIHN3aXRjaCB0byB0aGUgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlXG4rICogdGhlIGR1bXBpbmcgdGhyZWFkIHB1Ymxpc2hlZCBpbiB0aGlzIHRocmVhZCdzIGNvcmVfdGhyZWFkIGVudHJ5LlxuKyAqL1xuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXG4re1xuK1x0c3RydWN0IGNvcmVfc3RhdGUgKmNvcmVfc3RhdGU7XG4rXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcztcbitcbitcdC8qIFBhaXJzIHdpdGggdGhlIHJlbGVhc2UgaW4gY29yZWR1bXBfY2xvc2VfZmlsZXMoKS4gKi9cbitcdGZpbGVzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZzZWxmLVx1MDAzZWZpbGVzKTtcbitcdGlmICghZmlsZXMgfHwgIWN1cnJlbnQtXHUwMDNlZmlsZXMgfHwgY3VycmVudC1cdTAwM2VmaWxlcyA9PSBmaWxlcylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0X19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpO1xuK1x0c3dpdGNoX2ZpbGVzX3N0cnVjdChjdXJyZW50LCBmaWxlcyk7XG4rXHRjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbitcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4rXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4rXHRyZXR1cm4gdHJ1ZTtcbiB9XG4gXG4gc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0ge1xuZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuY1xuaW5kZXggYzY4YjhjMGE0MDk3YS4uM2M3MDU5MTc2NDZiNSAxMDA2NDRcbi0tLSBhL2ZzL2ZpbGVfdGFibGUuY1xuKysrIGIvZnMvZmlsZV90YWJsZS5jXG5AQCAtMTMsNiArMTMsNyBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGVsb2NrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9kbm90aWZ5LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zZWN1cml0eS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXZlbnRwb2xsLmhcdTAwM2VcbkBAIC02MDYsMTUgKzYwNyw1MyBAQCB2b2lkIF9fZnB1dF9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuIEVYUE9SVF9TWU1CT0woX19mcHV0X3N5bmMpO1xuIFxuIC8qXG4tICogRXF1aXZhbGVudCB0byBfX2ZwdXRfc3luYygpLCBidXQgb3B0aW1pemVkIGZvciBiZWluZyBjYWxsZWQgd2l0aCB0aGUgbGFzdFxuLSAqIHJlZmVyZW5jZS5cbi0gKlxuLSAqIFNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbisgKiBcImlkXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuKyAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxuICAqL1xuLXZvaWQgZnB1dF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxlKVxuK3N0YXRpYyBpbnQgZmlscF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbiB7XG4tXHRpZiAobGlrZWx5KGZpbGVfcmVmX3B1dF9jbG9zZShcdTAwMjZmaWxlLVx1MDAzZWZfcmVmKSkpXG4tXHRcdF9fZnB1dChmaWxlKTtcbitcdGludCByZXR2YWwgPSAwO1xuK1xuK1x0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXG4rXHRcdFx0XCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwiLFxuK1x0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRpZiAoZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKVxuK1x0XHRyZXR2YWwgPSBmaWxwLVx1MDAzZWZfb3AtXHUwMDNlZmx1c2goZmlscCwgaWQpO1xuK1xuK1x0aWYgKGxpa2VseSghKGZpbHAtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcbitcdFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XG4rXHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4rXHR9XG4rXHRyZXR1cm4gcmV0dmFsO1xuK31cbitcbitpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbit7XG4rXHRpbnQgcmV0dmFsO1xuK1xuK1x0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4rXHRmcHV0X2Nsb3NlKGZpbHApO1xuK1xuK1x0cmV0dXJuIHJldHZhbDtcbit9XG4rRVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcbitcbisvKlxuKyAqIExpa2UgZmlscF9jbG9zZSgpIGJ1dCB3aXRob3V0IGRlZmVycmluZyB0aGUgcmVsZWFzZSBvZiB0aGUgbGFzdFxuKyAqIHJlZmVyZW5jZSwgc2VlIGZpbGVfcmVmX3B1dF9jbG9zZSgpIGZvciBkZXRhaWxzLlxuKyAqL1xuK2ludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4re1xuK1x0aW50IHJldHZhbDtcbitcbitcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuK1x0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXHUwMDI2ZmlscC1cdTAwM2VmX3JlZikpKVxuK1x0XHRfX2ZwdXQoZmlscCk7XG4rXG4rXHRyZXR1cm4gcmV0dmFsO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2ludGVybmFsLmggYi9mcy9pbnRlcm5hbC5oXG5pbmRleCAzNTVkOTNmOTIyMDg2Li43YmE4Y2QyNmE2OThjIDEwMDY0NFxuLS0tIGEvZnMvaW50ZXJuYWwuaFxuKysrIGIvZnMvaW50ZXJuYWwuaFxuQEAgLTEyNyw3ICsxMjcsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2ZpbGVfYWNjZXNzKHN0cnVjdCBmaWxlICpmaWxlKVxuIFx0fVxuIH1cbiBcbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqKTtcbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKTtcbiB2b2lkIGZwdXRfY2xvc2Uoc3RydWN0IGZpbGUgKik7XG4gXG4gLypcbkBAIC0xOTAsNiArMTkwLDcgQEAgc3RydWN0IG9wZW5fZmxhZ3Mge1xuIFx0aW50IGludGVudDtcbiBcdGludCBsb29rdXBfZmxhZ3M7XG4gfTtcbitcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3BlbihpbnQgZGZkLCBzdHJ1Y3QgZmlsZW5hbWUgKnBhdGhuYW1lLFxuIFx0XHRjb25zdCBzdHJ1Y3Qgb3Blbl9mbGFncyAqb3ApO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZG9fZmlsZV9vcGVuX3Jvb3QoY29uc3Qgc3RydWN0IHBhdGggKixcbmRpZmYgLS1naXQgYS9mcy9vcGVuLmMgYi9mcy9vcGVuLmNcbmluZGV4IDQwODkyNWQ3YmQwYjcuLmQwMzY3MzZkNWQ0MzUgMTAwNjQ0XG4tLS0gYS9mcy9vcGVuLmNcbisrKyBiL2ZzL29wZW4uY1xuQEAgLTE0NTMsNDEgKzE0NTMsNiBAQCBTWVNDQUxMX0RFRklORTIoY3JlYXQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLCB1bW9kZV90LCBtb2RlKVxuIH1cbiAjZW5kaWZcbiBcbi0vKlxuLSAqIFwiaWRcIiBpcyB0aGUgUE9TSVggdGhyZWFkIElELiBXZSB1c2UgdGhlXG4tICogZmlsZXMgcG9pbnRlciBmb3IgdGhpcy4uXG4tICovXG4tc3RhdGljIGludCBmaWxwX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuLXtcbi1cdGludCByZXR2YWwgPSAwO1xuLVxuLVx0aWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihmaWxlX2NvdW50KGZpbHApID09IDAsIGZpbHAsXG4tXHRcdFx0XCJWRlM6IENsb3NlOiBmaWxlIGNvdW50IGlzIDAgKGZfb3A9JXBzKVwiLFxuLVx0XHRcdGZpbHAtXHUwMDNlZl9vcCkpIHtcbi1cdFx0cmV0dXJuIDA7XG4tXHR9XG4tXG4tXHRpZiAoZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKVxuLVx0XHRyZXR2YWwgPSBmaWxwLVx1MDAzZWZfb3AtXHUwMDNlZmx1c2goZmlscCwgaWQpO1xuLVxuLVx0aWYgKGxpa2VseSghKGZpbHAtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9QQVRIKSkpIHtcbi1cdFx0ZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7XG4tXHRcdGxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7XG4tXHR9XG4tXHRyZXR1cm4gcmV0dmFsO1xuLX1cbi1cbi1pbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbi17XG4tXHRpbnQgcmV0dmFsO1xuLVxuLVx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxwLCBpZCk7XG4tXHRmcHV0X2Nsb3NlKGZpbHApO1xuLVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tRVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcbi1cbiAvKlxuICAqIENhcmVmdWwgaGVyZSEgV2UgdGVzdCB3aGV0aGVyIHRoZSBmaWxlIHBvaW50ZXIgaXMgTlVMTCBiZWZvcmVcbiAgKiByZWxlYXNpbmcgdGhlIGZkLiBUaGlzIGVuc3VyZXMgdGhhdCBvbmUgY2xvbmUgdGFzayBjYW4ndCByZWxlYXNlXG5AQCAtMTUwMiwxMyArMTQ2NywxMSBAQCBTWVNDQUxMX0RFRklORTEoY2xvc2UsIHVuc2lnbmVkIGludCwgZmQpXG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG4gXG4tXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuLVxuIFx0LypcbiBcdCAqIFdlJ3JlIHJldHVybmluZyB0byB1c2VyIHNwYWNlLiBEb24ndCBib3RoZXJcbiBcdCAqIHdpdGggYW55IGRlbGF5ZWQgZnB1dCgpIGNhc2VzLlxuIFx0ICovXG4tXHRmcHV0X2Nsb3NlX3N5bmMoZmlsZSk7XG4rXHRyZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7XG4gXG4gXHRpZiAobGlrZWx5KHJldHZhbCA9PSAwKSlcbiBcdFx0cmV0dXJuIDA7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mZHRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuaW5kZXggYzQ1MzA2YTlmMDA3Mi4uZjBjMTAwM2RhOGNlOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuQEAgLTk5LDExICs5OSwxNiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgY2xvc2Vfb25fZXhlYyh1bnNpZ25lZCBpbnQgZmQsIGNvbnN0IHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbFxuIFxuIHN0cnVjdCB0YXNrX3N0cnVjdDtcbiBcbitzdHJ1Y3QgY29yZV90aHJlYWQ7XG4rXG4gdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcbitib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpO1xuK2Jvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpO1xuIGludCB1bnNoYXJlX2ZpbGVzKHZvaWQpO1xuIHN0cnVjdCBmZF9yYW5nZSB7XG4gXHR1bnNpZ25lZCBpbnQgZnJvbSwgdG87XG4gfTtcbitcbiBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCBzdHJ1Y3QgZmRfcmFuZ2UgKikgX19sYXRlbnRfZW50cm9weTtcbiB2b2lkIGRvX2Nsb3NlX29uX2V4ZWMoc3RydWN0IGZpbGVzX3N0cnVjdCAqKTtcbiBpbnQgaXRlcmF0ZV9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICosIHVuc2lnbmVkLFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li5mZWQwMmE0MjdkZTMxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTc2LDEyICs3NiwxNSBAQCBzdHJ1Y3QgbXVsdGlwcm9jZXNzX3NpZ25hbHMge1xuIHN0cnVjdCBjb3JlX3RocmVhZCB7XG4gXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XG4gXHRzdHJ1Y3QgY29yZV90aHJlYWQgKm5leHQ7XG4rXHQvKiBUaGUgZW1wdHkgdGFibGUgdG8gc3dpdGNoIHRvLCBwdWJsaXNoZWQgYnkgdGhlIGR1bXBpbmcgdGhyZWFkLiAqL1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4gfTtcbiBcbiBzdHJ1Y3QgY29yZV9zdGF0ZSB7XG4gXHRhdG9taWNfdCBucl90aHJlYWRzO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkIGR1bXBlcjtcbi1cdHN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0dXA7XG4rXHQvKiBDb21wbGV0ZWQgYnkgdGhlIGxhc3QgdGhyZWFkIHRvIHBhcmssIHJldXNlZCBmb3IgdGhlIHRhYmxlIHN3aXRjaC4gKi9cbitcdHN0cnVjdCBjb21wbGV0aW9uIGRvbmU7XG4gfTtcbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbmluZGV4IDZkMGM1M2I1MzRlYTguLmVjMDlkN2FiMDEzMTQgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbkBAIC0xOSw2ICsxOSw5IEBAXG4gICogQENPUkVEVU1QX01FTU9SWV9UWVBFUzogZHVtcCB0aGUgbWVtb3J5IHR5cGVzIGluXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wX2Fjay1cdTAwM2VtZW1vcnlfdHlwZXMgaW5zdGVhZCBvZiB0aGUgb25lc1xuICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFzayBzZWxlY3RlZDsgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMXG4rICogQENPUkVEVU1QX0NMT1NFX0ZJTEVTOiBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgdGFzayBiZWZvcmUgdGhlXG4rICogICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQ7IGluY29tcGF0aWJsZSB3aXRoXG4rICogICAgICAgICAgICAgICAgICAgICAgICBDT1JFRFVNUF9SRUpFQ1RcbiAgKi9cbiBlbnVtIHtcbiBcdENPUkVEVU1QX0tFUk5FTFx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyAwKSxcbkBAIC0yOCw2ICszMSw3IEBAIGVudW0ge1xuIFx0Q09SRURVTVBfUkVDT1JEU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNCksXG4gXHRDT1JFRFVNUF9TUEFSU0VcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNSksXG4gXHRDT1JFRFVNUF9NRU1PUllfVFlQRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDYpLFxuK1x0Q09SRURVTVBfQ0xPU0VfRklMRVNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDcpLFxuIH07XG4gXG4gLyoqXG5AQCAtMTM3LDYgKzE0MSwxMCBAQCBlbnVtIHtcbiAgKiBOb3RlIHRoYXQgQG1lbW9yeV90eXBlcyBtdXN0IGJlIHplcm8gaWYgQ09SRURVTVBfTUVNT1JZX1RZUEVTIGlzbid0XG4gICogcmFpc2VkLiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgcmVxdWlyZXMgQ09SRURVTVBfS0VSTkVMIGFuZCBhbiBhY2sgb2ZcbiAgKiBhdCBsZWFzdCBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxIGJ5dGVzLlxuKyAqXG4rICogSWYgQ09SRURVTVBfQ0xPU0VfRklMRVMgaXMgcmFpc2VkIGluIEBtYXNrIHRoZSBrZXJuZWwgY2xvc2VzIHRoZSBmaWxlXG4rICogZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGl0IGdlbmVyYXRlcyB0aGUgY29yZWR1bXAuXG4rICogVGhlIHRhc2sgZW5kcyB1cCB3aXRoIGFuIGVtcHR5IGRlc2NyaXB0b3IgdGFibGUuXG4gICovXG4gc3RydWN0IGNvcmVkdW1wX2FjayB7XG4gXHRfX3UzMiBzaXplO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jXG5pbmRleCAyYzBiMWMwMjkyMGY0Li5iNjUxNjc5YzEyZTk3IDEwMDY0NFxuLS0tIGEva2VybmVsL2V4aXQuY1xuKysrIGIva2VybmVsL2V4aXQuY1xuQEAgLTI1LDYgKzI1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9hY2N0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90c2FjY3Rfa2Vybi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZmR0YWJsZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYmluZm10cy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbnNwcm94eS5oXHUwMDNlXG5AQCAtNDMyLDYgKzQzMyw3IEBAIHN0YXRpYyB2b2lkIGNvcmVkdW1wX3Rhc2tfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbiBcdHN0cnVjdCBjb3JlX3RocmVhZCBzZWxmO1xuIFxuIFx0c2VsZi50YXNrID0gdHNrO1xuK1x0c2VsZi5maWxlcyA9IE5VTEw7XG4gXHRpZiAoc2VsZi50YXNrLVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9TSUdOQUxFRClcbiBcdFx0c2VsZi5uZXh0ID0geGNoZyhcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0LCBcdTAwMjZzZWxmKTtcbiBcdGVsc2VcbkBAIC00NDEsMTIgKzQ0MywxNSBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG4gXHQgKiB0byBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5cbiBcdCAqL1xuIFx0aWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vucl90aHJlYWRzKSlcbi1cdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VzdGFydHVwKTtcbitcdFx0Y29tcGxldGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2Vkb25lKTtcbiBcbiBcdGZvciAoOzspIHtcbiBcdFx0c2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JRExFfFRBU0tfRlJFRVpBQkxFKTtcbiBcdFx0aWYgKCFzZWxmLnRhc2spIC8qIHNlZSBjb3JlZHVtcF9maW5pc2goKSAqL1xuIFx0XHRcdGJyZWFrO1xuK1x0XHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xuK1x0XHRpZiAoY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhcdTAwMjZzZWxmKSlcbitcdFx0XHRjb250aW51ZTtcbiBcdFx0c2NoZWR1bGUoKTtcbiBcdH1cbiBcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5pbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NFxuLS0tIGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbisrKyBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5AQCAtMTksNiArMTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbitcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA3KSxcbiB9O1xuIFxuIC8qKlxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24ndFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbisgKlxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuKyAqIFRoZSB0YXNrIGVuZHMgdXAgd2l0aCBhbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlLlxuICAqL1xuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xuIFx0X191MzIgc2l6ZTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG5pbmRleCBkZWNlMWEzMWQ1NjFiLi5kYzg0ODlkNDA2MTg0IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGVcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG5AQCAtMyw3ICszLDggQEAgQ0ZMQUdTICs9IC1XYWxsIC1PMCAtZyAkKEtIRFJfSU5DTFVERVMpICQoVE9PTFNfSU5DTFVERVMpXG4gXG4gVEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcbiBcdFx0ICBjb3JlZHVtcF9zb2NrZXRfdGVzdCBcXFxuLVx0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0XG4rXHRcdCAgY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QgXFxcbitcdFx0ICBjb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0XG4gVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcbiBcbiBpbmNsdWRlIC4uL2xpYi5ta1xuQEAgLTExLDMgKzEyLDQgQEAgaW5jbHVkZSAuLi9saWIubWtcbiAkKE9VVFBVVCkvc3RhY2tkdW1wX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4gJChPVVRQVVQpL2NvcmVkdW1wX3NvY2tldF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiskKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43YTQxOTA2YjQ2OTUyXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9jbG9zZV9maWxlc190ZXN0LmNcbkBAIC0wLDAgKzEsNTkyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcdTAwM2NkaXJlbnQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvZmlsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3N0YXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJjb3JlZHVtcF90ZXN0LmhcIlxuK1xuKyNkZWZpbmUgTE9DS19GSUxFIFwiL3RtcC9jb3JlZHVtcC5sb2NrXCJcbitcbisvKiBJZGxlIHRocmVhZHMgdGhlIG11bHRpLXRocmVhZGVkIGNyYXNoaW5nIGNoaWxkIHNwYXducy4gKi9cbisjZGVmaW5lIE5VTV9DTE9TRV9USFJFQURTIDRcbitcbisvKiBIb3cgdGhlIGNyYXNoaW5nIGNoaWxkIGxvY2tzIExPQ0tfRklMRS4gKi9cbitlbnVtIGxvY2tfa2luZCB7XG4rXHRMT0NLX0tJTkRfUE9TSVgsXG4rXHRMT0NLX0tJTkRfT0ZELFxuK1x0TE9DS19LSU5EX0ZMT0NLLFxuK307XG4rXG4rLyogV2hvIGVsc2UgaGFzIGEgaGFuZGxlIG9uIHRoZSBsb2NrIHdoZW4gdGhlIGNoaWxkIGNyYXNoZXMuICovXG4rZW51bSBsb2NrX3NoYXJlIHtcbitcdExPQ0tfU0hBUkVfTk9ORSxcbitcdExPQ0tfU0hBUkVfRFVQLFx0XHQvKiBhIHNlY29uZCBzbG90IGluIHRoZSBjaGlsZCdzIG93biB0YWJsZSAqL1xuK1x0TE9DS19TSEFSRV9GT1JLLFx0LyogYSBmb3JrZWQgcHJvY2VzcyBrZWVwcyB0aGUgZmQgb3BlbiAqL1xuK1x0TE9DS19TSEFSRV9GSUxFUyxcdC8qIGEgQ0xPTkVfRklMRVMgcHJvY2VzcyBzaGFyZXMgdGhlIHRhYmxlICovXG4rfTtcbitcbitzdHJ1Y3QgY2xvc2VfdGVzdCB7XG4rXHRlbnVtIGxvY2tfa2luZCBraW5kO1xuK1x0ZW51bSBsb2NrX3NoYXJlIHNoYXJlO1xuK1x0Ym9vbCB0aHJlYWRzO1xuK1x0Ym9vbCBjbG9zZTtcdFx0LyogYWNrIHdpdGggQ09SRURVTVBfQ0xPU0VfRklMRVMgKi9cbitcdGJvb2wgdXNlcnNwYWNlO1x0XHQvKiBDT1JFRFVNUF9VU0VSU1BBQ0UgaW5zdGVhZCBvZiBDT1JFRFVNUF9LRVJORUwgKi9cbitcdGJvb2wgcmVsZWFzZWQ7XHRcdC8qIHRoZSBsb2NrIGlzIGdvbmUgb25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlIGNsb3NlICovXG4rfTtcbitcbitGSVhUVVJFX1NFVFVQKGNvcmVkdW1wKVxuK3tcbitcdEZJTEUgKmZpbGU7XG4rXHRpbnQgcmV0O1xuK1xuK1x0c2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyID0gLUVTUkNIO1xuK1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuK1x0ZmlsZSA9IGZvcGVuKFwiL3Byb2Mvc3lzL2tlcm5lbC9jb3JlX3BhdHRlcm5cIiwgXCJyXCIpO1xuK1x0QVNTRVJUX05FKE5VTEwsIGZpbGUpO1xuK1xuK1x0cmV0ID0gZnJlYWQoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4sIDEsIHNpemVvZihzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybiksIGZpbGUpO1xuK1x0QVNTRVJUX1RSVUUocmV0IHx8IGZlb2YoZmlsZSkpO1xuK1x0QVNTRVJUX0xUKHJldCwgc2l6ZW9mKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKSk7XG4rXG4rXHRzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybltyZXRdID0gJ1xcMCc7XG4rXHRzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkID0gY3JlYXRlX2RldGFjaGVkX3RtcGZzKCk7XG4rXHRBU1NFUlRfR0Uoc2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCwgMCk7XG4rXG4rXHRyZXQgPSBmY2xvc2UoZmlsZSk7XG4rXHRBU1NFUlRfRVEoMCwgcmV0KTtcbit9XG4rXG4rRklYVFVSRV9URUFSRE9XTihjb3JlZHVtcClcbit7XG4rXHRjb25zdCBjaGFyICpyZWFzb247XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldCwgc3RhdHVzO1xuK1xuK1x0aWYgKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciBcdTAwM2UgMCkge1xuK1x0XHRraWxsKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgU0lHVEVSTSk7XG4rXHRcdHdhaXRwaWQoc2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0fVxuK1x0dW5saW5rKExPQ0tfRklMRSk7XG4rXHR1bmxpbmsoXCIvdG1wL2NvcmVkdW1wLnNvY2tldFwiKTtcbitcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwid1wiKTtcbitcdGlmICghZmlsZSkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBvcGVuIGNvcmVfcGF0dGVyblwiO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRyZXQgPSBmcHJpbnRmKGZpbGUsIFwiJXNcIiwgc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byB3cml0ZSB0byBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0cmV0ID0gZmNsb3NlKGZpbGUpO1xuK1x0aWYgKHJldCkge1xuK1x0XHRyZWFzb24gPSBcIlVuYWJsZSB0byBjbG9zZSBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0aWYgKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgXHUwMDNlPSAwKSB7XG4rXHRcdHJldCA9IGNsb3NlKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQpO1xuK1x0XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4rXHRcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gY2xvc2UgZGV0YWNoZWQgdG1wZnNcIjtcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdH1cbitcdFx0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IC0xO1xuK1x0fVxuK1xuK1x0cmV0dXJuO1xuK2ZhaWw6XG4rXHQvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi9cbitcdGZwcmludGYoc3RkZXJyLCBcIkZhaWxlZCB0byBjbGVhbnVwIGNvcmVkdW1wIHRlc3Q6ICVzXFxuXCIsIHJlYXNvbik7XG4rfVxuK1xuKy8qIFdyaXRlLWxvY2sgQGZkIHRoZSB3YXkgQGtpbmQgc2F5cy4gKi9cbitzdGF0aWMgaW50IHRha2VfbG9jayhpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4re1xuK1x0c3RydWN0IGZsb2NrIGZsID0ge1xuK1x0XHQubF90eXBlID0gRl9XUkxDSyxcbitcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4rXHR9O1xuK1xuK1x0c3dpdGNoIChraW5kKSB7XG4rXHRjYXNlIExPQ0tfS0lORF9QT1NJWDpcbitcdFx0cmV0dXJuIGZjbnRsKGZkLCBGX1NFVExLLCBcdTAwMjZmbCk7XG4rXHRjYXNlIExPQ0tfS0lORF9PRkQ6XG4rXHRcdHJldHVybiBmY250bChmZCwgRl9PRkRfU0VUTEssIFx1MDAyNmZsKTtcbitcdGNhc2UgTE9DS19LSU5EX0ZMT0NLOlxuK1x0XHRyZXR1cm4gZmxvY2soZmQsIExPQ0tfRVgpO1xuK1x0fVxuK1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKiBEb2VzIGFueW9uZSBlbHNlIGhvbGQgYSB3cml0ZSBsb2NrIG9uIEBmZD8gMSBpZiBzbywgMCBpZiBub3QsIC0xIG9uIGVycm9yLiAqL1xuK3N0YXRpYyBpbnQgbG9ja19oZWxkKGludCBmZCwgZW51bSBsb2NrX2tpbmQga2luZClcbit7XG4rXHRzdHJ1Y3QgZmxvY2sgZmwgPSB7XG4rXHRcdC5sX3R5cGUgPSBGX1dSTENLLFxuK1x0XHQubF93aGVuY2UgPSBTRUVLX1NFVCxcbitcdH07XG4rXG4rXHRpZiAoa2luZCA9PSBMT0NLX0tJTkRfRkxPQ0spIHtcbitcdFx0aWYgKGZsb2NrKGZkLCBMT0NLX0VYIHwgTE9DS19OQikgPT0gMCkge1xuK1x0XHRcdGZsb2NrKGZkLCBMT0NLX1VOKTtcbitcdFx0XHRyZXR1cm4gMDtcbitcdFx0fVxuK1x0XHRyZXR1cm4gZXJybm8gPT0gRVdPVUxEQkxPQ0sgPyAxIDogLTE7XG4rXHR9XG4rXG4rXHQvKiBGX0dFVExLIHJlcG9ydHMgY29uZmxpY3RpbmcgT0ZEIGxvY2tzIHRvby4gKi9cbitcdGlmIChmY250bChmZCwgRl9HRVRMSywgXHUwMDI2ZmwpIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRyZXR1cm4gZmwubF90eXBlICE9IEZfVU5MQ0s7XG4rfVxuK1xuKy8qIE51bWJlciBvZiBlbnRyaWVzIGluIC9wcm9jL0BwaWQvZmQsIHRoZSBsb3dlc3Qgb25lIGluIEBmaXJzdC4gKi9cbitzdGF0aWMgaW50IGNvdW50X2ZkcyhwaWRfdCBwaWQsIGludCAqZmlyc3QpXG4re1xuK1x0Y2hhciBwYXRoWzY0XTtcbitcdHN0cnVjdCBkaXJlbnQgKmRlO1xuK1x0RElSICpkaXI7XG4rXHRpbnQgbnIgPSAwO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIi9wcm9jLyVkL2ZkXCIsIHBpZCk7XG4rXHRkaXIgPSBvcGVuZGlyKHBhdGgpO1xuK1x0aWYgKCFkaXIpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdCpmaXJzdCA9IC0xO1xuK1x0d2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHtcbitcdFx0aW50IGZkO1xuK1xuK1x0XHRpZiAoZGUtXHUwMDNlZF9uYW1lWzBdID09ICcuJylcbitcdFx0XHRjb250aW51ZTtcbitcdFx0ZmQgPSBhdG9pKGRlLVx1MDAzZWRfbmFtZSk7XG4rXHRcdGlmICgqZmlyc3QgXHUwMDNjIDAgfHwgZmQgXHUwMDNjICpmaXJzdClcbitcdFx0XHQqZmlyc3QgPSBmZDtcbitcdFx0bnIrKztcbitcdH1cbitcdGNsb3NlZGlyKGRpcik7XG4rXHRyZXR1cm4gbnI7XG4rfVxuK1xuKy8qXG4rICogQmxvY2sgdW50aWwgdGhlIHRlc3QgaGFuZ3MgdXAgQGZkX3JlbGVhc2UsIGtlZXBpbmcgZXZlcnkgaW5oZXJpdGVkIGZkXG4rICogb3BlbiwgdGhlbiByZXBvcnQgdGhyb3VnaCBAZmRfcmVzdWx0IHdoZXRoZXIgQGZkIGlzIHN0aWxsIG9wZW4uXG4rICovXG4rc3RhdGljIHZvaWQgaG9sZF91bnRpbF9yZWxlYXNlZChpbnQgZmQsIGludCBmZF9yZWxlYXNlLCBpbnQgZmRfcmVzdWx0KVxuK3tcbitcdGNoYXIgYztcbitcbitcdHJlYWRfbm9pbnRyKGZkX3JlbGVhc2UsIFx1MDAyNmMsIDEpO1xuK1x0YyA9IGZjbnRsKGZkLCBGX0dFVEZEKSBcdTAwM2MgMCA/ICdDJyA6ICdPJztcbitcdHdyaXRlX25vaW50cihmZF9yZXN1bHQsIFx1MDAyNmMsIDEpO1xuK1x0X2V4aXQoRVhJVF9TVUNDRVNTKTtcbit9XG4rXG4rLyogTG9jayBMT0NLX0ZJTEUsIHNoYXJlIGl0IGFzIHJlcXVlc3RlZCwgdGhlbiBjcmFzaC4gKi9cbitzdGF0aWMgdm9pZCBjcmFzaGluZ19jaGlsZF9sb2NrZWQoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9yZWxlYXNlLFxuK1x0XHRcdFx0ICBpbnQgZmRfcmVzdWx0KVxuK3tcbitcdHB0aHJlYWRfdCB0aHJlYWQ7XG4rXHRpbnQgZmQsIHBpZGZkLCBpO1xuK1x0cGlkX3QgcGlkO1xuK1xuK1x0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DTE9FWEVDKTtcbitcdGlmIChmZCBcdTAwM2MgMClcbitcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcbitcdGlmICh0YWtlX2xvY2soZmQsIHQtXHUwMDNla2luZCkpXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRzd2l0Y2ggKHQtXHUwMDNlc2hhcmUpIHtcbitcdGNhc2UgTE9DS19TSEFSRV9OT05FOlxuK1x0XHRicmVhaztcbitcdGNhc2UgTE9DS19TSEFSRV9EVVA6XG4rXHRcdGlmIChkdXAoZmQpIFx1MDAzYyAwKVxuK1x0XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBMT0NLX1NIQVJFX0ZPUks6XG4rXHRcdHBpZCA9IGZvcmsoKTtcbitcdFx0aWYgKHBpZCBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRpZiAocGlkID09IDApXG4rXHRcdFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcbitcdFx0YnJlYWs7XG4rXHRjYXNlIExPQ0tfU0hBUkVfRklMRVM6XG4rXHRcdHBpZCA9IGNyZWF0ZV9jaGlsZChcdTAwMjZwaWRmZCwgQ0xPTkVfRklMRVMpO1xuK1x0XHRpZiAocGlkIFx1MDAzYyAwKVxuK1x0XHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXHRcdGlmIChwaWQgPT0gMClcbitcdFx0XHRob2xkX3VudGlsX3JlbGVhc2VkKGZkLCBmZF9yZWxlYXNlLCBmZF9yZXN1bHQpO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdGlmICh0LVx1MDAzZXRocmVhZHMpXG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5VTV9DTE9TRV9USFJFQURTOyBpKyspXG4rXHRcdFx0cHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkLCBOVUxMLCBkb19ub3RoaW5nLCBOVUxMKTtcbitcbitcdC8qIGNyYXNoIG9uIHB1cnBvc2UgKi9cbitcdCoodm9sYXRpbGUgaW50ICopTlVMTCA9IDA7XG4rfVxuK1xuKy8qXG4rICogU2VydmUgb25lIGNvcmVkdW1wIGFuZCBsb29rIGF0IHRoZSB0YXNrIG9uIHRoZSB3YXkuIEJlZm9yZSB0aGUgYWNrIHRoZVxuKyAqIGxvY2sgaXMgaGVsZCBhbmQgdGhlIGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4gT25jZSB0aGUga2VybmVsIGlzIHBhc3QgdGhlXG4rICogcG9pbnQgd2hlcmUgaXQgY2xvc2VzIHRoZW0sIHdoaWNoIGlzIGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZHVtcFxuKyAqIG9yIGJlZm9yZSB0aGUgaGFuZ3VwIGluIHVzZXJzcGFjZSBtb2RlLCB0aGV5IGFyZSBnb25lIGlmIHdlIGFza2VkIGZvclxuKyAqIGl0IGFuZCB0aGUgbG9jayBpcyBpbiB0aGUgZXhwZWN0ZWQgc3RhdGUuXG4rICovXG4rc3RhdGljIGludCBjbG9zZV9zZXJ2ZXIoY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQsIGludCBmZF9pcGMpXG4re1xuK1x0c3RydWN0IGNvcmVkdW1wX3JlcSByZXEgPSB7fTtcbitcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcbitcdGludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xLCBmZF9sb2NrID0gLTE7XG4rXHRpbnQgZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFO1xuK1x0aW50IGZkLCBmaXJzdF9mZCwgbnJfZmRzO1xuK1x0X191NjQgbWFzaztcbitcdHNzaXplX3QgYnl0ZXM7XG4rXHRjaGFyIGM7XG4rXG4rXHRmZF9sb2NrID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmRfbG9jayBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogb3BlbiBsb2NrIGZpbGUgZmFpbGVkOiAlbVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoXCIvdG1wL2NvcmVkdW1wLnNvY2tldFwiKTtcbitcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICh3cml0ZV9ub2ludHIoZmRfaXBjLCBcIjFcIiwgMSkgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHdyaXRlX25vaW50ciB0byBpcGMgc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdGNsb3NlKGZkX2lwYyk7XG4rXG4rXHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0aWYgKGZkX2NvcmVkdW1wIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBhY2NlcHQ0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkX3BlZXJfcGlkZmQgPSBnZXRfcGVlcl9waWRmZChmZF9jb3JlZHVtcCk7XG4rXHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BlZXJfcGlkZmQgZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFx1MDAyNmluZm8pKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghcmVhZF9jb3JlZHVtcF9yZXEoZmRfY29yZWR1bXAsIFx1MDAyNnJlcSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHJlYWRfY29yZWR1bXBfcmVxIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFjaGVja19jb3JlZHVtcF9yZXEoXHUwMDI2cmVxKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogY2hlY2tfY29yZWR1bXBfcmVxIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LyogVGhlIHRhc2sgd2FpdHMgZm9yIG91ciBhbnN3ZXIgd2l0aCBldmVyeXRoaW5nIHN0aWxsIGluIHBsYWNlLiAqL1xuK1x0aWYgKGxvY2tfaGVsZChmZF9sb2NrLCB0LVx1MDAzZWtpbmQpICE9IDEpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGxvY2sgbm90IGhlbGQgZHVyaW5nIHRoZSBoYW5kc2hha2VcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuK1x0aWYgKG5yX2ZkcyBcdTAwM2M9IDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG5vIGRlc2NyaXB0b3JzIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgaGFuZHNoYWtlIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdGNsb3NlKGZkKTtcbitcbitcdG1hc2sgPSBDT1JFRFVNUF9XQUlUO1xuK1x0bWFzayB8PSB0LVx1MDAzZXVzZXJzcGFjZSA/IENPUkVEVU1QX1VTRVJTUEFDRSA6IENPUkVEVU1QX0tFUk5FTDtcbitcdGlmICh0LVx1MDAzZWNsb3NlKVxuK1x0XHRtYXNrIHw9IENPUkVEVU1QX0NMT1NFX0ZJTEVTO1xuK1xuK1x0aWYgKCFzZW5kX2NvcmVkdW1wX2FjayhmZF9jb3JlZHVtcCwgXHUwMDI2cmVxLCBtYXNrLCAwKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogc2VuZF9jb3JlZHVtcF9hY2sgZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXJlYWRfbWFya2VyKGZkX2NvcmVkdW1wLCBDT1JFRFVNUF9NQVJLX1JFUUFDSykpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHJlYWRfbWFya2VyIENPUkVEVU1QX01BUktfUkVRQUNLIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgXHUwMDI2YywgMSk7XG4rXHRpZiAoYnl0ZXMgIT0gKHQtXHUwMDNldXNlcnNwYWNlID8gMCA6IDEpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkIGFmdGVyIHRoZSBhY2sgcmV0dXJuZWQgJXpkOiAlbVxcblwiLCBfX2Z1bmNfXywgYnl0ZXMpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC1cdTAwM2VraW5kKSAhPSAhdC1cdTAwM2VyZWxlYXNlZCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogbG9jayAlcyB3aGlsZSB0aGUgY29yZWR1bXAgaXMgZ2VuZXJhdGVkXFxuXCIsXG4rXHRcdFx0X19mdW5jX18sIHQtXHUwMDNlcmVsZWFzZWQgPyBcInN0aWxsIGhlbGRcIiA6IFwicmVsZWFzZWRcIik7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0bnJfZmRzID0gY291bnRfZmRzKGluZm8ucGlkLCBcdTAwMjZmaXJzdF9mZCk7XG4rXHRpZiAobnJfZmRzIFx1MDAzYyAwIHx8ICFucl9mZHMgIT0gdC1cdTAwM2VjbG9zZSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogJWQgZGVzY3JpcHRvcnMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwiLFxuK1x0XHRcdF9fZnVuY19fLCBucl9mZHMpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkID0gc3lzX3BpZGZkX2dldGZkKGZkX3BlZXJfcGlkZmQsIGZpcnN0X2ZkLCAwKTtcbitcdGlmICh0LVx1MDAzZWNsb3NlKSB7XG4rXHRcdGlmIChmZCBcdTAwM2U9IDAgfHwgZXJybm8gIT0gRUJBREYpIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcGlkZmRfZ2V0ZmQgYWZ0ZXIgdGhlIGNsb3NlIHJldHVybmVkICVkOiAlbVxcblwiLFxuK1x0XHRcdFx0X19mdW5jX18sIGZkKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGR1cmluZyB0aGUgY29yZWR1bXAgZmFpbGVkOiAlbVxcblwiLFxuK1x0XHRcdFx0X19mdW5jX18pO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGNsb3NlKGZkKTtcbitcdH1cbitcbitcdC8qIENPUkVEVU1QX1dBSVQga2VlcHMgdGhlIHRhc2sgYXJvdW5kIHVudGlsIHdlIGhhbmcgdXAuICovXG4rXHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFx1MDAyNmluZm8pKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmIChpbmZvLm1hc2sgXHUwMDI2IFBJREZEX0lORk9fRVhJVCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogdGFzayBleGl0ZWQgYmVmb3JlIHRoZSBjb3JlZHVtcCBmaW5pc2hlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0Zm9yICg7Oykge1xuK1x0XHRjaGFyIGJ1ZmZlcls0MDk2XTtcbitcbitcdFx0Ynl0ZXMgPSByZWFkX25vaW50cihmZF9jb3JlZHVtcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7XG4rXHRcdGlmIChieXRlcyBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkIGZyb20gY29yZWR1bXAgc29ja2V0IGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGlmIChieXRlcyA9PSAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0fVxuK1xuK1x0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xuK291dDpcbitcdGlmIChmZF9sb2NrIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmRfbG9jayk7XG4rXHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX3BlZXJfcGlkZmQpO1xuK1x0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuK1x0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX3NlcnZlcik7XG4rXHRyZXR1cm4gZXhpdF9jb2RlO1xuK31cbitcbitzdGF0aWMgdm9pZCBydW5fY2xvc2VfdGVzdChzdHJ1Y3QgX190ZXN0X21ldGFkYXRhICpjb25zdCBfbWV0YWRhdGEsXG4rXHRcdFx0ICAgRklYVFVSRV9EQVRBKGNvcmVkdW1wKSAqc2VsZixcbitcdFx0XHQgICBjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCAqdClcbit7XG4rXHRpbnQgZmQsIHN0YXR1cywgaXBjX3NvY2tldHNbMl0sIHJlbGVhc2VfcGlwZVsyXSwgcmVzdWx0X3BpcGVbMl07XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRjaGFyIGM7XG4rXG4rXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFwiQEAvdG1wL2NvcmVkdW1wLnNvY2tldFwiKSk7XG4rXG4rXHRmZCA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQ0xPRVhFQywgMDY0NCk7XG4rXHRBU1NFUlRfR0UoZmQsIDApO1xuK1x0RVhQRUNUX0VRKGNsb3NlKGZkKSwgMCk7XG4rXG4rXHRBU1NFUlRfRVEoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSB8IFNPQ0tfQ0xPRVhFQywgMCwgaXBjX3NvY2tldHMpLCAwKTtcbitcbitcdHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XG4rXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XG4rXHRcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcbitcdFx0X2V4aXQoY2xvc2Vfc2VydmVyKHQsIGlwY19zb2NrZXRzWzFdKSk7XG4rXHR9XG4rXHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XG4rXHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApO1xuK1xuK1x0LyogT25seSB0aGUgY3Jhc2hpbmcgY2hpbGQgYW5kIHdoYXQgaXQgc3Bhd25zIHNlZSB0aGVzZSBwaXBlcy4gKi9cbitcdEFTU0VSVF9FUShwaXBlMihyZWxlYXNlX3BpcGUsIE9fQ0xPRVhFQyksIDApO1xuK1x0QVNTRVJUX0VRKHBpcGUyKHJlc3VsdF9waXBlLCBPX0NMT0VYRUMpLCAwKTtcbitcbitcdHBpZCA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWQsIDApO1xuK1x0aWYgKHBpZCA9PSAwKSB7XG4rXHRcdGNsb3NlKHJlbGVhc2VfcGlwZVsxXSk7XG4rXHRcdGNsb3NlKHJlc3VsdF9waXBlWzBdKTtcbitcdFx0Y3Jhc2hpbmdfY2hpbGRfbG9ja2VkKHQsIHJlbGVhc2VfcGlwZVswXSwgcmVzdWx0X3BpcGVbMV0pO1xuK1x0fVxuK1x0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVswXSksIDApO1xuK1x0RVhQRUNUX0VRKGNsb3NlKHJlc3VsdF9waXBlWzFdKSwgMCk7XG4rXG4rXHR3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1x0QVNTRVJUX1RSVUUoV0NPUkVEVU1QKHN0YXR1cykpO1xuK1xuK1x0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XG4rXG4rXHQvKiBMZXQgdGhlIHByb2Nlc3MgaG9sZGluZyB0aGUgc2hhcmVkIGxvY2sgZ28uICovXG4rXHRFWFBFQ1RfRVEoY2xvc2UocmVsZWFzZV9waXBlWzFdKSwgMCk7XG4rXG4rXHQvKiBUaGUgY3Jhc2hpbmcgY2hpbGQgaXMgZ29uZSBidXQgd2hhdCBpdCBzaGFyZWQgd2l0aCBpcyB1bnRvdWNoZWQuICovXG4rXHRpZiAodC1cdTAwM2VzaGFyZSA9PSBMT0NLX1NIQVJFX0ZPUksgfHwgdC1cdTAwM2VzaGFyZSA9PSBMT0NLX1NIQVJFX0ZJTEVTKSB7XG4rXHRcdEFTU0VSVF9FUShyZWFkX25vaW50cihyZXN1bHRfcGlwZVswXSwgXHUwMDI2YywgMSksIDEpO1xuK1x0XHRBU1NFUlRfRVEoYywgJ08nKTtcbitcdH1cbitcdEVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVswXSksIDApO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4KVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9PRkQsXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX2Zsb2NrX2R1cClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9EVVAsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeF9mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfb2ZkX2ZvcmspXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZPUkssXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfc2hhcmVkX3RhYmxlKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX1BPU0lYLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX0ZJTEVTLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3VzZXJzcGFjZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQudXNlcnNwYWNlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gdHJ1ZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX25vdF9yZXF1ZXN0ZWQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LnRocmVhZHMgPSB0cnVlLFxuK1x0XHQuY2xvc2UgPSBmYWxzZSxcbitcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9IQVJORVNTX01BSU5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuY1xuaW5kZXggZjVjOWJhZDg3NTQ2My4uYmViMTY3Njk4Y2ZkYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbkBAIC0yMzc3LDYgKzIzNzcsMTIgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfcmVxdWVzdF9tZW1vcnlfdHlwZXNfd2l0aG91dF9rZXJuZWwpXG4gXHRjaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9VU0VSU1BBQ0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpO1xuIH1cbiBcbisvKiBBIHJlamVjdGVkIHRhc2sgY2xvc2VzIGV2ZXJ5dGhpbmcgb24gaXRzIHdheSBvdXQgYW55d2F5LiAqL1xuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfY2xvc2VfZmlsZXNfcmVqZWN0KVxuK3tcbitcdGNoZWNrX2NvbmZsaWN0aW5nX2FjayhfbWV0YWRhdGEsIHNlbGYsIENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX0NMT1NFX0ZJTEVTKTtcbit9XG4rXG4gLypcbiAgKiBBIHNlcnZlciBidWlsdCB3aXRoIHRoZSBmaXJzdCBzdHJ1Y3RzIHJlYWRzIHRoZSByZXF1ZXN0IGl0IGtub3dzLFxuICAqIGRpc2NhcmRzIHRoZSByZXN0IGFuZCBhY2tzIHdpdGggdGhlIGFjayBpdCBrbm93cy4gSXQgcmFpc2VzIG5vdGhpbmdcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5pbmRleCA0ZTM2ZTNlNGZiNzhmLi42NTEzMmEwZGVjZWRkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5AQCAtMTYxMiw3ICsxNjEyLDggQEAgYm9vbCBzZW5kX2NvcmVkdW1wX2FjayhpbnQgZmQsIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9yZXEgKnJlcSxcbiAjZGVmaW5lIFRFU1RfUkVRX01BU0tfQUxMXHRcdFx0XHRcdFxcXG4gXHQoQ09SRURVTVBfS0VSTkVMIHwgQ09SRURVTVBfVVNFUlNQQUNFIHxcdFx0XHRcXFxuIFx0IENPUkVEVU1QX1JFSkVDVCB8IENPUkVEVU1QX1dBSVQgfFx0XHRcdFxcXG4tXHQgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUylcbitcdCBDT1JFRFVNUF9SRUNPUkRTIHwgQ09SRURVTVBfU1BBUlNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTIHwgXFxcbitcdCBDT1JFRFVNUF9DTE9TRV9GSUxFUylcbiBcbiBib29sIGNoZWNrX2NvcmVkdW1wX3JlcShjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTc6NTc6MDcuOTk0ODk1OTY0WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM4Mjc2ODAxMjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoaXMgQ29yZWR1bXAgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGRpZ2dpbmcgaW50byB0aGUgTGludXgga2VybmVsJ3MgY29yZWR1bXAgc3Vic3lzdGVtLCBhbmQgaXQgbG9va3MgaW50ZXJlc3RpbmcgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCdzIGFkZGluZyBhIG5ldyBmbGFnLCBgQ09SRURVTVBfQ0xPU0VfRklMRVNgLCB0byB0aGUgY29yZWR1bXAgcHJvdG9jb2wuIFRoZSBjcnVjaWFsIGJpdCBpcyB0aGF0IHdoZW4gYSB1c2Vyc3BhY2UgaGFuZGxlciBzZW5kcyBiYWNrIGFuIEFDSyB3aXRoIHRoaXMgZmxhZyBzZXQsIHRoZSBrZXJuZWwgd2lsbCBjbG9zZSAqYWxsKiBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSBjcmFzaGluZyB0YXNrIGJlZm9yZSBnZW5lcmF0aW5nIHRoZSBjb3JlIGR1bXAuXG5cblJpZ2h0IGF3YXksIEknbSB0aGlua2luZzogcmVhY2hhYmxlPyBGdXp6YWJsZT8gVGhpcyBsb29rcyBwcm9taXNpbmcuIFRoZSBjb3JlZHVtcCBmdW5jdGlvbmFsaXR5IGl0c2VsZiBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSwgbm8gcHJvYmxlbSB0aGVyZS4gQW5kIHRoaXMgbmV3IGBDT1JFRFVNUF9DTE9TRV9GSUxFU2AgZmxhZyBpcyBwYXJ0IG9mIHRoZSBVQVBJLCB3aGljaCBtZWFucyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIGNhbiB0cmlnZ2VyIGl0LiBUaGF0IG1ha2VzIGl0IHJpcGUgZm9yIGV4cGxvcmF0aW9uLlxuXG5JIHNlZSBjaGFuZ2VzIHNwcmlua2xlZCBhY3Jvc3MgdGhlIGZpbGVzeXN0ZW0gY29kZSAoYGZzL2NvcmVkdW1wLmNgLCBgZnMvZmlsZS5jYCwgYGZzL2ZpbGVfdGFibGUuY2AsIGBmcy9pbnRlcm5hbC5oYCwgYGZzL29wZW4uY2AsIGBpbmNsdWRlL2xpbnV4L2ZkdGFibGUuaGAsIGBpbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oYCwgYGluY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oYCkgYW5kIGV2ZW4gdGhlIGtlcm5lbCdzIGV4aXQgbG9naWMgKGBrZXJuZWwvZXhpdC5jYCkuIFRoaXMgdGVsbHMgbWUgdGhlIGNvcmUga2VybmVsIGlzIGludm9sdmVkLiBDbG9zaW5nIGZpbGUgZGVzY3JpcHRvcnMgaW4gYSBjb250cm9sbGVkIG1hbm5lciwgb3Igbm90LCBpcyBhbHdheXMgYSBzZW5zaXRpdmUgb3BlcmF0aW9uLlxuXG5NeSBuZXh0IHN0ZXAgaXMgdG8gcGlucG9pbnQgdGhlIHNwZWNpZmljIGZ1bmN0aW9ucyBJJ2xsIHdhbnQgdG8gZm9jdXMgb24gZm9yIGZ1enppbmcuIExvb2tzIGxpa2UgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgLCBhbmQgYGZpbHBfY2xvc2Vfc3luY2AgYXJlIHRoZSBtb3N0IHJlbGV2YW50IGluIHRoZSBmaWxlc3lzdGVtIGFyZWEuIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgIGFuZCBgZG9fY29yZWR1bXBgIG5lZWQgZnVydGhlciBhbmFseXNpcy4gVGhlc2UgYXJlIGFsbCB3b3J0aCBhIGNsb3NlIGxvb2sgYW5kIGZ1enppbmcuXG5cbkZpbmFsbHksIEkgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBvcHRpb25zLiBDb3JlZHVtcHMgYXJlIGVuYWJsZWQgdmlhIGBDT05GSUdfQ09SRURVTVBgLiBJIG5lZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBzZXQsIG90aGVyd2lzZSwgYWxsIHRoaXMgd29yayBpcyBmb3Igbm90aGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTU0OTMsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo0Ni4yNzE2OTk3OTJaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUzMDg2NTM2NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ09SRURVTVBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZy5iaW5mbXQ9MTQ1PWNvbmZpZyBCSU5GTVRfTUlTQ1xcbi0tXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTcwLVxcbmZzL0tjb25maWcuYmluZm10OjE3MTpjb25maWcgQ09SRURVTVBcXG5mcy9LY29uZmlnLmJpbmZtdC0xNzItXFx0Ym9vbCBcXFwiRW5hYmxlIGNvcmUgZHVtcCBzdXBwb3J0XFxcIiBpZiBFWFBFUlRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NDcuODAyNTY4NDc4WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDk0ODQ2MjA3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipBbmFseXppbmcgdGhlIGBDT1JFRFVNUGAgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyByZWxhdGVkIHRvIGBDT1JFRFVNUGAuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gZGVsdmUgaW50byB0aGUgdmFyaW91cyBsYXllcnMgaW52b2x2ZWQgaW4gZ2VuZXJhdGluZywgaGFuZGxpbmcsIGFuZCBpbnRlcnByZXRpbmcgY29yZSBkdW1wcy4gSSdtIHRoaW5raW5nIGFib3V0IHRoZSBrZXJuZWwtbGV2ZWwgY29tcG9uZW50cyB0aGF0IHRyaWdnZXIgdGhlIGR1bXAg4oCTIHNpZ25hbHMgbGlrZSBTSUdTRUdWLCBTSUdBQlJULCBTSUdJTEwsIGV0Yy4g4oCTIGFuZCBob3cgdGhvc2UgYXJlIGNvbmZpZ3VyZWQsIHBvdGVudGlhbGx5IHRocm91Z2ggYC9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuYCBvciBzaW1pbGFyIHN5c2N0bCBzZXR0aW5ncy5cblxuVGhlbiwgSSdtIGNvbnNpZGVyaW5nIHRoZSB1c2Vyc3BhY2UgdXRpbGl0aWVzOiBgZ2RiYCwgYGxsZGJgLCBgY29yZWR1bXBjdGxgLCBhbmQgdGhlIHdob2xlIHJhbmdlIG9mIGRlYnVnZ2VycyB0aGF0IGNhbiBhY3R1YWxseSAqdXNlKiB0aGUgY29yZSBmaWxlLiBXaGF0IGFyZSB0aGUga2V5IGxpYnJhcmllcyB0aGVzZSB0b29scyByZWx5IG9uIGZvciBwYXJzaW5nIHRoZSBjb3JlIGR1bXAgZm9ybWF0PyBFTEYsIERXQVJGLCB0aGUgZGVidWdnaW5nIGludGVyZmFjZSAoREJJKS4uLiBJIG5lZWQgdG8gbWFwIG91dCB0aGUgY29ubmVjdGlvbnMuIEFtIEkgZGVhbGluZyB3aXRoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCB3aGljaCBtYXkgaW5mbHVlbmNlIHRoZSBjb3JlIGZpbGUgZm9ybWF0P1xuXG5JJ20gYWxzbyBjb25zaWRlcmluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBjb3JlIGR1bXAgc2V0dGluZ3MgdGhlbXNlbHZlczogc2l6ZSBsaW1pdHMgKHVsaW1pdCAtYyksIHRoZSBjb3JlIGZpbGUgbmFtaW5nIGNvbnZlbnRpb24gKHBvdGVudGlhbGx5IGluamVjdGluZyBwcm9jZXNzIElEcywgdGltZXN0YW1wcywgZXRjLiksIGFuZCB3aGV0aGVyIHRoZSBkdW1wIGlzIGJlaW5nIGNhcHR1cmVkIGluIGEgZmlsZSBhdCBhbGwsIG9yIHBvdGVudGlhbGx5IHBpcGVkIHRvIGEgZGVidWdnZXIgZGlyZWN0bHkuXG5cbkkgc2hvdWxkIGFsc28gZmFjdG9yIGluIHRoZSBwb3NzaWJpbGl0eSBvZiBleHRlcm5hbCBkZXBlbmRlbmNpZXMg4oCTIHRvb2xzIHRoYXQgbWlnaHQgcHJlLXByb2Nlc3Mgb3IgcG9zdC1wcm9jZXNzIHRoZSBjb3JlIGR1bXBzLiBBcmUgdGhlcmUgYW55IGN1c3RvbSBzY3JpcHRzIG9yIHRvb2xzIHdpdGhpbiB0aGlzIHN5c3RlbSB0aGF0IGFyZSBpbnZvbHZlZCBpbiBjb3JlIGR1bXAgYW5hbHlzaXMgb3IgbWFuaXB1bGF0aW9uPyBVbmRlcnN0YW5kaW5nIGFueSBjdXN0b20gdG9vbHMgb3IgbW9kaWZpY2F0aW9ucyBpbiBwbGFjZSBpcyBjcnVjaWFsLlxuXG5VbHRpbWF0ZWx5LCBJIG5lZWQgYSBob2xpc3RpYyB2aWV3OiB3aGF0IHRyaWdnZXJzIGEgY29yZSBkdW1wLCBob3cgaXMgaXQgZ2VuZXJhdGVkLCB3aGF0IGFyZSB0aGUgcmVzdHJpY3Rpb25zIG9uIHRoZSBjb3JlIGR1bXAsIHdoYXQgdG9vbHMgaW50ZXJhY3Qgd2l0aCB0aGUgY29yZSBkdW1wLCBhbmQgd2hhdCB0b29scyBtYXkgYW5hbHl6ZSB0aGUgY29yZSBkdW1wPyBUaGlzIGlzIHRoZSBjb3JlIGRlcGVuZGVuY3kgZ3JhcGggSSBuZWVkIHRvIHVuZGVyc3RhbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE2Mzg5LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NTIuNzUxMDMyMzEyWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0NjE2Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDT1JFRFVNUFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9LY29uZmlnLmJpbmZtdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xNDU9Y29uZmlnIEJJTkZNVF9NSVNDXFxuLS1cXG5mcy9LY29uZmlnLmJpbmZtdC0xNzAtXFxuZnMvS2NvbmZpZy5iaW5mbXQ6MTcxOmNvbmZpZyBDT1JFRFVNUFxcbmZzL0tjb25maWcuYmluZm10LTE3Mi1cXHRib29sIFxcXCJFbmFibGUgY29yZSBkdW1wIHN1cHBvcnRcXFwiIGlmIEVYUEVSVFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo1Mi43OTU2NTQ5M1oiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM1NzMwMjUxNDYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgdGhlIHByb3ZpZGVkIHRleHQgYW5kIHRoaW5raW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9uczpcblxuKipBbmFseXppbmcgdGhlIEtlcm5lbCdzIEJpbmFyeSBGb3JtYXQgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gZmlsZSwgc3BlY2lmaWNhbGx5IHRoZSBgZnMvS2NvbmZpZy5iaW5mbXRgIHNlY3Rpb24uIE15IGV4cGVyaWVuY2UgdGVsbHMgbWUgdGhhdCB0aGlzIGlzIHdoZXJlIHRoZSBrZXJuZWwgZGVmaW5lcyBpdHMgaGFuZGxpbmcgb2YgdmFyaW91cyBiaW5hcnkgZm9ybWF0cywgbGlrZSBleGVjdXRhYmxlcy4gVGhlIGxpbmUgbnVtYmVyIHByb3ZpZGVkLCBhcm91bmQgMTcxLCB1c3VhbGx5IHBvaW50cyB0byBhIHNpZ25pZmljYW50IGJsb2NrIG9mIGNvZGUsIG9mdGVuIGRlYWxpbmcgd2l0aCB0aGUgbG93LWxldmVsIGRldGFpbHMgb2YgaG93IHRoZSBrZXJuZWwgaWRlbnRpZmllcyBhbmQgZXhlY3V0ZXMgZGlmZmVyZW50IHByb2dyYW0gdHlwZXMuIFRoaXMgaXMgY3JpdGljYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGZsZXhpYmlsaXR5IGFuZCBzZWN1cml0eSBvZiB0aGUga2VybmVsLCBhcyBpdCBkaWN0YXRlcyB3aGF0IGNhbiBiZSBydW4gb24gdGhlIHN5c3RlbSBhbmQgaG93LiBJIG5lZWQgdG8gc2VlIHdoYXQncyBiZWluZyBjb25maWd1cmVkLCB3aGF0IGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQsIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBtaWdodCBiZSBpbiBwbGFjZS4gSSdtIGdvaW5nIHRvIGxvb2sgZm9yIGFueSBjbHVlcyBhYm91dCB3aGF0IG5ldyBiaW5hcnkgZm9ybWF0IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQsIGFuZCBpZiBhbnkgc2VjdXJpdHkgb3B0aW9ucyBhcmUgaW4gcGxheS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5MTAsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMjo1Ni4zNjg2ODE3NzVaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2NjY4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9LY29uZmlnLmJpbmZtdFwiLFxuICBcIkZpcnN0TGluZVwiOiAxNjUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNjU6XFx0XFx0XFx0bW91bnQgYmluZm10X21pc2MgLXQgYmluZm10X21pc2MgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjXFxuIDE2NjpcXHRcXG4gMTY3OlxcdFxcdCAgWW91IG1heSBzYXkgTSBoZXJlIGZvciBtb2R1bGUgc3VwcG9ydCBhbmQgbGF0ZXIgbG9hZCB0aGUgbW9kdWxlIHdoZW5cXG4gMTY4OlxcdFxcdCAgeW91IGhhdmUgdXNlIGZvciBpdDsgdGhlIG1vZHVsZSBpcyBjYWxsZWQgYmluZm10X21pc2MuIElmIHlvdVxcbiAxNjk6XFx0XFx0ICBkb24ndCBrbm93IHdoYXQgdG8gYW5zd2VyIGF0IHRoaXMgcG9pbnQsIHNheSBZLlxcbiAxNzA6XFx0XFxuIDE3MTpcXHRjb25maWcgQ09SRURVTVBcXG4gMTcyOlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFxcXCIgaWYgRVhQRVJUXFxuIDE3MzpcXHRcXHRkZWZhdWx0IHlcXG4gMTc0OlxcdFxcdGhlbHBcXG4gMTc1OlxcdFxcdCAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBwZXJmb3JtaW5nIGNvcmUgZHVtcHMuIFlvdSBhbG1vc3RcXG4gMTc2OlxcdFxcdCAgY2VydGFpbmx5IHdhbnQgdG8gc2F5IFkgaGVyZS4gTm90IG5lY2Vzc2FyeSBvbiBzeXN0ZW1zIHRoYXQgbmV2ZXJcXG4gMTc3OlxcdFxcdCAgbmVlZCBkZWJ1Z2dpbmcgb3Igb25seSBldmVyIHJ1biBmbGF3bGVzcyBjb2RlLlxcbiAxNzg6XFx0XFxuIDE3OTpcXHRjb25maWcgRVhFQ19LVU5JVF9URVNUXFxuIDE4MDpcXHRcXHRib29sIFxcXCJCdWlsZCBleGVjdmUgdGVzdHNcXFwiIGlmICFLVU5JVF9BTExfVEVTVFNcXG4gMTgxOlxcdFxcdGRlcGVuZHMgb24gS1VOSVQ9eVxcbiAxODI6XFx0XFx0ZGVmYXVsdCBLVU5JVF9BTExfVEVTVFNcXG4gMTgzOlxcdFxcdGhlbHBcXG4gMTg0OlxcdFxcdCAgVGhpcyBidWlsZHMgdGhlIGV4ZWMgS1VuaXQgdGVzdHMsIHdoaWNoIHRlc3RzIGJvdW5kYXJ5IGNvbmRpdGlvbnNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDI6NTYuMzY4NzUwNDY2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODU1MjI2MzUwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIEFzc2Vzc21lbnQgb2YgQ29yZSBEdW1wIENvbmZpZ3VyYXRpb24gYW5kIEltcGxlbWVudGF0aW9uKipcblxuT2theSwgc28gYENPUkVEVU1QYCBzZWVtcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBzY29wZSBvZiBpdHMgYmVoYXZpb3IsIHNvIEkgbmVlZCB0byBjaGVjayBmb3IgYW55IHJlbGF0ZWQgY29uZmlndXJhdGlvbnMuIEl0IGxvb2tzIGxpa2UgdGhlIG1haW4gY29kZSBpcyBzcHJlYWQgYWNyb3NzIGBmcy9jb3JlZHVtcC5jYCwgYGZzL2ZpbGUuY2AsIGFuZCBga2VybmVsL2V4aXQuY2AuIExldCdzIHNlZSBpZiB0aGVyZSdzIGFueXRoaW5nIHNwZWNpZmljIHRvIGNvbnRyb2wgdGhlIGNsb3Npbmcgb2YgZmlsZXMgZHVyaW5nIGEgY29yZSBkdW1wOyBpcyB0aGVyZSBzb21ldGhpbmcgbGlrZSBgQ09SRURVTVBfQ0xPU0VfRklMRVNgPyBOb3BlLCBpdCdzIGp1c3QgYSBzaW1wbGUgZmxhZy5cblxuTm93LCBJIHNob3VsZCBleGFtaW5lIHRoZSByZWxldmFudCBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBhbGwgd29ya3MuIEknbSBmb2N1c2luZyBvbiBgY29yZWR1bXBfY2xvc2VfZmlsZXNgLCBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AsIGBmaWxwX2Nsb3NlX3N5bmNgLCBgY29yZWR1bXBfc29ja19yZXF1ZXN0YCwgYW5kIGBkb19jb3JlZHVtcGAuXG5cbkknbGwgcXVpY2tseSB2ZXJpZnkgdGhlIHZpc2liaWxpdHkgb2YgdGhlc2UgZnVuY3Rpb25zLiBDaGVja2luZyBgZnMvZmlsZS5jYCwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCBhbmQgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgIGFyZSBub24tc3RhdGljLiBUaGVuLCBsb29raW5nIGF0IGBmcy9maWxlX3RhYmxlLmNgLCBgZmlscF9jbG9zZV9zeW5jYCBpcyBhbHNvIG5vbi1zdGF0aWMuIEFoYSwgaW4gYGZzL2NvcmVkdW1wLmNgLCBJIHNlZSBib3RoIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgIGFuZCBgZG9fY29yZWR1bXBgLiBXYWl0IGEgc2Vjb25k4oCmIGlzIGBkb19jb3JlZHVtcGAgc3RhdGljPyBJIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoYXQgbGFzdCBvbmUuIFRoaXMgbWlnaHQgYmUgaW1wb3J0YW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzQ5NiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM0MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjAzOjA0LjkyMTAxNTc5N1oiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDI1NDc1MTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZG9fY29yZWR1bXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvY29yZWR1bXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTExODk9c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NraXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIwMC1cXG5mcy9jb3JlZHVtcC5jOjEyMDE6c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuZnMvY29yZWR1bXAuYy0xMjAyLVxcdFxcdFxcdHNpemVfdCAqKmFyZ3YsIGludCAqYXJnYywgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxcbi0tXFxuZnMvY29yZWR1bXAuYz0xMjc5PXZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEzMTctXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3JlZClcXG5mcy9jb3JlZHVtcC5jOjEzMTg6XFx0XFx0ZG9fY29yZWR1bXAoXFx1MDAyNmNuLCBcXHUwMDI2Y3BybSwgXFx1MDAyNmFyZ3YsIFxcdTAwMjZhcmdjLCBiaW5mbXQpO1xcbmZzL2NvcmVkdW1wLmMtMTMxOS1cXHRjb3JlZHVtcF9jbGVhbnVwKFxcdTAwMjZjbiwgXFx1MDAyNmNwcm0pO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzowNC45NjM1NjUwMTVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzM3MTM3NjMyMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIENvcmUgRHVtcCBMb2dpYyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyBjb3JlIGR1bXBzIGFyZSBnZW5lcmF0ZWQgaW4gdGhpcyBzeXN0ZW0uIFRoZSBmdW5jdGlvbiBgZG9fY29yZWR1bXBgIGlzIGRlY2xhcmVkIGFzIGBzdGF0aWNgLCB3aGljaCBpbW1lZGlhdGVseSB0ZWxscyBtZSBpdCdzIGxpa2VseSBhbiBpbnRlcm5hbCB1dGlsaXR5IGZ1bmN0aW9uLCBwcm9iYWJseSBub3Qgc29tZXRoaW5nIGRpcmVjdGx5IGV4cG9zZWQuIFRoZSByZWFsIGVudHJ5IHBvaW50IGZvciB0aGUgY29yZSBkdW1wIGZ1bmN0aW9uYWxpdHkgaXMgYHZmc19jb3JlZHVtcGAuIFRoYXQncyB3aGVyZSB0aGUgYWN0aW9uICpzdGFydHMqLiBJIG5lZWQgdG8gZHJpbGwgaW50byBgdmZzX2NvcmVkdW1wYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQncyBkb2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTg0MzIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzowOC4zMzQ5NTAyOTVaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1NDQyNTkxMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2ZnNfY29yZWR1bXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvY29yZWR1bXAuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyNzgtXFxuZnMvY29yZWR1bXAuYzoxMjc5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuZnMvY29yZWR1bXAuYy0xMjgwLXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MDguNTg5MzgxMzY3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ3ODU3NDA5NjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKkFuYWx5emluZyBgdmZzX2NvcmVkdW1wYCBhbmQgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAqKlxuXG5SaWdodCwgbGV0IG1lIHNlZS4uLiBzbyBgdmZzX2NvcmVkdW1wYCBpcyAqbm90KiBhIHN0YXRpYyBmdW5jdGlvbiwgd2hpY2ggaW1tZWRpYXRlbHkgcmFpc2VzIGEgZmxhZy4gV2UgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBwb3RlbnRpYWwgc2NvcGUgYW5kIGltcGFjdC4gTm93LCBsZXQncyBjb250cmFzdCB0aGF0IHdpdGggYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgd2hpY2ggKmlzKiBzdGF0aWMuIFRoYXQncyBnb29kOyBpdCBzdWdnZXN0cyBhIG1vcmUgbGltaXRlZCBzY29wZSwgY29udGFpbmVkIHdpdGhpbiBhIHNwZWNpZmljIG1vZHVsZSBvciBmaWxlLiBUaGUgb2J2aW91cyBxdWVzdGlvbiBub3cgYmVjb21lczogSXMgdGhlcmUgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24gdGhhdCBkaXJlY3RseSBjYWxscyBgY29yZWR1bXBfc29ja19yZXF1ZXN0YD8gVGhhdCB3b3VsZCBiZSB0aGUgY3J1Y2lhbCBsaW5rIHRvIGlkZW50aWZ5LCB3b3VsZG4ndCBpdD8gQSBub24tc3RhdGljIGNhbGxlciBvZiBhIHN0YXRpYyBmdW5jdGlvbi4uLiBobW0uLi4gbmVlZCB0byB0cmFjZSB0aGF0IHBvdGVudGlhbCBwYXRoLiBUaGF0IGNvdWxkIGJlIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcsIHdvdWxkbid0IGl0P1xuXG5cbiIsIklucHV0VG9rZW5zIjoxODczMiwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjAzOjEzLjM3NTEyNDQxNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDYyNDkzMzI1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wX3NvY2tfcmVxdWVzdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9ODIxPXN0YXRpYyBpbmxpbmUgdm9pZCBjb3JlZHVtcF9zb2NrX3NodXRkb3duKHN0cnVjdCBmaWxlICpmaWxlKVxcbi0tXFxuZnMvY29yZWR1bXAuYy04MzItXFxuZnMvY29yZWR1bXAuYzo4MzM6c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbmZzL2NvcmVkdW1wLmMtODM0LXtcXG4tLVxcbmZzL2NvcmVkdW1wLmM9OTU0PXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtOTU4LVxcbmZzL2NvcmVkdW1wLmM6OTU5OlxcdHJldHVybiBjb3JlZHVtcF9zb2NrX3JlcXVlc3QoY24sIGNwcm0pO1xcbmZzL2NvcmVkdW1wLmMtOTYwLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MTMuODM3NjIxOTZaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDE4OTQxNDExOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaXQgc3RhbmRzOlxuXG4qKlN0YXRpYyBWYXJpYWJsZXMgYW5kIENhbGxlcnMqKlxuXG5Pa2F5LCBzbyBgY29yZWR1bXBfc29ja2V0YCBpcyBhbHNvIGRlY2xhcmVkIGFzIGBzdGF0aWNgLiBUaGF0IGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdC4gU3RhdGljIHZhcmlhYmxlcyBoYXZlIHNwZWNpZmljIHNjb3BpbmcgYW5kIGxpZmV0aW1lIGNoYXJhY3RlcmlzdGljcywgc28gdW5kZXJzdGFuZGluZyB0aGVpciB1c2FnZSBpcyBjcnVjaWFsLCBlc3BlY2lhbGx5IHdpdGhpbiBhIGNyaXRpY2FsIHBhcnQgb2YgdGhlIHN5c3RlbSBsaWtlIGEgY29yZWR1bXAgbWVjaGFuaXNtLiBNeSBuZXh0IGltbWVkaWF0ZSB0aG91Z2h0IGlzOiBXaGF0ICpleGFjdGx5KiBjYWxscyBgY29yZWR1bXBfc29ja2V0YD8gSSBuZWVkIHRvIHRyYWNlIGJhY2sgdGhlIHVzYWdlIHRvIHVuZGVyc3RhbmQgaXRzIHB1cnBvc2UgYW5kIGhvdyBpdCdzIGJlaW5nIG1hbmFnZWQuIFdobyBpcyBzZXR0aW5nIHVwIHRoaXMgc29ja2V0PyBXaGF0IGlzIHNlbmRpbmcgZGF0YSB0byBpdD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRyb2wgZmxvdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTkxOTMsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowMzoxOC4wMjcwMzg3MjlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQyNzc4OTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wX3NvY2tldFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmM9ODMzPXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtOTUzLVxcbmZzL2NvcmVkdW1wLmM6OTU0OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTk1NS17XFxuLS1cXG5mcy9jb3JlZHVtcC5jPTk2Mz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9XFxuZnMvY29yZWR1bXAuYzo5NjQ6c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSkgeyByZXR1cm4gZmFsc2U7IH1cXG5mcy9jb3JlZHVtcC5jLTk2NS0jZW5kaWZcXG4tLVxcbmZzL2NvcmVkdW1wLmM9MTIwMT1zdGF0aWMgdm9pZCBkb19jb3JlZHVtcChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIyMi1cXHRjYXNlIENPUkVEVU1QX1NPQ0s6XFxuZnMvY29yZWR1bXAuYzoxMjIzOlxcdFxcdGlmICghY29yZWR1bXBfc29ja2V0KGNuLCBjcHJtKSlcXG5mcy9jb3JlZHVtcC5jLTEyMjQtXFx0XFx0XFx0cmV0dXJuO1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xNjQ5PXZvaWQgdmFsaWRhdGVfY29yZWR1bXBfc2FmZXR5KHZvaWQpXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTE2NTktXFxuZnMvY29yZWR1bXAuYzoxNjYwOnN0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19jb3JlZHVtcF9zb2NrZXQodm9pZClcXG5mcy9jb3JlZHVtcC5jLTE2NjEte1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xNjk5PXN0YXRpYyBpbnQgcHJvY19kb3N0cmluZ19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLFxcbi0tXFxuZnMvY29yZWR1bXAuYy0xNzE0LVxcbmZzL2NvcmVkdW1wLmM6MTcxNTpcXHRpZiAoIWNoZWNrX2NvcmVkdW1wX3NvY2tldCgpKSB7XFxuZnMvY29yZWR1bXAuYy0xNzE2LVxcdFxcdHN0cnNjcHkoY29yZV9wYXR0ZXJuLCBvbGRfY29yZV9wYXR0ZXJuLCByZXR2YWwgKyAxKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDM6MTguMDY5ODIwMDA3WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc5OTI3NjM5NjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBzZWUgaXQ6XG5cbioqRGlnZ2luZyBpbnRvIHRoZSBDb3JlIER1bXAgRmxvdyoqXG5cbk9rYXksIHNvIEknbSB0cnlpbmcgdG8gdHJhY2UgdGhlIGNvcmUgZHVtcCBwcm9jZXNzLiBSaWdodCBub3csIEknbSB0aGlua2luZyBhYm91dCBob3cgYGRvX2NvcmVkdW1wYCBpcyBjb25uZWN0ZWQgdG8gYGNvcmVkdW1wX3NvY2tldGAsIHdoaWNoIGluIHR1cm4gY2FsbHMgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAuIElmIGBkb19jb3JlZHVtcGAgaXMgY2FsbGVkIGJ5IGB2ZnNfY29yZWR1bXBgLCB0aGVuIHRoYXQgc3VnZ2VzdHMgYHZmc19jb3JlZHVtcGAgaXMgcHJvYmFibHkgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IGRpZ2dpbmcgZGVlcGVyIGFuZCBmb2N1c2luZyBteSBpbnZlc3RpZ2F0aW9uLiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoYXQgZnVuY3Rpb24uIE15IG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIGNoZWNrIGBmaWxwX2Nsb3NlX3N5bmNgIGJlY2F1c2Ugb2YgbXkgZXhwZXJpZW5jZXMgd2l0aCByZXNvdXJjZSBjbGVhbnVwIGluIHRoaXMgYXJlYS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTk4NzEsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowNDozNy45OTc0NjIzMjVaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2MTIwNjk2NTQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmlscF9jbG9zZV9zeW5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2ZpbGUuYz01MDE9c3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXFxuLS1cXG5mcy9maWxlLmMtNTI2LVxcdFxcdFxcdFxcdFxcdGlmIChzeW5jKVxcbmZzL2ZpbGUuYzo1Mjc6XFx0XFx0XFx0XFx0XFx0XFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcXG5mcy9maWxlLmMtNTI4LVxcdFxcdFxcdFxcdFxcdGVsc2VcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYz02NDI9RVhQT1JUX1NZTUJPTChmaWxwX2Nsb3NlKTtcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYy02NDctICovXFxuZnMvZmlsZV90YWJsZS5jOjY0ODppbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxcbmZzL2ZpbGVfdGFibGUuYy02NDkte1xcbi0tXFxuZnMvaW50ZXJuYWwuaD0xMjE9c3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4tLVxcbmZzL2ludGVybmFsLmgtMTI5LVxcbmZzL2ludGVybmFsLmg6MTMwOmludCBmaWxwX2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpO1xcbmZzL2ludGVybmFsLmgtMTMxLXZvaWQgZnB1dF9jbG9zZShzdHJ1Y3QgZmlsZSAqKTtcXG4tLVxcbmZzL29wZW4uYz0xNDYxPVNZU0NBTExfREVGSU5FMShjbG9zZSwgdW5zaWduZWQgaW50LCBmZClcXG4tLVxcbmZzL29wZW4uYy0xNDczLVxcdCAqL1xcbmZzL29wZW4uYzoxNDc0OlxcdHJldHZhbCA9IGZpbHBfY2xvc2Vfc3luYyhmaWxlLCBjdXJyZW50LVxcdTAwM2VmaWxlcyk7XFxuZnMvb3Blbi5jLTE0NzUtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjA0OjM5LjYwOTUzODU0OVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NTE5NzQwMTY0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246XG5cbioqQW5hbHl6aW5nIGBmaWxwX2Nsb3NlX3N5bmNgIGFzIGEgS2V5IEZvY3VzKipcblxuQWxyaWdodCwgYmFzZWQgb24gdGhvc2UgcmVsYXRpb25zaGlwcywgaXQgbG9va3MgbGlrZSBgZmlscF9jbG9zZV9zeW5jYCBpcyBkZWZpbml0ZWx5IGEgY29yZSBmdW5jdGlvbiB0byB6ZXJvIGluIG9uLiBUaGUgZmFjdCB0aGF0IGl0J3MgY2FsbGVkIGJ5IGJvdGggYGNsb3NlX2ZpbGVzYCBhbmQgYHN5c19jbG9zZWAgbWFrZXMgaXQgYSBoaWdoLXZhbHVlIHN5bWJvbCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBmaWxlIGNsb3NpbmcgcHJvY2Vzcy4gS25vd2luZyB0aGF0LCBJIG5lZWQgdG8gY2hlY2sgaG93IGl0IHdvcmtzIHdpdGggYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYC4gSXQgcHJvYmFibHkgZGVhbHMgd2l0aCBzb21lIG9mIHRoZSBmaW5lciBkZXRhaWxzIGJ1dCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGF0IHJlbGF0aW9uc2hpcC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjA0NjUsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowNTo1NC44MDY5NDI2NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQ2ODM0MjIyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb3JlZHVtcF9jbG9zZV9maWxlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyMzQtXFxuZnMvY29yZWR1bXAuYzoxMjM1OlxcdGlmICgoY3BybS1cXHUwMDNlbWFzayBcXHUwMDI2IENPUkVEVU1QX0NMT1NFX0ZJTEVTKSBcXHUwMDI2XFx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xcbmZzL2NvcmVkdW1wLmMtMTIzNi1cXHRcXHRjb3JlZHVtcF9yZXBvcnRfZmFpbHVyZShcXFwiRmFpbGVkIHRvIGNsb3NlIGZpbGVzLCBhYm9ydGluZyBjb3JlXFxcIik7XFxuLS1cXG5mcy9maWxlLmM9NTcxPXZvaWQgZXhpdF9maWxlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmZzL2ZpbGUuYy01ODEtICovXFxuZnMvZmlsZS5jOjU4Mjpib29sIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKHZvaWQpXFxuZnMvZmlsZS5jLTU4My17XFxuLS1cXG5mcy9maWxlLmM9NjI4PWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuLS1cXG5mcy9maWxlLmMtNjMyLVxcbmZzL2ZpbGUuYzo2MzM6XFx0LyogUGFpcnMgd2l0aCB0aGUgcmVsZWFzZSBpbiBjb3JlZHVtcF9jbG9zZV9maWxlcygpLiAqL1xcbmZzL2ZpbGUuYy02MzQtXFx0ZmlsZXMgPSBzbXBfbG9hZF9hY3F1aXJlKFxcdTAwMjZzZWxmLVxcdTAwM2VmaWxlcyk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaD0xMDQ9dm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZzKTtcXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaDoxMDU6Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcXG5pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaC0xMDYtYm9vbCBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKHN0cnVjdCBjb3JlX3RocmVhZCAqc2VsZik7XFxuLS1cXG5rZXJuZWwvZXhpdC5jPTQzMD1zdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuLS1cXG5rZXJuZWwvZXhpdC5jLTQ1MS1cXHRcXHRcXHRicmVhaztcXG5rZXJuZWwvZXhpdC5jOjQ1MjpcXHRcXHQvKiBzZWUgY29yZWR1bXBfY2xvc2VfZmlsZXMoKSAqL1xcbmtlcm5lbC9leGl0LmMtNDUzLVxcdFxcdGlmIChjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzKFxcdTAwMjZzZWxmKSlcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTQ9VEVTVF9HRU5fUFJPR1MgOj0gc3RhY2tkdW1wX3Rlc3QgXFxcXFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUtNi1cXHRcXHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXFxcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZTo3OlxcdFxcdCAgY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlLTgtVEVTVF9GSUxFUyA6PSBzdGFja2R1bXBcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlPTE0PSQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZToxNTokKE9VVFBVVCkvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDU6NTYuMjc1Mjg4NjA4WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE0NDcyOTYyOTE0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIGlmIEkgd2VyZSB0aGlua2luZyB0aGVzZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgQ29yZSBEdW1wIEZpbGUgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gaG9uaW5nIGluIG9uIHRoZSBjcnVjaWFsIGFyZWFzIGZvciBmaWxlIGhhbmRsaW5nIHdpdGhpbiB0aGUgY29yZSBkdW1wIHByb2Nlc3MuIGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYCBhcmUgZGVmaW5pdGVseSBrZXkgZm9jdXMgcG9pbnRzLiBUaG9zZSBmdW5jdGlvbiBuYW1lcyBzY3JlYW0gXCJmaWxlIGNsZWFudXAsXCIgd2hpY2ggaXMgZXhhY3RseSB3aGF0IEkgbmVlZCB0byB1bmRlcnN0YW5kIGJldHRlci4gTm93LCBJIHNob3VsZCBzaGlmdCBteSBhdHRlbnRpb24gdG8gdGhlIGFsbG9jYXRpb24gc2lkZSBvZiB0aGluZ3MuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgZmlsZSBzdHJ1Y3R1cmVzIGFyZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZC4gTGV0J3MgZGlnIGludG8gYGFsbG9jX2ZpbGVzX3N0cnVjdGAgYW5kIGBhbGxvY19maWxlc2AuIFVuZGVyc3RhbmRpbmcgdGhlIGFsbG9jYXRpb24gcHJvY2VzcyB3aWxsIHRlbGwgbWUgYSBsb3QgYWJvdXQgaG93IHRoZXNlIGZpbGUgaGFuZGxlcyBhcmUgbWFuYWdlZCBmcm9tIHRoZSB2ZXJ5IHN0YXJ0LiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgcGljdHVyZSBvZiB0aGUgZW50aXJlIGxpZmVjeWNsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjEzMzYsIk91dHB1dFRva2VucyI6MTcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODoyMS4wMDQ5MjAyNzhaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NTg3NjQyMjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYWxsb2NfZmlsZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmlsZS5jPTM2ND1zdGF0aWMgdW5zaWduZWQgaW50IHNhbmVfZmR0YWJsZV9zaXplKHN0cnVjdCBmZHRhYmxlICpmZHQsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcXG4tLVxcbmZzL2ZpbGUuYy0zNzgtLyogQSB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UgYW5kIHRoZSBlbWJlZGRlZCBmZHRhYmxlLCBub3RoaW5nIGNvcGllZCB5ZXQuICovXFxuZnMvZmlsZS5jOjM3OTpzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxcbmZzL2ZpbGUuYy0zODAte1xcbi0tXFxuZnMvZmlsZS5jLTQwNC0vKiBBbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZS4gKi9cXG5mcy9maWxlLmM6NDA1OnN0YXRpYyBzdHJ1Y3QgZmlsZXNfc3RydWN0ICphbGxvY19maWxlc19zdHJ1Y3Qodm9pZClcXG5mcy9maWxlLmMtNDA2LXtcXG4tLVxcbmZzL2ZpbGUuYy00MDgtXFxuZnMvZmlsZS5jOjQwOTpcXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xcbmZzL2ZpbGUuYy00MTAtXFx0aWYgKCFuZXdmKVxcbi0tXFxuZnMvZmlsZS5jPTQyMj1zdHJ1Y3QgZmlsZXNfc3RydWN0ICpkdXBfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqb2xkZiwgc3RydWN0IGZkX3JhbmdlICpwdW5jaF9ob2xlKVxcbi0tXFxuZnMvZmlsZS5jLTQyOC1cXG5mcy9maWxlLmM6NDI5OlxcdG5ld2YgPSBhbGxvY19maWxlcyhHRlBfS0VSTkVMKTtcXG5mcy9maWxlLmMtNDMwLVxcdGlmICghbmV3ZilcXG4tLVxcbmZzL2ZpbGUuYz01ODI9Ym9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxcbi0tXFxuZnMvZmlsZS5jLTU4OC1cXG5mcy9maWxlLmM6NTg5OlxcdGZpbGVzID0gYWxsb2NfZmlsZXNfc3RydWN0KCk7XFxuZnMvZmlsZS5jLTU5MC1cXHRpZiAoIWZpbGVzKVxcbi0tXFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jPTM1MzI9c3RhdGljIGludFxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYzozNTMzOnhmc19ibWFwX2J0YWxsb2NfZmlsZXN0cmVhbXMoXFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM1MzQtXFx0c3RydWN0IHhmc19ibWFsbG9jYVxcdCphcCxcXG4tLVxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYz0zNjI1PXhmc19ibWFwX2J0YWxsb2MoXFxuLS1cXG5mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMtMzY1OC1cXHRcXHRcXHR4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC1cXHUwMDNlaXApKVxcbmZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYzozNjU5OlxcdFxcdGVycm9yID0geGZzX2JtYXBfYnRhbGxvY19maWxlc3RyZWFtcyhhcCwgXFx1MDAyNmFyZ3MsIHN0cmlwZV9hbGlnbik7XFxuZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jLTM2NjAtXFx0ZWxzZVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODoyMi40NjM2ODgyMDVaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUyMDE0NDU1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqQW5hbHl6aW5nIEZpbGUgQWxsb2NhdGlvbiBTdHJ1Y3R1cmVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhlc2UgZmlsZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4gSSBzZWUgYGFsbG9jX2ZpbGVzYCBhbmQgYGFsbG9jX2ZpbGVzX3N0cnVjdGAgZGVmaW5lZCBhcyBgc3RhdGljYC4gUmlnaHQsIHRoYXQgbWVhbnMgdGhleSdyZSBvbmx5IHZpc2libGUgd2l0aGluIHRoaXMgY29tcGlsYXRpb24gdW5pdC4gVGhhdCdzIGdvb2QgdG8ga2VlcCBpbiBtaW5kLCBpdCBsaW1pdHMgdGhlaXIgc2NvcGUgd2hpY2ggaXMgdXN1YWxseSBhIHBvc2l0aXZlIHNpZ24gZm9yIG1vZHVsYXJpdHkuIE5vdywgbGV0IG1lIHNoaWZ0IG15IGZvY3VzIHRvIGBzd2l0Y2hfZmlsZXNfc3RydWN0YC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZXNlIG90aGVyIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4gSXQncyBsaWtlbHkgdGhhdCBpdCBoYXMgYSByb2xlIGluIG1hbmFnaW5nIG9yIG1hbmlwdWxhdGluZyB0aGUgZmlsZSBzdHJ1Y3R1cmUgaW4gc29tZSB3YXksIGFuZCBpdHMgcmVsYXRpb25zaGlwIHRvIGBhbGxvY19maWxlc2AgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZC4gVGltZSB0byBkZWx2ZSBpbnRvIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMjA2LCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MjUuOTgzODM0OTE0WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzkzNDcwMjA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN3aXRjaF9maWxlc19zdHJ1Y3RcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZmlsZS5jPTU0MT12b2lkIHB1dF9maWxlc19zdHJ1Y3Qoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMpXFxuLS1cXG5mcy9maWxlLmMtNTUzLS8qIEhhbmQgQHRzayB0aGUgdGFibGUgQGZpbGVzLCBvciBub25lLCBhbmQgZHJvcCB0aGUgb25lIGl0IGhhZC4gKi9cXG5mcy9maWxlLmM6NTU0OnN0YXRpYyB2b2lkIHN3aXRjaF9maWxlc19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXFxuZnMvZmlsZS5jLTU1NS1cXHRcXHRcXHRcXHRzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcylcXG4tLVxcbmZzL2ZpbGUuYz01NzE9dm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxcbi0tXFxuZnMvZmlsZS5jLTU3NC1cXHRcXHRyZXR1cm47XFxuZnMvZmlsZS5jOjU3NTpcXHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XFxuZnMvZmlsZS5jLTU3Ni19XFxuLS1cXG5mcy9maWxlLmM9NTgyPWJvb2wgY29yZWR1bXBfY2xvc2VfZmlsZXModm9pZClcXG4tLVxcbmZzL2ZpbGUuYy02MDktXFx0c2NvcGVkX3dpdGhfY3JlZHMoY3VycmVudF9yZWFsX2NyZWQoKSlcXG5mcy9maWxlLmM6NjEwOlxcdFxcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xcbmZzL2ZpbGUuYy02MTEtXFxuLS1cXG5mcy9maWxlLmM9NjI4PWJvb2wgY29yZWR1bXBfdGFza19jbG9zZV9maWxlcyhzdHJ1Y3QgY29yZV90aHJlYWQgKnNlbGYpXFxuLS1cXG5mcy9maWxlLmMtNjM4LVxcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcXG5mcy9maWxlLmM6NjM5OlxcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xcbmZzL2ZpbGUuYy02NDAtXFx0Y29yZV9zdGF0ZSA9IGN1cnJlbnQtXFx1MDAzZXNpZ25hbC1cXHUwMDNlY29yZV9zdGF0ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MjcuMzc3MzA5MDhaIiwiU2VxIjoyNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjI5MDk0NTcyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGb2N1cyBTeW1ib2wgUmVmaW5lbWVudCoqXG5cbk9rYXksIGxldCdzIG5haWwgZG93biB0aGVzZSBmb2N1cyBzeW1ib2xzLiBJJ3ZlIGdvdCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgbG9ja2VkIGluIGFzIHN0YXRpYywgc28gdGhhdCdzIG9mZiB0aGUgdGFibGUuIE5vdywgdGhlIG5vbi1zdGF0aWMgZnVuY3Rpb25zIGFyZSB0aGUgb25lcyBJIG5lZWQgdG8gZXhhbWluZTogYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgLCBgZmlscF9jbG9zZV9zeW5jYCwgYW5kIGB2ZnNfY29yZWR1bXBgLlxuXG5SaWdodCwgbGV0J3MgcmV2aXNpdCBgZmlscF9jbG9zZV9zeW5jYC4gSGFuZyBvbi4uLiBpdCdzIGNhbGxlZCBieSBgc3lzX2Nsb3NlYD8gVGhhdCdzIGEgKnZlcnkqIGhvdCBwYXRoLiBJIG5lZWQgdG8gYmUgY2FyZWZ1bDsgdGhhdCdzIHByb2JhYmx5IG5vdCBpZGVhbCBhcyBhIGZvY3VzIHN5bWJvbC4gVGhlIGtlcm5lbCBzZWVzIGEgdG9uIG9mIGBzeXNfY2xvc2VgIGNhbGxzLiBZZXAsIGByZXR2YWwgPSBmaWxwX2Nsb3NlX3N5bmMoZmlsZSwgY3VycmVudC1cdTAwM2VmaWxlcyk7YCBpbiBgc3lzX2Nsb3NlYCBjb25maXJtcyBpdC4gIFNvLCBzY3JhcCBgZmlscF9jbG9zZV9zeW5jYCBmcm9tIHRoZSBsaXN0OyBpdCdzIHRvbyBnZW5lcmljIGFuZCBoaWdoLWZyZXF1ZW5jeS5cblxuTm93LCB3aGF0IGFib3V0IGBjb3JlZHVtcF9jbG9zZV9maWxlc2AgYW5kIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYD8gVGhvc2UgYXJlIHNwZWNpZmljIHRvIGNvcmVkdW1wIGZ1bmN0aW9uYWxpdHksIHJpZ2h0PyBOb3QgYSBzdGFuZGFyZCBwYXRoLiBUaGF0IGxvb2tzIGdvb2QuIEFuZCBgdmZzX2NvcmVkdW1wYCBpcyBzaW1pbGFybHkgbmljaGUuIFRoYXQncyBnb29kIHRvby5cblxuQXJlIHRoZXJlIGFueSBvdGhlciBvdXRsaWVycz8gIGBmaWxwX2Nsb3NlYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgYnV0IGl0IGxvb2tzIGxpa2UgYSBob3QgcGF0aCAob3IgYXQgbGVhc3QgZ2VuZXJpYykuIEFuZCBgZHVwX2ZkYCBpcyBtb2RpZmllZCBidXQgaXQncyB1c2VkIGluIGZvcmssIG5vdCBhIGZvY3VzLlxuXG5Pa2F5LCBJIHRoaW5rIHdlJ3ZlIGdvdCBpdC4gVGhlIGZvY3VzIHN5bWJvbHMsIGdpdmVuIHRoZSBhbmFseXNpcywgc2hvdWxkIGJlOlxuXG4qICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYFxuKiAgIGBjb3JlZHVtcF90YXNrX2Nsb3NlX2ZpbGVzYFxuKiAgIGB2ZnNfY29yZWR1bXBgXG5cbkknbGwgZG91YmxlLWNoZWNrIGB2ZnNfY29yZWR1bXBgIG9uZSBtb3JlIHRpbWUsIGp1c3QgdG8gYmUgc3VyZS4gSXQgZG9lcyBzZWVtIHVuaXF1ZSB0byB0aGUgY29yZWR1bXAgdXNlIGNhc2UuIEV4Y2VsbGVudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI4MDMsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MzMuNjY4MjU3MjIxWiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDM4MTkyNTk2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInZmc19jb3JlZHVtcFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJEb2N1bWVudGF0aW9uL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdD01NTU9ZGlmZmVyZW50IHNldCBvZiBjcmVkZW50aWFscy4gIFRoaXMgaXMgZG9uZSBpbiB0aGUgZm9sbG93aW5nIHBsYWNlczpcXG4tLVxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0LTU1Ny0gKiBgYHN5c19mYWNjZXNzYXQoKWBgLlxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvY3JlZGVudGlhbHMucnN0OjU1ODogKiBgYHZmc19jb3JlZHVtcCgpYGAuXFxuRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNTU5LSAqIG5mczRyZWNvdmVyLmMuXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q9MjU0PWNvbnN05oyH6ZKI5LiK5pON5L2c77yM5Zug5q2k5LiN6ZyA6KaB6L+b6KGM57G75Z6L6L2s5o2i77yM5L2G6ZyA6KaB5Li05pe25pS+5byDY29uc3TpmZDlrprvvIzku6Xkvr/og73lpJ/kv67mlLlcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2NyZWRlbnRpYWxzLnJzdC00NzctICogYGBzeXNfZmFjY2Vzc2F0KClgYC5cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3Q6NDc4OiAqIGBgdmZzX2NvcmVkdW1wKClgYC5cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9jcmVkZW50aWFscy5yc3QtNDc5LSAqIG5mczRyZWNvdmVyLmMuXFxuLS1cXG5mcy9jb3JlZHVtcC5jPTEyMDE9c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEyNzgtXFxuZnMvY29yZWR1bXAuYzoxMjc5OnZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuZnMvY29yZWR1bXAuYy0xMjgwLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaD02Nz1ib29sIGR1bXBfdXNlcl9yYW5nZShzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LFxcbmluY2x1ZGUvbGludXgvY29yZWR1bXAuaC02OC1cXHRcXHQgICAgIHVuc2lnbmVkIGxvbmcgbGVuKTtcXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmg6Njk6dm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbyk7XFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTcwLVxcbi0tXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oLTg4LSNlbHNlXFxuaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oOjg5OnN0YXRpYyBpbmxpbmUgdm9pZCB2ZnNfY29yZWR1bXAoY29uc3Qga2VybmVsX3NpZ2luZm9fdCAqc2lnaW5mbykge31cXG5pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgtOTAtXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmM9MjgxMD1ib29sIGdldF9zaWduYWwoc3RydWN0IGtzaWduYWwgKmtzaWcpXFxuLS1cXG5rZXJuZWwvc2lnbmFsLmMtMzAzMC1cXHRcXHRcXHQgKi9cXG5rZXJuZWwvc2lnbmFsLmM6MzAzMTpcXHRcXHRcXHR2ZnNfY29yZWR1bXAoXFx1MDAyNmtzaWctXFx1MDAzZWluZm8pO1xcbmtlcm5lbC9zaWduYWwuYy0zMDMyLVxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6MzUuMTA2NDU0MDA3WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwODczMzMwNjQyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZlYXR1cmUqKlxuXG5Pa2F5LCBzbyBgdmZzX2NvcmVkdW1wYCDigJMgdGhhdCdzIGRlZmluaXRlbHkgYSBnb29kIHN0YXJ0aW5nIHBvaW50IGZvciBmdXp6aW5nLCBpdCdzIGNhbGxlZCB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBzbyB3ZSBoYXZlIGEgY2xlYXIgdHJpZ2dlci4gTGV0J3Mgc2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgY29uZmlncyByZWxhdGVkIHRvIHRoaXMgYXJlYS4gSXQgbG9va3MgbGlrZSBgQ09SRURVTVBgIGlzIHRoZSBvbmx5IG9uZS4gSG1tLCBpdCdzIGVuYWJsZWQgYnkgZGVmYXVsdCwgd2hpY2ggaXMgY29udmVuaWVudCwgYW5kIHRoaXMgaXMgdGhlIGNvbmZpZyB0aGF0IGVuYWJsZXMgdGhlIGZlYXR1cmUsIHNvIHllcywgd2Ugc2hvdWxkIGluY2x1ZGUgaXQuXG5cbk5vdywgd2hlcmUgZWxzZSBhcmUgdGhlIGNoYW5nZXM/IFRoZSBjaGFuZ2VzIGFyZSBtYWlubHkgYXJvdW5kIGZpbGUgZGVzY3JpcHRvciBtYW5hZ2VtZW50LiBJJ20gc2VlaW5nIGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucyBpbiBzZXZlcmFsIGZpbGVzOiBgZnMvZmlsZV90YWJsZS5jYCAod2l0aCBgZmlscF9jbG9zZWAgYW5kIGBmaWxwX2Nsb3NlX3N5bmNgKSwgYGZzL29wZW4uY2AgKHdpdGggYHN5c19jbG9zZWAgdXNpbmcgYGZpbHBfY2xvc2Vfc3luY2ApLCBhbmQgYGZzL2ZpbGUuY2AgKHdpdGggYSBidW5jaCBvZiBuZXcgZnVuY3Rpb25zIGxpa2UgYGFsbG9jX2ZpbGVzYCwgYGFsbG9jX2ZpbGVzX3N0cnVjdGAsIGBkdXBfZmRgLCBgY2xvc2VfZmlsZXNgLCBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAsIGBleGl0X2ZpbGVzYCwgYW5kIHNwZWNpZmljYWxseSwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYCwgYGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNgKS4gYGZzL2NvcmVkdW1wLmNgIGFsc28gaGFzIG5ldyBmdW5jdGlvbnMgbGlrZSBgY29yZWR1bXBfd2FpdGAsIGBjb3JlZHVtcF9zb2NrX3JlcXVlc3RgLCBhbmQgYGRvX2NvcmVkdW1wYC4gRmluYWxseSwgYGtlcm5lbC9leGl0LmNgIGhhcyBgY29yZWR1bXBfdGFza19leGl0YC5cblxuWWVzLCB0aGlzIGlzIGZ1bmN0aW9uYWxseSBzaWduaWZpY2FudC4gVGhlIGNvcmVkdW1wIGZlYXR1cmUgaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBJdCdzIHJlYWNoYWJsZSB3aGVuIGEgcHJvY2VzcyBjcmFzaGVzLCBzcGVjaWZpY2FsbHkgaWYgdGhlIGNvcmVkdW1wIHBhdHRlcm4gaXMgc2V0IHRvIGEgcGlwZSBvciBzb2NrZXQuIFRoZW4gdGhlIHVzZXJzcGFjZSBoYW5kbGVyIHdvdWxkIHJlcGx5IHdpdGggYENPUkVEVU1QX0NMT1NFX0ZJTEVTYC4gVGhpcyBzaG91bGQgYmUgZWFzaWx5IHJlcHJvZHVjaWJsZSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuXG5cblNvLCBoZXJlJ3MgdGhlIHN1bW1hcnk6XG5cbiogICAqKldvcnRoRnV6emluZyoqOiBUcnVlXG4qICAgKipGb2N1c1N5bWJvbHMqKjpcbiAgICAqICAgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzYFxuICAgICogICBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2BcbiAgICAqICAgYHZmc19jb3JlZHVtcGBcbiogICAqKkVuYWJsZUNvbmZpZ3MqKjpcbiAgICAqICAgYENPUkVEVU1QYFxuXG5MZXQncyBjaGVjayBgQ09SRURVTVBgIGZvciBkZXBlbmRlbmNpZXMuIEl0J3MgYSBib29sZWFuIG9wdGlvbiBjb250cm9sbGVkIGJ5IGBFWFBFUlRgLiBCdXQgaXQgZG9lc24ndCAqZGVwZW5kKiBvbiBleHBlcnQgbW9kZSwgaXQganVzdCAqc2hvd3MqIHRoZSBwcm9tcHQgaW4gZXhwZXJ0IG1vZGUuIFNvIGBDT1JFRFVNUGAgaXMgZmluZSBhcy1pcy5cblxuTG9va2luZyBiYWNrIGF0IHRoZSByZWFzb25pbmcuLi4gdGhlIHBhdGNoIGVzc2VudGlhbGx5IGFkZHMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gVGhpcyBhbGxvd3MgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXJzIHRvIGluc3RydWN0IHRoZSBrZXJuZWwgdG8gY2xvc2UgYWxsIHRoZSBmaWxlIGRlc2NyaXB0b3JzIG9mIGEgY3Jhc2hpbmcgdGFzayAqYmVmb3JlKiBkdW1waW5nIHRoZSBjb3JlLiBUaGlzIGludHJvZHVjZXMgbmV3IGxvZ2ljIGZvciBmaWxlIGRlc2NyaXB0b3IgdGFibGUgbWFuaXB1bGF0aW9uIGFuZCBjbG9zaW5nIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AuIFdlIGNhbiB0cmlnZ2VyIHRoaXMgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgaGFuZGxlciByZXR1cm4gdGhlIGZsYWcuXG5cbk9rYXksIEknbSBzYXRpc2ZpZWQuIFRpbWUgdG8gY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDEzNSwiT3V0cHV0VG9rZW5zIjoxODAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1ODgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDUuOTc5Nzg3NTY5WiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM3OTk0MDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNPUkVEVU1QXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiY29yZWR1bXBfY2xvc2VfZmlsZXNcIixcbiAgICBcImNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXNcIixcbiAgICBcInZmc19jb3JlZHVtcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYENPUkVEVU1QX0NMT1NFX0ZJTEVTYCBmbGFnIHRvIHRoZSBjb3JlZHVtcCBwcm90b2NvbC4gV2hlbiBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcXVlc3RzIHRoaXMgZmxhZywgdGhlIGtlcm5lbCBjbG9zZXMgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNvcmVkdW1waW5nIHRhc2sgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGNvcmVkdW1wLiBUaGlzIGludm9sdmVzIG5ldyBjb3JlIGtlcm5lbCBsb2dpYyBpbiBgZnMvZmlsZS5jYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGhhbmRsZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgc3dpdGNoaW5nIGFuZCBjbG9zaW5nLiBUaGUgZmVhdHVyZSBpcyByZWFjaGFibGUgYnkgY3Jhc2hpbmcgYSBwcm9jZXNzIGFuZCBoYXZpbmcgYSB1c2Vyc3BhY2UgY29yZWR1bXAgaGFuZGxlciByZXBseSB3aXRoIHRoZSBuZXcgZmxhZywgbWFraW5nIGl0IGZ1bmN0aW9uYWxseSBpbXBhY3RmdWwgYW5kIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ09SRURVTVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJjb3JlZHVtcF9jbG9zZV9maWxlc1wiLFxuICAgIFwiY29yZWR1bXBfdGFza19jbG9zZV9maWxlc1wiLFxuICAgIFwidmZzX2NvcmVkdW1wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgQ09SRURVTVBfQ0xPU0VfRklMRVNgIGZsYWcgdG8gdGhlIGNvcmVkdW1wIHByb3RvY29sLiBXaGVuIGEgdXNlcnNwYWNlIGNvcmVkdW1wIGhhbmRsZXIgcmVxdWVzdHMgdGhpcyBmbGFnLCB0aGUga2VybmVsIGNsb3NlcyBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29yZWR1bXAuIFRoaXMgaW52b2x2ZXMgbmV3IGNvcmUga2VybmVsIGxvZ2ljIGluIGBmcy9maWxlLmNgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gaGFuZGxlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBzd2l0Y2hpbmcgYW5kIGNsb3NpbmcuIFRoZSBmZWF0dXJlIGlzIHJlYWNoYWJsZSBieSBjcmFzaGluZyBhIHByb2Nlc3MgYW5kIGhhdmluZyBhIHVzZXJzcGFjZSBjb3JlZHVtcCBoYW5kbGVyIHJlcGx5IHdpdGggdGhlIG5ldyBmbGFnLCBtYWtpbmcgaXQgZnVuY3Rpb25hbGx5IGltcGFjdGZ1bCBhbmQgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDYuMDUzNTkyODRaIiwiU2VxIjoyOSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNTU3NjE3MDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjRUMTg6MDg6NDYuMDU0MDE1NTRaIiwiU2VxIjozMCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6MTA1NTcxOTEyNjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwOTU3ZDAwMGI0NWVhNDY5Y2YyMzRlN2NhZDRjNTcwNTFlYzU0NzE2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMjQgMTc6NTc6MDQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9jb3JlZHVtcC5jIGIvZnMvY29yZWR1bXAuY1xuaW5kZXggZWM5MzU5ZTM4MmVhNS4uYTZlN2RhMGJjMTZhNyAxMDA2NDRcbi0tLSBhL2ZzL2NvcmVkdW1wLmNcbisrKyBiL2ZzL2NvcmVkdW1wLmNcbkBAIC01MjMsNyArNTIzLDcgQEAgc3RhdGljIGludCBjb3JlZHVtcF93YWl0KGludCBleGl0X2NvZGUsIHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlKVxuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50O1xuIFx0aW50IGNvcmVfd2FpdGVycyA9IC1FQlVTWTtcbiBcbi1cdGluaXRfY29tcGxldGlvbihcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZXN0YXJ0dXApO1xuK1x0aW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4gXHRjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci50YXNrID0gdHNrO1xuIFx0Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dCA9IE5VTEw7XG4gXG5AQCAtNTMxLDcgKzUzMSw3IEBAIHN0YXRpYyBpbnQgY29yZWR1bXBfd2FpdChpbnQgZXhpdF9jb2RlLCBzdHJ1Y3QgY29yZV9zdGF0ZSAqY29yZV9zdGF0ZSlcbiBcdGlmIChjb3JlX3dhaXRlcnMgXHUwMDNlIDApIHtcbiBcdFx0c3RydWN0IGNvcmVfdGhyZWFkICpwdHI7XG4gXG4tXHRcdHdhaXRfZm9yX2NvbXBsZXRpb25fc3RhdGUoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VzdGFydHVwLFxuK1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbiBcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdC8qXG4gXHRcdCAqIFdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBiZWNvbWUgaW5hY3RpdmUsIHNvIHRoYXRcbkBAIC04MzcsNyArODM3LDggQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19yZXF1ZXN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdFx0Lm1hc2tcdFx0XHQ9IENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XG4gXHRcdFx0XHRcdCAgQ09SRURVTVBfUkVKRUNUIHwgQ09SRURVTVBfV0FJVCB8XG4gXHRcdFx0XHRcdCAgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8XG4tXHRcdFx0XHRcdCAgQ09SRURVTVBfTUVNT1JZX1RZUEVTLFxuK1x0XHRcdFx0XHQgIENPUkVEVU1QX01FTU9SWV9UWVBFUyB8XG4rXHRcdFx0XHRcdCAgQ09SRURVTVBfQ0xPU0VfRklMRVMsXG4gXHRcdC5zaXplX2Fja1x0XHQ9IHNpemVvZihzdHJ1Y3QgY29yZWR1bXBfYWNrKSxcbiBcdFx0Lm1lbW9yeV90eXBlc1x0XHQ9IGNwcm0tXHUwMDNlbWVtb3J5X3R5cGVzLFxuIFx0XHQubWVtb3J5X3R5cGVzX21hc2tcdD0gQ09SRURVTVBfTUVNT1JZX0FMTCxcbkBAIC05MDUsNiArOTA2LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcdH1cbiBcbitcdC8qIEEgcmVqZWN0ZWQgdGFzayBleGl0cyByaWdodCBhd2F5IGFuZCBjbG9zZXMgZXZlcnl0aGluZyBhbnl3YXkuICovXG4rXHRpZiAoKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9DTE9TRV9GSUxFUykgXHUwMDI2XHUwMDI2IChhY2subWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKSkge1xuK1x0XHRjb3JlZHVtcF9zb2NrX21hcmsoY3BybS1cdTAwM2VmaWxlLCBDT1JFRFVNUF9NQVJLX0NPTkZMSUNUSU5HKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuIFx0aWYgKGFjay5tYXNrIFx1MDAyNiBDT1JFRFVNUF9NRU1PUllfVFlQRVMpIHtcbiBcdFx0LyogVGhlIG1lbW9yeSB0eXBlcyBuZWVkIHRoZSB3aG9sZSBmaWVsZC4gKi9cbiBcdFx0aWYgKHVzaXplIFx1MDAzYyBDT1JFRFVNUF9BQ0tfU0laRV9WRVIxKSB7XG5AQCAtMTIyNSw2ICsxMjMyLDExIEBAIHN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuIFx0aWYgKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfUkVKRUNUKVxuIFx0XHRyZXR1cm47XG4gXG4rXHRpZiAoKGNwcm0tXHUwMDNlbWFzayBcdTAwMjYgQ09SRURVTVBfQ0xPU0VfRklMRVMpIFx1MDAyNlx1MDAyNiAhY29yZWR1bXBfY2xvc2VfZmlsZXMoKSkge1xuK1x0XHRjb3JlZHVtcF9yZXBvcnRfZmFpbHVyZShcIkZhaWxlZCB0byBjbG9zZSBmaWxlcywgYWJvcnRpbmcgY29yZVwiKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuIFx0LyogZ2V0IHVzIGFuIHVuc2hhcmVkIGRlc2NyaXB0b3IgdGFibGU7IGFsbW9zdCBhbHdheXMgYSBuby1vcCAqL1xuIFx0LyogVGhlIGNlbGwgc3B1ZnMgY29yZWR1bXAgY29kZSByZWFkcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRhYmxlcyAqL1xuIFx0aWYgKHVuc2hhcmVfZmlsZXMoKSlcbmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmNcbmluZGV4IDYyOGNhMDdkYzRiMTcuLjNiOGZjZTZlMzY5NTEgMTAwNjQ0XG4tLS0gYS9mcy9maWxlLmNcbisrKyBiL2ZzL2ZpbGUuY1xuQEAgLTM3NSwyMSArMzc1LDE1IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2FuZV9mZHRhYmxlX3NpemUoc3RydWN0IGZkdGFibGUgKmZkdCwgc3RydWN0IGZkX3JhbmdlICpwdW5jXG4gXHRyZXR1cm4gQUxJR04obGFzdCArIDEsIEJJVFNfUEVSX0xPTkcpO1xuIH1cbiBcbi0vKlxuLSAqIEFsbG9jYXRlIGEgbmV3IGRlc2NyaXB0b3IgdGFibGUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0aGUgcGFzc2VkIGluXG4tICogaW5zdGFuY2UuICBSZXR1cm5zIGEgcG9pbnRlciB0byBjbG9uZWQgdGFibGUgb24gc3VjY2VzcywgRVJSX1BUUigpXG4tICogb24gZmFpbHVyZS4gIEZvciAncHVuY2hfaG9sZScgc2VlIHNhbmVfZmR0YWJsZV9zaXplKCkuXG4tICovXG4tc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9sZSlcbisvKiBBIHRhYmxlIHdpdGggb25lIHJlZmVyZW5jZSBhbmQgdGhlIGVtYmVkZGVkIGZkdGFibGUsIG5vdGhpbmcgY29waWVkIHlldC4gKi9cbitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqYWxsb2NfZmlsZXMoZ2ZwX3QgZ2ZwKVxuIHtcbiBcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4tXHRzdHJ1Y3QgZmlsZSAqKm9sZF9mZHMsICoqbmV3X2Zkcztcbi1cdHVuc2lnbmVkIGludCBvcGVuX2ZpbGVzLCBpO1xuLVx0c3RydWN0IGZkdGFibGUgKm9sZF9mZHQsICpuZXdfZmR0O1xuK1x0c3RydWN0IGZkdGFibGUgKm5ld19mZHQ7XG4gXG4tXHRuZXdmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIEdGUF9LRVJORUwpO1xuK1x0bmV3ZiA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBnZnApO1xuIFx0aWYgKCFuZXdmKVxuLVx0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbitcdFx0cmV0dXJuIE5VTEw7XG4gXG4gXHRhdG9taWNfc2V0KFx1MDAyNm5ld2YtXHUwMDNlY291bnQsIDEpO1xuIFxuQEAgLTQwNCw2ICszOTgsMzkgQEAgc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIHN0cnVjdCBmZF9yYW5nZSAqcHVuY2hfaG9cbiBcdG5ld19mZHQtXHUwMDNlZnVsbF9mZHNfYml0cyA9IG5ld2YtXHUwMDNlZnVsbF9mZHNfYml0c19pbml0O1xuIFx0bmV3X2ZkdC1cdTAwM2VmZCA9IFx1MDAyNm5ld2YtXHUwMDNlZmRfYXJyYXlbMF07XG4gXG4rXHRyZXR1cm4gbmV3Zjtcbit9XG4rXG4rLyogQW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZSB3aXRoIG9uZSByZWZlcmVuY2UuICovXG4rc3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmFsbG9jX2ZpbGVzX3N0cnVjdCh2b2lkKVxuK3tcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm5ld2Y7XG4rXG4rXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xuK1x0aWYgKCFuZXdmKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdHJjdV9hc3NpZ25fcG9pbnRlcihuZXdmLVx1MDAzZWZkdCwgXHUwMDI2bmV3Zi1cdTAwM2VmZHRhYik7XG4rXHRyZXR1cm4gbmV3Zjtcbit9XG4rXG4rLypcbisgKiBBbGxvY2F0ZSBhIG5ldyBkZXNjcmlwdG9yIHRhYmxlIGFuZCBjb3B5IGNvbnRlbnRzIGZyb20gdGhlIHBhc3NlZCBpblxuKyAqIGluc3RhbmNlLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gY2xvbmVkIHRhYmxlIG9uIHN1Y2Nlc3MsIEVSUl9QVFIoKVxuKyAqIG9uIGZhaWx1cmUuICBGb3IgJ3B1bmNoX2hvbGUnIHNlZSBzYW5lX2ZkdGFibGVfc2l6ZSgpLlxuKyAqL1xuK3N0cnVjdCBmaWxlc19zdHJ1Y3QgKmR1cF9mZChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpvbGRmLCBzdHJ1Y3QgZmRfcmFuZ2UgKnB1bmNoX2hvbGUpXG4re1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqbmV3ZjtcbitcdHN0cnVjdCBmaWxlICoqb2xkX2ZkcywgKipuZXdfZmRzO1xuK1x0dW5zaWduZWQgaW50IG9wZW5fZmlsZXMsIGk7XG4rXHRzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7XG4rXG4rXHRuZXdmID0gYWxsb2NfZmlsZXMoR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIW5ld2YpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xuK1x0bmV3X2ZkdCA9IFx1MDAyNm5ld2YtXHUwMDNlZmR0YWI7XG4rXG4gXHRzcGluX2xvY2soXHUwMDI2b2xkZi1cdTAwM2VmaWxlX2xvY2spO1xuIFx0b2xkX2ZkdCA9IGZpbGVzX2ZkdGFibGUob2xkZik7XG4gXHRvcGVuX2ZpbGVzID0gc2FuZV9mZHRhYmxlX3NpemUob2xkX2ZkdCwgcHVuY2hfaG9sZSk7XG5AQCAtNDgwLDYgKzUwNywxMSBAQCBzdGF0aWMgc3RydWN0IGZkdGFibGUgKmNsb3NlX2ZpbGVzKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcylcbiBcdCAqL1xuIFx0c3RydWN0IGZkdGFibGUgKmZkdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoZmlsZXMtXHUwMDNlZmR0KTtcbiBcdHVuc2lnbmVkIGludCBpLCBqID0gMDtcbitcdC8qXG4rXHQgKiBBIGtlcm5lbCB0aHJlYWQgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8gbWFrZSBwcm9ncmVzcyBvbiBzb21lXG4rXHQgKiB1bW91bnQgbXVzdCBub3QgcnVuIF9fZnB1dCgpIGl0c2VsZiwgc2VlIF9fZnB1dF9zeW5jKCkuXG4rXHQgKi9cbitcdGJvb2wgc3luYyA9ICEoY3VycmVudC1cdTAwM2VmbGFncyBcdTAwMjYgUEZfS1RIUkVBRCk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHVuc2lnbmVkIGxvbmcgc2V0O1xuQEAgLTQ5MSw3ICs1MjMsMTAgQEAgc3RhdGljIHN0cnVjdCBmZHRhYmxlICpjbG9zZV9maWxlcyhzdHJ1Y3QgZmlsZXNfc3RydWN0ICogZmlsZXMpXG4gXHRcdFx0aWYgKHNldCBcdTAwMjYgMSkge1xuIFx0XHRcdFx0c3RydWN0IGZpbGUgKmZpbGUgPSBmZHQtXHUwMDNlZmRbaV07XG4gXHRcdFx0XHRpZiAoZmlsZSkge1xuLVx0XHRcdFx0XHRmaWxwX2Nsb3NlKGZpbGUsIGZpbGVzKTtcbitcdFx0XHRcdFx0aWYgKHN5bmMpXG4rXHRcdFx0XHRcdFx0ZmlscF9jbG9zZV9zeW5jKGZpbGUsIGZpbGVzKTtcbitcdFx0XHRcdFx0ZWxzZVxuK1x0XHRcdFx0XHRcdGZpbHBfY2xvc2UoZmlsZSwgZmlsZXMpO1xuIFx0XHRcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG5AQCAtNTE1LDE2ICs1NTAsOTcgQEAgdm9pZCBwdXRfZmlsZXNfc3RydWN0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuIFx0fVxuIH1cbiBcbisvKiBIYW5kIEB0c2sgdGhlIHRhYmxlIEBmaWxlcywgb3Igbm9uZSwgYW5kIGRyb3AgdGhlIG9uZSBpdCBoYWQuICovXG4rc3RhdGljIHZvaWQgc3dpdGNoX2ZpbGVzX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayxcbitcdFx0XHRcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzKVxuK3tcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZDtcbitcbitcdHRhc2tfbG9jayh0c2spO1xuK1x0b2xkID0gdHNrLVx1MDAzZWZpbGVzO1xuK1x0aWYgKG9sZCkge1xuK1x0XHRpZiAoZmlsZXMpXG4rXHRcdFx0YXRvbWljX2luYyhcdTAwMjZmaWxlcy1cdTAwM2Vjb3VudCk7XG4rXHRcdHRzay1cdTAwM2VmaWxlcyA9IGZpbGVzO1xuK1x0fVxuK1x0dGFza191bmxvY2sodHNrKTtcbitcdGlmIChvbGQpXG4rXHRcdHB1dF9maWxlc19zdHJ1Y3Qob2xkKTtcbit9XG4rXG4gdm9pZCBleGl0X2ZpbGVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuIHtcbi1cdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IHRzay1cdTAwM2VmaWxlcztcbitcdGlmICghdHNrLVx1MDAzZWZpbGVzKVxuK1x0XHRyZXR1cm47XG4rXHRzd2l0Y2hfZmlsZXNfc3RydWN0KHRzaywgTlVMTCk7XG4rfVxuK1xuKy8qXG4rICogVGhlIHRocmVhZC1ncm91cCBpcyB3YWl0aW5nIGluIGNvcmVkdW1wX3Rhc2tfZXhpdCgpLiBXYWtlIHRoZW0gYW5kXG4rICogdGVsbCB0aGVtIHRvIGdldCByaWQgb2YgdGhlaXIgZmlsZXMuXG4rICovXG4rYm9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKVxuK3tcbitcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlID0gY3VycmVudC1cdTAwM2VzaWduYWwtXHUwMDNlY29yZV9zdGF0ZTtcbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xuK1x0c3RydWN0IGNvcmVfdGhyZWFkICpjdDtcbitcdGludCBuciA9IDA7XG4gXG4tXHRpZiAoZmlsZXMpIHtcbi1cdFx0dGFza19sb2NrKHRzayk7XG4tXHRcdHRzay1cdTAwM2VmaWxlcyA9IE5VTEw7XG4tXHRcdHRhc2tfdW5sb2NrKHRzayk7XG4tXHRcdHB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpO1xuK1x0ZmlsZXMgPSBhbGxvY19maWxlc19zdHJ1Y3QoKTtcbitcdGlmICghZmlsZXMpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qIFRhc2tzIHdpdGhvdXQgYSB0YWJsZSwgdmhvc3Qgd29ya2VycyBzYXksIHNpdCB0aGUgc3dpdGNoIG91dC4gKi9cbitcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuK1x0XHRpZiAoY3QtXHUwMDNldGFzay1cdTAwM2VmaWxlcylcbitcdFx0XHRucisrO1xuK1x0YXRvbWljX3NldChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMsIG5yKTtcbitcdHJlaW5pdF9jb21wbGV0aW9uKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4rXG4rXHRmb3IgKGN0ID0gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dDsgY3Q7IGN0ID0gY3QtXHUwMDNlbmV4dCkge1xuK1x0XHRpZiAoIWN0LVx1MDAzZXRhc2stXHUwMDNlZmlsZXMpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdC8qIFBhaXJzIHdpdGggdGhlIGFjcXVpcmUgaW4gY29yZWR1bXBfdGFza19jbG9zZV9maWxlcygpLiAqL1xuK1x0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZjdC1cdTAwM2VmaWxlcywgZmlsZXMpO1xuK1x0XHR3YWtlX3VwX3Byb2Nlc3MoY3QtXHUwMDNldGFzayk7XG4gXHR9XG4rXG4rXHQvKiBUaGUgZHVtcGVyJ3Mgc3ViamVjdGl2ZSBjcmVkcyBhcmUgdGhlIGR1bXAncywgbm90IGl0cyBvd24uICovXG4rXHRzY29wZWRfd2l0aF9jcmVkcyhjdXJyZW50X3JlYWxfY3JlZCgpKVxuK1x0XHRzd2l0Y2hfZmlsZXNfc3RydWN0KGN1cnJlbnQsIGZpbGVzKTtcbitcbitcdGlmIChucikge1xuK1x0XHR3YWl0X2Zvcl9jb21wbGV0aW9uX3N0YXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSxcbitcdFx0XHRcdFx0ICBUQVNLX1VOSU5URVJSVVBUSUJMRXxUQVNLX0ZSRUVaQUJMRSk7XG4rXHRcdC8qIEJhY2sgYXNsZWVwIGJlZm9yZSB0aGUgbm90ZXMgcmVhZCB0aGVpciByZWdpc3RlcnMuICovXG4rXHRcdGZvciAoY3QgPSBjb3JlX3N0YXRlLVx1MDAzZWR1bXBlci5uZXh0OyBjdDsgY3QgPSBjdC1cdTAwM2VuZXh0KVxuK1x0XHRcdHdhaXRfdGFza19pbmFjdGl2ZShjdC1cdTAwM2V0YXNrLCBUQVNLX0FOWSk7XG4rXHR9XG4rXG4rXHRwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTtcbitcdHJldHVybiB0cnVlO1xuK31cbitcbisvKlxuKyAqIEdldCByaWQgb2YgdGhlIGZpbGVzIGFuZCBzd2l0Y2ggdG8gdGhlIGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZVxuKyAqIHRoZSBkdW1waW5nIHRocmVhZCBwdWJsaXNoZWQgaW4gdGhpcyB0aHJlYWQncyBjb3JlX3RocmVhZCBlbnRyeS5cbisgKi9cbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKVxuK3tcbitcdHN0cnVjdCBjb3JlX3N0YXRlICpjb3JlX3N0YXRlO1xuK1x0c3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7XG4rXG4rXHQvKiBQYWlycyB3aXRoIHRoZSByZWxlYXNlIGluIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKCkuICovXG4rXHRmaWxlcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2c2VsZi1cdTAwM2VmaWxlcyk7XG4rXHRpZiAoIWZpbGVzIHx8ICFjdXJyZW50LVx1MDAzZWZpbGVzIHx8IGN1cnJlbnQtXHUwMDNlZmlsZXMgPT0gZmlsZXMpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdF9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTtcbitcdHN3aXRjaF9maWxlc19zdHJ1Y3QoY3VycmVudCwgZmlsZXMpO1xuK1x0Y29yZV9zdGF0ZSA9IGN1cnJlbnQtXHUwMDNlc2lnbmFsLVx1MDAzZWNvcmVfc3RhdGU7XG4rXHRpZiAoYXRvbWljX2RlY19hbmRfdGVzdChcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZW5yX3RocmVhZHMpKVxuK1x0XHRjb21wbGV0ZShcdTAwMjZjb3JlX3N0YXRlLVx1MDAzZWRvbmUpO1xuK1x0cmV0dXJuIHRydWU7XG4gfVxuIFxuIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IHtcbmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmNcbmluZGV4IGM2OGI4YzBhNDA5N2EuLjNjNzA1OTE3NjQ2YjUgMTAwNjQ0XG4tLS0gYS9mcy9maWxlX3RhYmxlLmNcbisrKyBiL2ZzL2ZpbGVfdGFibGUuY1xuQEAgLTEzLDYgKzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlbG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZG5vdGlmeS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2VjdXJpdHkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2V2ZW50cG9sbC5oXHUwMDNlXG5AQCAtNjA2LDE1ICs2MDcsNTMgQEAgdm9pZCBfX2ZwdXRfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiBFWFBPUlRfU1lNQk9MKF9fZnB1dF9zeW5jKTtcbiBcbiAvKlxuLSAqIEVxdWl2YWxlbnQgdG8gX19mcHV0X3N5bmMoKSwgYnV0IG9wdGltaXplZCBmb3IgYmVpbmcgY2FsbGVkIHdpdGggdGhlIGxhc3Rcbi0gKiByZWZlcmVuY2UuXG4tICpcbi0gKiBTZWUgZmlsZV9yZWZfcHV0X2Nsb3NlKCkgZm9yIGRldGFpbHMuXG4rICogXCJpZFwiIGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGVcbisgKiBmaWxlcyBwb2ludGVyIGZvciB0aGlzLi5cbiAgKi9cbi12b2lkIGZwdXRfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbitzdGF0aWMgaW50IGZpbHBfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4ge1xuLVx0aWYgKGxpa2VseShmaWxlX3JlZl9wdXRfY2xvc2UoXHUwMDI2ZmlsZS1cdTAwM2VmX3JlZikpKVxuLVx0XHRfX2ZwdXQoZmlsZSk7XG4rXHRpbnQgcmV0dmFsID0gMDtcbitcbitcdGlmIChDSEVDS19EQVRBX0NPUlJVUFRJT04oZmlsZV9jb3VudChmaWxwKSA9PSAwLCBmaWxwLFxuK1x0XHRcdFwiVkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcIixcbitcdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbitcdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbitcbitcdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4rXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuK1x0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuK1x0fVxuK1x0cmV0dXJuIHJldHZhbDtcbit9XG4rXG4raW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4re1xuK1x0aW50IHJldHZhbDtcbitcbitcdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuK1x0ZnB1dF9jbG9zZShmaWxwKTtcbitcbitcdHJldHVybiByZXR2YWw7XG4rfVxuK0VYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4rXG4rLypcbisgKiBMaWtlIGZpbHBfY2xvc2UoKSBidXQgd2l0aG91dCBkZWZlcnJpbmcgdGhlIHJlbGVhc2Ugb2YgdGhlIGxhc3RcbisgKiByZWZlcmVuY2UsIHNlZSBmaWxlX3JlZl9wdXRfY2xvc2UoKSBmb3IgZGV0YWlscy5cbisgKi9cbitpbnQgZmlscF9jbG9zZV9zeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKVxuK3tcbitcdGludCByZXR2YWw7XG4rXG4rXHRyZXR2YWwgPSBmaWxwX2ZsdXNoKGZpbHAsIGlkKTtcbitcdGlmIChsaWtlbHkoZmlsZV9yZWZfcHV0X2Nsb3NlKFx1MDAyNmZpbHAtXHUwMDNlZl9yZWYpKSlcbitcdFx0X19mcHV0KGZpbHApO1xuK1xuK1x0cmV0dXJuIHJldHZhbDtcbiB9XG4gXG4gLypcbmRpZmYgLS1naXQgYS9mcy9pbnRlcm5hbC5oIGIvZnMvaW50ZXJuYWwuaFxuaW5kZXggMzU1ZDkzZjkyMjA4Ni4uN2JhOGNkMjZhNjk4YyAxMDA2NDRcbi0tLSBhL2ZzL2ludGVybmFsLmhcbisrKyBiL2ZzL2ludGVybmFsLmhcbkBAIC0xMjcsNyArMTI3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkIHB1dF9maWxlX2FjY2VzcyhzdHJ1Y3QgZmlsZSAqZmlsZSlcbiBcdH1cbiB9XG4gXG4tdm9pZCBmcHV0X2Nsb3NlX3N5bmMoc3RydWN0IGZpbGUgKik7XG4raW50IGZpbHBfY2xvc2Vfc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCk7XG4gdm9pZCBmcHV0X2Nsb3NlKHN0cnVjdCBmaWxlICopO1xuIFxuIC8qXG5AQCAtMTkwLDYgKzE5MCw3IEBAIHN0cnVjdCBvcGVuX2ZsYWdzIHtcbiBcdGludCBpbnRlbnQ7XG4gXHRpbnQgbG9va3VwX2ZsYWdzO1xuIH07XG4rXG4gZXh0ZXJuIHN0cnVjdCBmaWxlICpkb19maWxlX29wZW4oaW50IGRmZCwgc3RydWN0IGZpbGVuYW1lICpwYXRobmFtZSxcbiBcdFx0Y29uc3Qgc3RydWN0IG9wZW5fZmxhZ3MgKm9wKTtcbiBleHRlcm4gc3RydWN0IGZpbGUgKmRvX2ZpbGVfb3Blbl9yb290KGNvbnN0IHN0cnVjdCBwYXRoICosXG5kaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jXG5pbmRleCA0MDg5MjVkN2JkMGI3Li5kMDM2NzM2ZDVkNDM1IDEwMDY0NFxuLS0tIGEvZnMvb3Blbi5jXG4rKysgYi9mcy9vcGVuLmNcbkBAIC0xNDUzLDQxICsxNDUzLDYgQEAgU1lTQ0FMTF9ERUZJTkUyKGNyZWF0LCBjb25zdCBjaGFyIF9fdXNlciAqLCBwYXRobmFtZSwgdW1vZGVfdCwgbW9kZSlcbiB9XG4gI2VuZGlmXG4gXG4tLypcbi0gKiBcImlkXCIgaXMgdGhlIFBPU0lYIHRocmVhZCBJRC4gV2UgdXNlIHRoZVxuLSAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLlxuLSAqL1xuLXN0YXRpYyBpbnQgZmlscF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZClcbi17XG4tXHRpbnQgcmV0dmFsID0gMDtcbi1cbi1cdGlmIChDSEVDS19EQVRBX0NPUlJVUFRJT04oZmlsZV9jb3VudChmaWxwKSA9PSAwLCBmaWxwLFxuLVx0XHRcdFwiVkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwIChmX29wPSVwcylcIixcbi1cdFx0XHRmaWxwLVx1MDAzZWZfb3ApKSB7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuLVxuLVx0aWYgKGZpbHAtXHUwMDNlZl9vcC1cdTAwM2VmbHVzaClcbi1cdFx0cmV0dmFsID0gZmlscC1cdTAwM2VmX29wLVx1MDAzZWZsdXNoKGZpbHAsIGlkKTtcbi1cbi1cdGlmIChsaWtlbHkoIShmaWxwLVx1MDAzZWZfbW9kZSBcdTAwMjYgRk1PREVfUEFUSCkpKSB7XG4tXHRcdGRub3RpZnlfZmx1c2goZmlscCwgaWQpO1xuLVx0XHRsb2Nrc19yZW1vdmVfcG9zaXgoZmlscCwgaWQpO1xuLVx0fVxuLVx0cmV0dXJuIHJldHZhbDtcbi19XG4tXG4taW50IGZpbHBfY2xvc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpXG4te1xuLVx0aW50IHJldHZhbDtcbi1cbi1cdHJldHZhbCA9IGZpbHBfZmx1c2goZmlscCwgaWQpO1xuLVx0ZnB1dF9jbG9zZShmaWxwKTtcbi1cbi1cdHJldHVybiByZXR2YWw7XG4tfVxuLUVYUE9SVF9TWU1CT0woZmlscF9jbG9zZSk7XG4tXG4gLypcbiAgKiBDYXJlZnVsIGhlcmUhIFdlIHRlc3Qgd2hldGhlciB0aGUgZmlsZSBwb2ludGVyIGlzIE5VTEwgYmVmb3JlXG4gICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJ3QgcmVsZWFzZVxuQEAgLTE1MDIsMTMgKzE0NjcsMTEgQEAgU1lTQ0FMTF9ERUZJTkUxKGNsb3NlLCB1bnNpZ25lZCBpbnQsIGZkKVxuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuIFxuLVx0cmV0dmFsID0gZmlscF9mbHVzaChmaWxlLCBjdXJyZW50LVx1MDAzZWZpbGVzKTtcbi1cbiBcdC8qXG4gXHQgKiBXZSdyZSByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4gRG9uJ3QgYm90aGVyXG4gXHQgKiB3aXRoIGFueSBkZWxheWVkIGZwdXQoKSBjYXNlcy5cbiBcdCAqL1xuLVx0ZnB1dF9jbG9zZV9zeW5jKGZpbGUpO1xuK1x0cmV0dmFsID0gZmlscF9jbG9zZV9zeW5jKGZpbGUsIGN1cnJlbnQtXHUwMDNlZmlsZXMpO1xuIFxuIFx0aWYgKGxpa2VseShyZXR2YWwgPT0gMCkpXG4gXHRcdHJldHVybiAwO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmR0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcbmluZGV4IGM0NTMwNmE5ZjAwNzIuLmYwYzEwMDNkYThjZTggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZkdGFibGUuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mZHRhYmxlLmhcbkBAIC05OSwxMSArOTksMTYgQEAgc3RhdGljIGlubGluZSBib29sIGNsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkLCBjb25zdCBzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxcbiBcbiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7XG4gXG4rc3RydWN0IGNvcmVfdGhyZWFkO1xuK1xuIHZvaWQgcHV0X2ZpbGVzX3N0cnVjdChzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmcyk7XG4rYm9vbCBjb3JlZHVtcF9jbG9zZV9maWxlcyh2b2lkKTtcbitib29sIGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoc3RydWN0IGNvcmVfdGhyZWFkICpzZWxmKTtcbiBpbnQgdW5zaGFyZV9maWxlcyh2b2lkKTtcbiBzdHJ1Y3QgZmRfcmFuZ2Uge1xuIFx0dW5zaWduZWQgaW50IGZyb20sIHRvO1xuIH07XG4rXG4gc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKiwgc3RydWN0IGZkX3JhbmdlICopIF9fbGF0ZW50X2VudHJvcHk7XG4gdm9pZCBkb19jbG9zZV9vbl9leGVjKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKik7XG4gaW50IGl0ZXJhdGVfZmQoc3RydWN0IGZpbGVzX3N0cnVjdCAqLCB1bnNpZ25lZCxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuaW5kZXggNTg0YWU4OGI0MzVlOS4uZmVkMDJhNDI3ZGUzMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbkBAIC03NiwxMiArNzYsMTUgQEAgc3RydWN0IG11bHRpcHJvY2Vzc19zaWduYWxzIHtcbiBzdHJ1Y3QgY29yZV90aHJlYWQge1xuIFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xuIFx0c3RydWN0IGNvcmVfdGhyZWFkICpuZXh0O1xuK1x0LyogVGhlIGVtcHR5IHRhYmxlIHRvIHN3aXRjaCB0bywgcHVibGlzaGVkIGJ5IHRoZSBkdW1waW5nIHRocmVhZC4gKi9cbitcdHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzO1xuIH07XG4gXG4gc3RydWN0IGNvcmVfc3RhdGUge1xuIFx0YXRvbWljX3QgbnJfdGhyZWFkcztcbiBcdHN0cnVjdCBjb3JlX3RocmVhZCBkdW1wZXI7XG4tXHRzdHJ1Y3QgY29tcGxldGlvbiBzdGFydHVwO1xuK1x0LyogQ29tcGxldGVkIGJ5IHRoZSBsYXN0IHRocmVhZCB0byBwYXJrLCByZXVzZWQgZm9yIHRoZSB0YWJsZSBzd2l0Y2guICovXG4rXHRzdHJ1Y3QgY29tcGxldGlvbiBkb25lO1xuIH07XG4gXG4gLypcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5pbmRleCA2ZDBjNTNiNTM0ZWE4Li5lYzA5ZDdhYjAxMzE0IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG5AQCAtMTksNiArMTksOSBAQFxuICAqIEBDT1JFRFVNUF9NRU1PUllfVFlQRVM6IGR1bXAgdGhlIG1lbW9yeSB0eXBlcyBpblxuICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlZHVtcF9hY2stXHUwMDNlbWVtb3J5X3R5cGVzIGluc3RlYWQgb2YgdGhlIG9uZXNcbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhc2sgc2VsZWN0ZWQ7IHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTFxuKyAqIEBDT1JFRFVNUF9DTE9TRV9GSUxFUzogY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIHRhc2sgYmVmb3JlIHRoZVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXAgaXMgZ2VuZXJhdGVkOyBpbmNvbXBhdGlibGUgd2l0aFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgQ09SRURVTVBfUkVKRUNUXG4gICovXG4gZW51bSB7XG4gXHRDT1JFRFVNUF9LRVJORUxcdFx0PSAoMVVMTCBcdTAwM2NcdTAwM2MgMCksXG5AQCAtMjgsNiArMzEsNyBAQCBlbnVtIHtcbiBcdENPUkVEVU1QX1JFQ09SRFNcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDQpLFxuIFx0Q09SRURVTVBfU1BBUlNFXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDUpLFxuIFx0Q09SRURVTVBfTUVNT1JZX1RZUEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA2KSxcbitcdENPUkVEVU1QX0NMT1NFX0ZJTEVTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA3KSxcbiB9O1xuIFxuIC8qKlxuQEAgLTEzNyw2ICsxNDEsMTAgQEAgZW51bSB7XG4gICogTm90ZSB0aGF0IEBtZW1vcnlfdHlwZXMgbXVzdCBiZSB6ZXJvIGlmIENPUkVEVU1QX01FTU9SWV9UWVBFUyBpc24ndFxuICAqIHJhaXNlZC4gQ09SRURVTVBfTUVNT1JZX1RZUEVTIHJlcXVpcmVzIENPUkVEVU1QX0tFUk5FTCBhbmQgYW4gYWNrIG9mXG4gICogYXQgbGVhc3QgQ09SRURVTVBfQUNLX1NJWkVfVkVSMSBieXRlcy5cbisgKlxuKyAqIElmIENPUkVEVU1QX0NMT1NFX0ZJTEVTIGlzIHJhaXNlZCBpbiBAbWFzayB0aGUga2VybmVsIGNsb3NlcyB0aGUgZmlsZVxuKyAqIGRlc2NyaXB0b3JzIG9mIHRoZSBjb3JlZHVtcGluZyB0YXNrIGJlZm9yZSBpdCBnZW5lcmF0ZXMgdGhlIGNvcmVkdW1wLlxuKyAqIFRoZSB0YXNrIGVuZHMgdXAgd2l0aCBhbiBlbXB0eSBkZXNjcmlwdG9yIHRhYmxlLlxuICAqL1xuIHN0cnVjdCBjb3JlZHVtcF9hY2sge1xuIFx0X191MzIgc2l6ZTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuY1xuaW5kZXggMmMwYjFjMDI5MjBmNC4uYjY1MTY3OWMxMmU5NyAxMDA2NDRcbi0tLSBhL2tlcm5lbC9leGl0LmNcbisrKyBiL2tlcm5lbC9leGl0LmNcbkBAIC0yNSw2ICsyNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYWNjdC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdHNhY2N0X2tlcm4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZkdGFibGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZyZWV6ZXIuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L25zcHJveHkuaFx1MDAzZVxuQEAgLTQzMiw2ICs0MzMsNyBAQCBzdGF0aWMgdm9pZCBjb3JlZHVtcF90YXNrX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssXG4gXHRzdHJ1Y3QgY29yZV90aHJlYWQgc2VsZjtcbiBcbiBcdHNlbGYudGFzayA9IHRzaztcbitcdHNlbGYuZmlsZXMgPSBOVUxMO1xuIFx0aWYgKHNlbGYudGFzay1cdTAwM2VmbGFncyBcdTAwMjYgUEZfU0lHTkFMRUQpXG4gXHRcdHNlbGYubmV4dCA9IHhjaGcoXHUwMDI2Y29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIubmV4dCwgXHUwMDI2c2VsZik7XG4gXHRlbHNlXG5AQCAtNDQxLDEyICs0NDMsMTUgQEAgc3RhdGljIHZvaWQgY29yZWR1bXBfdGFza19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLFxuIFx0ICogdG8gY29yZV9zdGF0ZS1cdTAwM2VkdW1wZXIuXG4gXHQgKi9cbiBcdGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlbnJfdGhyZWFkcykpXG4tXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlc3RhcnR1cCk7XG4rXHRcdGNvbXBsZXRlKFx1MDAyNmNvcmVfc3RhdGUtXHUwMDNlZG9uZSk7XG4gXG4gXHRmb3IgKDs7KSB7XG4gXHRcdHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSURMRXxUQVNLX0ZSRUVaQUJMRSk7XG4gXHRcdGlmICghc2VsZi50YXNrKSAvKiBzZWUgY29yZWR1bXBfZmluaXNoKCkgKi9cbiBcdFx0XHRicmVhaztcbitcdFx0Lyogc2VlIGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKCkgKi9cbitcdFx0aWYgKGNvcmVkdW1wX3Rhc2tfY2xvc2VfZmlsZXMoXHUwMDI2c2VsZikpXG4rXHRcdFx0Y29udGludWU7XG4gXHRcdHNjaGVkdWxlKCk7XG4gXHR9XG4gXHRfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS91YXBpL2xpbnV4L2NvcmVkdW1wLmggYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuaW5kZXggNmQwYzUzYjUzNGVhOC4uZWMwOWQ3YWIwMTMxNCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2luY2x1ZGUvdWFwaS9saW51eC9jb3JlZHVtcC5oXG4rKysgYi90b29scy9pbmNsdWRlL3VhcGkvbGludXgvY29yZWR1bXAuaFxuQEAgLTE5LDYgKzE5LDkgQEBcbiAgKiBAQ09SRURVTVBfTUVNT1JZX1RZUEVTOiBkdW1wIHRoZSBtZW1vcnkgdHlwZXMgaW5cbiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZWR1bXBfYWNrLVx1MDAzZW1lbW9yeV90eXBlcyBpbnN0ZWFkIG9mIHRoZSBvbmVzXG4gICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YXNrIHNlbGVjdGVkOyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUxcbisgKiBAQ09SRURVTVBfQ0xPU0VfRklMRVM6IGNsb3NlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIG9mIHRoZSB0YXNrIGJlZm9yZSB0aGVcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVkdW1wIGlzIGdlbmVyYXRlZDsgaW5jb21wYXRpYmxlIHdpdGhcbisgKiAgICAgICAgICAgICAgICAgICAgICAgIENPUkVEVU1QX1JFSkVDVFxuICAqL1xuIGVudW0ge1xuIFx0Q09SRURVTVBfS0VSTkVMXHRcdD0gKDFVTEwgXHUwMDNjXHUwMDNjIDApLFxuQEAgLTI4LDYgKzMxLDcgQEAgZW51bSB7XG4gXHRDT1JFRFVNUF9SRUNPUkRTXHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA0KSxcbiBcdENPUkVEVU1QX1NQQVJTRVx0XHQ9ICgxVUxMIFx1MDAzY1x1MDAzYyA1KSxcbiBcdENPUkVEVU1QX01FTU9SWV9UWVBFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNiksXG4rXHRDT1JFRFVNUF9DTE9TRV9GSUxFU1x0PSAoMVVMTCBcdTAwM2NcdTAwM2MgNyksXG4gfTtcbiBcbiAvKipcbkBAIC0xMzcsNiArMTQxLDEwIEBAIGVudW0ge1xuICAqIE5vdGUgdGhhdCBAbWVtb3J5X3R5cGVzIG11c3QgYmUgemVybyBpZiBDT1JFRFVNUF9NRU1PUllfVFlQRVMgaXNuJ3RcbiAgKiByYWlzZWQuIENPUkVEVU1QX01FTU9SWV9UWVBFUyByZXF1aXJlcyBDT1JFRFVNUF9LRVJORUwgYW5kIGFuIGFjayBvZlxuICAqIGF0IGxlYXN0IENPUkVEVU1QX0FDS19TSVpFX1ZFUjEgYnl0ZXMuXG4rICpcbisgKiBJZiBDT1JFRFVNUF9DTE9TRV9GSUxFUyBpcyByYWlzZWQgaW4gQG1hc2sgdGhlIGtlcm5lbCBjbG9zZXMgdGhlIGZpbGVcbisgKiBkZXNjcmlwdG9ycyBvZiB0aGUgY29yZWR1bXBpbmcgdGFzayBiZWZvcmUgaXQgZ2VuZXJhdGVzIHRoZSBjb3JlZHVtcC5cbisgKiBUaGUgdGFzayBlbmRzIHVwIHdpdGggYW4gZW1wdHkgZGVzY3JpcHRvciB0YWJsZS5cbiAgKi9cbiBzdHJ1Y3QgY29yZWR1bXBfYWNrIHtcbiBcdF9fdTMyIHNpemU7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuaW5kZXggZGVjZTFhMzFkNTYxYi4uZGM4NDg5ZDQwNjE4NCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9NYWtlZmlsZVxuQEAgLTMsNyArMyw4IEBAIENGTEFHUyArPSAtV2FsbCAtTzAgLWcgJChLSERSX0lOQ0xVREVTKSAkKFRPT0xTX0lOQ0xVREVTKVxuIFxuIFRFU1RfR0VOX1BST0dTIDo9IHN0YWNrZHVtcF90ZXN0IFxcXG4gXHRcdCAgY29yZWR1bXBfc29ja2V0X3Rlc3QgXFxcbi1cdFx0ICBjb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdFxuK1x0XHQgIGNvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0IFxcXG4rXHRcdCAgY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdFxuIFRFU1RfRklMRVMgOj0gc3RhY2tkdW1wXG4gXG4gaW5jbHVkZSAuLi9saWIubWtcbkBAIC0xMSwzICsxMiw0IEBAIGluY2x1ZGUgLi4vbGliLm1rXG4gJChPVVRQVVQpL3N0YWNrZHVtcF90ZXN0OiBjb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuICQoT1VUUFVUKS9jb3JlZHVtcF9zb2NrZXRfdGVzdDogY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiAkKE9VVFBVVCkvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rJChPVVRQVVQpL2NvcmVkdW1wX2Nsb3NlX2ZpbGVzX3Rlc3Q6IGNvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2E0MTkwNmI0Njk1MlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfY2xvc2VfZmlsZXNfdGVzdC5jXG5AQCAtMCwwICsxLDU5MiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rXG4rI2luY2x1ZGUgXHUwMDNjZGlyZW50LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc29ja2V0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwiY29yZWR1bXBfdGVzdC5oXCJcbitcbisjZGVmaW5lIExPQ0tfRklMRSBcIi90bXAvY29yZWR1bXAubG9ja1wiXG4rXG4rLyogSWRsZSB0aHJlYWRzIHRoZSBtdWx0aS10aHJlYWRlZCBjcmFzaGluZyBjaGlsZCBzcGF3bnMuICovXG4rI2RlZmluZSBOVU1fQ0xPU0VfVEhSRUFEUyA0XG4rXG4rLyogSG93IHRoZSBjcmFzaGluZyBjaGlsZCBsb2NrcyBMT0NLX0ZJTEUuICovXG4rZW51bSBsb2NrX2tpbmQge1xuK1x0TE9DS19LSU5EX1BPU0lYLFxuK1x0TE9DS19LSU5EX09GRCxcbitcdExPQ0tfS0lORF9GTE9DSyxcbit9O1xuK1xuKy8qIFdobyBlbHNlIGhhcyBhIGhhbmRsZSBvbiB0aGUgbG9jayB3aGVuIHRoZSBjaGlsZCBjcmFzaGVzLiAqL1xuK2VudW0gbG9ja19zaGFyZSB7XG4rXHRMT0NLX1NIQVJFX05PTkUsXG4rXHRMT0NLX1NIQVJFX0RVUCxcdFx0LyogYSBzZWNvbmQgc2xvdCBpbiB0aGUgY2hpbGQncyBvd24gdGFibGUgKi9cbitcdExPQ0tfU0hBUkVfRk9SSyxcdC8qIGEgZm9ya2VkIHByb2Nlc3Mga2VlcHMgdGhlIGZkIG9wZW4gKi9cbitcdExPQ0tfU0hBUkVfRklMRVMsXHQvKiBhIENMT05FX0ZJTEVTIHByb2Nlc3Mgc2hhcmVzIHRoZSB0YWJsZSAqL1xuK307XG4rXG4rc3RydWN0IGNsb3NlX3Rlc3Qge1xuK1x0ZW51bSBsb2NrX2tpbmQga2luZDtcbitcdGVudW0gbG9ja19zaGFyZSBzaGFyZTtcbitcdGJvb2wgdGhyZWFkcztcbitcdGJvb2wgY2xvc2U7XHRcdC8qIGFjayB3aXRoIENPUkVEVU1QX0NMT1NFX0ZJTEVTICovXG4rXHRib29sIHVzZXJzcGFjZTtcdFx0LyogQ09SRURVTVBfVVNFUlNQQUNFIGluc3RlYWQgb2YgQ09SRURVTVBfS0VSTkVMICovXG4rXHRib29sIHJlbGVhc2VkO1x0XHQvKiB0aGUgbG9jayBpcyBnb25lIG9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZSBjbG9zZSAqL1xuK307XG4rXG4rRklYVFVSRV9TRVRVUChjb3JlZHVtcClcbit7XG4rXHRGSUxFICpmaWxlO1xuK1x0aW50IHJldDtcbitcbitcdHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciA9IC1FU1JDSDtcbitcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdGZpbGUgPSBmb3BlbihcIi9wcm9jL3N5cy9rZXJuZWwvY29yZV9wYXR0ZXJuXCIsIFwiclwiKTtcbitcdEFTU0VSVF9ORShOVUxMLCBmaWxlKTtcbitcbitcdHJldCA9IGZyZWFkKHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuLCAxLCBzaXplb2Yoc2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm4pLCBmaWxlKTtcbitcdEFTU0VSVF9UUlVFKHJldCB8fCBmZW9mKGZpbGUpKTtcbitcdEFTU0VSVF9MVChyZXQsIHNpemVvZihzZWxmLVx1MDAzZW9yaWdpbmFsX2NvcmVfcGF0dGVybikpO1xuK1xuK1x0c2VsZi1cdTAwM2VvcmlnaW5hbF9jb3JlX3BhdHRlcm5bcmV0XSA9ICdcXDAnO1xuK1x0c2VsZi1cdTAwM2VmZF90bXBmc19kZXRhY2hlZCA9IGNyZWF0ZV9kZXRhY2hlZF90bXBmcygpO1xuK1x0QVNTRVJUX0dFKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQsIDApO1xuK1xuK1x0cmV0ID0gZmNsb3NlKGZpbGUpO1xuK1x0QVNTRVJUX0VRKDAsIHJldCk7XG4rfVxuK1xuK0ZJWFRVUkVfVEVBUkRPV04oY29yZWR1bXApXG4re1xuK1x0Y29uc3QgY2hhciAqcmVhc29uO1xuK1x0RklMRSAqZmlsZTtcbitcdGludCByZXQsIHN0YXR1cztcbitcbitcdGlmIChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgXHUwMDNlIDApIHtcbitcdFx0a2lsbChzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIsIFNJR1RFUk0pO1xuK1x0XHR3YWl0cGlkKHNlbGYtXHUwMDNlcGlkX2NvcmVkdW1wX3NlcnZlciwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdH1cbitcdHVubGluayhMT0NLX0ZJTEUpO1xuK1x0dW5saW5rKFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcIik7XG4rXG4rXHRmaWxlID0gZm9wZW4oXCIvcHJvYy9zeXMva2VybmVsL2NvcmVfcGF0dGVyblwiLCBcIndcIik7XG4rXHRpZiAoIWZpbGUpIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gb3BlbiBjb3JlX3BhdHRlcm5cIjtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0cmV0ID0gZnByaW50ZihmaWxlLCBcIiVzXCIsIHNlbGYtXHUwMDNlb3JpZ2luYWxfY29yZV9wYXR0ZXJuKTtcbitcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gd3JpdGUgdG8gY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdHJldCA9IGZjbG9zZShmaWxlKTtcbitcdGlmIChyZXQpIHtcbitcdFx0cmVhc29uID0gXCJVbmFibGUgdG8gY2xvc2UgY29yZV9wYXR0ZXJuXCI7XG4rXHRcdGdvdG8gZmFpbDtcbitcdH1cbitcbitcdGlmIChzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkIFx1MDAzZT0gMCkge1xuK1x0XHRyZXQgPSBjbG9zZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRcdHJlYXNvbiA9IFwiVW5hYmxlIHRvIGNsb3NlIGRldGFjaGVkIHRtcGZzXCI7XG4rXHRcdFx0Z290byBmYWlsO1xuK1x0XHR9XG4rXHRcdHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQgPSAtMTtcbitcdH1cbitcbitcdHJldHVybjtcbitmYWlsOlxuK1x0LyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovXG4rXHRmcHJpbnRmKHN0ZGVyciwgXCJGYWlsZWQgdG8gY2xlYW51cCBjb3JlZHVtcCB0ZXN0OiAlc1xcblwiLCByZWFzb24pO1xuK31cbitcbisvKiBXcml0ZS1sb2NrIEBmZCB0aGUgd2F5IEBraW5kIHNheXMuICovXG4rc3RhdGljIGludCB0YWtlX2xvY2soaW50IGZkLCBlbnVtIGxvY2tfa2luZCBraW5kKVxuK3tcbitcdHN0cnVjdCBmbG9jayBmbCA9IHtcbitcdFx0LmxfdHlwZSA9IEZfV1JMQ0ssXG4rXHRcdC5sX3doZW5jZSA9IFNFRUtfU0VULFxuK1x0fTtcbitcbitcdHN3aXRjaCAoa2luZCkge1xuK1x0Y2FzZSBMT0NLX0tJTkRfUE9TSVg6XG4rXHRcdHJldHVybiBmY250bChmZCwgRl9TRVRMSywgXHUwMDI2ZmwpO1xuK1x0Y2FzZSBMT0NLX0tJTkRfT0ZEOlxuK1x0XHRyZXR1cm4gZmNudGwoZmQsIEZfT0ZEX1NFVExLLCBcdTAwMjZmbCk7XG4rXHRjYXNlIExPQ0tfS0lORF9GTE9DSzpcbitcdFx0cmV0dXJuIGZsb2NrKGZkLCBMT0NLX0VYKTtcbitcdH1cbitcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLyogRG9lcyBhbnlvbmUgZWxzZSBob2xkIGEgd3JpdGUgbG9jayBvbiBAZmQ/IDEgaWYgc28sIDAgaWYgbm90LCAtMSBvbiBlcnJvci4gKi9cbitzdGF0aWMgaW50IGxvY2tfaGVsZChpbnQgZmQsIGVudW0gbG9ja19raW5kIGtpbmQpXG4re1xuK1x0c3RydWN0IGZsb2NrIGZsID0ge1xuK1x0XHQubF90eXBlID0gRl9XUkxDSyxcbitcdFx0Lmxfd2hlbmNlID0gU0VFS19TRVQsXG4rXHR9O1xuK1xuK1x0aWYgKGtpbmQgPT0gTE9DS19LSU5EX0ZMT0NLKSB7XG4rXHRcdGlmIChmbG9jayhmZCwgTE9DS19FWCB8IExPQ0tfTkIpID09IDApIHtcbitcdFx0XHRmbG9jayhmZCwgTE9DS19VTik7XG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdH1cbitcdFx0cmV0dXJuIGVycm5vID09IEVXT1VMREJMT0NLID8gMSA6IC0xO1xuK1x0fVxuK1xuK1x0LyogRl9HRVRMSyByZXBvcnRzIGNvbmZsaWN0aW5nIE9GRCBsb2NrcyB0b28uICovXG4rXHRpZiAoZmNudGwoZmQsIEZfR0VUTEssIFx1MDAyNmZsKSBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1x0cmV0dXJuIGZsLmxfdHlwZSAhPSBGX1VOTENLO1xuK31cbitcbisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiAvcHJvYy9AcGlkL2ZkLCB0aGUgbG93ZXN0IG9uZSBpbiBAZmlyc3QuICovXG4rc3RhdGljIGludCBjb3VudF9mZHMocGlkX3QgcGlkLCBpbnQgKmZpcnN0KVxuK3tcbitcdGNoYXIgcGF0aFs2NF07XG4rXHRzdHJ1Y3QgZGlyZW50ICpkZTtcbitcdERJUiAqZGlyO1xuK1x0aW50IG5yID0gMDtcbitcbitcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCIvcHJvYy8lZC9mZFwiLCBwaWQpO1xuK1x0ZGlyID0gb3BlbmRpcihwYXRoKTtcbitcdGlmICghZGlyKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHQqZmlyc3QgPSAtMTtcbitcdHdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpKSB7XG4rXHRcdGludCBmZDtcbitcbitcdFx0aWYgKGRlLVx1MDAzZWRfbmFtZVswXSA9PSAnLicpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGZkID0gYXRvaShkZS1cdTAwM2VkX25hbWUpO1xuK1x0XHRpZiAoKmZpcnN0IFx1MDAzYyAwIHx8IGZkIFx1MDAzYyAqZmlyc3QpXG4rXHRcdFx0KmZpcnN0ID0gZmQ7XG4rXHRcdG5yKys7XG4rXHR9XG4rXHRjbG9zZWRpcihkaXIpO1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbisvKlxuKyAqIEJsb2NrIHVudGlsIHRoZSB0ZXN0IGhhbmdzIHVwIEBmZF9yZWxlYXNlLCBrZWVwaW5nIGV2ZXJ5IGluaGVyaXRlZCBmZFxuKyAqIG9wZW4sIHRoZW4gcmVwb3J0IHRocm91Z2ggQGZkX3Jlc3VsdCB3aGV0aGVyIEBmZCBpcyBzdGlsbCBvcGVuLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGhvbGRfdW50aWxfcmVsZWFzZWQoaW50IGZkLCBpbnQgZmRfcmVsZWFzZSwgaW50IGZkX3Jlc3VsdClcbit7XG4rXHRjaGFyIGM7XG4rXG4rXHRyZWFkX25vaW50cihmZF9yZWxlYXNlLCBcdTAwMjZjLCAxKTtcbitcdGMgPSBmY250bChmZCwgRl9HRVRGRCkgXHUwMDNjIDAgPyAnQycgOiAnTyc7XG4rXHR3cml0ZV9ub2ludHIoZmRfcmVzdWx0LCBcdTAwMjZjLCAxKTtcbitcdF9leGl0KEVYSVRfU1VDQ0VTUyk7XG4rfVxuK1xuKy8qIExvY2sgTE9DS19GSUxFLCBzaGFyZSBpdCBhcyByZXF1ZXN0ZWQsIHRoZW4gY3Jhc2guICovXG4rc3RhdGljIHZvaWQgY3Jhc2hpbmdfY2hpbGRfbG9ja2VkKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfcmVsZWFzZSxcbitcdFx0XHRcdCAgaW50IGZkX3Jlc3VsdClcbit7XG4rXHRwdGhyZWFkX3QgdGhyZWFkO1xuK1x0aW50IGZkLCBwaWRmZCwgaTtcbitcdHBpZF90IHBpZDtcbitcbitcdGZkID0gb3BlbihMT0NLX0ZJTEUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdF9leGl0KEVYSVRfRkFJTFVSRSk7XG4rXG4rXHRpZiAodGFrZV9sb2NrKGZkLCB0LVx1MDAzZWtpbmQpKVxuK1x0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1xuK1x0c3dpdGNoICh0LVx1MDAzZXNoYXJlKSB7XG4rXHRjYXNlIExPQ0tfU0hBUkVfTk9ORTpcbitcdFx0YnJlYWs7XG4rXHRjYXNlIExPQ0tfU0hBUkVfRFVQOlxuK1x0XHRpZiAoZHVwKGZkKSBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRicmVhaztcbitcdGNhc2UgTE9DS19TSEFSRV9GT1JLOlxuK1x0XHRwaWQgPSBmb3JrKCk7XG4rXHRcdGlmIChwaWQgXHUwMDNjIDApXG4rXHRcdFx0X2V4aXQoRVhJVF9GQUlMVVJFKTtcbitcdFx0aWYgKHBpZCA9PSAwKVxuK1x0XHRcdGhvbGRfdW50aWxfcmVsZWFzZWQoZmQsIGZkX3JlbGVhc2UsIGZkX3Jlc3VsdCk7XG4rXHRcdGJyZWFrO1xuK1x0Y2FzZSBMT0NLX1NIQVJFX0ZJTEVTOlxuK1x0XHRwaWQgPSBjcmVhdGVfY2hpbGQoXHUwMDI2cGlkZmQsIENMT05FX0ZJTEVTKTtcbitcdFx0aWYgKHBpZCBcdTAwM2MgMClcbitcdFx0XHRfZXhpdChFWElUX0ZBSUxVUkUpO1xuK1x0XHRpZiAocGlkID09IDApXG4rXHRcdFx0aG9sZF91bnRpbF9yZWxlYXNlZChmZCwgZmRfcmVsZWFzZSwgZmRfcmVzdWx0KTtcbitcdFx0YnJlYWs7XG4rXHR9XG4rXG4rXHRpZiAodC1cdTAwM2V0aHJlYWRzKVxuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOVU1fQ0xPU0VfVEhSRUFEUzsgaSsrKVxuK1x0XHRcdHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZCwgTlVMTCwgZG9fbm90aGluZywgTlVMTCk7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlICovXG4rXHQqKHZvbGF0aWxlIGludCAqKU5VTEwgPSAwO1xuK31cbitcbisvKlxuKyAqIFNlcnZlIG9uZSBjb3JlZHVtcCBhbmQgbG9vayBhdCB0aGUgdGFzayBvbiB0aGUgd2F5LiBCZWZvcmUgdGhlIGFjayB0aGVcbisgKiBsb2NrIGlzIGhlbGQgYW5kIHRoZSBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuIE9uY2UgdGhlIGtlcm5lbCBpcyBwYXN0IHRoZVxuKyAqIHBvaW50IHdoZXJlIGl0IGNsb3NlcyB0aGVtLCB3aGljaCBpcyBiZWZvcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGR1bXBcbisgKiBvciBiZWZvcmUgdGhlIGhhbmd1cCBpbiB1c2Vyc3BhY2UgbW9kZSwgdGhleSBhcmUgZ29uZSBpZiB3ZSBhc2tlZCBmb3JcbisgKiBpdCBhbmQgdGhlIGxvY2sgaXMgaW4gdGhlIGV4cGVjdGVkIHN0YXRlLlxuKyAqL1xuK3N0YXRpYyBpbnQgY2xvc2Vfc2VydmVyKGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0ICp0LCBpbnQgZmRfaXBjKVxuK3tcbitcdHN0cnVjdCBjb3JlZHVtcF9yZXEgcmVxID0ge307XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307XG4rXHRpbnQgZmRfc2VydmVyID0gLTEsIGZkX2NvcmVkdW1wID0gLTEsIGZkX3BlZXJfcGlkZmQgPSAtMSwgZmRfbG9jayA9IC0xO1xuK1x0aW50IGV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTtcbitcdGludCBmZCwgZmlyc3RfZmQsIG5yX2ZkcztcbitcdF9fdTY0IG1hc2s7XG4rXHRzc2l6ZV90IGJ5dGVzO1xuK1x0Y2hhciBjO1xuK1xuK1x0ZmRfbG9jayA9IG9wZW4oTE9DS19GSUxFLCBPX1JEV1IgfCBPX0NMT0VYRUMpO1xuK1x0aWYgKGZkX2xvY2sgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IG9wZW4gbG9jayBmaWxlIGZhaWxlZDogJW1cXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcIik7XG4rXHRpZiAoZmRfc2VydmVyIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAod3JpdGVfbm9pbnRyKGZkX2lwYywgXCIxXCIsIDEpIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiB3cml0ZV9ub2ludHIgdG8gaXBjIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRjbG9zZShmZF9pcGMpO1xuK1xuK1x0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcbitcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogYWNjZXB0NCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xuK1x0aWYgKGZkX3BlZXJfcGlkZmQgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGdldF9wZWVyX3BpZGZkIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXJlYWRfY29yZWR1bXBfcmVxKGZkX2NvcmVkdW1wLCBcdTAwMjZyZXEpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGlmICghY2hlY2tfY29yZWR1bXBfcmVxKFx1MDAyNnJlcSkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGNoZWNrX2NvcmVkdW1wX3JlcSBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdC8qIFRoZSB0YXNrIHdhaXRzIGZvciBvdXIgYW5zd2VyIHdpdGggZXZlcnl0aGluZyBzdGlsbCBpbiBwbGFjZS4gKi9cbitcdGlmIChsb2NrX2hlbGQoZmRfbG9jaywgdC1cdTAwM2VraW5kKSAhPSAxKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBsb2NrIG5vdCBoZWxkIGR1cmluZyB0aGUgaGFuZHNoYWtlXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRucl9mZHMgPSBjb3VudF9mZHMoaW5mby5waWQsIFx1MDAyNmZpcnN0X2ZkKTtcbitcdGlmIChucl9mZHMgXHUwMDNjPSAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBubyBkZXNjcmlwdG9ycyBkdXJpbmcgdGhlIGhhbmRzaGFrZVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZmQgPSBzeXNfcGlkZmRfZ2V0ZmQoZmRfcGVlcl9waWRmZCwgZmlyc3RfZmQsIDApO1xuK1x0aWYgKGZkIFx1MDAzYyAwKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGhhbmRzaGFrZSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRtYXNrID0gQ09SRURVTVBfV0FJVDtcbitcdG1hc2sgfD0gdC1cdTAwM2V1c2Vyc3BhY2UgPyBDT1JFRFVNUF9VU0VSU1BBQ0UgOiBDT1JFRFVNUF9LRVJORUw7XG4rXHRpZiAodC1cdTAwM2VjbG9zZSlcbitcdFx0bWFzayB8PSBDT1JFRFVNUF9DTE9TRV9GSUxFUztcbitcbitcdGlmICghc2VuZF9jb3JlZHVtcF9hY2soZmRfY29yZWR1bXAsIFx1MDAyNnJlcSwgbWFzaywgMCkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHNlbmRfY29yZWR1bXBfYWNrIGZhaWxlZFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0aWYgKCFyZWFkX21hcmtlcihmZF9jb3JlZHVtcCwgQ09SRURVTVBfTUFSS19SRVFBQ0spKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiByZWFkX21hcmtlciBDT1JFRFVNUF9NQVJLX1JFUUFDSyBmYWlsZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIFx1MDAyNmMsIDEpO1xuK1x0aWYgKGJ5dGVzICE9ICh0LVx1MDAzZXVzZXJzcGFjZSA/IDAgOiAxKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcmVhZCBhZnRlciB0aGUgYWNrIHJldHVybmVkICV6ZDogJW1cXG5cIiwgX19mdW5jX18sIGJ5dGVzKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAobG9ja19oZWxkKGZkX2xvY2ssIHQtXHUwMDNla2luZCkgIT0gIXQtXHUwMDNlcmVsZWFzZWQpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGxvY2sgJXMgd2hpbGUgdGhlIGNvcmVkdW1wIGlzIGdlbmVyYXRlZFxcblwiLFxuK1x0XHRcdF9fZnVuY19fLCB0LVx1MDAzZXJlbGVhc2VkID8gXCJzdGlsbCBoZWxkXCIgOiBcInJlbGVhc2VkXCIpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG5yX2ZkcyA9IGNvdW50X2ZkcyhpbmZvLnBpZCwgXHUwMDI2Zmlyc3RfZmQpO1xuK1x0aWYgKG5yX2ZkcyBcdTAwM2MgMCB8fCAhbnJfZmRzICE9IHQtXHUwMDNlY2xvc2UpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6ICVkIGRlc2NyaXB0b3JzIHdoaWxlIHRoZSBjb3JlZHVtcCBpcyBnZW5lcmF0ZWRcXG5cIixcbitcdFx0XHRfX2Z1bmNfXywgbnJfZmRzKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRmZCA9IHN5c19waWRmZF9nZXRmZChmZF9wZWVyX3BpZGZkLCBmaXJzdF9mZCwgMCk7XG4rXHRpZiAodC1cdTAwM2VjbG9zZSkge1xuK1x0XHRpZiAoZmQgXHUwMDNlPSAwIHx8IGVycm5vICE9IEVCQURGKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHBpZGZkX2dldGZkIGFmdGVyIHRoZSBjbG9zZSByZXR1cm5lZCAlZDogJW1cXG5cIixcbitcdFx0XHRcdF9fZnVuY19fLCBmZCk7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcdH0gZWxzZSB7XG4rXHRcdGlmIChmZCBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBwaWRmZF9nZXRmZCBkdXJpbmcgdGhlIGNvcmVkdW1wIGZhaWxlZDogJW1cXG5cIixcbitcdFx0XHRcdF9fZnVuY19fKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRjbG9zZShmZCk7XG4rXHR9XG4rXG4rXHQvKiBDT1JFRFVNUF9XQUlUIGtlZXBzIHRoZSB0YXNrIGFyb3VuZCB1bnRpbCB3ZSBoYW5nIHVwLiAqL1xuK1x0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoaW5mby5tYXNrIFx1MDAyNiBQSURGRF9JTkZPX0VYSVQpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHRhc2sgZXhpdGVkIGJlZm9yZSB0aGUgY29yZWR1bXAgZmluaXNoZWRcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdGZvciAoOzspIHtcbitcdFx0Y2hhciBidWZmZXJbNDA5Nl07XG4rXG4rXHRcdGJ5dGVzID0gcmVhZF9ub2ludHIoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xuK1x0XHRpZiAoYnl0ZXMgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogcmVhZCBmcm9tIGNvcmVkdW1wIHNvY2tldCBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoYnl0ZXMgPT0gMClcbitcdFx0XHRicmVhaztcbitcdH1cbitcbitcdGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUztcbitvdXQ6XG4rXHRpZiAoZmRfbG9jayBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX2xvY2spO1xuK1x0aWYgKGZkX3BlZXJfcGlkZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcbitcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKGZkX2NvcmVkdW1wKTtcbitcdGlmIChmZF9zZXJ2ZXIgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShmZF9zZXJ2ZXIpO1xuK1x0cmV0dXJuIGV4aXRfY29kZTtcbit9XG4rXG4rc3RhdGljIHZvaWQgcnVuX2Nsb3NlX3Rlc3Qoc3RydWN0IF9fdGVzdF9tZXRhZGF0YSAqY29uc3QgX21ldGFkYXRhLFxuK1x0XHRcdCAgIEZJWFRVUkVfREFUQShjb3JlZHVtcCkgKnNlbGYsXG4rXHRcdFx0ICAgY29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgKnQpXG4re1xuK1x0aW50IGZkLCBzdGF0dXMsIGlwY19zb2NrZXRzWzJdLCByZWxlYXNlX3BpcGVbMl0sIHJlc3VsdF9waXBlWzJdO1xuK1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1x0Y2hhciBjO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihcIkBAL3RtcC9jb3JlZHVtcC5zb2NrZXRcIikpO1xuK1xuK1x0ZmQgPSBvcGVuKExPQ0tfRklMRSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2NDQpO1xuK1x0QVNTRVJUX0dFKGZkLCAwKTtcbitcdEVYUEVDVF9FUShjbG9zZShmZCksIDApO1xuK1xuK1x0QVNTRVJUX0VRKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsIGlwY19zb2NrZXRzKSwgMCk7XG4rXG4rXHRwaWRfY29yZWR1bXBfc2VydmVyID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xuK1x0aWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkge1xuK1x0XHRjbG9zZShpcGNfc29ja2V0c1swXSk7XG4rXHRcdF9leGl0KGNsb3NlX3NlcnZlcih0LCBpcGNfc29ja2V0c1sxXSkpO1xuK1x0fVxuK1x0c2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjtcbitcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1sxXSksIDApO1xuK1x0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCBcdTAwMjZjLCAxKSwgMSk7XG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbitcbitcdC8qIE9ubHkgdGhlIGNyYXNoaW5nIGNoaWxkIGFuZCB3aGF0IGl0IHNwYXducyBzZWUgdGhlc2UgcGlwZXMuICovXG4rXHRBU1NFUlRfRVEocGlwZTIocmVsZWFzZV9waXBlLCBPX0NMT0VYRUMpLCAwKTtcbitcdEFTU0VSVF9FUShwaXBlMihyZXN1bHRfcGlwZSwgT19DTE9FWEVDKSwgMCk7XG4rXG4rXHRwaWQgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkLCAwKTtcbitcdGlmIChwaWQgPT0gMCkge1xuK1x0XHRjbG9zZShyZWxlYXNlX3BpcGVbMV0pO1xuK1x0XHRjbG9zZShyZXN1bHRfcGlwZVswXSk7XG4rXHRcdGNyYXNoaW5nX2NoaWxkX2xvY2tlZCh0LCByZWxlYXNlX3BpcGVbMF0sIHJlc3VsdF9waXBlWzFdKTtcbitcdH1cbitcdEVYUEVDVF9FUShjbG9zZShyZWxlYXNlX3BpcGVbMF0pLCAwKTtcbitcdEVYUEVDVF9FUShjbG9zZShyZXN1bHRfcGlwZVsxXSksIDApO1xuK1xuK1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTtcbitcdEFTU0VSVF9UUlVFKFdDT1JFRFVNUChzdGF0dXMpKTtcbitcbitcdHdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpO1xuK1xuK1x0LyogTGV0IHRoZSBwcm9jZXNzIGhvbGRpbmcgdGhlIHNoYXJlZCBsb2NrIGdvLiAqL1xuK1x0RVhQRUNUX0VRKGNsb3NlKHJlbGVhc2VfcGlwZVsxXSksIDApO1xuK1xuK1x0LyogVGhlIGNyYXNoaW5nIGNoaWxkIGlzIGdvbmUgYnV0IHdoYXQgaXQgc2hhcmVkIHdpdGggaXMgdW50b3VjaGVkLiAqL1xuK1x0aWYgKHQtXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GT1JLIHx8IHQtXHUwMDNlc2hhcmUgPT0gTE9DS19TSEFSRV9GSUxFUykge1xuK1x0XHRBU1NFUlRfRVEocmVhZF9ub2ludHIocmVzdWx0X3BpcGVbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbitcdFx0QVNTRVJUX0VRKGMsICdPJyk7XG4rXHR9XG4rXHRFWFBFQ1RfRVEoY2xvc2UocmVzdWx0X3BpcGVbMF0pLCAwKTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19wb3NpeClcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQudGhyZWFkcyA9IHRydWUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19vZmQpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfT0ZELFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9jaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9OT05FLFxuK1x0XHQudGhyZWFkcyA9IHRydWUsXG4rXHRcdC5jbG9zZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19mbG9ja19kdXApXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfRFVQLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfcG9zaXhfZm9yaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSB0cnVlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfRihjb3JlZHVtcCwgY2xvc2VfZmlsZXNfZmxvY2tfZm9yaylcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9GTE9DSyxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX29mZF9mb3JrKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX09GRCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GT1JLLFxuK1x0XHQuY2xvc2UgPSB0cnVlLFxuK1x0XHQucmVsZWFzZWQgPSBmYWxzZSxcbitcdH07XG4rXG4rXHRydW5fY2xvc2VfdGVzdChfbWV0YWRhdGEsIHNlbGYsIFx1MDAyNnQpO1xuK31cbitcbitURVNUX0YoY29yZWR1bXAsIGNsb3NlX2ZpbGVzX3Bvc2l4X3NoYXJlZF90YWJsZSlcbit7XG4rXHRjb25zdCBzdHJ1Y3QgY2xvc2VfdGVzdCB0ID0ge1xuK1x0XHQua2luZCA9IExPQ0tfS0lORF9QT1NJWCxcbitcdFx0LnNoYXJlID0gTE9DS19TSEFSRV9GSUxFUyxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnJlbGVhc2VkID0gZmFsc2UsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc191c2Vyc3BhY2UpXG4re1xuK1x0Y29uc3Qgc3RydWN0IGNsb3NlX3Rlc3QgdCA9IHtcbitcdFx0LmtpbmQgPSBMT0NLX0tJTkRfRkxPQ0ssXG4rXHRcdC5zaGFyZSA9IExPQ0tfU0hBUkVfTk9ORSxcbitcdFx0LmNsb3NlID0gdHJ1ZSxcbitcdFx0LnVzZXJzcGFjZSA9IHRydWUsXG4rXHRcdC5yZWxlYXNlZCA9IHRydWUsXG4rXHR9O1xuK1xuK1x0cnVuX2Nsb3NlX3Rlc3QoX21ldGFkYXRhLCBzZWxmLCBcdTAwMjZ0KTtcbit9XG4rXG4rVEVTVF9GKGNvcmVkdW1wLCBjbG9zZV9maWxlc19ub3RfcmVxdWVzdGVkKVxuK3tcbitcdGNvbnN0IHN0cnVjdCBjbG9zZV90ZXN0IHQgPSB7XG4rXHRcdC5raW5kID0gTE9DS19LSU5EX0ZMT0NLLFxuK1x0XHQuc2hhcmUgPSBMT0NLX1NIQVJFX05PTkUsXG4rXHRcdC50aHJlYWRzID0gdHJ1ZSxcbitcdFx0LmNsb3NlID0gZmFsc2UsXG4rXHRcdC5yZWxlYXNlZCA9IGZhbHNlLFxuK1x0fTtcbitcbitcdHJ1bl9jbG9zZV90ZXN0KF9tZXRhZGF0YSwgc2VsZiwgXHUwMDI2dCk7XG4rfVxuK1xuK1RFU1RfSEFSTkVTU19NQUlOXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Byb3RvY29sX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF9wcm90b2NvbF90ZXN0LmNcbmluZGV4IGY1YzliYWQ4NzU0NjMuLmJlYjE2NzY5OGNmZGIgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfcHJvdG9jb2xfdGVzdC5jXG5AQCAtMjM3Nyw2ICsyMzc3LDEyIEBAIFRFU1RfRihjb3JlZHVtcCwgc29ja2V0X3JlcXVlc3RfbWVtb3J5X3R5cGVzX3dpdGhvdXRfa2VybmVsKVxuIFx0Y2hlY2tfY29uZmxpY3RpbmdfYWNrKF9tZXRhZGF0YSwgc2VsZiwgQ09SRURVTVBfVVNFUlNQQUNFIHwgQ09SRURVTVBfTUVNT1JZX1RZUEVTKTtcbiB9XG4gXG4rLyogQSByZWplY3RlZCB0YXNrIGNsb3NlcyBldmVyeXRoaW5nIG9uIGl0cyB3YXkgb3V0IGFueXdheS4gKi9cbitURVNUX0YoY29yZWR1bXAsIHNvY2tldF9yZXF1ZXN0X2Nsb3NlX2ZpbGVzX3JlamVjdClcbit7XG4rXHRjaGVja19jb25mbGljdGluZ19hY2soX21ldGFkYXRhLCBzZWxmLCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9DTE9TRV9GSUxFUyk7XG4rfVxuK1xuIC8qXG4gICogQSBzZXJ2ZXIgYnVpbHQgd2l0aCB0aGUgZmlyc3Qgc3RydWN0cyByZWFkcyB0aGUgcmVxdWVzdCBpdCBrbm93cyxcbiAgKiBkaXNjYXJkcyB0aGUgcmVzdCBhbmQgYWNrcyB3aXRoIHRoZSBhY2sgaXQga25vd3MuIEl0IHJhaXNlcyBub3RoaW5nXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggNGUzNmUzZTRmYjc4Zi4uNjUxMzJhMGRlY2VkZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTE2MTIsNyArMTYxMiw4IEBAIGJvb2wgc2VuZF9jb3JlZHVtcF9hY2soaW50IGZkLCBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcmVxICpyZXEsXG4gI2RlZmluZSBURVNUX1JFUV9NQVNLX0FMTFx0XHRcdFx0XHRcXFxuIFx0KENPUkVEVU1QX0tFUk5FTCB8IENPUkVEVU1QX1VTRVJTUEFDRSB8XHRcdFx0XFxcbiBcdCBDT1JFRFVNUF9SRUpFQ1QgfCBDT1JFRFVNUF9XQUlUIHxcdFx0XHRcXFxuLVx0IENPUkVEVU1QX1JFQ09SRFMgfCBDT1JFRFVNUF9TUEFSU0UgfCBDT1JFRFVNUF9NRU1PUllfVFlQRVMpXG4rXHQgQ09SRURVTVBfUkVDT1JEUyB8IENPUkVEVU1QX1NQQVJTRSB8IENPUkVEVU1QX01FTU9SWV9UWVBFUyB8IFxcXG4rXHQgQ09SRURVTVBfQ0xPU0VfRklMRVMpXG4gXG4gYm9vbCBjaGVja19jb3JlZHVtcF9yZXEoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3JlcSAqcmVxKVxuIHtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI0VDE4OjA4OjQ2LjA1NDAxNjUzWiIsIlNlcSI6MzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwNTU3MTY3MjI4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIENvcmVkdW1wIEZpbGUgRGVzY3JpcHRvciBDbG9zdXJlIFBhdGNoKipcblxuT2theSwgc28gdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gdGhlIGNvcmVkdW1wIG1lY2hhbmlzbTogYENPUkVEVU1QX0NMT1NFX0ZJTEVTYC4gV2hlbiBzZXQgaW4gdGhlIGFja25vd2xlZGdlbWVudCBtYXNrLCB0aGUga2VybmVsIHdpbGwgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIGNyYXNoaW5nIHRhc2sgKmJlZm9yZSogZHVtcGluZyB0aGUgY29yZS4gU21hcnQuIEVzc2VudGlhbGx5LCBpdCdzIHN3YXBwaW5nIG91dCB0aGUgZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGZvciBhbiBlbXB0eSBvbmUuIFRoaXMgaXMgaW50ZXJlc3RpbmcuIExldCdzIGJyZWFrIGRvd24gdGhlIGNoYW5nZXMuXG5cbkkgc2VlIGl0J3MgdG91Y2hpbmcgc2V2ZXJhbCBmaWxlcy4gSW4gYGZzL2NvcmVkdW1wLmNgLCB0aGUgYGNvcmVkdW1wX3NvY2tfcmVxdWVzdGAgZnVuY3Rpb24gbm93IGNoZWNrcyBmb3IgdGhlIG5ldyBmbGFnLCBhbmQgYGRvX2NvcmVkdW1wYCBjYWxscyBhIG5ldyBmdW5jdGlvbiwgYGNvcmVkdW1wX2Nsb3NlX2ZpbGVzKClgLlxuXG5gZnMvZmlsZS5jYCBoYXMgc2VlbiB0aGUgYnVsayBvZiB0aGUgY2hhbmdlcy4gV2UgaGF2ZSBgYWxsb2NfZmlsZXNfc3RydWN0YCBhbGxvY2F0aW5nIHRoZSBuZXcgZW1wdHkgdGFibGUsIGBjbG9zZV9maWxlc2AgYmVpbmcgbW9kaWZpZWQgdG8gYmUgbW9yZSBhZ2dyZXNzaXZlIHdpdGggYGZpbHBfY2xvc2Vfc3luY2AgZm9yIG5vbi1rZXJuZWwgdGhyZWFkcywgYSBgc3dpdGNoX2ZpbGVzX3N0cnVjdGAgdG8gZG8gdGhlIGFjdHVhbCBzd2FwLCBhbmQgdGhlIGtleSBgY29yZWR1bXBfY2xvc2VfZmlsZXNgIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggYWxsIHRocmVhZHMgaW4gdGhlIGNvcmVkdW1wIHN0YXRlIGFuZCBvcmNoZXN0cmF0ZXMgdGhlIGNsb3N1cmUsIGFsb25nIHdpdGggYSBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgdGhhdCBoYW5kbGVzIGNsZWFudXAgZHVyaW5nIHRocmVhZCBleGl0LlxuXG5UaGV5J3ZlIGFkZGVkIGBmaWxwX2Nsb3NlX3N5bmNgIGluIGBmcy9maWxlX3RhYmxlLmNgLCB3aGljaCBpcyB0aGUgaW1tZWRpYXRlLCBzeW5jaHJvbm91cyB2ZXJzaW9uIG9mIGBmaWxwX2Nsb3NlYC4gVGhhdCBtYWtlcyBzZW5zZTsgd2UgZG9uJ3Qgd2FudCB0byBkZWZlciBmaWxlIHJlbGVhc2UgaW4gdGhpcyBzY2VuYXJpby5cblxuRmluYWxseSwgYGtlcm5lbC9leGl0LmNgIG5vdyBjYWxscyBgY29yZWR1bXBfdGFza19jbG9zZV9maWxlc2AgZHVyaW5nIHRoZSBleGl0IHByb2Nlc3MsIHdhaXRpbmcgZm9yIHRoZSBjb3JlZHVtcCB0byBjb21wbGV0ZS5cblxuTm93LCB0aGUgaW1wb3J0YW50IHF1ZXN0aW9uOiBhcmUgdGhlcmUgYW55IHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBoZXJlPyBMZXQncyBzZWUuLi4gdGhlIGBhbGxvY19maWxlc19zdHJ1Y3RgIHVzZXMgYEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPYCwgc28gaXQncyBpbml0aWFsaXplZCB0byB6ZXJvLiBUaGUgYGNvcmVkdW1wX2Fja2Agc3RydWN0IGluIGB1YXBpL2xpbnV4L2NvcmVkdW1wLmhgIGhhc24ndCBjaGFuZ2VkIHNpemUsIG9ubHkgdGhlIGVudW0gZm9yIHRoZSBmbGFncy4gU28sIG5vIG5ldyB1c2VyLXNwYWNlIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHRoZSBjb2RlLCBpdCdzIGFsbCBhYm91dCBmaWxlIGRlc2NyaXB0b3IgdGFibGUgcG9pbnRlcnMsIHN3aXRjaGluZywgYW5kIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycy4gTm90aGluZyBjb21wbGljYXRlZCBpcyBhbGxvY2F0ZWQgdGhhdCBJIGNhbiBzZWUsIGFuZCBub3RoaW5nIG5ldyBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gSXQgc2VlbXMgd2VsbCBpc29sYXRlZC5cblxuQmFzZWQgb24gdGhpcywgSSBkb24ndCBzZWUgYW55IGltbWVkaWF0ZSByZWFzb24gdG8gc3VzcGVjdCB0aGF0IEtNU0FOIGlzIG5lZWRlZCBoZXJlLiBUaGlzIG1vc3RseSBkZWFscyB3aXRoIHBvaW50ZXJzIGFuZCBmaWxlIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBvZiBLQVNBTidzIGFuYWx5c2lzLiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gYW5kIG90aGVycyBzaG91bGQgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgaXNzdWVzIGxpa2UgdXNlLWFmdGVyLWZyZWUsIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgYnVncyB0aGF0IG1pZ2h0IHNuZWFrIGluIGR1cmluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIG1hbmlwdWxhdGlvbnMuIFRoaXMgbG9va3MgcHJldHR5IHNvbGlkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ5MCwiT3V0cHV0VG9rZW5zIjoxNzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNFQxODowODo1Ni42MTExODYwMDhaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTQyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZmVhdHVyZSB0byBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzIGJlZm9yZSBnZW5lcmF0aW5nIGEgY29yZWR1bXAgKENPUkVEVU1QX0NMT1NFX0ZJTEVTKS4gSXQgbW9kaWZpZXMgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIG1hbmFnZW1lbnQsIGFkZHMgYSBuZXcgZW1wdHkgZmlsZSBkZXNjcmlwdG9yIHRhYmxlIGFsbG9jYXRpb24gKHdoaWNoIGlzIGV4cGxpY2l0bHkgemVyb2VkIHVzaW5nIF9fR0ZQX1pFUk8pLCBhbmQgYWx0ZXJzIHRoZSBjb3JlZHVtcCBzeW5jaHJvbml6YXRpb24gbG9naWMuIE5vIG5ldyBkYXRhIHN0cnVjdHVyZXMgYXJlIGNvcGllZCB0byB1c2Vyc3BhY2UsIGFuZCBubyBjb21wbGV4IHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB3aXRob3V0IGluaXRpYWxpemF0aW9uLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBwb2ludGVyIHN3aXRjaGluZywgcmVmZXJlbmNlIGNvdW50aW5nLCBhbmQgZmlsZSBjbG9zaW5nLCB3aGljaCBtaWdodCByaXNrIHVzZS1hZnRlci1mcmVlLCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGlzc3Vlcy4gVGhlc2UgdHlwZXMgb2YgYnVncyBhcmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgcmVxdWlyZSBLTVNBTi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGZlYXR1cmUgdG8gY2xvc2UgZmlsZSBkZXNjcmlwdG9ycyBiZWZvcmUgZ2VuZXJhdGluZyBhIGNvcmVkdW1wIChDT1JFRFVNUF9DTE9TRV9GSUxFUykuIEl0IG1vZGlmaWVzIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBtYW5hZ2VtZW50LCBhZGRzIGEgbmV3IGVtcHR5IGZpbGUgZGVzY3JpcHRvciB0YWJsZSBhbGxvY2F0aW9uICh3aGljaCBpcyBleHBsaWNpdGx5IHplcm9lZCB1c2luZyBfX0dGUF9aRVJPKSwgYW5kIGFsdGVycyB0aGUgY29yZWR1bXAgc3luY2hyb25pemF0aW9uIGxvZ2ljLiBObyBuZXcgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlcnNwYWNlLCBhbmQgbm8gY29tcGxleCBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aG91dCBpbml0aWFsaXphdGlvbi4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgcG9pbnRlciBzd2l0Y2hpbmcsIHJlZmVyZW5jZSBjb3VudGluZywgYW5kIGZpbGUgY2xvc2luZywgd2hpY2ggbWlnaHQgcmlzayB1c2UtYWZ0ZXItZnJlZSwgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlcywgb3IgbG9ja2luZyBpc3N1ZXMuIFRoZXNlIHR5cGVzIG9mIGJ1Z3MgYXJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIHJlcXVpcmUgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowbm9wk[1] Phase: Succeeded StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 2026-08-24 18:09:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 2026-08-24 18:09:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2] Phase: Running StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN) Phase: Running StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 2026-08-24 18:09:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-24 18:09:08 +0000 UTC FinishedAt: 2026-08-24 18:09:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},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-workflowbm9wk/series-workflowbm9wk-convert-artifact-2250828724/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-24 18:09:19 +0000 UTC FinishedAt: 2026-08-24 18:29:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-24 18:09:19 +0000 UTC FinishedAt: 2026-08-24 18:29:39 +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:*4c2adcf5-db95-4794-abe8-277dc79e3a24,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-workflowbm9wk/series-workflowbm9wk-convert-artifact-2250828724/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": "107b25f9-55d8-4807-b4e9-5906f6cbd679", "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-workflowbm9wk/series-workflowbm9wk-build-action-3800867250/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-24 18:09:19 +0000 UTC FinishedAt: 2026-08-24 18:29:29 +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:*4c2adcf5-db95-4794-abe8-277dc79e3a24,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-workflowbm9wk/series-workflowbm9wk-convert-artifact-2250828724/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": "107b25f9-55d8-4807-b4e9-5906f6cbd679", "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-workflowbm9wk/series-workflowbm9wk-build-action-3800867250/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-24 18:29:39 +0000 UTC FinishedAt: 2026-08-24 18:29:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-24 18:29:39 +0000 UTC FinishedAt: 2026-08-24 18:29:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-24 18:29:39 +0000 UTC FinishedAt: 2026-08-24 18:29:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-24 18:29:39 +0000 UTC FinishedAt: 2026-08-24 18:29:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},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-workflowbm9wk/series-workflowbm9wk-convert-artifact-3933713523/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-24 18:29:49 +0000 UTC FinishedAt: 2026-08-24 18:31:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-24 18:29:49 +0000 UTC FinishedAt: 2026-08-24 18:31:42 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*107b25f9-55d8-4807-b4e9-5906f6cbd679,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-workflowbm9wk/series-workflowbm9wk-build-action-3800867250/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-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-24 18:31:52 +0000 UTC FinishedAt: 2026-08-24 18:31:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-24 18:31:52 +0000 UTC FinishedAt: 2026-08-24 18:31:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-24 18:31:52 +0000 UTC FinishedAt: 2026-08-24 18:58:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-24 18:31:52 +0000 UTC FinishedAt: 2026-08-24 18:58:16 +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:*4c2adcf5-db95-4794-abe8-277dc79e3a24,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-workflowbm9wk/series-workflowbm9wk-convert-artifact-3933713523/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": "4f12ea5e-138b-451f-baca-3965d905174e", "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-workflowbm9wk/series-workflowbm9wk-build-action-1335782439/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-24 18:31:52 +0000 UTC FinishedAt: 2026-08-24 18:57:50 +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:*4c2adcf5-db95-4794-abe8-277dc79e3a24,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-workflowbm9wk/series-workflowbm9wk-convert-artifact-3933713523/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": "4f12ea5e-138b-451f-baca-3965d905174e", "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-workflowbm9wk/series-workflowbm9wk-build-action-1335782439/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-24 18:58:16 +0000 UTC FinishedAt: 2026-08-24 18:58:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-24 18:58:16 +0000 UTC FinishedAt: 2026-08-24 18:58:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-24 18:58:16 +0000 UTC FinishedAt: 2026-08-24 19:00:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-24 18:58:16 +0000 UTC FinishedAt: 2026-08-24 19:00:02 +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:*4f12ea5e-138b-451f-baca-3965d905174e,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-workflowbm9wk/series-workflowbm9wk-build-action-1335782439/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-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10] Phase: Running StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Running StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"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:*107b25f9-55d8-4807-b4e9-5906f6cbd679,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4f12ea5e-138b-451f-baca-3965d905174e,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-workflowbm9wk/series-workflowbm9wk-build-action-3800867250/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-workflowbm9wk/series-workflowbm9wk-build-action-1335782439/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 2026-08-24 19:01:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 2026-08-24 19:00:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"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-workflowbm9wk/series-workflowbm9wk-convert-artifact-3617593452/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 2026-08-24 19:00:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 2026-08-24 19:00:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-24 19:00:15 +0000 UTC FinishedAt: 2026-08-24 19:00:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Running StartedAt: 2026-08-24 19:01:02 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbm9wk[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["coredump_close_files","coredump_task_close_files","vfs_coredump"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"5870ce43c013ad564b3b83bae330b160e056df67","config_name":"upstream-apparmor-kasan.config","enable_configs":["COREDUMP"],"series_id":"ba203764-1732-4433-a3f5-fd29cd3ea50b","tree_name":"vfs","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/vfs/vfs.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Running StartedAt: 2026-08-24 19:01:02 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*107b25f9-55d8-4807-b4e9-5906f6cbd679,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*4f12ea5e-138b-451f-baca-3965d905174e,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-workflowbm9wk/series-workflowbm9wk-build-action-3800867250/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-workflowbm9wk/series-workflowbm9wk-build-action-1335782439/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-workflowbm9wk/series-workflowbm9wk-convert-artifact-3617593452/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil