Name: series-workflowq58bq Phase: Succeeded StartedAt: 2026-08-22 16:34:08 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[0] Phase: Succeeded StartedAt: 2026-08-22 16:34:08 +0000 UTC FinishedAt: 2026-08-22 17:28:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[0].run-triage Phase: Succeeded StartedAt: 2026-08-22 16:34:08 +0000 UTC FinishedAt: 2026-08-22 17:28:51 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "934753d26f1ed7fadeedf1b9e7df6fe75de303e8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "934753d26f1ed7fadeedf1b9e7df6fe75de303e8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "fc23472c-255a-43de-8cfe-7e5a1ccb95dd" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_convert_inline_data", "ext4_try_add_inline_entry" ], "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+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgICAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXh0NCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGJ5IHJlcGxhY2luZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgIHdpdGggYSBuZXcgZnVuY3Rpb24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG1hbnVhbGx5IGFsbG9jYXRpbmcgYmxvY2tzIHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgLlxuXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcbjEuIGBpbm9kZV9idWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBidXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4gd2l0aCBhIGZ1bGwgY29weSBvZiB0aGUgdmFsaWQgb24tZGlzayBgcmF3X2lub2RlYCB2aWEgYG1lbWNweWAuXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cbjQuIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YC5cbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cblxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgaW4gZXh0NCwgc3BlY2lmaWNhbGx5IGhvdyBpbmxpbmUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGJsb2NrLiBJdCByZXBsYWNlcyBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEgd2l0aCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayBhbmQgY2hhbmdlcyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrIHRvIHVzZSBleHQ0X21iX25ld19ibG9ja3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHQ0X21hcF9ibG9ja3MuIFRoZXNlIGFyZSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgYWRkaW5nIGRpcmVjdG9yeSBlbnRyaWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDIyIDE3OjE4OjMwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jXG5pbmRleCA4MDQ1ZTRmZjI3MGM3Li41MDcxMDZjNzJlODJmIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuY1xuQEAgLTE0LDYgJiM0MzsxNCw3IEBAXG4gI2luY2x1ZGUgXCYjMzQ7ZXh0NC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7eGF0dHIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3RydW5jYXRlLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwmIzM0O2RhdGFcJiMzNDtcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcdCgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSlcbkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgYmxvY2ssXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBpbnQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKVxuIHtcbi1cdGludCByZXQ7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuJiM0MztcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4mIzQzO1x0XHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4mIzQzO1x0XHQubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLFxuJiM0MztcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuJiM0MztcdFx0LnZhbHVlID0gTlVMTCxcbiYjNDM7XHRcdC52YWx1ZV9sZW4gPSAwLFxuJiM0MztcdH07XG4mIzQzO1x0aW50IGVycm9yO1xuJiM0MztcdGludCBpbm9kZV9zaXplO1xuJiM0MztcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiBcbi1cdHJldCA9IGV4dDRfY3JlYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlubGluZV9zaXplKTtcbi1cdGlmIChyZXQpIHtcbi1cdFx0ZXh0NF9tc2coaW5vZGUtXHUwMDNlaV9zYiwgS0VSTl9FTUVSRyxcbi1cdFx0XHRcJiMzNDtlcnJvciByZXN0b3JpbmcgaW5saW5lX2RhdGEgZm9yIGlub2RlIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhIChpbm9kZSAlbGx1LCBlcnJvciAlZClcJiMzNDssXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbiYjNDM7XHRpbm9kZV9zaXplID0gRVhUNF9JTk9ERV9TSVpFKGlub2RlLVx1MDAzZWlfc2IpO1xuJiM0MztcdGlub2RlX2J1ZiA9IGttYWxsb2MoaW5vZGVfc2l6ZSwgR0ZQX05PRlMpO1xuJiM0MztcdGlmICghaW5vZGVfYnVmKSB7XG4mIzQzO1x0XHRlcnJvciA9IC1FTk9NRU07XG4mIzQzO1x0XHRkb3duX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbiYjNDM7XHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0cmV0dXJuIGVycm9yO1xuIFx0fVxuLVx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XG4tXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuJiM0MztcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdGlmIChlcnJvcikge1xuJiM0MztcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbiYjNDM7XHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0a2ZyZWUoaW5vZGVfYnVmKTtcbiYjNDM7XHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYyk7XG4mIzQzO1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwmIzM0O2dldF93cml0ZV9hY2Nlc3NcJiMzNDspO1xuJiM0MztcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbiYjNDM7XHRpZiAoZXJyb3IpIHtcbiYjNDM7XHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4mIzQzO1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpO1xuJiM0MztcdG1lbXNldCgodm9pZCAqKXJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVx1MDAzZWlfc2IpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuJiM0MztcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbiYjNDM7XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IFBUUl9FUlIocGF0aCk7XG4mIzQzO1x0XHRcdGdvdG8gcmVjb3Zlcnk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG4mIzQzO1xuJiM0MztcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbiYjNDM7XHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuJiM0MztcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4mIzQzO1x0XHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgMCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4mIzQzO1x0XHRcdGVycm9yID0gUFRSX0VSUihwYXRoKTtcbiYjNDM7XHRcdFx0aWYgKGVycm9yID09IC1FRFFVT1QgfHwgZXJyb3IgPT0gLUVOT1NQQykge1xuJiM0MztcdFx0XHRcdGdvdG8gcmVjb3Zlcnk7XG4mIzQzO1x0XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFx0ZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTtcbiYjNDM7XHRcdFx0XHRnb3RvIG5vZnJlZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YVswXSA9IGNwdV90b19sZTMyKGJsb2NrKTtcbiYjNDM7XHR9XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRnb3RvIHJlY292ZXJ5O1xuJiM0MztcdGlmICghaXMucy5ub3RfZm91bmQpXG4mIzQzO1x0XHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7cmVjb3Zlcnk6XG4mIzQzO1x0aWYgKGVycm9yKSB7XG4mIzQzO1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuJiM0MztcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuJiM0Mztub2ZyZWU6XG4mIzQzO1x0XHRtZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7XG4mIzQzO1x0XHRtZW1jcHkoZWktXHUwMDNlaV9kYXRhLCByYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4mIzQzO1x0XHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0XHRnZXRfYmgoaXMuaWxvYy5iaCk7XG4mIzQzO1x0XHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9zaXplID0gMDtcbiYjNDM7XHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbiYjNDM7XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbiYjNDM7XHRcdFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbiYjNDM7XHRcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGJyZWxzZShiaCk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuJiM0MztcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdGtmcmVlKGlub2RlX2J1Zik7XG4mIzQzO1x0cmV0dXJuIGVycm9yO1xuIH1cbiBcbiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbkBAIC0xMDk0LDggJiM0MzsxMTg5LDExIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aW50IGVycm9yO1xuIFx0dm9pZCAqYnVmID0gTlVMTDtcbiBcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4tXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbiBcdGludCBpbmxpbmVfc2l6ZTtcbiYjNDM7XHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuJiM0MztcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuJiM0MztcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXAubV9sYmxrID0gMDtcbi1cdG1hcC5tX2xlbiA9IDE7XG4tXHRtYXAubV9mbGFncyA9IDA7XG4tXHRlcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xuJiM0MztcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4mIzQzO1x0YXIuaW5vZGUgPSBpbm9kZTtcbiYjNDM7XHRhci5sb2dpY2FsID0gMDtcbiYjNDM7XHRhci5sZW4gPSAxO1xuJiM0MztcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4mIzQzO1x0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGFyLmZsYWdzID0gMDtcbiYjNDM7XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4gXHRpZiAoZXJyb3IgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHRpZiAoIShtYXAubV9mbGFncyBcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xuLVx0XHRlcnJvciA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHR9XG4tXG4tXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuJiM0MztcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbmV3YmxvY2spO1xuIFx0aWYgKCFkYXRhX2JoKSB7XG4gXHRcdGVycm9yID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbiYjNDM7XHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICYjNDM7MTI0Miw3IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aWYgKGVycm9yKSB7XG4gXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG4gXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbiYjNDM7XHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFx0bWVtc2V0KGRhdGFfYmgtXHUwMDNlYl9kYXRhLCAwLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbiBcbkBAIC0xMTU5LDI0ICYjNDM7MTI1NCwyOCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4gXHR9IGVsc2Uge1xuIFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuLVx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVxuIFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuIFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuIFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuIFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4tXHRcdGlmICghZXJyb3IpXG4tXHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4gXHR9XG4mIzQzO291dF9iaDpcbiYjNDM7XHRpZiAoZXJyb3IpIHtcbiYjNDM7XHRcdGludCBmbGFncyA9IDA7XG4gXG4tb3V0X3Jlc3RvcmU6XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcbiYjNDM7XHRcdGlmIChkYXRhX2JoKVxuJiM0MztcdFx0XHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiBcbiYjNDM7XHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuJiM0MztcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBmbGFncyk7XG4mIzQzO1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLFxuJiM0MztcdFx0XHRcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xuJiM0MztcdH1cbiBvdXQ6XG4tXHRicmVsc2UoZGF0YV9iaCk7XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGJkYjI3MjA4NDk3NzU0MTAxYWM0ZWNlMDFlZTQ4ODA5ZTFmNWQzNTgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jCmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5saW5lLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuYwpAQCAtMTQsNiAmIzQzOzE0LDcgQEAKICNpbmNsdWRlICYjMzQ7ZXh0NC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7eGF0dHIuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3RydW5jYXRlLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7ZXh0NF9leHRlbnRzLmgmIzM0OwogCiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEEJJiMzNDtkYXRhJiMzNDsKICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRQkoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpCkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsCi0JCQkJICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSkKJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jaywKJiM0MzsJCQkJCXVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiYjNDM7CWludCBpbm9kZV9zaXplOwomIzQzOwl2b2lkICppbm9kZV9idWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlOwogCi0JcmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpOwotCWlmIChyZXQpIHsKLQkJZXh0NF9tc2coaW5vZGUtJmd0O2lfc2IsIEtFUk5fRU1FUkcsCi0JCQkmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKSYjMzQ7LAotCQkJaW5vZGUtJmd0O2lfaW5vLCByZXQpOwotCQlyZXR1cm47CiYjNDM7CWlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtJmd0O2lfc2IpOwomIzQzOwlpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTsKJiM0MzsJaWYgKCFpbm9kZV9idWYpIHsKJiM0MzsJCWVycm9yID0gLUVOT01FTTsKJiM0MzsJCWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmYW1wO2lzLmlsb2MpOwomIzQzOwlpZiAoZXJyb3IpIHsKJiM0MzsJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiYjNDM7CQl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJCWtmcmVlKGlub2RlX2J1Zik7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiYjNDM7CX0KJiM0MzsJcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoJmFtcDtpcy5pbG9jKTsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJbWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpOwomIzQzOwltZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtJmd0O2lfYmxvY2ssIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwltZW1zZXQoZWktJmd0O2lfZGF0YSwgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7CiYjNDM7CWlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtJmd0O2lfc2IpICZhbXA7JmFtcDsKJiM0MzsJCShTX0lTRElSKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNSRUcoaW5vZGUtJmd0O2lfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0mZ3Q7aV9tb2RlKSkpIHsKJiM0MzsJCWV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7CiYjNDM7CQlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7CiYjNDM7CQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApOwomIzQzOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlnb3RvIHJlY292ZXJ5OwomIzQzOwkJfQomIzQzOwkJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4OwomIzQzOwomIzQzOwkJbmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTsKJiM0MzsJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCXBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZhbXA7bmV3ZXgsIDApOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7CiYjNDM7CQkJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTsKJiM0MzsJCQkJZ290byBub2ZyZWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CWlmICghaXMucy5ub3RfZm91bmQpCiYjNDM7CQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7cmVjb3Zlcnk6CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKJiM0Mztub2ZyZWU6CiYjNDM7CQltZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7CiYjNDM7CQltZW1jcHkoZWktJmd0O2lfZGF0YSwgcmF3X2lub2RlLSZndDtpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7CiYjNDM7CQlnZXRfYmgoaXMuaWxvYy5iaCk7CiYjNDM7CQllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9vZmYgPSAwOwomIzQzOwkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9pbmxpbmVfc2l6ZSA9IDA7CiYjNDM7CQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CQlpZiAoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSkgewomIzQzOwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCQlFWFQ0X0koaW5vZGUpLSZndDtpX2Rpc2tzaXplID0gaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwkJfQomIzQzOwkJYnJlbHNlKGJoKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJYnJlbHNlKGlzLmlsb2MuYmgpOwomIzQzOwl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJa2ZyZWUoaW5vZGVfYnVmKTsKJiM0MzsJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTEwOTQsOCAmIzQzOzExODksMTEgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKJiM0MzsJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYik7CiYjNDM7CXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7CiAKIAlpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKIAlidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7CkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAkJCWdvdG8gb3V0OwogCX0KIAotCWVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JbWFwLm1fbGJsayA9IDA7Ci0JbWFwLm1fbGVuID0gMTsKLQltYXAubV9mbGFncyA9IDA7Ci0JZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgJmFtcDttYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpOwomIzQzOwltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CiYjNDM7CWFyLmlub2RlID0gaW5vZGU7CiYjNDM7CWFyLmxvZ2ljYWwgPSAwOwomIzQzOwlhci5sZW4gPSAxOwomIzQzOwlpZiAoU19JU1JFRyhpbm9kZS0mZ3Q7aV9tb2RlKSkKJiM0MzsJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CiYjNDM7CWVsc2UKJiM0MzsJCWFyLmZsYWdzID0gMDsKJiM0MzsJbmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYW1wO2FyLCAmYW1wO2Vycm9yKTsKIAlpZiAoZXJyb3IgJmx0OyAwKQotCQlnb3RvIG91dF9yZXN0b3JlOwotCWlmICghKG1hcC5tX2ZsYWdzICZhbXA7IEVYVDRfTUFQX01BUFBFRCkpIHsKLQkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwotCX0KLQotCWRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtJmd0O2lfc2IsIG1hcC5tX3BibGspOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzEyNDIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNTksMjQgJiM0MzsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkJICAgaW5vZGUsIGRhdGFfYmgpOwogCX0gZWxzZSB7CiAJCXVubG9ja19idWZmZXIoZGF0YV9iaCk7Ci0JCWlub2RlLSZndDtpX3NpemUgPSBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemU7Ci0JCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKLQkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9kaXNrc2l6ZSA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQogCQllcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLAogCQkJICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS0mZ3Q7aW5vZGUpLAogCQkJICBidWYgJiM0MzsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsCiAJCQkgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpOwotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQomIzQzO291dF9iaDoKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlpbnQgZmxhZ3MgPSAwOwogCi1vdXRfcmVzdG9yZToKLQlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKJiM0MzsJCWlmIChkYXRhX2JoKQomIzQzOwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUOwomIzQzOwkJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCiYjNDM7CQlkb3duX3dyaXRlKCZhbXA7ZWktJmd0O2lfZGF0YV9zZW0pOwomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsCiYjNDM7CQkJCW5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpOwomIzQzOwl9CiBvdXQ6Ci0JYnJlbHNlKGRhdGFfYmgpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDc5CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjk3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXh0NCBJbmxpbmUgRGF0YSBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBtb2RpZnlpbmcgYGZzL2V4dDQvaW5saW5lLmNgIGhhcyBjYXVnaHQgbXkgYXR0ZW50aW9uLiBUaGUgcmVtb3ZhbCBvZiBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgaW50cm9kdWN0aW9uIG9mIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGNvdXBsZWQgd2l0aCB0aGUgbW9kaWZpY2F0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hpY2ggbm93IHVzZXMgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGNhbGxzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIHNjcmVhbXMgJiMzNDtmdW5jdGlvbmFsIGNoYW5nZSYjMzQ7IHRvIG1lLCBwYXJ0aWN1bGFybHkgaW4gaG93IHRoZSBleHQ0IGZpbGVzeXN0ZW0gaGFuZGxlcyBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIHRvIHJlZ3VsYXIgYmxvY2tzLiBUaGlzIGRlbWFuZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uIGZvciBmdXp6aW5nIG9wcG9ydHVuaXRpZXMuCgpTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBmb2N1cyBvbiB0aGVzZSBtb2RpZmllZCBmdW5jdGlvbnM6IGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgKHRoZSBuZXcgb25lLCBvYnZpb3VzbHkgYSBrZXkgdGFyZ2V0KSBhbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgICh3aGljaCBpcyBub3cgYmVoYXZpbmcgZGlmZmVyZW50bHkpLiBUaGUgY29yZSBvZiB0aGlzIHBhdGNoIHNlZW1zIHRvIGJlIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGlubGluZSBkYXRhIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MsIHdoaWNoIG1ha2VzIGl0IGFic29sdXRlbHkgd29ydGggZnV6emluZy4KCk15IG5leHQgc3RlcHMgd2lsbCBiZSB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBleHQ0OyBJIG5lZWQgdG8gZW5zdXJlIHRoaXMgY29kZSBwYXRoIGlzIGVuYWJsZWQgaW4gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNvbmZpcm0gdGhhdCBgQ09ORklHX0VYVDRfRlNgIGlzIHRoZSByZWxldmFudCBmbGFnLgoKVGhlbiwgSSYjMzk7bGwgdHJhY2UgdGhlIGNhbGwgZ3JhcGggdG8gZmluZCBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIGZvciBvdXIgZnV6emluZyBjYW1wYWlnbnMuIExvb2tzIGxpa2UgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgc28gdGhhdCYjMzk7cyB3aGVyZSBJIHdpbGwgc3RhcnQsIGJ5IHRyYWNpbmcgd2hlcmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgY2FsbGVkLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGNvbnN0cnVjdGluZyBlZmZlY3RpdmUgZnV6emluZyBoYXJuZXNzZXMuIFRoaXMgd2lsbCBiZSBhbiBpbnRlcmVzdGluZyBvbmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcbi0tXG5mcy9leHQ0L2NyeXB0by5jLTE1Mi1cbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlx0cmVzID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvY3J5cHRvLmMtMTU0LVx0aWYgKHJlcylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zNzg0PWV4dGVybiBpbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpO1xuZnMvZXh0NC9leHQ0LmgtMzc4NS1cbmZzL2V4dDQvZXh0NC5oOjM3ODY6ZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7XG5mcy9leHQ0L2V4dDQuaC0zNzg3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ4NTQ9bG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cdGlub2RlX2xvY2soaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDg4NDpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2V4dGVudHMuYy00ODg1LVx0aWYgKHJldClcbi0tXG5mcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTE4NC1cbmZzL2V4dDQvaW5saW5lLmM6MTE4NTpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbmZzL2V4dDQvaW5saW5lLmMtMTE4Ni1cdFx0XHRcdFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jPTEyODg9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTM0MC1cdCAqL1xuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlx0cmV0ID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGRpciwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTEzNDItXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xOTQzPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTIwNTQtXG5mcy9leHQ0L2lubGluZS5jOjIwNTU6aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9pbmxpbmUuYy0yMDU2LXtcbi0tXG5mcy9leHQ0L2lubGluZS5jLTIwOTItXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzoyMDkzOlx0XHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTIwOTQtXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbi0tXG5mcy9leHQ0L2lub2RlLmM9NTkzND1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTYwMzEtXHRcdCAgICBhdHRyLVx1MDAzZWlhX3NpemUgXHUwMDNlIEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSkge1xuZnMvZXh0NC9pbm9kZS5jOjYwMzI6XHRcdFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC9pbm9kZS5jLTYwMzMtXHRcdFx0aWYgKGVycm9yKVxuLS1cbmZzL2V4dDQvaW5vZGUuYz02Nzg3PXZtX2ZhdWx0X3QgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTY4MDgtXG5mcy9leHQ0L2lub2RlLmM6NjgwOTpcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2lub2RlLmMtNjgxMC1cdGlmIChlcnIpXG4tLVxuZnMvZXh0NC92ZXJpdHkuYz0xMDI9c3RhdGljIGludCBleHQ0X2JlZ2luX2VuYWJsZV92ZXJpdHkoc3RydWN0IGZpbGUgKmZpbHApXG4tLVxuZnMvZXh0NC92ZXJpdHkuYy0xMjgtXG5mcy9leHQ0L3Zlcml0eS5jOjEyOTpcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L3Zlcml0eS5jLTEzMC1cdGlmIChlcnIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzI1MQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEzOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqTXkgQW5hbHlzaXMgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBDYWxsZXJzKioKCkFscmlnaHQsIHNvIEkmIzM5O20gdHJhY2luZyB0aGUgZXhlY3V0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gY29kZSwgYW5kIEkgc2VlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXM6IGBleHQ0X3NldF9jb250ZXh0YCAoc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gY3J5cHRvIG9wZXJhdGlvbnMpLCBgZXh0NF9mYWxsb2NhdGVgLCBgZXh0NF9zZXRhdHRyYCwgYGV4dDRfcGFnZV9ta3dyaXRlYCwgYW5kIGBleHQ0X2JlZ2luX2VuYWJsZV92ZXJpdHlgLiBJbnRlcmVzdGluZyByYW5nZSB0aGVyZSDigJMgY292ZXJpbmcgYSBmZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgZmlsZSBtYW5pcHVsYXRpb24uCgpUaGVuLCB0aGluZ3MgZ2V0IGEgbGl0dGxlIGxlc3Mgc3RyYWlnaHRmb3J3YXJkLiBJIHNlZSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBkaXJlY3RseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoYXQgc3VnZ2VzdHMgd2UgYXJlIGxvb2tpbmcgYXQgYW4gYXR0ZW1wdCB0byBhZGQgZGF0YSBpbmxpbmUgdG8gYW4gaW5vZGUsIHdpdGhvdXQgdGFraW5nIHRoZSBnbG9iYWwgbG9jaywgc28gaXQmIzM5O3MgcHJvYmFibHkgY2FsbGVkIGR1cmluZyBhIGZpbGUgY3JlYXRlIG9yIHNpbWlsYXIgb3BlcmF0aW9uLgoKQW5kIGhlcmXigJlzIHdoZXJlIEkgbmVlZCB0byBiZSBjYXJlZnVsOyBpdCBsb29rcyBsaWtlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBhbHNvIGNhbGxzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gT2theSwgKnRoYXQqIHdhcnJhbnRzIGEgY2xvc2VyIGxvb2ssIGxldCBtZSBqdXN0IGRvdWJsZSBjaGVjayBob3cgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGZ1bmN0aW9ucy4gSSBuZWVkIHRvIGJlIGNlcnRhaW4gYWJvdXQgdGhlIGZsb3cgYW5kIHRoZSBsb2NraW5nIHNlbWFudGljcyBpbnZvbHZlZC4gSXQgc2VlbXMgbGlrZWx5IHRoYXQgdGhlICYjMzQ7bm9sb2NrJiMzNDsgdmFyaWFudCBpcyB1c2VkICp3aXRoaW4qIHRoZSBjb250ZXh0IG9mIGFuIGV4aXN0aW5nIGxvY2sgaW4gdGhpcyBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODExNQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEZWNvbnN0cnVjdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBhY3R1YWxseSBoYXBwZW5pbmcgdW5kZXIgdGhlIGhvb2Qgd2hlbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZ2V0cyBjYWxsZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gdHJhY2UgaXRzIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBvcGVyYXRlcy4gRXNzZW50aWFsbHksIEkmIzM5O20gdGhpbmtpbmcsICYjMzQ7V2hlcmUgZG9lcyB0aGlzIHBpZWNlIGZpdCBpbnRvIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIHB1enpsZT8mIzM0OyBXaGF0IG90aGVyIGZ1bmN0aW9ucyBvciBwcm9jZXNzZXMgdHJpZ2dlciB0aGlzIGNvbnZlcnNpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgY2hhaW4gd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgZm9yIHdoeSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXRpbGl6ZWQuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaXRzIGludGVyYWN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NzMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1NzM6XHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gNTc0Olx0XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNTc1Olx0e1xuIDU3NjpcdFx0aW50IHJldCwgbmVlZGVkX2Jsb2Nrcywgbm9fZXhwYW5kO1xuIDU3NzpcdFx0aGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7XG4gNTc4Olx0XHRpbnQgcmV0cmllcyA9IDAsIHNlbV9oZWxkID0gMDtcbiA1Nzk6XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIDU4MDpcdFx0dW5zaWduZWQgZnJvbSwgdG87XG4gNTgxOlx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4gNTgyOlx0XG4gNTgzOlx0XHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xuIDU4NDpcdFx0XHQvKlxuIDU4NTpcdFx0XHQgKiBjbGVhciB0aGUgZmxhZyBzbyB0aGF0IG5vIG5ldyB3cml0ZVxuIDU4NjpcdFx0XHQgKiB3aWxsIHRyYXAgaGVyZSBhZ2Fpbi5cbiA1ODc6XHRcdFx0ICovXG4gNTg4Olx0XHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbiA1ODk6XHRcdFx0cmV0dXJuIDA7XG4gNTkwOlx0XHR9XG4gNTkxOlx0XG4gNTkyOlx0XHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xuIDU5MzpcdFxuIDU5NDpcdFx0cmV0ID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcdTAwMjZpbG9jKTtcbiA1OTU6XHRcdGlmIChyZXQpXG4gNTk2Olx0XHRcdHJldHVybiByZXQ7XG4gNTk3Olx0XG4gNTk4Olx0cmV0cnk6XG4gNTk5Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfV1JJVEVfUEFHRSwgbmVlZGVkX2Jsb2Nrcyk7XG4gNjAwOlx0XHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcbiA2MDE6XHRcdFx0cmV0ID0gUFRSX0VSUihoYW5kbGUpO1xuIDYwMjpcdFx0XHRoYW5kbGUgPSBOVUxMO1xuIDYwMzpcdFx0XHRnb3RvIG91dDtcbiA2MDQ6XHRcdH1cbiA2MDU6XHRcbiA2MDY6XHRcdC8qIFdlIGNhbm5vdCByZWN1cnNlIGludG8gdGhlIGZpbGVzeXN0ZW0gYXMgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHlcbiA2MDc6XHRcdCAqIHN0YXJ0ZWQgKi9cbiA2MDg6XHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCAwLCBGR1BfV1JJVEVCRUdJTiB8IEZHUF9OT0ZTLFxuIDYwOTpcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuIDYxMDpcdFx0aWYgKElTX0VSUihmb2xpbykpIHtcbiA2MTE6XHRcdFx0cmV0ID0gUFRSX0VSUihmb2xpbyk7XG4gNjEyOlx0XHRcdGdvdG8gb3V0X25vZm9saW87XG4gNjEzOlx0XHR9XG4gNjE0Olx0XG4gNjE1Olx0XHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4gNjE2Olx0XHRzZW1faGVsZCA9IDE7XG4gNjE3Olx0XHQvKiBJZiBzb21lIG9uZSBoYXMgYWxyZWFkeSBkb25lIHRoaXMgZm9yIHVzLCBqdXN0IGV4aXQuICovXG4gNjE4Olx0XHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xuIDYxOTpcdFx0XHRyZXQgPSAwO1xuIDYyMDpcdFx0XHRnb3RvIG91dDtcbiA2MjE6XHRcdH1cbiA2MjI6XHRcbiA2MjM6XHRcdGZyb20gPSAwO1xuIDYyNDpcdFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XG4gNjI1Olx0XHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XG4gNjI2Olx0XHRcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oaW5vZGUsIGZvbGlvKTtcbiA2Mjc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbiA2Mjg6XHRcdFx0XHRnb3RvIG91dDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGV4dDRfZmNfdHJhY2tfaW5vZGUoaGFuZGxlLCBpbm9kZSk7XG4gNjMyOlx0XHRyZXQgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xuIDYzMzpcdFx0aWYgKHJldClcbiA2MzQ6XHRcdFx0Z290byBvdXQ7XG4gNjM1Olx0XG4gNjM2Olx0XHRpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKSB7XG4gNjM3Olx0XHRcdHJldCA9IGV4dDRfYmxvY2tfd3JpdGVfYmVnaW4oaGFuZGxlLCBmb2xpbywgZnJvbSwgdG8sXG4gNjM4Olx0XHRcdFx0XHRcdCAgICAgZXh0NF9nZXRfYmxvY2tfdW53cml0dGVuKTtcbiA2Mzk6XHRcdH0gZWxzZVxuIDY0MDpcdFx0XHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxuIDY0MTpcdFx0XHRcdFx0XHQgICAgIGV4dDRfZ2V0X2Jsb2NrKTtcbiA2NDI6XHRcdGNsZWFyX2J1ZmZlcl9uZXcoZm9saW9fYnVmZmVycyhmb2xpbykpO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHtcbiA2NDU6XHRcdFx0cmV0ID0gZXh0NF93YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIGlub2RlLFxuIDY0NjpcdFx0XHRcdFx0XHQgICAgIGZvbGlvX2J1ZmZlcnMoZm9saW8pLCBmcm9tLCB0byxcbiA2NDc6XHRcdFx0XHRcdFx0ICAgICBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpO1xuIDY0ODpcdFx0fVxuIDY0OTpcdFxuIDY1MDpcdFx0aWYgKHJldCkge1xuIDY1MTpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDY1MjpcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDY1MzpcdFx0XHRmb2xpbyA9IE5VTEw7XG4gNjU0Olx0XHRcdGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTtcbiA2NTU6XHRcdFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4gNjU2Olx0XHRcdHNlbV9oZWxkID0gMDtcbiA2NTc6XHRcdFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcbiA2NTg6XHRcdFx0aGFuZGxlID0gTlVMTDtcbiA2NTk6XHRcdFx0ZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpO1xuIDY2MDpcdFx0XHQvKlxuIDY2MTpcdFx0XHQgKiBJZiB0cnVuY2F0ZSBmYWlsZWQgZWFybHkgdGhlIGlub2RlIG1pZ2h0XG4gNjYyOlx0XHRcdCAqIHN0aWxsIGJlIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0b1xuIDY2MzpcdFx0XHQgKiBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGVcbiA2NjQ6XHRcdFx0ICogb3JwaGFuIGxpc3QgaW4gdGhhdCBjYXNlLlxuIDY2NTpcdFx0XHQgKi9cbiA2NjY6XHRcdFx0aWYgKGlub2RlLVx1MDAzZWlfbmxpbmspXG4gNjY3Olx0XHRcdFx0ZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTtcbiA2Njg6XHRcdH1cbiA2Njk6XHRcbiA2NzA6XHRcdGlmIChyZXQgPT0gLUVOT1NQQyBcdTAwMjZcdTAwMjYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtXHUwMDNlaV9zYiwgXHUwMDI2cmV0cmllcykpXG4gNjcxOlx0XHRcdGdvdG8gcmV0cnk7XG4gNjcyOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTgxMQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbiBMb2dpYyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcyBpbiBleHQ0LiBJdCYjMzk7cyBzdHJpa2luZyBtZSB0aGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCAqZG9lc24mIzM5O3QqIGNhbGwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBUaGF0IGZlZWxz4oCmdW51c3VhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBIYW5nIG9uLCBpcyBpdCB0aGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBzcGVjaWZpY2FsbHkgZm9yIGRpcmVjdG9yaWVzLCB3aGVyZWFzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBpcyBoYW5kbGluZyByZWd1bGFyIGZpbGVzPyBUaGF0JiMzOTtzIGEgcGxhdXNpYmxlIGRpc3RpbmN0aW9uLiBJIG5lZWQgdG8gY29uZmlybSB0aGlzLiBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEkmIzM5O2xsIGRpdmUgaW50byB0aGUgc291cmNlIGNvZGUgZm9yIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgc3BlY2lmaWNhbGx5IGluIGBmcy9leHQ0L2lubGluZS5jYC4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaXRzIGludGVuZGVkIHVzZSBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTg1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTg1Olx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4xMTg2Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4xMTg3Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpXG4xMTg4Olx0e1xuMTE4OTpcdFx0aW50IGVycm9yO1xuMTE5MDpcdFx0dm9pZCAqYnVmID0gTlVMTDtcbjExOTE6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4xMTkyOlx0XHRpbnQgaW5saW5lX3NpemU7XG4xMTkzOlx0XHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuMTE5NDpcdFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xuMTE5NTpcdFx0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKTtcbjExOTY6XHRcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4xMTk3Olx0XG4xMTk4Olx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbjExOTk6XHRcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbjEyMDA6XHRcdGlmICghYnVmKSB7XG4xMjAxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjEyMDI6XHRcdFx0Z290byBvdXQ7XG4xMjAzOlx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMjA2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMjA3Olx0XHRcdGdvdG8gb3V0O1xuMTIwODpcdFxuMTIwOTpcdFx0LypcbjEyMTA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjEyMTE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMjEyOlx0XHQgKi9cbjEyMTM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjEyMTQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjEyMTU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTIxNjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjEyMTc6XHRcdFx0aWYgKGVycm9yKVxuMTIxODpcdFx0XHRcdGdvdG8gb3V0O1xuMTIxOTpcdFx0fVxuMTIyMDpcdFxuMTIyMTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjEyMjI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMjIzOlx0XHRhci5sb2dpY2FsID0gMDtcbjEyMjQ6XHRcdGFyLmxlbiA9IDE7XG4xMjI1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTIyNjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTIyNzpcdFx0ZWxzZVxuMTIyODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMjI5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMjMwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMjMxOlx0XHRcdGdvdG8gb3V0O1xuMTIzMjpcdFx0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuMTIzMzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMjM0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjEyMzU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTIzNjpcdFx0XHRnb3RvIG91dF9iaDtcbjEyMzc6XHRcdH1cbjEyMzg6XHRcbjEyMzk6XHRcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI0MDpcdFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBkYXRhX2JoLFxuMTI0MTpcdFx0XHRcdFx0XHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XG4xMjQyOlx0XHRpZiAoZXJyb3IpIHtcbjEyNDM6XHRcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbjEyNDQ6XHRcdFx0ZXJyb3IgPSAtRUlPO1xuMTI0NTpcdFx0XHRnb3RvIG91dF9iaDtcbjEyNDY6XHRcdH1cbjEyNDc6XHRcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4xMjQ4Olx0XG4xMjQ5Olx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuMTI1MDpcdFx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuMTI1MTpcdFx0XHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xuMTI1MjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI1MzpcdFx0XHRlcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSxcbjEyNTQ6XHRcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4xMjU1Olx0XHR9IGVsc2Uge1xuMTI1NjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI1NzpcdFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuMTI1ODpcdFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuMTI1OTpcdFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTI2MDpcdFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4xMjYxOlx0XHR9XG4xMjYyOlx0b3V0X2JoOlxuMTI2MzpcdFx0aWYgKGVycm9yKSB7XG4xMjY0Olx0XHRcdGludCBmbGFncyA9IDA7XG4xMjY1Olx0XG4xMjY2Olx0XHRcdGlmIChkYXRhX2JoKVxuMTI2NzpcdFx0XHRcdGZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUO1xuMTI2ODpcdFx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XG4xMjY5Olx0XG4xMjcwOlx0XHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4xMjcxOlx0XHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4xMjcyOlx0XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xuMTI3MzpcdFx0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbjEyNzQ6XHRcdH0gZWxzZSB7XG4xMjc1Olx0XHRcdGVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSxcbjEyNzY6XHRcdFx0XHRcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xuMTI3NzpcdFx0fVxuMTI3ODpcdG91dDpcbjEyNzk6XHRcdGtmcmVlKGJ1Zik7XG4xMjgwOlx0XHRyZXR1cm4gZXJyb3I7XG4xMjgxOlx0fVxuMTI4MjpcdFxuMTI4MzpcdC8qXG4xMjg0Olx0ICogVHJ5IHRvIGFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBpbmxpbmUgZGF0YS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE3MDEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBVc2FnZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBob3cgaW5saW5lIGRhdGEgaXMgaGFuZGxlZCBpbiBleHQ0LiBJdCBzZWVtcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIHdvcmtob3JzZSBoZXJlLCBhbmQgaXQmIzM5O3MgdXNlZCBmb3IgYm90aCBkaXJlY3RvcmllcyBhbmQgcmVndWxhciBmaWxlcyDigJMgY2xldmVyLCBpdCBjaGVja3MgdGhlIGlub2RlJiMzOTtzIG1vZGUgd2l0aCBgU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKWAgdG8gZmlndXJlIG91dCB0aGUgZmlsZSB0eXBlLiBHb3QgaXQuIEFuZCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciB0aGUgb3ZlcmFsbCBmbG93LiBMZXQgbWUganVzdCBkb3VibGUtY2hlY2sgdGhhdCBmdW5jdGlvbiBjYWxsIGFuZCB0aGUgbG9naWMgYXJvdW5kIHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGUgbG9jayBpcyBoYW5kbGVkIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwNTU6XHRpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4yMDU2Olx0e1xuMjA1NzpcdFx0aW50IGVycm9yLCBuZWVkZWRfYmxvY2tzLCBub19leHBhbmQ7XG4yMDU4Olx0XHRoYW5kbGVfdCAqaGFuZGxlO1xuMjA1OTpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuMjA2MDpcdFxuMjA2MTpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbjIwNjI6XHRcdFx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuMjA2MzpcdFx0XHRyZXR1cm4gMDtcbjIwNjQ6XHRcdH0gZWxzZSBpZiAoIWV4dDRfdGVzdF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpKSB7XG4yMDY1Olx0XHRcdC8qXG4yMDY2Olx0XHRcdCAqIElub2RlIGhhcyBpbmxpbmUgZGF0YSBidXQgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEgaXNcbjIwNjc6XHRcdFx0ICogY2xlYXJlZC4gVGhpcyBtZWFucyB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBtb3Zpbmcgb2ZcbjIwNjg6XHRcdFx0ICogaW5saW5lIGRhdGEgdG8gZGVsYXkgYWxsb2NhdGVkIGJsb2NrLiBKdXN0IGZvcmNlIHdyaXRlb3V0XG4yMDY5Olx0XHRcdCAqIGhlcmUgdG8gZmluaXNoIGNvbnZlcnNpb24uXG4yMDcwOlx0XHRcdCAqL1xuMjA3MTpcdFx0XHRlcnJvciA9IGZpbGVtYXBfZmx1c2goaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbjIwNzI6XHRcdFx0aWYgKGVycm9yKVxuMjA3MzpcdFx0XHRcdHJldHVybiBlcnJvcjtcbjIwNzQ6XHRcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG4yMDc1Olx0XHRcdFx0cmV0dXJuIDA7XG4yMDc2Olx0XHR9XG4yMDc3Olx0XG4yMDc4Olx0XHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xuMjA3OTpcdFxuMjA4MDpcdFx0aWxvYy5iaCA9IE5VTEw7XG4yMDgxOlx0XHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aWxvYyk7XG4yMDgyOlx0XHRpZiAoZXJyb3IpXG4yMDgzOlx0XHRcdHJldHVybiBlcnJvcjtcbjIwODQ6XHRcbjIwODU6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcbjIwODY6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuMjA4NzpcdFx0XHRlcnJvciA9IFBUUl9FUlIoaGFuZGxlKTtcbjIwODg6XHRcdFx0Z290byBvdXRfZnJlZTtcbjIwODk6XHRcdH1cbjIwOTA6XHRcbjIwOTE6XHRcdGV4dDRfd3JpdGVfbG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbjIwOTI6XHRcdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG4yMDkzOlx0XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcdTAwMjZpbG9jKTtcbjIwOTQ6XHRcdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuMjA5NTpcdFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcbjIwOTY6XHRvdXRfZnJlZTpcbjIwOTc6XHRcdGJyZWxzZShpbG9jLmJoKTtcbjIwOTg6XHRcdHJldHVybiBlcnJvcjtcbjIwOTk6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzE1CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgY2FsbGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBhcmVhIGZvciBmdXp6aW5nLCBkZWZpbml0ZWx5IHdvcnRoIGEgY2xvc2VyIGxvb2suIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmUgZ29pbmcgdG8gYmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSGFuZyBvbiwgdGhvdWdoIOKAkyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgKnN0YXRpYyosIHNvIGl0IHdvbiYjMzk7dCBiZSBkaXJlY3RseSBleHBvc2VkIGFzIGEgZm9jdXMgZm9yIGZ1enppbmcuIFRoYXQgbmFycm93cyB0aGluZ3MgZG93biBhIGJpdC4KClJpZ2h0LCBzbyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCAqaXMqIGV4cG9ydGVkIOKAkyBpdCYjMzk7cyBnbG9iYWwuIEFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaXMgYWxzbyBnbG9iYWwuIE5vdywgSSB3YW50IHRvIHNlZSBpZiBhbnl0aGluZyAqZWxzZSogY2FsbHMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBMZXQgbWUganVzdCBkb3VibGUgY2hlY2s7IG9oLCB5ZXAsIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBjYWxscyBpdC4gQW5kIG9idmlvdXNseSwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXRzZWxmIGRvZXMuIAoKVGhlIGNvbmZpZ3VyYXRpb24gaGVyZSBpcyBgRVhUNF9GU2AsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgY29udGV4dC4gTGV0IG1lIGp1c3QgY29uZmlybSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhY3R1YWxseSBhIGdsb2JhbCBmdW5jdGlvbiBhcyB3ZWxsLCBmb3IgY2xhcml0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM3NDc9ZXh0ZXJuIGludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9leHQ0LmgtMzc1MS1cdFx0XHRcdFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcbmZzL2V4dDQvZXh0NC5oOjM3NTI6ZXh0ZXJuIGludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsXG5mcy9leHQ0L2V4dDQuaC0zNzUzLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMTg1PXN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTI4Ny0gKi9cbmZzL2V4dDQvaW5saW5lLmM6MTI4ODppbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG5mcy9leHQ0L2lubGluZS5jLTEyODktXHRcdFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9uYW1laS5jPTIzNTY9c3RhdGljIGludCBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yMzgzLVx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGRpcikpIHtcbmZzL2V4dDQvbmFtZWkuYzoyMzg0Olx0XHRyZXR2YWwgPSBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZSwgXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xuZnMvZXh0NC9uYW1laS5jLTIzODUtXHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQ3CgkJCQkJCQlvdXRwdXQ6IDE2NgoJCQkJCQkJdGhvdWdodHM6IDE1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgRXh0NCBJbmxpbmUgRGF0YSBGdW5jdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkmIzM5O20gbm90aW5nIHRoZSBzY29wZSBvZiB0aGVzZSBleHQ0IGlubGluZSBkYXRhIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFyZSBnbG9iYWwsIHdoaWNoIGlzIGltcG9ydGFudCB0byBjb25zaWRlciBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzIGFuZCBob3cgdGhleSYjMzk7cmUgZXhwb3NlZC4gVGhlbiwgSSBzZWUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyBzdGF0aWM7IHRoYXQmIzM5O3MgZ29vZCwgaXQmIzM5O3Mgc2NvcGVkIGFuZCBsaWtlbHkgbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5LgoKTm93LCBJJiMzOTttIG1vdmluZyBvbiB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAsIGFuZCBpdCYjMzk7cyBhbHNvIHN0YXRpYywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gaXRzIHNwZWNpZmljIHB1cnBvc2UuIE5leHQsIEkmIzM5O3ZlIGdvdCBgZXh0NF9nZW5lcmljX3dyaXRlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhYCB3aGljaCBhcmUgYm90aCBnbG9iYWwgZnVuY3Rpb25zLgoKSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24gbGFuZHNjYXBlIGhlcmUuIFRoZSBjZW50cmFsIGNvbmZpZyBvcHRpb24gc2VlbXMgdG8gYmUgYEVYVDRfRlNgLCB3aGljaCBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGlubGluZSBkYXRhIHN1cHBvcnQuIFRoaXMgaXMgdGhlIG1haW4gb25lIHRoYXQgbWF0dGVycyBoZXJlLgoKT2theSwgSSB0aGluayBJJiMzOTt2ZSBnb3QgdGhlIGxheSBvZiB0aGUgbGFuZCBub3cuIExldCYjMzk7cyB1c2UgdGhlIGBzZXQtcmVzdWx0c2AgdG9vbCB0byBhbmFseXplIHRoaXMgZnVydGhlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBpbiBleHQ0LCBzcGVjaWZpY2FsbHkgaG93IGlubGluZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgYmxvY2suIEl0IHJlcGxhY2VzIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YSB3aXRoIGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrIGFuZCBjaGFuZ2VzIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2sgdG8gdXNlIGV4dDRfbWJfbmV3X2Jsb2NrcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGV4dDRfbWFwX2Jsb2Nrcy4gVGhlc2UgYXJlIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBhZGRpbmcgZGlyZWN0b3J5IGVudHJpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBpbiBleHQ0LCBzcGVjaWZpY2FsbHkgaG93IGlubGluZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgYmxvY2suIEl0IHJlcGxhY2VzIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YSB3aXRoIGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrIGFuZCBjaGFuZ2VzIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2sgdG8gdXNlIGV4dDRfbWJfbmV3X2Jsb2NrcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGV4dDRfbWFwX2Jsb2Nrcy4gVGhlc2UgYXJlIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBhZGRpbmcgZGlyZWN0b3J5IGVudHJpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjltPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+OW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cblxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxuMi4gYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgYnV0IGFsbCBvZiBpdHMgZmllbGRzIChgZWVfYmxvY2tgLCBgZWVfbGVuYCwgYGVlX3N0YXJ0X2hpYCwgYGVlX3N0YXJ0X2xvYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgKHRoZSBsYXR0ZXIgdHdvIHZpYSBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCksIGFuZCB0aGUgc3RydWN0IGNvbnRhaW5zIG5vIHBhZGRpbmcuXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXG41LiBUaGUgbmV3IGJsb2NrIGJ1ZmZlciBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXG5cblRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgcmVhZCwgdXNlZCBpbiBjb250cm9sIGZsb3csIG9yIGxlYWtlZCB0byB1c2VyIHNwYWNlLiBUaGUgcGF0Y2ggcHJpbWFyaWx5IGFkZHJlc3NlcyBleHQ0IGludGVybmFsIG1ldGFkYXRhIG1hbmlwdWxhdGlvbiAobGlrZWx5IHRvIGZpeCBhIGRlYWRsb2NrLCB0cmFuc2FjdGlvbiBpc3N1ZSwgb3IgdXNlLWFmdGVyLWZyZWUpLiBTdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIGZ1bGx5IHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2NraW5nIGJ1Z3MpIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGJkYjI3MjA4NDk3NzU0MTAxYWM0ZWNlMDFlZTQ4ODA5ZTFmNWQzNTgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jCmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5saW5lLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuYwpAQCAtMTQsNiAmIzQzOzE0LDcgQEAKICNpbmNsdWRlICYjMzQ7ZXh0NC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7eGF0dHIuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3RydW5jYXRlLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7ZXh0NF9leHRlbnRzLmgmIzM0OwogCiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEEJJiMzNDtkYXRhJiMzNDsKICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRQkoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpCkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsCi0JCQkJICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSkKJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jaywKJiM0MzsJCQkJCXVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiYjNDM7CWludCBpbm9kZV9zaXplOwomIzQzOwl2b2lkICppbm9kZV9idWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlOwogCi0JcmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpOwotCWlmIChyZXQpIHsKLQkJZXh0NF9tc2coaW5vZGUtJmd0O2lfc2IsIEtFUk5fRU1FUkcsCi0JCQkmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKSYjMzQ7LAotCQkJaW5vZGUtJmd0O2lfaW5vLCByZXQpOwotCQlyZXR1cm47CiYjNDM7CWlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtJmd0O2lfc2IpOwomIzQzOwlpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTsKJiM0MzsJaWYgKCFpbm9kZV9idWYpIHsKJiM0MzsJCWVycm9yID0gLUVOT01FTTsKJiM0MzsJCWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmYW1wO2lzLmlsb2MpOwomIzQzOwlpZiAoZXJyb3IpIHsKJiM0MzsJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiYjNDM7CQl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJCWtmcmVlKGlub2RlX2J1Zik7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiYjNDM7CX0KJiM0MzsJcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoJmFtcDtpcy5pbG9jKTsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJbWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpOwomIzQzOwltZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtJmd0O2lfYmxvY2ssIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwltZW1zZXQoZWktJmd0O2lfZGF0YSwgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7CiYjNDM7CWlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtJmd0O2lfc2IpICZhbXA7JmFtcDsKJiM0MzsJCShTX0lTRElSKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNSRUcoaW5vZGUtJmd0O2lfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0mZ3Q7aV9tb2RlKSkpIHsKJiM0MzsJCWV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7CiYjNDM7CQlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7CiYjNDM7CQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApOwomIzQzOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlnb3RvIHJlY292ZXJ5OwomIzQzOwkJfQomIzQzOwkJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4OwomIzQzOwomIzQzOwkJbmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTsKJiM0MzsJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCXBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZhbXA7bmV3ZXgsIDApOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7CiYjNDM7CQkJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTsKJiM0MzsJCQkJZ290byBub2ZyZWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CWlmICghaXMucy5ub3RfZm91bmQpCiYjNDM7CQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7cmVjb3Zlcnk6CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKJiM0Mztub2ZyZWU6CiYjNDM7CQltZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7CiYjNDM7CQltZW1jcHkoZWktJmd0O2lfZGF0YSwgcmF3X2lub2RlLSZndDtpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7CiYjNDM7CQlnZXRfYmgoaXMuaWxvYy5iaCk7CiYjNDM7CQllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9vZmYgPSAwOwomIzQzOwkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9pbmxpbmVfc2l6ZSA9IDA7CiYjNDM7CQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CQlpZiAoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSkgewomIzQzOwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCQlFWFQ0X0koaW5vZGUpLSZndDtpX2Rpc2tzaXplID0gaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwkJfQomIzQzOwkJYnJlbHNlKGJoKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJYnJlbHNlKGlzLmlsb2MuYmgpOwomIzQzOwl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJa2ZyZWUoaW5vZGVfYnVmKTsKJiM0MzsJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTEwOTQsOCAmIzQzOzExODksMTEgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKJiM0MzsJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYik7CiYjNDM7CXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7CiAKIAlpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKIAlidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7CkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAkJCWdvdG8gb3V0OwogCX0KIAotCWVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JbWFwLm1fbGJsayA9IDA7Ci0JbWFwLm1fbGVuID0gMTsKLQltYXAubV9mbGFncyA9IDA7Ci0JZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgJmFtcDttYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpOwomIzQzOwltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CiYjNDM7CWFyLmlub2RlID0gaW5vZGU7CiYjNDM7CWFyLmxvZ2ljYWwgPSAwOwomIzQzOwlhci5sZW4gPSAxOwomIzQzOwlpZiAoU19JU1JFRyhpbm9kZS0mZ3Q7aV9tb2RlKSkKJiM0MzsJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CiYjNDM7CWVsc2UKJiM0MzsJCWFyLmZsYWdzID0gMDsKJiM0MzsJbmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYW1wO2FyLCAmYW1wO2Vycm9yKTsKIAlpZiAoZXJyb3IgJmx0OyAwKQotCQlnb3RvIG91dF9yZXN0b3JlOwotCWlmICghKG1hcC5tX2ZsYWdzICZhbXA7IEVYVDRfTUFQX01BUFBFRCkpIHsKLQkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwotCX0KLQotCWRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtJmd0O2lfc2IsIG1hcC5tX3BibGspOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzEyNDIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNTksMjQgJiM0MzsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkJICAgaW5vZGUsIGRhdGFfYmgpOwogCX0gZWxzZSB7CiAJCXVubG9ja19idWZmZXIoZGF0YV9iaCk7Ci0JCWlub2RlLSZndDtpX3NpemUgPSBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemU7Ci0JCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKLQkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9kaXNrc2l6ZSA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQogCQllcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLAogCQkJICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS0mZ3Q7aW5vZGUpLAogCQkJICBidWYgJiM0MzsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsCiAJCQkgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpOwotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQomIzQzO291dF9iaDoKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlpbnQgZmxhZ3MgPSAwOwogCi1vdXRfcmVzdG9yZToKLQlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKJiM0MzsJCWlmIChkYXRhX2JoKQomIzQzOwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUOwomIzQzOwkJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCiYjNDM7CQlkb3duX3dyaXRlKCZhbXA7ZWktJmd0O2lfZGF0YV9zZW0pOwomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsCiYjNDM7CQkJCW5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpOwomIzQzOwl9CiBvdXQ6Ci0JYnJlbHNlKGRhdGFfYmgpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTA3NgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE4MjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgSW5saW5lIERhdGEgQ29udmVyc2lvbiBQYXRjaCBpbiBleHQ0KioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyBtb2RpZnlpbmcgYGZzL2V4dDQvaW5saW5lLmNgIGluIHRoZSBMaW51eCBrZXJuZWwuIFRoZSBjb3JlIG9mIGl0IHNlZW1zIHRvIGJlIGNoYW5naW5nIGhvdyBpbmxpbmUgZGF0YSBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgcmVndWxhciBibG9jayBvbiBkaXNrLiBJbnN0ZWFkIG9mIHRoZSBvbGQgZnVuY3Rpb25zLCBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3ZSYjMzk7cmUgbm93IGxvb2tpbmcgYXQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gSXQmIzM5O3MgYWxzbyBkaXRjaGluZyB0aGUgdXNlIG9mIGBleHQ0X21hcF9ibG9ja3NgIGluIGZhdm9yIG9mIGRpcmVjdGx5IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGZvciBibG9jayBhbGxvY2F0aW9uLgoKTGV0JiMzOTtzIGJyZWFrIGRvd24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gSSYjMzk7bSBzZWVpbmcgaXQgYWxsb2NhdGVzIGBpbm9kZV9idWZgIHdpdGggYGttYWxsb2NgLCB3aGljaCBtZWFucyBpdCBpc24mIzM5O3QgaW5pdGlhbGl6ZWQuIFRoZW4sIGl0IGltbWVkaWF0ZWx5IGNvcGllcyB0aGUgZW50aXJlIGByYXdfaW5vZGVgIGludG8gaXQuIElmIGFueSBlcnJvciBwb3BzIHVwIGxhdGVyLCBpdCByZXN0b3JlcyBgcmF3X2lub2RlYCBmcm9tIHRoaXMgYmFja3VwLiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgbWlnaHQgbG9vayBsaWtlIGEgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLCBidXQgc2luY2UgYGlub2RlX2J1ZmAgaXMgaW1tZWRpYXRlbHkgZmlsbGVkIHdpdGggYSBjb3B5IG9mIGByYXdfaW5vZGVgLCBpdCBzaG91bGQgYmUgZmluZS4gSXQgaXMgb25seSB1c2VkIGlmIHRoZXJlJiMzOTtzIGEgcmVjb3ZlcnkuCgpOb3csIGNoZWNraW5nIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIGBidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7YCBmb3IgYSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEsIHdoaWNoIHNlZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggZGF0YSByZWFkIGZyb20gZGlzay4gVGhlIG5ldyBibG9jayBgZGF0YV9iaGAgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIHRoZXJlJiMzOTtzIG5vIG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgdXNlZCBoZXJlLgoKVGhlIG1haW4gY29uY2VybiBpbiBhIHBhdGNoIGxpa2UgdGhpcyBpcyB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBlaXRoZXIgZ2V0IHdyaXR0ZW4gdG8gZGlzaywgd2hpY2ggd291bGQgYmUgZGlzYXN0cm91cywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgaXNzdWUuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgYGlub2RlX2J1ZmAgaXMgYSBiYWNrdXAgZm9yIHRoZSBgcmF3X2lub2RlYCwgcmVhZCBmcm9tIGRpc2sgYW5kIHRoZSBjb3B5IGlzIGRvbmUgZnJvbSBpdCBhbmQgdGhlIG90aGVyIGJ1ZmZlciBpcyByZWFkIGZyb20gZGlzay4gU28sIGFzIGxvbmcgYXMgYGV4dDRfZ2V0X2lub2RlX2xvY2Agc3VjY2VlZHMsIGFuZCBgaW5vZGVfc2l6ZWAgaXMgZnVsbHkgcmVhZCBmcm9tIGRpc2ssIHRoZSBgcmF3X2lub2RlYCBzaG91bGQgYmUgdmFsaWQuCgpPa2F5LCBsZXQmIzM5O3MgbG9vayBmb3IgbW9yZSBoaW50cy4gSW5zaWRlIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIEkgc2VlIGEgY291cGxlIG9mIHN0cnVjdHMgYmVpbmcgaW5pdGlhbGl6ZWQuIFRoZSBmaXJzdCBpcyBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIHdoZXJlIEkgc2VlIGAucy5ub3RfZm91bmQgPSAwYCBiZWluZyBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBJbiBDLCBpZiBvbmUgZmllbGQgb2YgYSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIHRoZSBvdGhlcnMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8sIHNvIG5vIHByb2JsZW1zIHRoZXJlLiBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCwgd2hlcmUgYC5uYW1lX2luZGV4YCwgYC5uYW1lYCwgYC52YWx1ZWAsIGFuZCBgLnZhbHVlX2xlbmAgYXJlIGluaXRpYWxpemVkIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSwgdGhyb3VnaCB6ZXJvaW5nLiBBbHNvIGBpbnQgZXJyb3JgLCBgaW50IGlub2RlX3NpemVgLCBgdm9pZCAqaW5vZGVfYnVmID0gTlVMTGAsIGFuZCBgc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtgIGRvbiYjMzk7dCBzZWVtIHRvIGJlIHByb2JsZW1hdGljLiBUaGV5IGFyZSBlaXRoZXIgYXNzaWduZWQgb3IgcmUtaW5pdGlhbGl6ZWQgbGF0ZXIuCgpMb29raW5nIGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgc2ltaWxhciB2YXJpYWJsZXMgbGlrZSBgZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYilgLCBhbmQgYHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7YCBzZWVtIHNhZmU7IGBhcmAgaXMgZnVsbHkgemVyb2VkLgoKU28sIGFtIEkgc2VlaW5nIGFueSByZWFsIHJpc2s/IFRoZSBwYXRjaCBzZWVtcyB0byBiZSBhYm91dCBmaXhpbmcgYW4gZXhpc3RpbmcgYnVnIGR1cmluZyBpbmxpbmUgZGF0YSBjb252ZXJzaW9uLiBUaGUgbmV3IGJsb2NrIGlzIGZ1bGx5IHplcm9lZCBvdXQsIGFuZCB0aGUgYGlub2RlX2J1ZmAgaXMgZmlsbGVkIHdpdGggdmFsaWQgZGF0YSBpbW1lZGlhdGVseS4gU28gSSYjMzk7bSB0aGlua2luZyB0aGUgYnVnIGZpeGVkIGJ5IHRoaXMgaXMgbGlrZWx5IGEgY3Jhc2gsIGEgZGVhZGxvY2ssIG9yIGRhdGEgY29ycnVwdGlvbiwgc29tZXRoaW5nIHRoYXQgbWlnaHQgdHJpZ2dlciBLQVNBTiwgYnV0IEkgZG9uJiMzOTt0IHNlZSBhbnkgaW50cm9kdWN0aW9uIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKTGV0IG1lIGdvIGJhY2sgYW5kIGRvdWJsZSBjaGVjayBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBBaCwgaGVyZSEgVGhlcmUmIzM5O3MgYW4gYGV4dDRfZXh0ZW50YCBiZWluZyB1c2VkLiBJdCYjMzk7cyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGFuZCB0aGVuIGAuZWVfYmxvY2tgLCBgLmVlX2xlbmAgYXJlIGFzc2lnbmVkLiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3RydWN0IHdpbGwgYmUgc2V0IGxhdGVyLiBBcyB0aGUgdG9vbCBpbmRpY2F0ZXM6CmBgYGMKc3RydWN0IGV4dDRfZXh0ZW50IHsKICBfX2xlMzIgIGVlX2Jsb2NrOwogIF9fbGUxNiAgZWVfbGVuOwogIF9fbGUxNiAgZWVfc3RhcnRfaGk7CiAgX19sZTMyICBlZV9zdGFydF9sbzsKICBfX2xlMTYgIGVlX2ZpbGVfYWNsOwogIF9fbGUxNiAgZWVfZmxhZ3M7Cn07CmBgYApFdmVyeXRoaW5nIHdpdGhpbiB0aGF0IHN0cnVjdCBpcyBhc3NpZ25lZC4gU28sIEkgZG9uJiMzOTt0IHNlZSBhbnkgdW4KCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgZXh0NF9leHRlbnQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01NS0gKi9cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXHRfX2xlMzJcdGVlX2Jsb2NrO1x0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgwNjgKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqRGl2aW5nIGludG8gdGhlIEV4dGVudCBTdHJ1Y3R1cmUqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgcmVhbGx5IHVuZGVyc3RhbmQgaG93IGV4dGVudHMgYXJlIGltcGxlbWVudGVkIGluIGV4dDQuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGUgaGVhZGVyIGZpbGUsIHNwZWNpZmljYWxseSBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAuIE5vIGZsdWZmLCBqdXN0IHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYHN0cnVjdCBleHQ0X2V4dGVudGAuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgZXhhY3QgbGF5b3V0LCB0aGUgZmllbGRzLCBhbmQgaG93IHRoZSB2YXJpb3VzIGZsYWdzIGFuZCB2YWx1ZXMgYWxsIGludGVyYWN0LiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ7IHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIGl0c2VsZiBpcyBrZXkgdG8gYW55IHJlYWwgYW5hbHlzaXMgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBleHRlbnQgaW1wbGVtZW50YXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSYjMzk7dmUgZ290IGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0fTtcbiAgNTE6XHRcbiAgNTI6XHQvKlxuICA1MzpcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNTQ6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUuXG4gIDU1Olx0ICovXG4gIDU2Olx0c3RydWN0IGV4dDRfZXh0ZW50IHtcbiAgNTc6XHRcdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiAgNTg6XHRcdF9fbGUxNlx0ZWVfbGVuO1x0XHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXG4gIDU5Olx0XHRfX2xlMTZcdGVlX3N0YXJ0X2hpO1x0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXG4gIDYwOlx0XHRfX2xlMzJcdGVlX3N0YXJ0X2xvO1x0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjE6XHR9O1xuICA2MjpcdFxuICA2MzpcdC8qXG4gIDY0Olx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNjU6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxuICA2NjpcdCAqL1xuICA2NzpcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xuICA2ODpcdFx0X19sZTMyXHRlaV9ibG9jaztcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICYjMzk7YmxvY2smIzM5OyAqL1xuICA2OTpcdFx0X19sZTMyXHRlaV9sZWFmX2xvO1x0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjE0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXh0NCBFeHRlbnQgU3RydWN0dXJlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLCBhbmQgaXQmIzM5O3MgZ290IGZvdXIga2V5IGZpZWxkczogYGVlX2Jsb2NrYCAoMzItYml0LCBJIHJlbWVtYmVyIHRoYXQpLCBgZWVfbGVuYCAoMTYtYml0LCB0aGF0JiMzOTtzIGV4cGVjdGVkKSwgYW5kIHRoZW4gd2UgaGF2ZSBgZWVfc3RhcnRfaGlgIGFuZCBgZWVfc3RhcnRfbG9gIHdoaWNoIGFyZSBlYWNoIDE2IGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gR290IGl0LiBOb3csIGluIHRoaXMgcGF0Y2gsIEkgc2VlIHRoZXkmIzM5O3JlIGNyZWF0aW5nIGEgbmV3IGBzdHJ1Y3QgZXh0NF9leHRlbnRgIG5hbWVkIGBuZXdleGAuIFRoZXkmIzM5O3JlIGluaXRpYWxpemluZyBgZWVfYmxvY2tgIHRvIDAsIHdoaWNoIGlzIGFsd2F5cyBhIHN0YXJ0aW5nIHBvaW50LCBhbmQgYGVlX2xlbmAgdG8gMSwgb2theSwgbWFrZXMgc2Vuc2UuIEJ1dCB0aGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGlzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGNhbGwuIEkgbmVlZCB0byBkaXZlIGludG8gd2hhdCB0aGlzIGZ1bmN0aW9uICphY3R1YWxseSogZG9lcy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIHdpdGggdGhpcyBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MjE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfc3RvcmVfcGJsb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQxLS8qXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0MjogKiBleHQ0X2V4dF9zdG9yZV9wYmxvY2s6XG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0My0gKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0yMjc9c3RhdGljIGludCBleHRlbnRzX2t1bml0X2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzE5LVx0RVhUX0ZJUlNUX0VYVEVOVChlaCktXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoRVhUX0RBVEFfTEVOKTtcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6MzIwOlx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKEVYVF9GSVJTVF9FWFRFTlQoZWgpLCBFWFRfREFUQV9QQkxLKTtcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzIxLVx0aWYgKCFwYXJhbSB8fCBwYXJhbS1cdTAwM2Vpc191bndyaXRfYXRfc3RhcnQpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjA4NS1cdFx0XHRleC1cdTAwM2VlZV9ibG9jayA9IG5ld2V4dC1cdTAwM2VlZV9ibG9jaztcbmZzL2V4dDQvZXh0ZW50cy5jOjIwODY6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XG5mcy9leHQ0L2V4dGVudHMuYy0yMDg3LVx0XHRcdGV4LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTIxOTYtXHRuZWFyZXgtXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXHUwMDNlZWVfYmxvY2s7XG5mcy9leHQ0L2V4dGVudHMuYzoyMTk3Olx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xuZnMvZXh0NC9leHRlbnRzLmMtMjE5OC1cdG5lYXJleC1cdTAwM2VlZV9sZW4gPSBuZXdleHQtXHUwMDNlZWVfbGVuO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTI2MTQ9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTI3MzktXHRcdFx0LyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mjc0MDpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtMjc0MS1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ2LVx0ZXgyLVx1MDAzZWVlX2xlbiAgID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gKHNwbGl0IC0gZWVfYmxvY2spKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNDc6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBuZXdibG9jayk7XG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ4LVx0aWYgKGlzX3Vud3JpdClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zNTU3PWV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ1LVx0XHRcdGV4LVx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoZWVfYmxvY2sgJiM0MzsgbWFwX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNjQ2Olx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZWVfcGJsayAmIzQzOyBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM2NDctXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzY5MS1cdFx0XHRhYnV0X2V4LVx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobmV4dF9sYmxrIC0gbWFwX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNjkyOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhhYnV0X2V4LCBuZXh0X3BibGsgLSBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM2OTMtXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzc0NS1cdFx0XHRcdGNwdV90b19sZTE2KCphbGxvY2F0ZWQgLSBzcGxpdF9tYXAubV9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmM6Mzc0NjpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2emVyb19leDEsXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ3LVx0XHRcdFx0ZXh0NF9leHRfcGJsb2NrKGV4KSAmIzQzOyBzcGxpdF9tYXAubV9sYmxrICYjNDM7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzc2MC1cdFx0XHRcdFx0XHRcdGVlX2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NjE6XHRcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2emVyb19leDIsXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYyLVx0XHRcdFx0XHRcdCAgICAgIGV4dDRfZXh0X3BibG9jayhleCkpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQyNjk9aW50IGV4dDRfZXh0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy00NDczLVx0cGJsayA9IG5ld2Jsb2NrICYjNDM7IG9mZnNldDtcbmZzL2V4dDQvZXh0ZW50cy5jOjQ0NzQ6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIHBibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNDQ3NS1cdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGFyLmxlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTc2Mz1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01ODk3LVx0XHR0bXBfZXggPSAqZXgxO1xuZnMvZXh0NC9leHRlbnRzLmM6NTg5ODpcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MSwgZXh0NF9leHRfcGJsb2NrKGV4MikpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTg5OTpcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgZXh0NF9leHRfcGJsb2NrKFx1MDAyNnRtcF9leCkpO1xuZnMvZXh0NC9leHRlbnRzLmMtNTkwMC1cdFx0ZXgxLVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGUyX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjAyNz1pbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MDgwLVx0XHRleHQ0X2V4dF9tYXJrX2luaXRpYWxpemVkKGV4KTtcbmZzL2V4dDQvZXh0ZW50cy5jOjYwODE6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHBibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNjA4Mi1cdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9OTMxPXN0YXRpYyBpbnQgZXh0NF9mY193cml0ZV9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqY3JjKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy05NjEtXHRcdGV4LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KHJhbmdlLVx1MDAzZWxlbik7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6OTYyOlx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHJhbmdlLVx1MDAzZXBibGspO1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2My1cdFx0aWYgKHJhbmdlLVx1MDAzZXVud3JpdHRlbilcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjE0OD1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2FkZF9yYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1OCAqdmFsKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjAyLVx0XHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY3VyKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMjAzOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA0LVx0XHRcdFx0XHUwMDI2bmV3ZXgsIHN0YXJ0X3BibGsgJiM0MzsgY3VyIC0gc3RhcnQpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jayxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMzUtXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuZnMvZXh0NC9pbmxpbmUuYzoxMTM2Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbmZzL2V4dDQvaW5saW5lLmMtMTEzNy1cdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSk7XG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG5mcy9leHQ0L21pZ3JhdGUuYy0zNS1cdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT43bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNDI5CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUgd2UgZ28uIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVla2luZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGZ1bmN0aW9uLiBJdCYjMzk7cyBpbiBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAsIHNvIGl0JiMzOTtzIGNsZWFybHkgcmVsYXRlZCB0byB0aGUgZXh0ZW50cyBjb2RlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBNeSBpbW1lZGlhdGUgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2x2ZWQgaW4gKnN0b3JpbmcqIHRoZSBwaHlzaWNhbCBibG9jayAocGJsb2NrKSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGV4dGVudCBtYXBwaW5ncy4gR2l2ZW4gaXRzIG5hbWUsIGl0IHNvdW5kcyBsaWtlIGEgY29yZSBidWlsZGluZyBibG9jayBmb3IgbWFuYWdpbmcgdGhvc2UgZXh0ZW50IHN0cnVjdHVyZXMuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyByZWxhdGVzIHRvIHRoZSBvdmVyYWxsIGV4dGVudCB0cmVlIHN0cnVjdHVyZSBhbmQgaG93IGl0IGhhbmRsZXMgdGhpbmdzIGxpa2UgYmxvY2sgYWxsb2NhdGlvbiwgbWV0YWRhdGEgdXBkYXRlcywgYW5kIHBvdGVudGlhbCBlcnJvciBoYW5kbGluZy4gSSB3b25kZXIgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGJsb2NrIGRldmljZSBpbnRlcmZhY2UuIFRpbWUgdG8gZGlnIGluIGFuZCBzZWUgaG93IHRoaXMgc3BlY2lmaWMgcGllY2UgZml0cyBpbnRvIHRoZSBsYXJnZXIgZXh0NCBleHRlbnQgamlnc2F3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI0MDpcdFxuIDI0MTpcdC8qXG4gMjQyOlx0ICogZXh0NF9leHRfc3RvcmVfcGJsb2NrOlxuIDI0MzpcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXG4gMjQ0Olx0ICogYnJlYWtpbmcgaXQgaW50byBwYXJ0c1xuIDI0NTpcdCAqL1xuIDI0NjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcbiAyNDc6XHRcdFx0XHRcdFx0IGV4dDRfZnNibGtfdCBwYilcbiAyNDg6XHR7XG4gMjQ5Olx0XHRleC1cdTAwM2VlZV9zdGFydF9sbyA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBsb25nKSAocGIgXHUwMDI2IDB4ZmZmZmZmZmYpKTtcbiAyNTA6XHRcdGV4LVx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXHUwMDNlXHUwMDNlIDMxKSBcdTAwM2VcdTAwM2UgMSkgXHUwMDI2XG4gMjUxOlx0XHRcdFx0XHQgICAgICAweGZmZmYpO1xuIDI1MjpcdH1cbiAyNTM6XHRcbiAyNTQ6XHQvKlxuIDI1NTpcdCAqIGV4dDRfaWR4X3N0b3JlX3BibG9jazpcbiAyNTY6XHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBpbmRleCBzdHJ1Y3QsXG4gMjU3Olx0ICogYnJlYWtpbmcgaXQgaW50byBwYXJ0c1xuIDI1ODpcdCAqL1xuIDI1OTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2lkeF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMDI1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogODcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgSW5pdGlhbGl6YXRpb24gaW4gZXh0NCBGaWxlIFN5c3RlbSBPcGVyYXRpb25zKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLiBGaXJzdCwgSSBzZWUgdGhhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBzZXRzIGJvdGggYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLiBHb29kLCBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGFmdGVyIHRoYXQgY2FsbCwgd2hpY2ggaXMgd2hhdCBJIGV4cGVjdC4KClRoZW4sIEkgc2hpZnRlZCBteSBmb2N1cyB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEkgc2VlIGBidWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBhbmQgdGhlbiBmaWxsZWQgYnkgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIE15IHF1ZXN0aW9uIHRoZW4gaXM6IERvZXMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZnVsbHkgaW5pdGlhbGl6ZSBpdD8gWWVzLCBpdCByZWFkcyBpbiB0aGUgaW5saW5lIGRhdGEgZnJvbSB0aGUgcmVsZXZhbnQgc291cmNlLCBzbyBpdCBzaG91bGQgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhhdCBjYWxsLiBJIGNhbiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24uCgpOZXh0IHVwLCBJIHNlZSBgbWVtc2V0KCZhbXA7YXIsIDAsIHNpemVvZihhcikpYCB3aGljaCBlbnN1cmVzIHRoYXQgYGFyYCBpcyBmdWxseSB6ZXJvZWQgb3V0LCB3aGljaCBpcyBnb29kLgoKQWZ0ZXIgdGhhdCwgdGhlIGNvZGUgZ3JhYnMgYSBuZXcgYmxvY2ssIGFuZCB0aGVuIGdldHMgYSBidWZmZXIgaGVhZC4gYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgb3V0LCBzbyB0aGF0JiMzOTtzIHRha2VuIGNhcmUgb2YuCgpGaW5hbGx5LCBpbiB0aGUgc3Vic2VxdWVudCBjb25kaXRpb25hbCwgSSBzZWUgdGhhdCBpZiBpdCYjMzk7cyBub3QgYSBkaXJlY3RvcnksIGEgYG1lbWNweWAgY29waWVzIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtJmd0O2JfZGF0YWAg4oCTIHdoaWNoIGlzIGZpbmUgc2luY2UgYGJ1ZmAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQg4oCTIGFmdGVyIGBkYXRhX2JoLSZndDtiX2RhdGFgIHdhcyB6ZXJvZWQuIE90aGVyd2lzZSwgYGV4dDRfaW5pdF9kaXJibG9ja2AgaXMgY2FsbGVkLiBTbywgSSBuZWVkIHRvIGNoZWNrIGBleHQ0X2luaXRfZGlyYmxvY2tgIG5leHQgdG8gbWFrZSBzdXJlIHRoYXQgYnJhbmNoIGlzIGhhbmRsZWQgY29ycmVjdGx5IGFzIHdlbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfaW5pdF9kaXJibG9jayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM3OTc9ZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7XG5mcy9leHQ0L2V4dDQuaDozNzk4OmV4dGVybiBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dDQuaC0zNzk5LVx0XHRcdCAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2Jsb2NrLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTE4NT1zdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTEyNTYtXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG5mcy9leHQ0L2lubGluZS5jOjEyNTc6XHRcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXG5mcy9leHQ0L2lubGluZS5jLTEyNTgtXHRcdFx0ICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS1cdTAwM2Vpbm9kZSksXG4tLVxuZnMvZXh0NC9uYW1laS5jPTI4ODI9c3RhdGljIGludCBleHQ0X3RtcGZpbGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yOTIyLVxuZnMvZXh0NC9uYW1laS5jOjI5MjM6aW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9uYW1laS5jLTI5MjQtXHRcdCAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgcGFyZW50X2lubyxcbi0tXG5mcy9leHQ0L25hbWVpLmM9Mjk2OT1pbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTI5ODgtXHRcdHJldHVybiBQVFJfRVJSKGRpcl9ibG9jayk7XG5mcy9leHQ0L25hbWVpLmM6Mjk4OTpcdGVyciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkaXJfYmxvY2ssIGRpci1cdTAwM2VpX2lubywgTlVMTCwgMCk7XG5mcy9leHQ0L25hbWVpLmMtMjk5MC1vdXQ6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzODA0CgkJCQkJCQlvdXRwdXQ6IDQxNQoJCQkJCQkJdGhvdWdodHM6IDE1ODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIGNvbmNlcm4gd2FzIGFib3V0IHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSwgYnV0IGFmdGVyIGNhcmVmdWwgaW5zcGVjdGlvbiwgSSYjMzk7bSBmYWlybHkgY29uZmlkZW50IHRoZXJlIGFyZW4mIzM5O3QgYW55IGlzc3Vlcy4KCkZpcnN0LCBJIHNlZSB0aGUgYWxsb2NhdGlvbiBvZiBgaW5vZGVfYnVmYCB1c2luZyBga21hbGxvY2AuIFRoZW4sIHRoZSBkYXRhIGlzIGNvcGllZCBmcm9tIGRpc2sgdXNpbmcgYG1lbWNweWAgaW50byBgaW5vZGVfYnVmYC4gIFRoZSBjcml0aWNhbCBwb2ludCBoZXJlIGlzIHRoYXQgYGV4dDRfZ2V0X2lub2RlX2xvY2AgZW5zdXJlcyBgcmF3X2lub2RlYCBwb2ludHMgdG8gdmFsaWQgaW5vZGUgZGF0YSByZWFkIGZyb20gdGhlIGRpc2suIFRoZSBzaXplIG9mIHRoZSBjb3B5LCBgaW5vZGVfc2l6ZWAsIGlzIGRldGVybWluZWQgYnkgYEVYVDRfSU5PREVfU0laRWAgd2hpY2ggaXMgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIGlub2RlIG9uIGRpc2suIFNpbmNlIHRoaXMgZGF0YSBjb21lcyBkaXJlY3RseSBmcm9tIGRpc2ssIGl0JiMzOTtzIGZ1bGx5IGluaXRpYWxpemVkLiBFdmVuIGlmIGBpbm9kZV9zaXplYCBoYXBwZW5zIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBsb2dpY2FsbHkgJiMzNDt1c2VkJiMzNDsgcGFydCBvZiB0aGUgZGF0YSBvbiBkaXNrLCBgbWVtY3B5YCB3aWxsIHN0aWxsIHJlYWQgYSBjb2hlcmVudCBibG9jayBmcm9tIGRpc2sgdG8gdGhlIGJ1ZmZlci4KClRoZSBmb2xsb3dpbmcgYG1lbXNldGAgY2FsbHMgemVybyBvdXQgdGhlIGlubGluZSBkYXRhIGFyZWEgYWZ0ZXIgdGhlIGRpc2sgZGF0YSBpcyBzYWZlbHkgY29waWVkLiBJbXBvcnRhbnRseSwgdGhlcmUmIzM5O3MgYSBzYWZlZ3VhcmQgdXNpbmcgYG1lbWNweWAgdGhhdCByZXN0b3JlcyB0aGUgaW5vZGUgdG8gaXRzIG9yaWdpbmFsIHN0YXRlIGlmIGFuIGVycm9yIG9jY3Vycy4gIFRoaXMgbWVhbnMgd2XigJlyZSBlaXRoZXIgdXNpbmcgaW5pdGlhbGl6ZWQgZGlzayBkYXRhLCBvciByZXN0b3JpbmcgaXQgdG8gdGhlIG9yaWdpbmFsLCBrbm93biBnb29kIHN0YXRlLiBTbywgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoIGhlcmUgaXMgY2xlYW4uCgpUaGUgY2hhbmdlcyBwcmltYXJpbHkgZGVhbCB3aXRoIGJsb2NrIGFsbG9jYXRpb24gYW5kIGlub2RlIHVwZGF0ZXMuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyB1c2luZyBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByb2JhYmx5IGNhdXNpbmcgaXNzdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG1hbnVhbC4gSSYjMzk7bSBzYXRpc2ZpZWQgdGhhdCB0aGlzIHBhdGNoIGZpeGVzIGEgYnVnIHdpdGggaW5saW5lIGRhdGEgY29udmVyc2lvbi4gVGhlcmUmIzM5O3Mgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZCB0byB1c2VyIHNwYWNlLCBub3IgaXMgaXQgdXNlZCBpbiBhbnkgY29udHJvbCBmbG93IGRlY2lzaW9ucy4gVGhlIHN0cnVjdHVyZXMgaW52b2x2ZWQgYXJlICpmdWxseSogaW5pdGlhbGl6ZWQuCgpJIGFsc28gY2hlY2tlZCBmb3IgcGFkZGluZy4gVGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIChhbmQgdGhlIHN0cnVjdHMgdXNlZCBpbiB4YXR0cnMgYW5kIGFsbG9jYXRpb25zKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgZWl0aGVyIHRocm91Z2ggemVyb2luZyBvciBieSBzcGVjaWZ5aW5nIHRoZWlyIGluaXRpYWwgdmFsdWVzLiBObyBpc3N1ZXMgdGhlcmUuIEkgZW5zdXJlZCB0aGUgc3RydWN0dXJlIHNpemVzIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHZhbHVlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEluIHNob3J0LCBhbGwgdGhlc2Ugc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBhbnkgbWVtb3J5IGJlaW5nIHVzZWQgaXMgZmlsbGVkIGZyb20gYSBrbm93biBzb3VyY2UuCgpUaGUgYGJ1ZmAgdmFyaWFibGUgYWxsb2NhdGVkIGZvciBpbmxpbmUgZGF0YSBhbHNvIGZvbGxvd3MgYSBzaW1pbGFyIHBhdHRlcm4uIEl0IGlzIGVpdGhlciB6ZXJvLWluaXRpYWxpemVkIG9yIGZpbGxlZCB3aXRoIHZhbGlkIGRhdGEgcmVhZCBmcm9tIHRoZSBkaXNrLiBGdXJ0aGVybW9yZSwgYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgYmVpbmcgemVyb2VkIG91dC4gU28gd2UgaGF2ZSB2YWxpZCBhbmQgaW5pdGlhbGl6ZWQgZGF0YS4KCioqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGluLWRlcHRoIHJldmlldywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gIFRoZSBwYXRjaCBwcm9wZXJseSBpbml0aWFsaXplcyBhbGwgbmV3bHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgdXNpbmcgYG1lbXNldGAsIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXgsIG9yIGBtZW1jcHlgIGZyb20ga25vd24gYW5kIHZhbGlkIGRhdGEgc291cmNlcyAobGlrZSBkaXNrIGRhdGEpLiAgU3RhbmRhcmQgZGVidWdnaW5nIGFuZCB2YWxpZGF0aW9uIHRvb2xzIChLQVNBTiwgTE9DS0RFUCwgZXRjLikgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiwgbG9ja2luZywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXNzdWVzLiBUaGVyZWZvcmUsIGEgc3BlY2lhbGl6ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIHBhdGNoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXh0NCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGJ5IHJlcGxhY2luZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgIHdpdGggYSBuZXcgZnVuY3Rpb24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG1hbnVhbGx5IGFsbG9jYXRpbmcgYmxvY2tzIHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgLlxuXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcbjEuIGBpbm9kZV9idWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBidXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4gd2l0aCBhIGZ1bGwgY29weSBvZiB0aGUgdmFsaWQgb24tZGlzayBgcmF3X2lub2RlYCB2aWEgYG1lbWNweWAuXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cbjQuIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YC5cbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cblxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXG5cbkFsbCBuZXdseSBpbnRyb2R1Y2VkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgYXJlIGZ1bGx5IGluaXRpYWxpemVkOlxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxuMy4gYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgIGFuZCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCBhcmUgaW5pdGlhbGl6ZWQgdXNpbmcgZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIHdoaWNoIGd1YXJhbnRlZXMgemVyby1pbml0aWFsaXphdGlvbiBvZiBhbGwgdW5tZW50aW9uZWQgZmllbGRzIGFuZCBwYWRkaW5nLlxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAgYmVmb3JlIGlubGluZSBkYXRhIGlzIGNvcGllZCBpbnRvIGl0LlxuXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODozMi4xNzQxNDI3NDVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDcyMjczMzk4MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cXG5cXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcXG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxcbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxcbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXFxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cXG5cXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTg6MzIuMTc0MTQ3NDg1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTkxMzA1OTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcXG5AQCAtMTQsNiArMTQsNyBAQFxcbiAjaW5jbHVkZSBcXFwiZXh0NC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwieGF0dHIuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInRydW5jYXRlLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gXFxuICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQVxcdFxcXCJkYXRhXFxcIlxcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXFxuQEAgLTEwNzAsMjEgKzEwNzEsMTE1IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsXFxuLVxcdFxcdFxcdFxcdCAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpXFxuK3N0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKVxcbiB7XFxuLVxcdGludCByZXQ7XFxuK1xcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4rXFx0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHtcXG4rXFx0XFx0LnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LFxcbitcXHR9O1xcbitcXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XFxuK1xcdFxcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXFxuK1xcdFxcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcXG4rXFx0XFx0LnZhbHVlID0gTlVMTCxcXG4rXFx0XFx0LnZhbHVlX2xlbiA9IDAsXFxuK1xcdH07XFxuK1xcdGludCBlcnJvcjtcXG4rXFx0aW50IGlub2RlX3NpemU7XFxuK1xcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XFxuK1xcdHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGU7XFxuIFxcbi1cXHRyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7XFxuLVxcdGlmIChyZXQpIHtcXG4tXFx0XFx0ZXh0NF9tc2coaW5vZGUtXFx1MDAzZWlfc2IsIEtFUk5fRU1FUkcsXFxuLVxcdFxcdFxcdFxcXCJlcnJvciByZXN0b3JpbmcgaW5saW5lX2RhdGEgZm9yIGlub2RlIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhIChpbm9kZSAlbGx1LCBlcnJvciAlZClcXFwiLFxcbi1cXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9pbm8sIHJldCk7XFxuLVxcdFxcdHJldHVybjtcXG4rXFx0aW5vZGVfc2l6ZSA9IEVYVDRfSU5PREVfU0laRShpbm9kZS1cXHUwMDNlaV9zYik7XFxuK1xcdGlub2RlX2J1ZiA9IGttYWxsb2MoaW5vZGVfc2l6ZSwgR0ZQX05PRlMpO1xcbitcXHRpZiAoIWlub2RlX2J1Zikge1xcbitcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuK1xcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4rXFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbitcXHRcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHRcXHRyZXR1cm4gZXJyb3I7XFxuIFxcdH1cXG4tXFx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XFxuLVxcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XFxuK1xcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0aWYgKGVycm9yKSB7XFxuK1xcdFxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcXG4rXFx0XFx0dXBfd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0XFx0a2ZyZWUoaW5vZGVfYnVmKTtcXG4rXFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXHR9XFxuK1xcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFxcXCJnZXRfd3JpdGVfYWNjZXNzXFxcIik7XFxuK1xcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cXHUwMDNlaV9zYiwgaXMuaWxvYy5iaCwgRVhUNF9KVFJfTk9ORSk7XFxuK1xcdGlmIChlcnJvcikge1xcbitcXHRcXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xcbitcXHRcXHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdG1lbWNweShpbm9kZV9idWYsICh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9zaXplKTtcXG4rXFx0bWVtc2V0KCh2b2lkICopcmF3X2lub2RlLVxcdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcXG4rXFx0bWVtc2V0KGVpLVxcdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbitcXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQoU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXFx1MDAzZWlfbW9kZSkpKSB7XFxuK1xcdFxcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XFxuK1xcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcXG4rXFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcXG4rXFxuK1xcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4rXFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRnb3RvIHJlY292ZXJ5O1xcbitcXHRcXHR9XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcXG4rXFxuK1xcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XFxuK1xcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xcbitcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuK1xcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuK1xcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4rXFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7XFxuK1xcdFxcdFxcdFxcdGdvdG8gcmVjb3Zlcnk7XFxuK1xcdFxcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdFxcdGV4dDRfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBibG9jayk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gbm9mcmVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XFxuK1xcdH1cXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFxcdTAwMjZpLCBcXHUwMDI2aXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gcmVjb3Zlcnk7XFxuK1xcdGlmICghaXMucy5ub3RfZm91bmQpXFxuK1xcdFxcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmksIFxcdTAwMjZpcyk7XFxuK3JlY292ZXJ5OlxcbitcXHRpZiAoZXJyb3IpIHtcXG4rXFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4rXFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbitub2ZyZWU6XFxuK1xcdFxcdG1lbWNweSgodm9pZCAqKXJhd19pbm9kZSwgaW5vZGVfYnVmLCBpbm9kZV9zaXplKTtcXG4rXFx0XFx0bWVtY3B5KGVpLVxcdTAwM2VpX2RhdGEsIHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XFxuK1xcdFxcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcXG4rXFx0XFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xcbitcXHRcXHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG4rXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuK1xcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rXFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4rXFx0XFx0XFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbitcXHRcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbitcXHRcXHR9XFxuK1xcdFxcdGJyZWxzZShiaCk7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRicmVsc2UoaXMuaWxvYy5iaCk7XFxuK1xcdHVwX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdGtmcmVlKGlub2RlX2J1Zik7XFxuK1xcdHJldHVybiBlcnJvcjtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuQEAgLTEwOTQsOCArMTE4OSwxMSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0aW50IGVycm9yO1xcbiBcXHR2b2lkICpidWYgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcXG4gXFx0aW50IGlubGluZV9zaXplO1xcbitcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbitcXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XFxuK1xcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtXFx1MDAzZWlfc2IpO1xcbitcXHR1bnNpZ25lZCBpbnQgYWxsb2NhdGVkX2Jsb2NrO1xcbiBcXG4gXFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuIFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG5AQCAtMTEyMCwyNSArMTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdG1hcC5tX2xibGsgPSAwO1xcbi1cXHRtYXAubV9sZW4gPSAxO1xcbi1cXHRtYXAubV9mbGFncyA9IDA7XFxuLVxcdGVycm9yID0gZXh0NF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xcbitcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4rXFx0YXIuaW5vZGUgPSBpbm9kZTtcXG4rXFx0YXIubG9naWNhbCA9IDA7XFxuK1xcdGFyLmxlbiA9IDE7XFxuK1xcdGlmIChTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpKVxcbitcXHRcXHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xcbitcXHRlbHNlXFxuK1xcdFxcdGFyLmZsYWdzID0gMDtcXG4rXFx0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcXHUwMDI2YXIsIFxcdTAwMjZlcnJvcik7XFxuIFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuLVxcdGlmICghKG1hcC5tX2ZsYWdzIFxcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xcbi1cXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuLVxcdH1cXG4tXFxuLVxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xcbitcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuIFxcdGlmICghZGF0YV9iaCkge1xcbiBcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcbiBcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5AQCAtMTE0Nyw3ICsxMjQyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdGlmIChlcnJvcikge1xcbiBcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbiBcXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuIFxcbkBAIC0xMTU5LDI0ICsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICBpbm9kZSwgZGF0YV9iaCk7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuLVxcdFxcdGlub2RlLVxcdTAwM2VpX3NpemUgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemU7XFxuLVxcdFxcdGlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4tXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4tXFxuIFxcdFxcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXFxuIFxcdFxcdFxcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXFx1MDAzZWlub2RlKSxcXG4gXFx0XFx0XFx0ICBidWYgKyBFWFQ0X0lOTElORV9ET1RET1RfU0laRSxcXG4gXFx0XFx0XFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4tXFx0XFx0aWYgKCFlcnJvcilcXG4tXFx0XFx0XFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XFxuIFxcdH1cXG4rb3V0X2JoOlxcbitcXHRpZiAoZXJyb3IpIHtcXG4rXFx0XFx0aW50IGZsYWdzID0gMDtcXG4gXFxuLW91dF9yZXN0b3JlOlxcbi1cXHRpZiAoZXJyb3IpXFxuLVxcdFxcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcXG4rXFx0XFx0aWYgKGRhdGFfYmgpXFxuK1xcdFxcdFxcdGZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUO1xcbitcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XFxuIFxcbitcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdFxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xcbitcXHRcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXFxuK1xcdFxcdFxcdFxcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xcbitcXHR9XFxuIG91dDpcXG4tXFx0YnJlbHNlKGRhdGFfYmgpO1xcbiBcXHRrZnJlZShidWYpO1xcbiBcXHRyZXR1cm4gZXJyb3I7XFxuIH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTg6MzMuMzY2MTAwNDE0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NjA2MzY0NzExMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDIyIDE3OjE4OjMwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsMTE1IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi1cdFx0XHRcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcbi1cdFx0XHRcdCAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpXG4rc3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgYmxvY2ssXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuK1x0aW50IGlub2RlX3NpemU7XG4rXHR2b2lkICppbm9kZV9idWYgPSBOVUxMO1xuK1x0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiBcbi1cdHJldCA9IGV4dDRfY3JlYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlubGluZV9zaXplKTtcbi1cdGlmIChyZXQpIHtcbi1cdFx0ZXh0NF9tc2coaW5vZGUtXHUwMDNlaV9zYiwgS0VSTl9FTUVSRyxcbi1cdFx0XHRcImVycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKVwiLFxuLVx0XHRcdGlub2RlLVx1MDAzZWlfaW5vLCByZXQpO1xuLVx0XHRyZXR1cm47XG4rXHRpbm9kZV9zaXplID0gRVhUNF9JTk9ERV9TSVpFKGlub2RlLVx1MDAzZWlfc2IpO1xuK1x0aW5vZGVfYnVmID0ga21hbGxvYyhpbm9kZV9zaXplLCBHRlBfTk9GUyk7XG4rXHRpZiAoIWlub2RlX2J1Zikge1xuK1x0XHRlcnJvciA9IC1FTk9NRU07XG4rXHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4rXHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0a2ZyZWUoaW5vZGVfYnVmKTtcbitcdFx0cmV0dXJuIGVycm9yO1xuK1x0fVxuK1x0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYyk7XG4rXHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXCJnZXRfd3JpdGVfYWNjZXNzXCIpO1xuK1x0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVx1MDAzZWlfc2IsIGlzLmlsb2MuYmgsIEVYVDRfSlRSX05PTkUpO1xuK1x0aWYgKGVycm9yKSB7XG4rXHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4rXHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRtZW1jcHkoaW5vZGVfYnVmLCAodm9pZCAqKXJhd19pbm9kZSwgaW5vZGVfc2l6ZSk7XG4rXHRtZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4rXHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdGlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXHUwMDNlaV9zYikgXHUwMDI2XHUwMDI2XG4rXHRcdChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXHUwMDNlaV9tb2RlKSkpIHtcbitcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbitcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpO1xuK1x0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuK1xuK1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4rXHRcdFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xuK1x0XHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRcdH1cbitcdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuK1xuK1x0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuK1x0XHRuZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNigxKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbitcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuK1x0XHRcdGVycm9yID0gUFRSX0VSUihwYXRoKTtcbitcdFx0XHRpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7XG4rXHRcdFx0XHRnb3RvIHJlY292ZXJ5O1xuK1x0XHRcdH0gZWxzZSB7XG4rXHRcdFx0XHRleHQ0X2ZvcmdldChoYW5kbGUsIDAsIGlub2RlLCBiaCwgYmxvY2spO1xuK1x0XHRcdFx0Z290byBub2ZyZWU7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfZmluZChpbm9kZSwgXHUwMDI2aSwgXHUwMDI2aXMpO1xuK1x0aWYgKGVycm9yKVxuK1x0XHRnb3RvIHJlY292ZXJ5O1xuK1x0aWYgKCFpcy5zLm5vdF9mb3VuZClcbitcdFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rcmVjb3Zlcnk6XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK25vZnJlZTpcbitcdFx0bWVtY3B5KCh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9idWYsIGlub2RlX3NpemUpO1xuK1x0XHRtZW1jcHkoZWktXHUwMDNlaV9kYXRhLCByYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbitcdH0gZWxzZSB7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4rXHRcdGdldF9iaChpcy5pbG9jLmJoKTtcbitcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuK1x0XHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rXHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbitcdFx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuK1x0XHRcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemU7XG4rXHRcdH1cbitcdFx0YnJlbHNlKGJoKTtcbitcdH1cbitvdXQ6XG4rXHRicmVsc2UoaXMuaWxvYy5iaCk7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdGtmcmVlKGlub2RlX2J1Zik7XG4rXHRyZXR1cm4gZXJyb3I7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuQEAgLTEwOTQsOCArMTE4OSwxMSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdGludCBlcnJvcjtcbiBcdHZvaWQgKmJ1ZiA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xuLVx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XG4gXHRpbnQgaW5saW5lX3NpemU7XG4rXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuK1x0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xuK1x0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKTtcbitcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICsxMjE4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0ZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xuLVx0aWYgKGVycm9yKVxuLVx0XHRnb3RvIG91dDtcbi1cbi1cdG1hcC5tX2xibGsgPSAwO1xuLVx0bWFwLm1fbGVuID0gMTtcbi1cdG1hcC5tX2ZsYWdzID0gMDtcbi1cdGVycm9yID0gZXh0NF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIFx1MDAyNm1hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7XG4rXHRtZW1zZXQoXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xuK1x0YXIuaW5vZGUgPSBpbm9kZTtcbitcdGFyLmxvZ2ljYWwgPSAwO1xuK1x0YXIubGVuID0gMTtcbitcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4rXHRcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XG4rXHRlbHNlXG4rXHRcdGFyLmZsYWdzID0gMDtcbitcdG5ld2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgXHUwMDI2YXIsIFx1MDAyNmVycm9yKTtcbiBcdGlmIChlcnJvciBcdTAwM2MgMClcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbi1cdGlmICghKG1hcC5tX2ZsYWdzIFx1MDAyNiBFWFQ0X01BUF9NQVBQRUQpKSB7XG4tXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbi1cdH1cbi1cbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuK1x0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4gXHRpZiAoIWRhdGFfYmgpIHtcbiBcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcbiBcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuQEAgLTExNDcsNyArMTI0Miw3IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aWYgKGVycm9yKSB7XG4gXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG4gXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbitcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuIFxuQEAgLTExNTksMjQgKzEyNTQsMjggQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0XHRcdFx0ICAgaW5vZGUsIGRhdGFfYmgpO1xuIFx0fSBlbHNlIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbi1cdFx0aW5vZGUtXHUwMDNlaV9zaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbi1cdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cbiBcdFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcbiBcdFx0XHQgIGxlMzJfdG9fY3B1KCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilidWYpLVx1MDAzZWlub2RlKSxcbiBcdFx0XHQgIGJ1ZiArIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuIFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4tXHRcdGlmICghZXJyb3IpXG4tXHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4gXHR9XG4rb3V0X2JoOlxuK1x0aWYgKGVycm9yKSB7XG4rXHRcdGludCBmbGFncyA9IDA7XG4gXG4tb3V0X3Jlc3RvcmU6XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcbitcdFx0aWYgKGRhdGFfYmgpXG4rXHRcdFx0ZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQ7XG4rXHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiBcbitcdFx0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBmbGFncyk7XG4rXHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0fSBlbHNlIHtcbitcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLFxuK1x0XHRcdFx0bmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZGF0YV9iaCk7XG4rXHR9XG4gb3V0OlxuLVx0YnJlbHNlKGRhdGFfYmgpO1xuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODozMy4zNjYxMDE1ODRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzgwODU4NzA4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgSW5saW5lIERhdGEgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIG1vZGlmeWluZyBgZnMvZXh0NC9pbmxpbmUuY2AgaGFzIGNhdWdodCBteSBhdHRlbnRpb24uIFRoZSByZW1vdmFsIG9mIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y3Rpb24gb2YgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgY291cGxlZCB3aXRoIHRoZSBtb2RpZmljYXRpb24gb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3aGljaCBub3cgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgY2FsbHMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgc2NyZWFtcyBcImZ1bmN0aW9uYWwgY2hhbmdlXCIgdG8gbWUsIHBhcnRpY3VsYXJseSBpbiBob3cgdGhlIGV4dDQgZmlsZXN5c3RlbSBoYW5kbGVzIGlubGluZSBkYXRhIGNvbnZlcnNpb24gdG8gcmVndWxhciBibG9ja3MuIFRoaXMgZGVtYW5kcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gZm9yIGZ1enppbmcgb3Bwb3J0dW5pdGllcy5cblxuU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gZm9jdXMgb24gdGhlc2UgbW9kaWZpZWQgZnVuY3Rpb25zOiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgICh0aGUgbmV3IG9uZSwgb2J2aW91c2x5IGEga2V5IHRhcmdldCkgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCAod2hpY2ggaXMgbm93IGJlaGF2aW5nIGRpZmZlcmVudGx5KS4gVGhlIGNvcmUgb2YgdGhpcyBwYXRjaCBzZWVtcyB0byBiZSBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBpbmxpbmUgZGF0YSBpcyBoYW5kbGVkIGR1cmluZyB0aGUgY29udmVyc2lvbiBwcm9jZXNzLCB3aGljaCBtYWtlcyBpdCBhYnNvbHV0ZWx5IHdvcnRoIGZ1enppbmcuXG5cbk15IG5leHQgc3RlcHMgd2lsbCBiZSB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBleHQ0OyBJIG5lZWQgdG8gZW5zdXJlIHRoaXMgY29kZSBwYXRoIGlzIGVuYWJsZWQgaW4gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLiBJJ2xsIG5lZWQgdG8gY29uZmlybSB0aGF0IGBDT05GSUdfRVhUNF9GU2AgaXMgdGhlIHJlbGV2YW50IGZsYWcuXG5cblRoZW4sIEknbGwgdHJhY2UgdGhlIGNhbGwgZ3JhcGggdG8gZmluZCBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIGZvciBvdXIgZnV6emluZyBjYW1wYWlnbnMuIExvb2tzIGxpa2UgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgc28gdGhhdCdzIHdoZXJlIEkgd2lsbCBzdGFydCwgYnkgdHJhY2luZyB3aGVyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpcyBjYWxsZWQuIFRoaXMgd2lsbCBnaXZlIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIGhhcm5lc3Nlcy4gVGhpcyB3aWxsIGJlIGFuIGludGVyZXN0aW5nIG9uZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA3OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE4OjQ3LjE3NDY5MTgyNFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTcyNjE4NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcXG4tLVxcbmZzL2V4dDQvY3J5cHRvLmMtMTUyLVxcbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlxcdHJlcyA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9jcnlwdG8uYy0xNTQtXFx0aWYgKHJlcylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM3ODQ9ZXh0ZXJuIGludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzc4NS1cXG5mcy9leHQ0L2V4dDQuaDozNzg2OmV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM3ODctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00ODU0PWxvbmcgZXh0NF9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cXHRpbm9kZV9sb2NrKGlub2RlKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0ODg0OlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4NS1cXHRpZiAocmV0KVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NDY9aW50IGV4dDRfcmVhZHBhZ2VfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cXG5mcy9leHQ0L2lubGluZS5jOjU3MzpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cXHRcXHRcXHQvKiBSZXRyeSBpbnNpZGUgKi9cXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcXHRcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03MzAtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy03ODktXFx0aWYgKHBvcyArIGxlbiBcXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXFxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XFx0XFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVxcdHJldHVybiBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEobWFwcGluZywgaW5vZGUsIHBvcywgbGVuLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTg0LVxcbmZzL2V4dDQvaW5saW5lLmM6MTE4NTpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG5mcy9leHQ0L2lubGluZS5jLTExODYtXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTI4OD1pbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEzNDAtXFx0ICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBkaXIsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTEzNDItXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE5NDM9aW50IGV4dDRfaW5saW5lX2RhdGFfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50ICpoYXNfaW5saW5lKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0yMDU0LVxcbmZzL2V4dDQvaW5saW5lLmM6MjA1NTppbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9pbmxpbmUuYy0yMDU2LXtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjA5Mi1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbmZzL2V4dDQvaW5saW5lLmM6MjA5MzpcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmMtMjA5NC1cXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9NTkzND1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNjAzMS1cXHRcXHQgICAgYXR0ci1cXHUwMDNlaWFfc2l6ZSBcXHUwMDNlIEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUpIHtcXG5mcy9leHQ0L2lub2RlLmM6NjAzMjpcXHRcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9pbm9kZS5jLTYwMzMtXFx0XFx0XFx0aWYgKGVycm9yKVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTY3ODc9dm1fZmF1bHRfdCBleHQ0X3BhZ2VfbWt3cml0ZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy02ODA4LVxcbmZzL2V4dDQvaW5vZGUuYzo2ODA5OlxcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9pbm9kZS5jLTY4MTAtXFx0aWYgKGVycilcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmM9MTAyPXN0YXRpYyBpbnQgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5KHN0cnVjdCBmaWxlICpmaWxwKVxcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYy0xMjgtXFxuZnMvZXh0NC92ZXJpdHkuYzoxMjk6XFx0ZXJyID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcXG5mcy9leHQ0L3Zlcml0eS5jLTEzMC1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODo0Ny4yMjA0MjM0MTlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTk0NzMxNzM5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKk15IEFuYWx5c2lzIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBpdHMgQ2FsbGVycyoqXG5cbkFscmlnaHQsIHNvIEknbSB0cmFjaW5nIHRoZSBleGVjdXRpb24gb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLCBhbmQgSSBzZWUgaXQncyBjYWxsZWQgZnJvbSBhIGZldyBkaWZmZXJlbnQgcGxhY2VzOiBgZXh0NF9zZXRfY29udGV4dGAgKHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGNyeXB0byBvcGVyYXRpb25zKSwgYGV4dDRfZmFsbG9jYXRlYCwgYGV4dDRfc2V0YXR0cmAsIGBleHQ0X3BhZ2VfbWt3cml0ZWAsIGFuZCBgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5YC4gSW50ZXJlc3RpbmcgcmFuZ2UgdGhlcmUg4oCTIGNvdmVyaW5nIGEgZmV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIGZpbGUgbWFuaXB1bGF0aW9uLlxuXG5UaGVuLCB0aGluZ3MgZ2V0IGEgbGl0dGxlIGxlc3Mgc3RyYWlnaHRmb3J3YXJkLiBJIHNlZSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBkaXJlY3RseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoYXQgc3VnZ2VzdHMgd2UgYXJlIGxvb2tpbmcgYXQgYW4gYXR0ZW1wdCB0byBhZGQgZGF0YSBpbmxpbmUgdG8gYW4gaW5vZGUsIHdpdGhvdXQgdGFraW5nIHRoZSBnbG9iYWwgbG9jaywgc28gaXQncyBwcm9iYWJseSBjYWxsZWQgZHVyaW5nIGEgZmlsZSBjcmVhdGUgb3Igc2ltaWxhciBvcGVyYXRpb24uXG5cbkFuZCBoZXJl4oCZcyB3aGVyZSBJIG5lZWQgdG8gYmUgY2FyZWZ1bDsgaXQgbG9va3MgbGlrZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgYWxzbyBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIE9rYXksICp0aGF0KiB3YXJyYW50cyBhIGNsb3NlciBsb29rLCBsZXQgbWUganVzdCBkb3VibGUgY2hlY2sgaG93IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBmdW5jdGlvbnMuIEkgbmVlZCB0byBiZSBjZXJ0YWluIGFib3V0IHRoZSBmbG93IGFuZCB0aGUgbG9ja2luZyBzZW1hbnRpY3MgaW52b2x2ZWQuIEl0IHNlZW1zIGxpa2VseSB0aGF0IHRoZSBcIm5vbG9ja1wiIHZhcmlhbnQgaXMgdXNlZCAqd2l0aGluKiB0aGUgY29udGV4dCBvZiBhbiBleGlzdGluZyBsb2NrIGluIHRoaXMgY2FzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzI1MSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODo1OS4xNjc3NDI5NTZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU4NzgwOTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxcbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5mcy9leHQ0L2lubGluZS5jLTU3NC1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNzI4LVxcdFxcdFxcdC8qIFJldHJ5IGluc2lkZSAqL1xcbmZzL2V4dDQvaW5saW5lLmM6NzI5OlxcdFxcdFxcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTczMC1cXHRcXHR9XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTc4ND1pbnQgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cXHRpZiAocG9zICsgbGVuIFxcdTAwM2UgZXh0NF9nZXRfbWF4X2lubGluZV9zaXplKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03OTEtXFx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE4OjU5LjIxMzYyNDcxMVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDUwMjQ3NDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEZWNvbnN0cnVjdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYWN0dWFsbHkgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kIHdoZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGdldHMgY2FsbGVkLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHRyYWNlIGl0cyBkZXBlbmRlbmNpZXMuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMuIEVzc2VudGlhbGx5LCBJJ20gdGhpbmtpbmcsIFwiV2hlcmUgZG9lcyB0aGlzIHBpZWNlIGZpdCBpbnRvIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIHB1enpsZT9cIiBXaGF0IG90aGVyIGZ1bmN0aW9ucyBvciBwcm9jZXNzZXMgdHJpZ2dlciB0aGlzIGNvbnZlcnNpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgY2hhaW4gd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgZm9yIHdoeSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXRpbGl6ZWQuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaXRzIGludGVyYWN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODExNSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjAyLjIxODY1MTcyOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3MyxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NzM6XFx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbiA1NzQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4gNTc1OlxcdHtcXG4gNTc2OlxcdFxcdGludCByZXQsIG5lZWRlZF9ibG9ja3MsIG5vX2V4cGFuZDtcXG4gNTc3OlxcdFxcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xcbiA1Nzg6XFx0XFx0aW50IHJldHJpZXMgPSAwLCBzZW1faGVsZCA9IDA7XFxuIDU3OTpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcXG4gNTgwOlxcdFxcdHVuc2lnbmVkIGZyb20sIHRvO1xcbiA1ODE6XFx0XFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xcbiA1ODQ6XFx0XFx0XFx0LypcXG4gNTg1OlxcdFxcdFxcdCAqIGNsZWFyIHRoZSBmbGFnIHNvIHRoYXQgbm8gbmV3IHdyaXRlXFxuIDU4NjpcXHRcXHRcXHQgKiB3aWxsIHRyYXAgaGVyZSBhZ2Fpbi5cXG4gNTg3OlxcdFxcdFxcdCAqL1xcbiA1ODg6XFx0XFx0XFx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xcbiA1ODk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDU5MDpcXHRcXHR9XFxuIDU5MTpcXHRcXG4gNTkyOlxcdFxcdG5lZWRlZF9ibG9ja3MgPSBleHQ0X2NodW5rX3RyYW5zX2V4dGVudChpbm9kZSwgMSk7XFxuIDU5MzpcXHRcXG4gNTk0OlxcdFxcdHJldCA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbiA1OTU6XFx0XFx0aWYgKHJldClcXG4gNTk2OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDU5NzpcXHRcXG4gNTk4OlxcdHJldHJ5OlxcbiA1OTk6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX1dSSVRFX1BBR0UsIG5lZWRlZF9ibG9ja3MpO1xcbiA2MDA6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDYwMTpcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDYwMjpcXHRcXHRcXHRoYW5kbGUgPSBOVUxMO1xcbiA2MDM6XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYwNDpcXHRcXHR9XFxuIDYwNTpcXHRcXG4gNjA2OlxcdFxcdC8qIFdlIGNhbm5vdCByZWN1cnNlIGludG8gdGhlIGZpbGVzeXN0ZW0gYXMgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHlcXG4gNjA3OlxcdFxcdCAqIHN0YXJ0ZWQgKi9cXG4gNjA4OlxcdFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCAwLCBGR1BfV1JJVEVCRUdJTiB8IEZHUF9OT0ZTLFxcbiA2MDk6XFx0XFx0XFx0XFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XFxuIDYxMDpcXHRcXHRpZiAoSVNfRVJSKGZvbGlvKSkge1xcbiA2MTE6XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihmb2xpbyk7XFxuIDYxMjpcXHRcXHRcXHRnb3RvIG91dF9ub2ZvbGlvO1xcbiA2MTM6XFx0XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHRcXHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbiA2MTY6XFx0XFx0c2VtX2hlbGQgPSAxO1xcbiA2MTc6XFx0XFx0LyogSWYgc29tZSBvbmUgaGFzIGFscmVhZHkgZG9uZSB0aGlzIGZvciB1cywganVzdCBleGl0LiAqL1xcbiA2MTg6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4gNjE5OlxcdFxcdFxcdHJldCA9IDA7XFxuIDYyMDpcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjIxOlxcdFxcdH1cXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZnJvbSA9IDA7XFxuIDYyNDpcXHRcXHR0byA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4gNjI1OlxcdFxcdGlmICghZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpIHtcXG4gNjI2OlxcdFxcdFxcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oaW5vZGUsIGZvbGlvKTtcXG4gNjI3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbiA2Mjg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYyOTpcXHRcXHR9XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdGV4dDRfZmNfdHJhY2tfaW5vZGUoaGFuZGxlLCBpbm9kZSk7XFxuIDYzMjpcXHRcXHRyZXQgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xcbiA2MzM6XFx0XFx0aWYgKHJldClcXG4gNjM0OlxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2MzU6XFx0XFxuIDYzNjpcXHRcXHRpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKSB7XFxuIDYzNzpcXHRcXHRcXHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxcbiA2Mzg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBleHQ0X2dldF9ibG9ja191bndyaXR0ZW4pO1xcbiA2Mzk6XFx0XFx0fSBlbHNlXFxuIDY0MDpcXHRcXHRcXHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxcbiA2NDE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBleHQ0X2dldF9ibG9jayk7XFxuIDY0MjpcXHRcXHRjbGVhcl9idWZmZXJfbmV3KGZvbGlvX2J1ZmZlcnMoZm9saW8pKTtcXG4gNjQzOlxcdFxcbiA2NDQ6XFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkge1xcbiA2NDU6XFx0XFx0XFx0cmV0ID0gZXh0NF93YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIGlub2RlLFxcbiA2NDY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmb2xpb19idWZmZXJzKGZvbGlvKSwgZnJvbSwgdG8sXFxuIDY0NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7XFxuIDY0ODpcXHRcXHR9XFxuIDY0OTpcXHRcXG4gNjUwOlxcdFxcdGlmIChyZXQpIHtcXG4gNjUxOlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDY1MjpcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbiA2NTM6XFx0XFx0XFx0Zm9saW8gPSBOVUxMO1xcbiA2NTQ6XFx0XFx0XFx0ZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpO1xcbiA2NTU6XFx0XFx0XFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbiA2NTY6XFx0XFx0XFx0c2VtX2hlbGQgPSAwO1xcbiA2NTc6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNjU4OlxcdFxcdFxcdGhhbmRsZSA9IE5VTEw7XFxuIDY1OTpcXHRcXHRcXHRleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7XFxuIDY2MDpcXHRcXHRcXHQvKlxcbiA2NjE6XFx0XFx0XFx0ICogSWYgdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodFxcbiA2NjI6XFx0XFx0XFx0ICogc3RpbGwgYmUgb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvXFxuIDY2MzpcXHRcXHRcXHQgKiBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGVcXG4gNjY0OlxcdFxcdFxcdCAqIG9ycGhhbiBsaXN0IGluIHRoYXQgY2FzZS5cXG4gNjY1OlxcdFxcdFxcdCAqL1xcbiA2NjY6XFx0XFx0XFx0aWYgKGlub2RlLVxcdTAwM2VpX25saW5rKVxcbiA2Njc6XFx0XFx0XFx0XFx0ZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTtcXG4gNjY4OlxcdFxcdH1cXG4gNjY5OlxcdFxcbiA2NzA6XFx0XFx0aWYgKHJldCA9PSAtRU5PU1BDIFxcdTAwMjZcXHUwMDI2IGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLVxcdTAwM2VpX3NiLCBcXHUwMDI2cmV0cmllcykpXFxuIDY3MTpcXHRcXHRcXHRnb3RvIHJldHJ5O1xcbiA2NzI6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjAyLjIxODc3NjM1OFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE2NzgzMTcyOTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIExvZ2ljKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcyBpbiBleHQ0LiBJdCdzIHN0cmlraW5nIG1lIHRoYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgICpkb2Vzbid0KiBjYWxsIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gVGhhdCBmZWVsc+KApnVudXN1YWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeS4gSGFuZyBvbiwgaXMgaXQgdGhhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgc3BlY2lmaWNhbGx5IGZvciBkaXJlY3Rvcmllcywgd2hlcmVhcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgaXMgaGFuZGxpbmcgcmVndWxhciBmaWxlcz8gVGhhdCdzIGEgcGxhdXNpYmxlIGRpc3RpbmN0aW9uLiBJIG5lZWQgdG8gY29uZmlybSB0aGlzLiBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEknbGwgZGl2ZSBpbnRvIHRoZSBzb3VyY2UgY29kZSBmb3IgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGRpcmVjdGx5LCBzcGVjaWZpY2FsbHkgaW4gYGZzL2V4dDQvaW5saW5lLmNgLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgaW50ZW5kZWQgdXNlIGNhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4MTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToxOS4wMDE5NTExNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjc1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTg1LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE4NTpcXHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4xMTg2OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbjExODg6XFx0e1xcbjExODk6XFx0XFx0aW50IGVycm9yO1xcbjExOTA6XFx0XFx0dm9pZCAqYnVmID0gTlVMTDtcXG4xMTkxOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XFxuMTE5MjpcXHRcXHRpbnQgaW5saW5lX3NpemU7XFxuMTE5MzpcXHRcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbjExOTQ6XFx0XFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xcbjExOTU6XFx0XFx0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cXHUwMDNlaV9zYik7XFxuMTE5NjpcXHRcXHR1bnNpZ25lZCBpbnQgYWxsb2NhdGVkX2Jsb2NrO1xcbjExOTc6XFx0XFxuMTE5ODpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4xMTk5OlxcdFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4xMjAwOlxcdFxcdGlmICghYnVmKSB7XFxuMTIwMTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTIwMjpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMjAzOlxcdFxcdH1cXG4xMjA0OlxcdFxcbjEyMDU6XFx0XFx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xcbjEyMDY6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMjA3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjEyMDg6XFx0XFxuMTIwOTpcXHRcXHQvKlxcbjEyMTA6XFx0XFx0ICogTWFrZSBzdXJlIHRoZSBpbmxpbmUgZGlyZWN0b3J5IGVudHJpZXMgcGFzcyBjaGVja3MgYmVmb3JlIHdlIHRyeSB0b1xcbjEyMTE6XFx0XFx0ICogY29udmVydCB0aGVtLCBzbyB0aGF0IHdlIGF2b2lkIHRvdWNoaW5nIHN0dWZmIHRoYXQgbmVlZHMgZnNjay5cXG4xMjEyOlxcdFxcdCAqL1xcbjEyMTM6XFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4xMjE0OlxcdFxcdFxcdGVycm9yID0gZXh0NF9jaGVja19hbGxfZGUoaW5vZGUsIGlsb2MtXFx1MDAzZWJoLFxcbjEyMTU6XFx0XFx0XFx0XFx0XFx0XFx0YnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTIxNjpcXHRcXHRcXHRcXHRcXHRcXHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMjE3OlxcdFxcdFxcdGlmIChlcnJvcilcXG4xMjE4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4xMjIyOlxcdFxcdGFyLmlub2RlID0gaW5vZGU7XFxuMTIyMzpcXHRcXHRhci5sb2dpY2FsID0gMDtcXG4xMjI0OlxcdFxcdGFyLmxlbiA9IDE7XFxuMTIyNTpcXHRcXHRpZiAoU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSlcXG4xMjI2OlxcdFxcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuMTIyNzpcXHRcXHRlbHNlXFxuMTIyODpcXHRcXHRcXHRhci5mbGFncyA9IDA7XFxuMTIyOTpcXHRcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4xMjMwOlxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuMTIzMTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMjMyOlxcdFxcdGFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTtcXG4xMjMzOlxcdFxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcXG4xMjM0OlxcdFxcdGlmICghZGF0YV9iaCkge1xcbjEyMzU6XFx0XFx0XFx0ZXJyb3IgPSAtRU5PTUVNO1xcbjEyMzY6XFx0XFx0XFx0Z290byBvdXRfYmg7XFxuMTIzNzpcXHRcXHR9XFxuMTIzODpcXHRcXG4xMjM5OlxcdFxcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbjEyNDA6XFx0XFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cXHUwMDNlaV9zYiwgZGF0YV9iaCxcXG4xMjQxOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBFWFQ0X0pUUl9OT05FKTtcXG4xMjQyOlxcdFxcdGlmIChlcnJvcikge1xcbjEyNDM6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjQ0OlxcdFxcdFxcdGVycm9yID0gLUVJTztcXG4xMjQ1OlxcdFxcdFxcdGdvdG8gb3V0X2JoO1xcbjEyNDY6XFx0XFx0fVxcbjEyNDc6XFx0XFx0bWVtc2V0KGRhdGFfYmgtXFx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4xMjQ4OlxcdFxcbjEyNDk6XFx0XFx0aWYgKCFTX0lTRElSKGlub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuMTI1MDpcXHRcXHRcXHRtZW1jcHkoZGF0YV9iaC1cXHUwMDNlYl9kYXRhLCBidWYsIGlubGluZV9zaXplKTtcXG4xMjUxOlxcdFxcdFxcdHNldF9idWZmZXJfdXB0b2RhdGUoZGF0YV9iaCk7XFxuMTI1MjpcXHRcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbjEyNTM6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsXFxuMTI1NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBpbm9kZSwgZGF0YV9iaCk7XFxuMTI1NTpcXHRcXHR9IGVsc2Uge1xcbjEyNTY6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjU3OlxcdFxcdFxcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXFxuMTI1ODpcXHRcXHRcXHRcXHQgIGxlMzJfdG9fY3B1KCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilidWYpLVxcdTAwM2Vpbm9kZSksXFxuMTI1OTpcXHRcXHRcXHRcXHQgIGJ1ZiArIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxcbjEyNjA6XFx0XFx0XFx0XFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMjYxOlxcdFxcdH1cXG4xMjYyOlxcdG91dF9iaDpcXG4xMjYzOlxcdFxcdGlmIChlcnJvcikge1xcbjEyNjQ6XFx0XFx0XFx0aW50IGZsYWdzID0gMDtcXG4xMjY1OlxcdFxcbjEyNjY6XFx0XFx0XFx0aWYgKGRhdGFfYmgpXFxuMTI2NzpcXHRcXHRcXHRcXHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcXG4xMjY4OlxcdFxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4xMjY5OlxcdFxcbjEyNzA6XFx0XFx0XFx0ZG93bl93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbjEyNzE6XFx0XFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4xMjcyOlxcdFxcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xcbjEyNzM6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4xMjc0OlxcdFxcdH0gZWxzZSB7XFxuMTI3NTpcXHRcXHRcXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXFxuMTI3NjpcXHRcXHRcXHRcXHRcXHRuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBkYXRhX2JoKTtcXG4xMjc3OlxcdFxcdH1cXG4xMjc4OlxcdG91dDpcXG4xMjc5OlxcdFxcdGtmcmVlKGJ1Zik7XFxuMTI4MDpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMTI4MTpcXHR9XFxuMTI4MjpcXHRcXG4xMjgzOlxcdC8qXFxuMTI4NDpcXHQgKiBUcnkgdG8gYWRkIHRoZSBuZXcgZW50cnkgdG8gdGhlIGlubGluZSBkYXRhLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToxOS4wMDIwODA1M1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDg0NTI0OTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBVc2FnZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gaG93IGlubGluZSBkYXRhIGlzIGhhbmRsZWQgaW4gZXh0NC4gSXQgc2VlbXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIHRoZSB3b3JraG9yc2UgaGVyZSwgYW5kIGl0J3MgdXNlZCBmb3IgYm90aCBkaXJlY3RvcmllcyBhbmQgcmVndWxhciBmaWxlcyDigJMgY2xldmVyLCBpdCBjaGVja3MgdGhlIGlub2RlJ3MgbW9kZSB3aXRoIGBTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSlgIHRvIGZpZ3VyZSBvdXQgdGhlIGZpbGUgdHlwZS4gR290IGl0LiBBbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYWN0dWFsbHkgY2FsbHMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3aGljaCBtYWtlcyBzZW5zZSBmb3IgdGhlIG92ZXJhbGwgZmxvdy4gTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBhbmQgdGhlIGxvZ2ljIGFyb3VuZCB0aGF0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgdGhlIGxvY2sgaXMgaGFuZGxlZCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE3MDEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjIzLjQ4NjYwNzkwMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDU1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMDU1OlxcdGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcXG4yMDU2OlxcdHtcXG4yMDU3OlxcdFxcdGludCBlcnJvciwgbmVlZGVkX2Jsb2Nrcywgbm9fZXhwYW5kO1xcbjIwNTg6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4yMDU5OlxcdFxcdHN0cnVjdCBleHQ0X2lsb2MgaWxvYztcXG4yMDYwOlxcdFxcbjIwNjE6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4yMDYyOlxcdFxcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4yMDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbjIwNjQ6XFx0XFx0fSBlbHNlIGlmICghZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSkpIHtcXG4yMDY1OlxcdFxcdFxcdC8qXFxuMjA2NjpcXHRcXHRcXHQgKiBJbm9kZSBoYXMgaW5saW5lIGRhdGEgYnV0IEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBIGlzXFxuMjA2NzpcXHRcXHRcXHQgKiBjbGVhcmVkLiBUaGlzIG1lYW5zIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIG1vdmluZyBvZlxcbjIwNjg6XFx0XFx0XFx0ICogaW5saW5lIGRhdGEgdG8gZGVsYXkgYWxsb2NhdGVkIGJsb2NrLiBKdXN0IGZvcmNlIHdyaXRlb3V0XFxuMjA2OTpcXHRcXHRcXHQgKiBoZXJlIHRvIGZpbmlzaCBjb252ZXJzaW9uLlxcbjIwNzA6XFx0XFx0XFx0ICovXFxuMjA3MTpcXHRcXHRcXHRlcnJvciA9IGZpbGVtYXBfZmx1c2goaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuMjA3MjpcXHRcXHRcXHRpZiAoZXJyb3IpXFxuMjA3MzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA3NDpcXHRcXHRcXHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4yMDc1OlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbjIwNzY6XFx0XFx0fVxcbjIwNzc6XFx0XFxuMjA3ODpcXHRcXHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xcbjIwNzk6XFx0XFxuMjA4MDpcXHRcXHRpbG9jLmJoID0gTlVMTDtcXG4yMDgxOlxcdFxcdGVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcXHUwMDI2aWxvYyk7XFxuMjA4MjpcXHRcXHRpZiAoZXJyb3IpXFxuMjA4MzpcXHRcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA4NDpcXHRcXG4yMDg1OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcXG4yMDg2OlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbjIwODc6XFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7XFxuMjA4ODpcXHRcXHRcXHRnb3RvIG91dF9mcmVlO1xcbjIwODk6XFx0XFx0fVxcbjIwOTA6XFx0XFxuMjA5MTpcXHRcXHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbjIwOTI6XFx0XFx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4yMDkzOlxcdFxcdFxcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcXHUwMDI2aWxvYyk7XFxuMjA5NDpcXHRcXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuMjA5NTpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbjIwOTY6XFx0b3V0X2ZyZWU6XFxuMjA5NzpcXHRcXHRicmVsc2UoaWxvYy5iaCk7XFxuMjA5ODpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA5OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjIzLjQ4NjcyNzA2MloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0ODM5Njc4MjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaW1tZWRpYXRlbHksIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGlzIGNhbGxpbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBUaGlzIGxvb2tzIGxpa2UgYSBwcm9taXNpbmcgYXJlYSBmb3IgZnV6emluZywgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLiBNeSBpbml0aWFsIGZvY3VzIHN5bWJvbHMgYXJlIGdvaW5nIHRvIGJlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEhhbmcgb24sIHRob3VnaCDigJMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzICpzdGF0aWMqLCBzbyBpdCB3b24ndCBiZSBkaXJlY3RseSBleHBvc2VkIGFzIGEgZm9jdXMgZm9yIGZ1enppbmcuIFRoYXQgbmFycm93cyB0aGluZ3MgZG93biBhIGJpdC5cblxuUmlnaHQsIHNvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgICppcyogZXhwb3J0ZWQg4oCTIGl0J3MgZ2xvYmFsLiBBbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzIGFsc28gZ2xvYmFsLiBOb3csIEkgd2FudCB0byBzZWUgaWYgYW55dGhpbmcgKmVsc2UqIGNhbGxzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gTGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrOyBvaCwgeWVwLCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgY2FsbHMgaXQuIEFuZCBvYnZpb3VzbHksIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGl0c2VsZiBkb2VzLiBcblxuVGhlIGNvbmZpZ3VyYXRpb24gaGVyZSBpcyBgRVhUNF9GU2AsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgY29udGV4dC4gTGV0IG1lIGp1c3QgY29uZmlybSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhY3R1YWxseSBhIGdsb2JhbCBmdW5jdGlvbiBhcyB3ZWxsLCBmb3IgY2xhcml0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3MTUsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToyOC4zMjY0MDcyMThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODUzMDg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM3NTEtXFx0XFx0XFx0XFx0XFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcXG5mcy9leHQ0L2V4dDQuaDozNzUyOmV4dGVybiBpbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExODU9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyODctICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMjg4OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG5mcy9leHQ0L2lubGluZS5jLTEyODktXFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjM4My1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xcbmZzL2V4dDQvbmFtZWkuYzoyMzg0OlxcdFxcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xcbmZzL2V4dDQvbmFtZWkuYy0yMzg1LVxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToyOC4zNzIyNjMyNDRaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU1MzYzODgyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRXh0NCBJbmxpbmUgRGF0YSBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJ20gbm90aW5nIHRoZSBzY29wZSBvZiB0aGVzZSBleHQ0IGlubGluZSBkYXRhIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFyZSBnbG9iYWwsIHdoaWNoIGlzIGltcG9ydGFudCB0byBjb25zaWRlciBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzIGFuZCBob3cgdGhleSdyZSBleHBvc2VkLiBUaGVuLCBJIHNlZSBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIHN0YXRpYzsgdGhhdCdzIGdvb2QsIGl0J3Mgc2NvcGVkIGFuZCBsaWtlbHkgbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuXG5Ob3csIEknbSBtb3Zpbmcgb24gdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgLCBhbmQgaXQncyBhbHNvIHN0YXRpYywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gaXRzIHNwZWNpZmljIHB1cnBvc2UuIE5leHQsIEkndmUgZ290IGBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGFgIHdoaWNoIGFyZSBib3RoIGdsb2JhbCBmdW5jdGlvbnMuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGxhbmRzY2FwZSBoZXJlLiBUaGUgY2VudHJhbCBjb25maWcgb3B0aW9uIHNlZW1zIHRvIGJlIGBFWFQ0X0ZTYCwgd2hpY2ggaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBpbmxpbmUgZGF0YSBzdXBwb3J0LiBUaGlzIGlzIHRoZSBtYWluIG9uZSB0aGF0IG1hdHRlcnMgaGVyZS5cblxuT2theSwgSSB0aGluayBJJ3ZlIGdvdCB0aGUgbGF5IG9mIHRoZSBsYW5kIG5vdy4gTGV0J3MgdXNlIHRoZSBgc2V0LXJlc3VsdHNgIHRvb2wgdG8gYW5hbHl6ZSB0aGlzIGZ1cnRoZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQ3LCJPdXRwdXRUb2tlbnMiOjE2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTozMy45MjU5MDM4NTlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjY2NDQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhXCIsXG4gICAgXCJleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgaW4gZXh0NCwgc3BlY2lmaWNhbGx5IGhvdyBpbmxpbmUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGJsb2NrLiBJdCByZXBsYWNlcyBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEgd2l0aCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayBhbmQgY2hhbmdlcyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrIHRvIHVzZSBleHQ0X21iX25ld19ibG9ja3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHQ0X21hcF9ibG9ja3MuIFRoZXNlIGFyZSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgYWRkaW5nIGRpcmVjdG9yeSBlbnRyaWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTozNC4wMDI1NzUyNzlaIiwiU2VxIjoxNywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0NTM5ODg5NzQwNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjM0LjAwMzAwMTYyOVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo1NDUzOTg0NjczOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXFxuXFxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XFxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXFxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxcbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXFxuXFxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiZGIyNzIwODQ5Nzc1NDEwMWFjNGVjZTAxZWU0ODgwOWUxZjVkMzU4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjIgMTc6MTg6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xuaW5kZXggODA0NWU0ZmYyNzBjNy4uNTA3MTA2YzcyZTgyZiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvaW5saW5lLmNcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcbkBAIC0xNCw2ICsxNCw3IEBAXG4gI2luY2x1ZGUgXCJleHQ0LmhcIlxuICNpbmNsdWRlIFwieGF0dHIuaFwiXG4gI2luY2x1ZGUgXCJ0cnVuY2F0ZS5oXCJcbisjaW5jbHVkZSBcImV4dDRfZXh0ZW50cy5oXCJcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwiZGF0YVwiXG4gI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXG5AQCAtMTA3MCwyMSArMTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jayxcbitcdFx0XHRcdFx0dW5zaWduZWQgaW50IGxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcbiB7XG4tXHRpbnQgcmV0O1xuK1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuK1x0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHtcbitcdFx0LnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LFxuK1x0fTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHtcbitcdFx0Lm5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1NZU1RFTSxcbitcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuK1x0XHQudmFsdWUgPSBOVUxMLFxuK1x0XHQudmFsdWVfbGVuID0gMCxcbitcdH07XG4rXHRpbnQgZXJyb3I7XG4rXHRpbnQgaW5vZGVfc2l6ZTtcbitcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XG4rXHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtXHUwMDNlaV9zYik7XG4rXHRpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTtcbitcdGlmICghaW5vZGVfYnVmKSB7XG4rXHRcdGVycm9yID0gLUVOT01FTTtcbitcdFx0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0cmV0dXJuIGVycm9yO1xuIFx0fVxuLVx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XG4tXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuK1x0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdGVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdGlmIChlcnJvcikge1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4rXHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0XHRrZnJlZShpbm9kZV9idWYpO1xuK1x0XHRyZXR1cm4gZXJyb3I7XG4rXHR9XG4rXHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKTtcbitcdEJVRkZFUl9UUkFDRShpcy5pbG9jLmJoLCBcImdldF93cml0ZV9hY2Nlc3NcIik7XG4rXHRlcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaW5vZGUtXHUwMDNlaV9zYiwgaXMuaWxvYy5iaCwgRVhUNF9KVFJfTk9ORSk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdG1lbWNweShpbm9kZV9idWYsICh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9zaXplKTtcbitcdG1lbXNldCgodm9pZCAqKXJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXG4rXHRcdGlmIChJU19FUlIocGF0aCkpIHtcbitcdFx0XHRlcnJvciA9IFBUUl9FUlIocGF0aCk7XG4rXHRcdFx0Z290byByZWNvdmVyeTtcbitcdFx0fVxuK1x0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG4rXG4rXHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG4rXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuK1x0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbitcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4rXHRcdFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xuK1x0XHRcdGlmIChlcnJvciA9PSAtRURRVU9UIHx8IGVycm9yID09IC1FTk9TUEMpIHtcbitcdFx0XHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdGV4dDRfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBibG9jayk7XG4rXHRcdFx0XHRnb3RvIG5vZnJlZTtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YVswXSA9IGNwdV90b19sZTMyKGJsb2NrKTtcbitcdH1cbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRpZiAoIWlzLnMubm90X2ZvdW5kKVxuK1x0XHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbityZWNvdmVyeTpcbitcdGlmIChlcnJvcikge1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4rbm9mcmVlOlxuK1x0XHRtZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7XG4rXHRcdG1lbWNweShlaS1cdTAwM2VpX2RhdGEsIHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0fSBlbHNlIHtcbitcdFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcbitcdFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0XHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX29mZiA9IDA7XG4rXHRcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdFx0aWYgKFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuK1x0XHRcdGlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4rXHRcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbitcdFx0fVxuK1x0XHRicmVsc2UoYmgpO1xuK1x0fVxuK291dDpcbitcdGJyZWxzZShpcy5pbG9jLmJoKTtcbitcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0a2ZyZWUoaW5vZGVfYnVmKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTg5LDExIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aW50IGVycm9yO1xuIFx0dm9pZCAqYnVmID0gTlVMTDtcbiBcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4tXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbiBcdGludCBpbmxpbmVfc2l6ZTtcbitcdGV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7XG4rXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4rXHRzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuK1x0dW5zaWduZWQgaW50IGFsbG9jYXRlZF9ibG9jaztcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzEyMTgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuLVxuLVx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBtYXAubV9wYmxrKTtcbitcdFx0Z290byBvdXQ7XG4rXHRhbGxvY2F0ZWRfYmxvY2sgPSBFWFQ0X0MyQihzYmksIGFyLmxlbik7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMjQyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE1OSwyNCArMTI1NCwyOCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4gXHR9IGVsc2Uge1xuIFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuLVx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVxuIFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuIFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuIFx0XHRcdCAgYnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXG4gXHRcdFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbi1cdFx0aWYgKCFlcnJvcilcbi1cdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbitvdXRfYmg6XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0aW50IGZsYWdzID0gMDtcbiBcbi1vdXRfcmVzdG9yZTpcbi1cdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuK1x0XHRpZiAoZGF0YV9iaClcbitcdFx0XHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcbitcdFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuIFxuK1x0XHRkb3duX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGZsYWdzKTtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXG4rXHRcdFx0XHRuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBkYXRhX2JoKTtcbitcdH1cbiBvdXQ6XG4tXHRicmVsc2UoZGF0YV9iaCk7XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjM0LjAwMzAwMjMyOVoiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTg1NDU4MzA4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoIGluIGV4dDQqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgcGF0Y2ggdGhhdCdzIG1vZGlmeWluZyBgZnMvZXh0NC9pbmxpbmUuY2AgaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhlIGNvcmUgb2YgaXQgc2VlbXMgdG8gYmUgY2hhbmdpbmcgaG93IGlubGluZSBkYXRhIGdldHMgY29udmVydGVkIGludG8gYSByZWd1bGFyIGJsb2NrIG9uIGRpc2suIEluc3RlYWQgb2YgdGhlIG9sZCBmdW5jdGlvbnMsIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIHdlJ3JlIG5vdyBsb29raW5nIGF0IGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEl0J3MgYWxzbyBkaXRjaGluZyB0aGUgdXNlIG9mIGBleHQ0X21hcF9ibG9ja3NgIGluIGZhdm9yIG9mIGRpcmVjdGx5IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGZvciBibG9jayBhbGxvY2F0aW9uLlxuXG5MZXQncyBicmVhayBkb3duIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEknbSBzZWVpbmcgaXQgYWxsb2NhdGVzIGBpbm9kZV9idWZgIHdpdGggYGttYWxsb2NgLCB3aGljaCBtZWFucyBpdCBpc24ndCBpbml0aWFsaXplZC4gVGhlbiwgaXQgaW1tZWRpYXRlbHkgY29waWVzIHRoZSBlbnRpcmUgYHJhd19pbm9kZWAgaW50byBpdC4gSWYgYW55IGVycm9yIHBvcHMgdXAgbGF0ZXIsIGl0IHJlc3RvcmVzIGByYXdfaW5vZGVgIGZyb20gdGhpcyBiYWNrdXAuIEF0IGZpcnN0IGdsYW5jZSwgdGhpcyBtaWdodCBsb29rIGxpa2UgYSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUsIGJ1dCBzaW5jZSBgaW5vZGVfYnVmYCBpcyBpbW1lZGlhdGVseSBmaWxsZWQgd2l0aCBhIGNvcHkgb2YgYHJhd19pbm9kZWAsIGl0IHNob3VsZCBiZSBmaW5lLiBJdCBpcyBvbmx5IHVzZWQgaWYgdGhlcmUncyBhIHJlY292ZXJ5LlxuXG5Ob3csIGNoZWNraW5nIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIGBidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7YCBmb3IgYSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEsIHdoaWNoIHNlZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggZGF0YSByZWFkIGZyb20gZGlzay4gVGhlIG5ldyBibG9jayBgZGF0YV9iaGAgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIHRoZXJlJ3Mgbm8gb2J2aW91cyB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIGhlcmUuXG5cblRoZSBtYWluIGNvbmNlcm4gaW4gYSBwYXRjaCBsaWtlIHRoaXMgaXMgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gZWl0aGVyIGdldCB3cml0dGVuIHRvIGRpc2ssIHdoaWNoIHdvdWxkIGJlIGRpc2FzdHJvdXMsIG9yIGxlYWtlZCB0byB1c2VyIHNwYWNlLCB3aGljaCB3b3VsZCBiZSBhIHNlY3VyaXR5IGlzc3VlLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhlIGBpbm9kZV9idWZgIGlzIGEgYmFja3VwIGZvciB0aGUgYHJhd19pbm9kZWAsIHJlYWQgZnJvbSBkaXNrIGFuZCB0aGUgY29weSBpcyBkb25lIGZyb20gaXQgYW5kIHRoZSBvdGhlciBidWZmZXIgaXMgcmVhZCBmcm9tIGRpc2suIFNvLCBhcyBsb25nIGFzIGBleHQ0X2dldF9pbm9kZV9sb2NgIHN1Y2NlZWRzLCBhbmQgYGlub2RlX3NpemVgIGlzIGZ1bGx5IHJlYWQgZnJvbSBkaXNrLCB0aGUgYHJhd19pbm9kZWAgc2hvdWxkIGJlIHZhbGlkLlxuXG5Pa2F5LCBsZXQncyBsb29rIGZvciBtb3JlIGhpbnRzLiBJbnNpZGUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgSSBzZWUgYSBjb3VwbGUgb2Ygc3RydWN0cyBiZWluZyBpbml0aWFsaXplZC4gVGhlIGZpcnN0IGlzIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgd2hlcmUgSSBzZWUgYC5zLm5vdF9mb3VuZCA9IDBgIGJlaW5nIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIEluIEMsIGlmIG9uZSBmaWVsZCBvZiBhIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgdGhlIG90aGVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybywgc28gbm8gcHJvYmxlbXMgdGhlcmUuIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgLCB3aGVyZSBgLm5hbWVfaW5kZXhgLCBgLm5hbWVgLCBgLnZhbHVlYCwgYW5kIGAudmFsdWVfbGVuYCBhcmUgaW5pdGlhbGl6ZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCB0aHJvdWdoIHplcm9pbmcuIEFsc28gYGludCBlcnJvcmAsIGBpbnQgaW5vZGVfc2l6ZWAsIGB2b2lkICppbm9kZV9idWYgPSBOVUxMYCwgYW5kIGBzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlO2AgZG9uJ3Qgc2VlbSB0byBiZSBwcm9ibGVtYXRpYy4gVGhleSBhcmUgZWl0aGVyIGFzc2lnbmVkIG9yIHJlLWluaXRpYWxpemVkIGxhdGVyLlxuXG5Mb29raW5nIGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgc2ltaWxhciB2YXJpYWJsZXMgbGlrZSBgZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKWAsIGFuZCBgdW5zaWduZWQgaW50IGFsbG9jYXRlZF9ibG9jaztgIHNlZW0gc2FmZTsgYGFyYCBpcyBmdWxseSB6ZXJvZWQuXG5cblNvLCBhbSBJIHNlZWluZyBhbnkgcmVhbCByaXNrPyBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgYWJvdXQgZml4aW5nIGFuIGV4aXN0aW5nIGJ1ZyBkdXJpbmcgaW5saW5lIGRhdGEgY29udmVyc2lvbi4gVGhlIG5ldyBibG9jayBpcyBmdWxseSB6ZXJvZWQgb3V0LCBhbmQgdGhlIGBpbm9kZV9idWZgIGlzIGZpbGxlZCB3aXRoIHZhbGlkIGRhdGEgaW1tZWRpYXRlbHkuIFNvIEknbSB0aGlua2luZyB0aGUgYnVnIGZpeGVkIGJ5IHRoaXMgaXMgbGlrZWx5IGEgY3Jhc2gsIGEgZGVhZGxvY2ssIG9yIGRhdGEgY29ycnVwdGlvbiwgc29tZXRoaW5nIHRoYXQgbWlnaHQgdHJpZ2dlciBLQVNBTiwgYnV0IEkgZG9uJ3Qgc2VlIGFueSBpbnRyb2R1Y3Rpb24gb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbkxldCBtZSBnbyBiYWNrIGFuZCBkb3VibGUgY2hlY2sgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gQWgsIGhlcmUhIFRoZXJlJ3MgYW4gYGV4dDRfZXh0ZW50YCBiZWluZyB1c2VkLiBJdCdzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIHRoZW4gYC5lZV9ibG9ja2AsIGAuZWVfbGVuYCBhcmUgYXNzaWduZWQuIEFuZCBpdCBsb29rcyBsaWtlIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBzZXQgbGF0ZXIuIEFzIHRoZSB0b29sIGluZGljYXRlczpcbmBgYGNcbnN0cnVjdCBleHQ0X2V4dGVudCB7XG4gIF9fbGUzMiAgZWVfYmxvY2s7XG4gIF9fbGUxNiAgZWVfbGVuO1xuICBfX2xlMTYgIGVlX3N0YXJ0X2hpO1xuICBfX2xlMzIgIGVlX3N0YXJ0X2xvO1xuICBfX2xlMTYgIGVlX2ZpbGVfYWNsO1xuICBfX2xlMTYgIGVlX2ZsYWdzO1xufTtcbmBgYFxuRXZlcnl0aGluZyB3aXRoaW4gdGhhdCBzdHJ1Y3QgaXMgYXNzaWduZWQuIFNvLCBJIGRvbid0IHNlZSBhbnkgdW5cblxuIiwiSW5wdXRUb2tlbnMiOjUwNzYsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODIxLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTk6NTMuODU3NTg4NjA2WiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDg3NjA1NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgZXh0NF9leHRlbnQgXFxcXHtcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU1LSAqL1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU3LVxcdF9fbGUzMlxcdGVlX2Jsb2NrO1xcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTo1My45MDI0NjkwMDJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjQ2NjgwMDUxMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHRlbnQgU3RydWN0dXJlKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgcmVhbGx5IHVuZGVyc3RhbmQgaG93IGV4dGVudHMgYXJlIGltcGxlbWVudGVkIGluIGV4dDQuIEknbSBnb2luZyB0byBwdWxsIHVwIHRoZSBoZWFkZXIgZmlsZSwgc3BlY2lmaWNhbGx5IGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gTm8gZmx1ZmYsIGp1c3QgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBleGFjdCBsYXlvdXQsIHRoZSBmaWVsZHMsIGFuZCBob3cgdGhlIHZhcmlvdXMgZmxhZ3MgYW5kIHZhbHVlcyBhbGwgaW50ZXJhY3QuIFRoaXMgaXMgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZDsgdW5kZXJzdGFuZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXRzZWxmIGlzIGtleSB0byBhbnkgcmVhbCBhbmFseXNpcyBvciBtb2RpZmljYXRpb24gb2YgdGhlIGV4dGVudCBpbXBsZW1lbnRhdGlvbi4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290IGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MDY4LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjA6MTguNTcwNDc2NDkxWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNTA6XFx0fTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0LypcXG4gIDUzOlxcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cXG4gIDU0OlxcdCAqIEl0J3MgdXNlZCBhdCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlLlxcbiAgNTU6XFx0ICovXFxuICA1NjpcXHRzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbiAgNTc6XFx0XFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuICA1ODpcXHRcXHRfX2xlMTZcXHRlZV9sZW47XFx0XFx0LyogbnVtYmVyIG9mIGJsb2NrcyBjb3ZlcmVkIGJ5IGV4dGVudCAqL1xcbiAgNTk6XFx0XFx0X19sZTE2XFx0ZWVfc3RhcnRfaGk7XFx0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXFxuICA2MDpcXHRcXHRfX2xlMzJcXHRlZV9zdGFydF9sbztcXHQvKiBsb3cgMzIgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xcbiAgNjE6XFx0fTtcXG4gIDYyOlxcdFxcbiAgNjM6XFx0LypcXG4gIDY0OlxcdCAqIFRoaXMgaXMgaW5kZXggb24tZGlzayBzdHJ1Y3R1cmUuXFxuICA2NTpcXHQgKiBJdCdzIHVzZWQgYXQgYWxsIHRoZSBsZXZlbHMgZXhjZXB0IHRoZSBib3R0b20uXFxuICA2NjpcXHQgKi9cXG4gIDY3OlxcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xcbiAgNjg6XFx0XFx0X19sZTMyXFx0ZWlfYmxvY2s7XFx0LyogaW5kZXggY292ZXJzIGxvZ2ljYWwgYmxvY2tzIGZyb20gJ2Jsb2NrJyAqL1xcbiAgNjk6XFx0XFx0X19sZTMyXFx0ZWlfbGVhZl9sbztcXHQvKiBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBibG9jayBvZiB0aGUgbmV4dCAqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjIwOjE4LjU3MDUzOTY5MVoiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTQyMTg3NDcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgRXh0ZW50IFN0cnVjdHVyZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgYHN0cnVjdCBleHQ0X2V4dGVudGAsIGFuZCBpdCdzIGdvdCBmb3VyIGtleSBmaWVsZHM6IGBlZV9ibG9ja2AgKDMyLWJpdCwgSSByZW1lbWJlciB0aGF0KSwgYGVlX2xlbmAgKDE2LWJpdCwgdGhhdCdzIGV4cGVjdGVkKSwgYW5kIHRoZW4gd2UgaGF2ZSBgZWVfc3RhcnRfaGlgIGFuZCBgZWVfc3RhcnRfbG9gIHdoaWNoIGFyZSBlYWNoIDE2IGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gR290IGl0LiBOb3csIGluIHRoaXMgcGF0Y2gsIEkgc2VlIHRoZXkncmUgY3JlYXRpbmcgYSBuZXcgYHN0cnVjdCBleHQ0X2V4dGVudGAgbmFtZWQgYG5ld2V4YC4gVGhleSdyZSBpbml0aWFsaXppbmcgYGVlX2Jsb2NrYCB0byAwLCB3aGljaCBpcyBhbHdheXMgYSBzdGFydGluZyBwb2ludCwgYW5kIGBlZV9sZW5gIHRvIDEsIG9rYXksIG1ha2VzIHNlbnNlLiBCdXQgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBjYWxsLiBJIG5lZWQgdG8gZGl2ZSBpbnRvIHdoYXQgdGhpcyBmdW5jdGlvbiAqYWN0dWFsbHkqIGRvZXMuIExldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2Qgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjE0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjE6MDMuOTkyNDE2MjFaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjczMzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X3N0b3JlX3BibG9ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0MS0vKlxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQyOiAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0My0gKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxcbi0tXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ3LVxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTIyNz1zdGF0aWMgaW50IGV4dGVudHNfa3VuaXRfaW5pdChzdHJ1Y3Qga3VuaXQgKnRlc3QpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMxOS1cXHRFWFRfRklSU1RfRVhURU5UKGVoKS1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoRVhUX0RBVEFfTEVOKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjMyMDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0VYVEVOVChlaCksIEVYVF9EQVRBX1BCTEspO1xcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzIxLVxcdGlmICghcGFyYW0gfHwgcGFyYW0tXFx1MDAzZWlzX3Vud3JpdF9hdF9zdGFydClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTI9ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjA4NS1cXHRcXHRcXHRleC1cXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXFx1MDAzZWVlX2Jsb2NrO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIwODY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjA4Ny1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMTk2LVxcdG5lYXJleC1cXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXFx1MDAzZWVlX2Jsb2NrO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIxOTc6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIxOTgtXFx0bmVhcmV4LVxcdTAwM2VlZV9sZW4gPSBuZXdleHQtXFx1MDAzZWVlX2xlbjtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTI2MTQ9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjczOS1cXHRcXHRcXHQvKiB0aGlzIGV4dGVudCBpcyByZW1vdmVkOyBtYXJrIHNsb3QgZW50aXJlbHkgdW51c2VkICovXFxuZnMvZXh0NC9leHRlbnRzLmM6Mjc0MDpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTI3NDEtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDYtXFx0ZXgyLVxcdTAwM2VlZV9sZW4gICA9IGNwdV90b19sZTE2KGVlX2xlbiAtIChzcGxpdCAtIGVlX2Jsb2NrKSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzI0NzpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBuZXdibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzI0OC1cXHRpZiAoaXNfdW53cml0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzU1Nz1leHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ1LVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9ibG9jayA9IGNwdV90b19sZTMyKGVlX2Jsb2NrICsgbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzY0NjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGVlX3BibGsgKyBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ3LVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM2OTEtXFx0XFx0XFx0YWJ1dF9leC1cXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihuZXh0X2xibGsgLSBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYzozNjkyOlxcdFxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhhYnV0X2V4LCBuZXh0X3BibGsgLSBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkzLVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDUtXFx0XFx0XFx0XFx0Y3B1X3RvX2xlMTYoKmFsbG9jYXRlZCAtIHNwbGl0X21hcC5tX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzc0NjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNnplcm9fZXgxLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDctXFx0XFx0XFx0XFx0ZXh0NF9leHRfcGJsb2NrKGV4KSArIHNwbGl0X21hcC5tX2xibGsgK1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzc2MC1cXHRcXHRcXHRcXHRcXHRcXHRcXHRlZV9ibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzc2MTpcXHRcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNnplcm9fZXgyLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjItXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZXh0NF9leHRfcGJsb2NrKGV4KSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00NDczLVxcdHBibGsgPSBuZXdibG9jayArIG9mZnNldDtcXG5mcy9leHQ0L2V4dGVudHMuYzo0NDc0OlxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXgsIHBibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ0NzUtXFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3NjM9ZXh0NF9zd2FwX2V4dGVudHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZTEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01ODk3LVxcdFxcdHRtcF9leCA9ICpleDE7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTg5ODpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgxLCBleHQ0X2V4dF9wYmxvY2soZXgyKSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTg5OTpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBleHQ0X2V4dF9wYmxvY2soXFx1MDAyNnRtcF9leCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MDAtXFx0XFx0ZXgxLVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlMl9sZW4pO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjAyNz1pbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYwODAtXFx0XFx0ZXh0NF9leHRfbWFya19pbml0aWFsaXplZChleCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NjA4MTpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHBibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYwODItXFx0ZG93bl93cml0ZShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9OTMxPXN0YXRpYyBpbnQgZXh0NF9mY193cml0ZV9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqY3JjKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2MS1cXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYocmFuZ2UtXFx1MDAzZWxlbik7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjk2MjpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHJhbmdlLVxcdTAwM2VwYmxrKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtOTYzLVxcdFxcdGlmIChyYW5nZS1cXHUwMDNldW53cml0dGVuKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIxNDg9c3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9hZGRfcmFuZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjAyLVxcdFxcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY3VyKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjIwMzpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDQtXFx0XFx0XFx0XFx0XFx1MDAyNm5ld2V4LCBzdGFydF9wYmxrICsgY3VyIC0gc3RhcnQpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM1LVxcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTEzNjpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM3LVxcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuZnMvZXh0NC9taWdyYXRlLmMtMzUtXFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjE6MDQuMDM3NjkyNTk2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQyNjk2MDY2MDcxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSB3ZSBnby4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqUGVla2luZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqXG5cblJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBmdW5jdGlvbi4gSXQncyBpbiBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAsIHNvIGl0J3MgY2xlYXJseSByZWxhdGVkIHRvIHRoZSBleHRlbnRzIGNvZGUgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIE15IGltbWVkaWF0ZSBleHBlY3RhdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZvbHZlZCBpbiAqc3RvcmluZyogdGhlIHBoeXNpY2FsIGJsb2NrIChwYmxvY2spIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZXh0ZW50IG1hcHBpbmdzLiBHaXZlbiBpdHMgbmFtZSwgaXQgc291bmRzIGxpa2UgYSBjb3JlIGJ1aWxkaW5nIGJsb2NrIGZvciBtYW5hZ2luZyB0aG9zZSBleHRlbnQgc3RydWN0dXJlcy4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgcmVsYXRlcyB0byB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCBoYW5kbGVzIHRoaW5ncyBsaWtlIGJsb2NrIGFsbG9jYXRpb24sIG1ldGFkYXRhIHVwZGF0ZXMsIGFuZCBwb3RlbnRpYWwgZXJyb3IgaGFuZGxpbmcuIEkgd29uZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgaW50ZXJmYWNlLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIGhvdyB0aGlzIHNwZWNpZmljIHBpZWNlIGZpdHMgaW50byB0aGUgbGFyZ2VyIGV4dDQgZXh0ZW50IGppZ3Nhdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjksIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoyODoxMC45OTgzNTYzNjZaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Njg1NzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNDA6XFx0XFxuIDI0MTpcXHQvKlxcbiAyNDI6XFx0ICogZXh0NF9leHRfc3RvcmVfcGJsb2NrOlxcbiAyNDM6XFx0ICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gZXh0ZW50IHN0cnVjdCxcXG4gMjQ0OlxcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcXG4gMjQ1OlxcdCAqL1xcbiAyNDY6XFx0c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxcbiAyNDc6XFx0XFx0XFx0XFx0XFx0XFx0IGV4dDRfZnNibGtfdCBwYilcXG4gMjQ4OlxcdHtcXG4gMjQ5OlxcdFxcdGV4LVxcdTAwM2VlZV9zdGFydF9sbyA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBsb25nKSAocGIgXFx1MDAyNiAweGZmZmZmZmZmKSk7XFxuIDI1MDpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfaGkgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgbG9uZykgKChwYiBcXHUwMDNlXFx1MDAzZSAzMSkgXFx1MDAzZVxcdTAwM2UgMSkgXFx1MDAyNlxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgMHhmZmZmKTtcXG4gMjUyOlxcdH1cXG4gMjUzOlxcdFxcbiAyNTQ6XFx0LypcXG4gMjU1OlxcdCAqIGV4dDRfaWR4X3N0b3JlX3BibG9jazpcXG4gMjU2OlxcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGluZGV4IHN0cnVjdCxcXG4gMjU3OlxcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcXG4gMjU4OlxcdCAqL1xcbiAyNTk6XFx0c3RhdGljIGlubGluZSB2b2lkIGV4dDRfaWR4X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6Mjg6MTAuOTk4NDI3MDc1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNDI2MDU4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBJbml0aWFsaXphdGlvbiBpbiBleHQ0IEZpbGUgU3lzdGVtIE9wZXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLiBGaXJzdCwgSSBzZWUgdGhhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBzZXRzIGJvdGggYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLiBHb29kLCBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGFmdGVyIHRoYXQgY2FsbCwgd2hpY2ggaXMgd2hhdCBJIGV4cGVjdC5cblxuVGhlbiwgSSBzaGlmdGVkIG15IGZvY3VzIHRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSSBzZWUgYGJ1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGFuZCB0aGVuIGZpbGxlZCBieSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYC4gTXkgcXVlc3Rpb24gdGhlbiBpczogRG9lcyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBmdWxseSBpbml0aWFsaXplIGl0PyBZZXMsIGl0IHJlYWRzIGluIHRoZSBpbmxpbmUgZGF0YSBmcm9tIHRoZSByZWxldmFudCBzb3VyY2UsIHNvIGl0IHNob3VsZCBiZSBmdWxseSBpbml0aWFsaXplZCBhZnRlciB0aGF0IGNhbGwuIEkgY2FuIG1vdmUgb24gdG8gdGhlIG5leHQgc2VjdGlvbi5cblxuTmV4dCB1cCwgSSBzZWUgYG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSlgIHdoaWNoIGVuc3VyZXMgdGhhdCBgYXJgIGlzIGZ1bGx5IHplcm9lZCBvdXQsIHdoaWNoIGlzIGdvb2QuXG5cbkFmdGVyIHRoYXQsIHRoZSBjb2RlIGdyYWJzIGEgbmV3IGJsb2NrLCBhbmQgdGhlbiBnZXRzIGEgYnVmZmVyIGhlYWQuIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgb3V0LCBzbyB0aGF0J3MgdGFrZW4gY2FyZSBvZi5cblxuRmluYWxseSwgaW4gdGhlIHN1YnNlcXVlbnQgY29uZGl0aW9uYWwsIEkgc2VlIHRoYXQgaWYgaXQncyBub3QgYSBkaXJlY3RvcnksIGEgYG1lbWNweWAgY29waWVzIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCDigJMgd2hpY2ggaXMgZmluZSBzaW5jZSBgYnVmYCBoYXMgYmVlbiBpbml0aWFsaXplZCDigJMgYWZ0ZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCB3YXMgemVyb2VkLiBPdGhlcndpc2UsIGBleHQ0X2luaXRfZGlyYmxvY2tgIGlzIGNhbGxlZC4gU28sIEkgbmVlZCB0byBjaGVjayBgZXh0NF9pbml0X2RpcmJsb2NrYCBuZXh0IHRvIG1ha2Ugc3VyZSB0aGF0IGJyYW5jaCBpcyBoYW5kbGVkIGNvcnJlY3RseSBhcyB3ZWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjAyNSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg3MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjI4OjIwLjE0MTAzNTkwMVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDMyODI2NDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9pbml0X2RpcmJsb2NrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM3OTc9ZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7XFxuZnMvZXh0NC9leHQ0Lmg6Mzc5ODpleHRlcm4gaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvZXh0NC5oLTM3OTktXFx0XFx0XFx0ICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2ssXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExODU9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyNTYtXFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5mcy9leHQ0L2lubGluZS5jOjEyNTc6XFx0XFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcXG5mcy9leHQ0L2lubGluZS5jLTEyNTgtXFx0XFx0XFx0ICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS1cXHUwMDNlaW5vZGUpLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTI4ODI9c3RhdGljIGludCBleHQ0X3RtcGZpbGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTI5MjItXFxuZnMvZXh0NC9uYW1laS5jOjI5MjM6aW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbmFtZWkuYy0yOTI0LVxcdFxcdCAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgcGFyZW50X2lubyxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz0yOTY5PWludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yOTg4LVxcdFxcdHJldHVybiBQVFJfRVJSKGRpcl9ibG9jayk7XFxuZnMvZXh0NC9uYW1laS5jOjI5ODk6XFx0ZXJyID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRpcl9ibG9jaywgZGlyLVxcdTAwM2VpX2lubywgTlVMTCwgMCk7XFxuZnMvZXh0NC9uYW1laS5jLTI5OTAtb3V0OlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoyODoyMC4xODQzMjI2MzZaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTkyMTcxMjkxNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBmdW5jdGlvbi4gTXkgaW5pdGlhbCBjb25jZXJuIHdhcyBhYm91dCBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCBhZnRlciBjYXJlZnVsIGluc3BlY3Rpb24sIEknbSBmYWlybHkgY29uZmlkZW50IHRoZXJlIGFyZW4ndCBhbnkgaXNzdWVzLlxuXG5GaXJzdCwgSSBzZWUgdGhlIGFsbG9jYXRpb24gb2YgYGlub2RlX2J1ZmAgdXNpbmcgYGttYWxsb2NgLiBUaGVuLCB0aGUgZGF0YSBpcyBjb3BpZWQgZnJvbSBkaXNrIHVzaW5nIGBtZW1jcHlgIGludG8gYGlub2RlX2J1ZmAuICBUaGUgY3JpdGljYWwgcG9pbnQgaGVyZSBpcyB0aGF0IGBleHQ0X2dldF9pbm9kZV9sb2NgIGVuc3VyZXMgYHJhd19pbm9kZWAgcG9pbnRzIHRvIHZhbGlkIGlub2RlIGRhdGEgcmVhZCBmcm9tIHRoZSBkaXNrLiBUaGUgc2l6ZSBvZiB0aGUgY29weSwgYGlub2RlX3NpemVgLCBpcyBkZXRlcm1pbmVkIGJ5IGBFWFQ0X0lOT0RFX1NJWkVgIHdoaWNoIGlzIHRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSBpbm9kZSBvbiBkaXNrLiBTaW5jZSB0aGlzIGRhdGEgY29tZXMgZGlyZWN0bHkgZnJvbSBkaXNrLCBpdCdzIGZ1bGx5IGluaXRpYWxpemVkLiBFdmVuIGlmIGBpbm9kZV9zaXplYCBoYXBwZW5zIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBsb2dpY2FsbHkgXCJ1c2VkXCIgcGFydCBvZiB0aGUgZGF0YSBvbiBkaXNrLCBgbWVtY3B5YCB3aWxsIHN0aWxsIHJlYWQgYSBjb2hlcmVudCBibG9jayBmcm9tIGRpc2sgdG8gdGhlIGJ1ZmZlci5cblxuVGhlIGZvbGxvd2luZyBgbWVtc2V0YCBjYWxscyB6ZXJvIG91dCB0aGUgaW5saW5lIGRhdGEgYXJlYSBhZnRlciB0aGUgZGlzayBkYXRhIGlzIHNhZmVseSBjb3BpZWQuIEltcG9ydGFudGx5LCB0aGVyZSdzIGEgc2FmZWd1YXJkIHVzaW5nIGBtZW1jcHlgIHRoYXQgcmVzdG9yZXMgdGhlIGlub2RlIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBUaGlzIG1lYW5zIHdl4oCZcmUgZWl0aGVyIHVzaW5nIGluaXRpYWxpemVkIGRpc2sgZGF0YSwgb3IgcmVzdG9yaW5nIGl0IHRvIHRoZSBvcmlnaW5hbCwga25vd24gZ29vZCBzdGF0ZS4gU28sIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaCBoZXJlIGlzIGNsZWFuLlxuXG5UaGUgY2hhbmdlcyBwcmltYXJpbHkgZGVhbCB3aXRoIGJsb2NrIGFsbG9jYXRpb24gYW5kIGlub2RlIHVwZGF0ZXMuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyB1c2luZyBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByb2JhYmx5IGNhdXNpbmcgaXNzdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG1hbnVhbC4gSSdtIHNhdGlzZmllZCB0aGF0IHRoaXMgcGF0Y2ggZml4ZXMgYSBidWcgd2l0aCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uLiBUaGVyZSdzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlciBzcGFjZSwgbm9yIGlzIGl0IHVzZWQgaW4gYW55IGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIFRoZSBzdHJ1Y3R1cmVzIGludm9sdmVkIGFyZSAqZnVsbHkqIGluaXRpYWxpemVkLlxuXG5JIGFsc28gY2hlY2tlZCBmb3IgcGFkZGluZy4gVGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIChhbmQgdGhlIHN0cnVjdHMgdXNlZCBpbiB4YXR0cnMgYW5kIGFsbG9jYXRpb25zKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgZWl0aGVyIHRocm91Z2ggemVyb2luZyBvciBieSBzcGVjaWZ5aW5nIHRoZWlyIGluaXRpYWwgdmFsdWVzLiBObyBpc3N1ZXMgdGhlcmUuIEkgZW5zdXJlZCB0aGUgc3RydWN0dXJlIHNpemVzIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHZhbHVlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEluIHNob3J0LCBhbGwgdGhlc2Ugc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBhbnkgbWVtb3J5IGJlaW5nIHVzZWQgaXMgZmlsbGVkIGZyb20gYSBrbm93biBzb3VyY2UuXG5cblRoZSBgYnVmYCB2YXJpYWJsZSBhbGxvY2F0ZWQgZm9yIGlubGluZSBkYXRhIGFsc28gZm9sbG93cyBhIHNpbWlsYXIgcGF0dGVybi4gSXQgaXMgZWl0aGVyIHplcm8taW5pdGlhbGl6ZWQgb3IgZmlsbGVkIHdpdGggdmFsaWQgZGF0YSByZWFkIGZyb20gdGhlIGRpc2suIEZ1cnRoZXJtb3JlLCBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGJlaW5nIHplcm9lZCBvdXQuIFNvIHdlIGhhdmUgdmFsaWQgYW5kIGluaXRpYWxpemVkIGRhdGEuXG5cbioqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGluLWRlcHRoIHJldmlldywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gIFRoZSBwYXRjaCBwcm9wZXJseSBpbml0aWFsaXplcyBhbGwgbmV3bHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgdXNpbmcgYG1lbXNldGAsIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXgsIG9yIGBtZW1jcHlgIGZyb20ga25vd24gYW5kIHZhbGlkIGRhdGEgc291cmNlcyAobGlrZSBkaXNrIGRhdGEpLiAgU3RhbmRhcmQgZGVidWdnaW5nIGFuZCB2YWxpZGF0aW9uIHRvb2xzIChLQVNBTiwgTE9DS0RFUCwgZXRjLikgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiwgbG9ja2luZywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXNzdWVzLiBUaGVyZWZvcmUsIGEgc3BlY2lhbGl6ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIHBhdGNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzgwNCwiT3V0cHV0VG9rZW5zIjo0MTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTgyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjI4OjM5LjQwMTQ1Mzg0M1oiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzOTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cXG5cXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcXG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxcbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxcbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXFxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cXG5cXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXFxuXFxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XFxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXFxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxcbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXFxuXFxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowq58bq[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-22 16:34:08 +0000 UTC FinishedAt: 2026-08-22 17:28:41 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "934753d26f1ed7fadeedf1b9e7df6fe75de303e8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "934753d26f1ed7fadeedf1b9e7df6fe75de303e8", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "fc23472c-255a-43de-8cfe-7e5a1ccb95dd" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_convert_inline_data", "ext4_try_add_inline_entry" ], "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+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgICAmIzM0O2V4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXh0NCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGJ5IHJlcGxhY2luZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgIHdpdGggYSBuZXcgZnVuY3Rpb24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG1hbnVhbGx5IGFsbG9jYXRpbmcgYmxvY2tzIHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgLlxuXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcbjEuIGBpbm9kZV9idWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBidXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4gd2l0aCBhIGZ1bGwgY29weSBvZiB0aGUgdmFsaWQgb24tZGlzayBgcmF3X2lub2RlYCB2aWEgYG1lbWNweWAuXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cbjQuIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YC5cbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cblxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgaW4gZXh0NCwgc3BlY2lmaWNhbGx5IGhvdyBpbmxpbmUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGJsb2NrLiBJdCByZXBsYWNlcyBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEgd2l0aCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayBhbmQgY2hhbmdlcyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrIHRvIHVzZSBleHQ0X21iX25ld19ibG9ja3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHQ0X21hcF9ibG9ja3MuIFRoZXNlIGFyZSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgYWRkaW5nIGRpcmVjdG9yeSBlbnRyaWVzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDIyIDE3OjE4OjMwIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jXG5pbmRleCA4MDQ1ZTRmZjI3MGM3Li41MDcxMDZjNzJlODJmIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuY1xuQEAgLTE0LDYgJiM0MzsxNCw3IEBAXG4gI2luY2x1ZGUgXCYjMzQ7ZXh0NC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7eGF0dHIuaFwmIzM0O1xuICNpbmNsdWRlIFwmIzM0O3RydW5jYXRlLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7ZXh0NF9leHRlbnRzLmhcJiMzNDtcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwmIzM0O2RhdGFcJiMzNDtcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcdCgoc2l6ZW9mKF9fbGUzMikgKiBFWFQ0X05fQkxPQ0tTKSlcbkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbiYjNDM7c3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgYmxvY2ssXG4mIzQzO1x0XHRcdFx0XHR1bnNpZ25lZCBpbnQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKVxuIHtcbi1cdGludCByZXQ7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuJiM0MztcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4mIzQzO1x0XHQucyA9IHsgLm5vdF9mb3VuZCA9IDAsIH0sXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4mIzQzO1x0XHQubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLFxuJiM0MztcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuJiM0MztcdFx0LnZhbHVlID0gTlVMTCxcbiYjNDM7XHRcdC52YWx1ZV9sZW4gPSAwLFxuJiM0MztcdH07XG4mIzQzO1x0aW50IGVycm9yO1xuJiM0MztcdGludCBpbm9kZV9zaXplO1xuJiM0MztcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiBcbi1cdHJldCA9IGV4dDRfY3JlYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlubGluZV9zaXplKTtcbi1cdGlmIChyZXQpIHtcbi1cdFx0ZXh0NF9tc2coaW5vZGUtXHUwMDNlaV9zYiwgS0VSTl9FTUVSRyxcbi1cdFx0XHRcJiMzNDtlcnJvciByZXN0b3JpbmcgaW5saW5lX2RhdGEgZm9yIGlub2RlIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhIChpbm9kZSAlbGx1LCBlcnJvciAlZClcJiMzNDssXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbiYjNDM7XHRpbm9kZV9zaXplID0gRVhUNF9JTk9ERV9TSVpFKGlub2RlLVx1MDAzZWlfc2IpO1xuJiM0MztcdGlub2RlX2J1ZiA9IGttYWxsb2MoaW5vZGVfc2l6ZSwgR0ZQX05PRlMpO1xuJiM0MztcdGlmICghaW5vZGVfYnVmKSB7XG4mIzQzO1x0XHRlcnJvciA9IC1FTk9NRU07XG4mIzQzO1x0XHRkb3duX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbiYjNDM7XHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0cmV0dXJuIGVycm9yO1xuIFx0fVxuLVx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XG4tXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuJiM0MztcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdGlmIChlcnJvcikge1xuJiM0MztcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbiYjNDM7XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbiYjNDM7XHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdFx0a2ZyZWUoaW5vZGVfYnVmKTtcbiYjNDM7XHRcdHJldHVybiBlcnJvcjtcbiYjNDM7XHR9XG4mIzQzO1x0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYyk7XG4mIzQzO1x0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFwmIzM0O2dldF93cml0ZV9hY2Nlc3NcJiMzNDspO1xuJiM0MztcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTtcbiYjNDM7XHRpZiAoZXJyb3IpIHtcbiYjNDM7XHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4mIzQzO1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpO1xuJiM0MztcdG1lbXNldCgodm9pZCAqKXJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbiYjNDM7XHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVx1MDAzZWlfc2IpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuJiM0MztcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbiYjNDM7XHRcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IFBUUl9FUlIocGF0aCk7XG4mIzQzO1x0XHRcdGdvdG8gcmVjb3Zlcnk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG4mIzQzO1xuJiM0MztcdFx0bmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTtcbiYjNDM7XHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuJiM0MztcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4mIzQzO1x0XHRwYXRoID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCBcdTAwMjZuZXdleCwgMCk7XG4mIzQzO1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4mIzQzO1x0XHRcdGVycm9yID0gUFRSX0VSUihwYXRoKTtcbiYjNDM7XHRcdFx0aWYgKGVycm9yID09IC1FRFFVT1QgfHwgZXJyb3IgPT0gLUVOT1NQQykge1xuJiM0MztcdFx0XHRcdGdvdG8gcmVjb3Zlcnk7XG4mIzQzO1x0XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFx0ZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTtcbiYjNDM7XHRcdFx0XHRnb3RvIG5vZnJlZTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YVswXSA9IGNwdV90b19sZTMyKGJsb2NrKTtcbiYjNDM7XHR9XG4mIzQzO1x0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7XHRpZiAoZXJyb3IpXG4mIzQzO1x0XHRnb3RvIHJlY292ZXJ5O1xuJiM0MztcdGlmICghaXMucy5ub3RfZm91bmQpXG4mIzQzO1x0XHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbiYjNDM7cmVjb3Zlcnk6XG4mIzQzO1x0aWYgKGVycm9yKSB7XG4mIzQzO1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuJiM0MztcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuJiM0Mztub2ZyZWU6XG4mIzQzO1x0XHRtZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7XG4mIzQzO1x0XHRtZW1jcHkoZWktXHUwMDNlaV9kYXRhLCByYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4mIzQzO1x0XHRleHQ0X2NsZWFyX2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4mIzQzO1x0XHRnZXRfYmgoaXMuaWxvYy5iaCk7XG4mIzQzO1x0XHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuJiM0MztcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9zaXplID0gMDtcbiYjNDM7XHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbiYjNDM7XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbiYjNDM7XHRcdFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbiYjNDM7XHRcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGJyZWxzZShiaCk7XG4mIzQzO1x0fVxuJiM0MztvdXQ6XG4mIzQzO1x0YnJlbHNlKGlzLmlsb2MuYmgpO1xuJiM0MztcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuJiM0MztcdGtmcmVlKGlub2RlX2J1Zik7XG4mIzQzO1x0cmV0dXJuIGVycm9yO1xuIH1cbiBcbiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbkBAIC0xMDk0LDggJiM0MzsxMTg5LDExIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aW50IGVycm9yO1xuIFx0dm9pZCAqYnVmID0gTlVMTDtcbiBcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4tXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbiBcdGludCBpbmxpbmVfc2l6ZTtcbiYjNDM7XHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuJiM0MztcdHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuJiM0MztcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcbi1cdGlmIChlcnJvcilcbi1cdFx0Z290byBvdXQ7XG4tXG4tXHRtYXAubV9sYmxrID0gMDtcbi1cdG1hcC5tX2xlbiA9IDE7XG4tXHRtYXAubV9mbGFncyA9IDA7XG4tXHRlcnJvciA9IGV4dDRfbWFwX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xuJiM0MztcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4mIzQzO1x0YXIuaW5vZGUgPSBpbm9kZTtcbiYjNDM7XHRhci5sb2dpY2FsID0gMDtcbiYjNDM7XHRhci5sZW4gPSAxO1xuJiM0MztcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4mIzQzO1x0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGFyLmZsYWdzID0gMDtcbiYjNDM7XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4gXHRpZiAoZXJyb3IgXHUwMDNjIDApXG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHRpZiAoIShtYXAubV9mbGFncyBcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xuLVx0XHRlcnJvciA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4tXHR9XG4tXG4tXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuJiM0MztcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbmV3YmxvY2spO1xuIFx0aWYgKCFkYXRhX2JoKSB7XG4gXHRcdGVycm9yID0gLUVOT01FTTtcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbiYjNDM7XHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICYjNDM7MTI0Miw3IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aWYgKGVycm9yKSB7XG4gXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG4gXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbiYjNDM7XHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFx0bWVtc2V0KGRhdGFfYmgtXHUwMDNlYl9kYXRhLCAwLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbiBcbkBAIC0xMTU5LDI0ICYjNDM7MTI1NCwyOCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4gXHR9IGVsc2Uge1xuIFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuLVx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVxuIFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuIFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuIFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuIFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4tXHRcdGlmICghZXJyb3IpXG4tXHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4gXHR9XG4mIzQzO291dF9iaDpcbiYjNDM7XHRpZiAoZXJyb3IpIHtcbiYjNDM7XHRcdGludCBmbGFncyA9IDA7XG4gXG4tb3V0X3Jlc3RvcmU6XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcbiYjNDM7XHRcdGlmIChkYXRhX2JoKVxuJiM0MztcdFx0XHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiBcbiYjNDM7XHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4mIzQzO1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuJiM0MztcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBmbGFncyk7XG4mIzQzO1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLFxuJiM0MztcdFx0XHRcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xuJiM0MztcdH1cbiBvdXQ6XG4tXHRicmVsc2UoZGF0YV9iaCk7XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGJkYjI3MjA4NDk3NzU0MTAxYWM0ZWNlMDFlZTQ4ODA5ZTFmNWQzNTgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jCmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5saW5lLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuYwpAQCAtMTQsNiAmIzQzOzE0LDcgQEAKICNpbmNsdWRlICYjMzQ7ZXh0NC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7eGF0dHIuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3RydW5jYXRlLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7ZXh0NF9leHRlbnRzLmgmIzM0OwogCiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEEJJiMzNDtkYXRhJiMzNDsKICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRQkoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpCkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsCi0JCQkJICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSkKJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jaywKJiM0MzsJCQkJCXVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiYjNDM7CWludCBpbm9kZV9zaXplOwomIzQzOwl2b2lkICppbm9kZV9idWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlOwogCi0JcmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpOwotCWlmIChyZXQpIHsKLQkJZXh0NF9tc2coaW5vZGUtJmd0O2lfc2IsIEtFUk5fRU1FUkcsCi0JCQkmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKSYjMzQ7LAotCQkJaW5vZGUtJmd0O2lfaW5vLCByZXQpOwotCQlyZXR1cm47CiYjNDM7CWlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtJmd0O2lfc2IpOwomIzQzOwlpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTsKJiM0MzsJaWYgKCFpbm9kZV9idWYpIHsKJiM0MzsJCWVycm9yID0gLUVOT01FTTsKJiM0MzsJCWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmYW1wO2lzLmlsb2MpOwomIzQzOwlpZiAoZXJyb3IpIHsKJiM0MzsJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiYjNDM7CQl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJCWtmcmVlKGlub2RlX2J1Zik7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiYjNDM7CX0KJiM0MzsJcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoJmFtcDtpcy5pbG9jKTsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJbWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpOwomIzQzOwltZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtJmd0O2lfYmxvY2ssIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwltZW1zZXQoZWktJmd0O2lfZGF0YSwgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7CiYjNDM7CWlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtJmd0O2lfc2IpICZhbXA7JmFtcDsKJiM0MzsJCShTX0lTRElSKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNSRUcoaW5vZGUtJmd0O2lfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0mZ3Q7aV9tb2RlKSkpIHsKJiM0MzsJCWV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7CiYjNDM7CQlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7CiYjNDM7CQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApOwomIzQzOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlnb3RvIHJlY292ZXJ5OwomIzQzOwkJfQomIzQzOwkJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4OwomIzQzOwomIzQzOwkJbmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTsKJiM0MzsJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCXBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZhbXA7bmV3ZXgsIDApOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7CiYjNDM7CQkJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTsKJiM0MzsJCQkJZ290byBub2ZyZWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CWlmICghaXMucy5ub3RfZm91bmQpCiYjNDM7CQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7cmVjb3Zlcnk6CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKJiM0Mztub2ZyZWU6CiYjNDM7CQltZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7CiYjNDM7CQltZW1jcHkoZWktJmd0O2lfZGF0YSwgcmF3X2lub2RlLSZndDtpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7CiYjNDM7CQlnZXRfYmgoaXMuaWxvYy5iaCk7CiYjNDM7CQllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9vZmYgPSAwOwomIzQzOwkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9pbmxpbmVfc2l6ZSA9IDA7CiYjNDM7CQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CQlpZiAoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSkgewomIzQzOwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCQlFWFQ0X0koaW5vZGUpLSZndDtpX2Rpc2tzaXplID0gaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwkJfQomIzQzOwkJYnJlbHNlKGJoKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJYnJlbHNlKGlzLmlsb2MuYmgpOwomIzQzOwl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJa2ZyZWUoaW5vZGVfYnVmKTsKJiM0MzsJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTEwOTQsOCAmIzQzOzExODksMTEgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKJiM0MzsJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYik7CiYjNDM7CXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7CiAKIAlpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKIAlidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7CkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAkJCWdvdG8gb3V0OwogCX0KIAotCWVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JbWFwLm1fbGJsayA9IDA7Ci0JbWFwLm1fbGVuID0gMTsKLQltYXAubV9mbGFncyA9IDA7Ci0JZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgJmFtcDttYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpOwomIzQzOwltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CiYjNDM7CWFyLmlub2RlID0gaW5vZGU7CiYjNDM7CWFyLmxvZ2ljYWwgPSAwOwomIzQzOwlhci5sZW4gPSAxOwomIzQzOwlpZiAoU19JU1JFRyhpbm9kZS0mZ3Q7aV9tb2RlKSkKJiM0MzsJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CiYjNDM7CWVsc2UKJiM0MzsJCWFyLmZsYWdzID0gMDsKJiM0MzsJbmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYW1wO2FyLCAmYW1wO2Vycm9yKTsKIAlpZiAoZXJyb3IgJmx0OyAwKQotCQlnb3RvIG91dF9yZXN0b3JlOwotCWlmICghKG1hcC5tX2ZsYWdzICZhbXA7IEVYVDRfTUFQX01BUFBFRCkpIHsKLQkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwotCX0KLQotCWRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtJmd0O2lfc2IsIG1hcC5tX3BibGspOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzEyNDIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNTksMjQgJiM0MzsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkJICAgaW5vZGUsIGRhdGFfYmgpOwogCX0gZWxzZSB7CiAJCXVubG9ja19idWZmZXIoZGF0YV9iaCk7Ci0JCWlub2RlLSZndDtpX3NpemUgPSBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemU7Ci0JCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKLQkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9kaXNrc2l6ZSA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQogCQllcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLAogCQkJICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS0mZ3Q7aW5vZGUpLAogCQkJICBidWYgJiM0MzsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsCiAJCQkgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpOwotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQomIzQzO291dF9iaDoKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlpbnQgZmxhZ3MgPSAwOwogCi1vdXRfcmVzdG9yZToKLQlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKJiM0MzsJCWlmIChkYXRhX2JoKQomIzQzOwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUOwomIzQzOwkJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCiYjNDM7CQlkb3duX3dyaXRlKCZhbXA7ZWktJmd0O2lfZGF0YV9zZW0pOwomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsCiYjNDM7CQkJCW5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpOwomIzQzOwl9CiBvdXQ6Ci0JYnJlbHNlKGRhdGFfYmgpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDc5CgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjk3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXh0NCBJbmxpbmUgRGF0YSBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gVGhpcyBwYXRjaCBtb2RpZnlpbmcgYGZzL2V4dDQvaW5saW5lLmNgIGhhcyBjYXVnaHQgbXkgYXR0ZW50aW9uLiBUaGUgcmVtb3ZhbCBvZiBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgaW50cm9kdWN0aW9uIG9mIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGNvdXBsZWQgd2l0aCB0aGUgbW9kaWZpY2F0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgd2hpY2ggbm93IHVzZXMgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AgYW5kIGNhbGxzIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIHNjcmVhbXMgJiMzNDtmdW5jdGlvbmFsIGNoYW5nZSYjMzQ7IHRvIG1lLCBwYXJ0aWN1bGFybHkgaW4gaG93IHRoZSBleHQ0IGZpbGVzeXN0ZW0gaGFuZGxlcyBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIHRvIHJlZ3VsYXIgYmxvY2tzLiBUaGlzIGRlbWFuZHMgZnVydGhlciBpbnZlc3RpZ2F0aW9uIGZvciBmdXp6aW5nIG9wcG9ydHVuaXRpZXMuCgpTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBmb2N1cyBvbiB0aGVzZSBtb2RpZmllZCBmdW5jdGlvbnM6IGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AgKHRoZSBuZXcgb25lLCBvYnZpb3VzbHkgYSBrZXkgdGFyZ2V0KSBhbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgICh3aGljaCBpcyBub3cgYmVoYXZpbmcgZGlmZmVyZW50bHkpLiBUaGUgY29yZSBvZiB0aGlzIHBhdGNoIHNlZW1zIHRvIGJlIGZ1bmRhbWVudGFsbHkgY2hhbmdpbmcgaG93IGlubGluZSBkYXRhIGlzIGhhbmRsZWQgZHVyaW5nIHRoZSBjb252ZXJzaW9uIHByb2Nlc3MsIHdoaWNoIG1ha2VzIGl0IGFic29sdXRlbHkgd29ydGggZnV6emluZy4KCk15IG5leHQgc3RlcHMgd2lsbCBiZSB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBleHQ0OyBJIG5lZWQgdG8gZW5zdXJlIHRoaXMgY29kZSBwYXRoIGlzIGVuYWJsZWQgaW4gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNvbmZpcm0gdGhhdCBgQ09ORklHX0VYVDRfRlNgIGlzIHRoZSByZWxldmFudCBmbGFnLgoKVGhlbiwgSSYjMzk7bGwgdHJhY2UgdGhlIGNhbGwgZ3JhcGggdG8gZmluZCBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIGZvciBvdXIgZnV6emluZyBjYW1wYWlnbnMuIExvb2tzIGxpa2UgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgc28gdGhhdCYjMzk7cyB3aGVyZSBJIHdpbGwgc3RhcnQsIGJ5IHRyYWNpbmcgd2hlcmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgY2FsbGVkLiBUaGlzIHdpbGwgZ2l2ZSBtZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGNvbnN0cnVjdGluZyBlZmZlY3RpdmUgZnV6emluZyBoYXJuZXNzZXMuIFRoaXMgd2lsbCBiZSBhbiBpbnRlcmVzdGluZyBvbmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcbi0tXG5mcy9leHQ0L2NyeXB0by5jLTE1Mi1cbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlx0cmVzID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcbmZzL2V4dDQvY3J5cHRvLmMtMTU0LVx0aWYgKHJlcylcbi0tXG5mcy9leHQ0L2V4dDQuaD0zNzg0PWV4dGVybiBpbnQgZXh0NF9pbmxpbmVfZGF0YV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmhhc19pbmxpbmUpO1xuZnMvZXh0NC9leHQ0LmgtMzc4NS1cbmZzL2V4dDQvZXh0NC5oOjM3ODY6ZXh0ZXJuIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSk7XG5mcy9leHQ0L2V4dDQuaC0zNzg3LVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQ4NTQ9bG9uZyBleHQ0X2ZhbGxvY2F0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsIGxvZmZfdCBsZW4pXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cdGlub2RlX2xvY2soaW5vZGUpO1xuZnMvZXh0NC9leHRlbnRzLmM6NDg4NDpcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2V4dGVudHMuYy00ODg1LVx0aWYgKHJldClcbi0tXG5mcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTE4NC1cbmZzL2V4dDQvaW5saW5lLmM6MTE4NTpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbmZzL2V4dDQvaW5saW5lLmMtMTE4Ni1cdFx0XHRcdFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jPTEyODg9aW50IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTM0MC1cdCAqL1xuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlx0cmV0ID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGRpciwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTEzNDItXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xOTQzPWludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSlcbi0tXG5mcy9leHQ0L2lubGluZS5jLTIwNTQtXG5mcy9leHQ0L2lubGluZS5jOjIwNTU6aW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuZnMvZXh0NC9pbmxpbmUuYy0yMDU2LXtcbi0tXG5mcy9leHQ0L2lubGluZS5jLTIwOTItXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzoyMDkzOlx0XHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXHUwMDI2aWxvYyk7XG5mcy9leHQ0L2lubGluZS5jLTIwOTQtXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbi0tXG5mcy9leHQ0L2lub2RlLmM9NTkzND1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTYwMzEtXHRcdCAgICBhdHRyLVx1MDAzZWlhX3NpemUgXHUwMDNlIEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSkge1xuZnMvZXh0NC9pbm9kZS5jOjYwMzI6XHRcdFx0ZXJyb3IgPSBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoaW5vZGUpO1xuZnMvZXh0NC9pbm9kZS5jLTYwMzMtXHRcdFx0aWYgKGVycm9yKVxuLS1cbmZzL2V4dDQvaW5vZGUuYz02Nzg3PXZtX2ZhdWx0X3QgZXh0NF9wYWdlX21rd3JpdGUoc3RydWN0IHZtX2ZhdWx0ICp2bWYpXG4tLVxuZnMvZXh0NC9pbm9kZS5jLTY4MDgtXG5mcy9leHQ0L2lub2RlLmM6NjgwOTpcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L2lub2RlLmMtNjgxMC1cdGlmIChlcnIpXG4tLVxuZnMvZXh0NC92ZXJpdHkuYz0xMDI9c3RhdGljIGludCBleHQ0X2JlZ2luX2VuYWJsZV92ZXJpdHkoc3RydWN0IGZpbGUgKmZpbHApXG4tLVxuZnMvZXh0NC92ZXJpdHkuYy0xMjgtXG5mcy9leHQ0L3Zlcml0eS5jOjEyOTpcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XG5mcy9leHQ0L3Zlcml0eS5jLTEzMC1cdGlmIChlcnIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzI1MQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDEzOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4KCioqTXkgQW5hbHlzaXMgb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBDYWxsZXJzKioKCkFscmlnaHQsIHNvIEkmIzM5O20gdHJhY2luZyB0aGUgZXhlY3V0aW9uIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gY29kZSwgYW5kIEkgc2VlIGl0JiMzOTtzIGNhbGxlZCBmcm9tIGEgZmV3IGRpZmZlcmVudCBwbGFjZXM6IGBleHQ0X3NldF9jb250ZXh0YCAoc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gY3J5cHRvIG9wZXJhdGlvbnMpLCBgZXh0NF9mYWxsb2NhdGVgLCBgZXh0NF9zZXRhdHRyYCwgYGV4dDRfcGFnZV9ta3dyaXRlYCwgYW5kIGBleHQ0X2JlZ2luX2VuYWJsZV92ZXJpdHlgLiBJbnRlcmVzdGluZyByYW5nZSB0aGVyZSDigJMgY292ZXJpbmcgYSBmZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgZmlsZSBtYW5pcHVsYXRpb24uCgpUaGVuLCB0aGluZ3MgZ2V0IGEgbGl0dGxlIGxlc3Mgc3RyYWlnaHRmb3J3YXJkLiBJIHNlZSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBkaXJlY3RseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoYXQgc3VnZ2VzdHMgd2UgYXJlIGxvb2tpbmcgYXQgYW4gYXR0ZW1wdCB0byBhZGQgZGF0YSBpbmxpbmUgdG8gYW4gaW5vZGUsIHdpdGhvdXQgdGFraW5nIHRoZSBnbG9iYWwgbG9jaywgc28gaXQmIzM5O3MgcHJvYmFibHkgY2FsbGVkIGR1cmluZyBhIGZpbGUgY3JlYXRlIG9yIHNpbWlsYXIgb3BlcmF0aW9uLgoKQW5kIGhlcmXigJlzIHdoZXJlIEkgbmVlZCB0byBiZSBjYXJlZnVsOyBpdCBsb29rcyBsaWtlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBhbHNvIGNhbGxzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gT2theSwgKnRoYXQqIHdhcnJhbnRzIGEgY2xvc2VyIGxvb2ssIGxldCBtZSBqdXN0IGRvdWJsZSBjaGVjayBob3cgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGZ1bmN0aW9ucy4gSSBuZWVkIHRvIGJlIGNlcnRhaW4gYWJvdXQgdGhlIGZsb3cgYW5kIHRoZSBsb2NraW5nIHNlbWFudGljcyBpbnZvbHZlZC4gSXQgc2VlbXMgbGlrZWx5IHRoYXQgdGhlICYjMzQ7bm9sb2NrJiMzNDsgdmFyaWFudCBpcyB1c2VkICp3aXRoaW4qIHRoZSBjb250ZXh0IG9mIGFuIGV4aXN0aW5nIGxvY2sgaW4gdGhpcyBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbmZzL2V4dDQvaW5saW5lLmMtNTc0LVx0XHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYy03MjgtXHRcdFx0LyogUmV0cnkgaW5zaWRlICovXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcdFx0XHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XG5mcy9leHQ0L2lubGluZS5jLTczMC1cdFx0fVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9Nzg0PWludCBleHQ0X3RyeV90b193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cdGlmIChwb3MgJiM0MzsgbGVuIFx1MDAzZSBleHQ0X2dldF9tYXhfaW5saW5lX3NpemUoaW5vZGUpKVxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XHRcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODExNQoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEZWNvbnN0cnVjdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBhY3R1YWxseSBoYXBwZW5pbmcgdW5kZXIgdGhlIGhvb2Qgd2hlbiBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgZ2V0cyBjYWxsZWQuIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8gdHJhY2UgaXRzIGRlcGVuZGVuY2llcy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBvcGVyYXRlcy4gRXNzZW50aWFsbHksIEkmIzM5O20gdGhpbmtpbmcsICYjMzQ7V2hlcmUgZG9lcyB0aGlzIHBpZWNlIGZpdCBpbnRvIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIHB1enpsZT8mIzM0OyBXaGF0IG90aGVyIGZ1bmN0aW9ucyBvciBwcm9jZXNzZXMgdHJpZ2dlciB0aGlzIGNvbnZlcnNpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgY2hhaW4gd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgZm9yIHdoeSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXRpbGl6ZWQuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaXRzIGludGVyYWN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1NzMsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMTAwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1NzM6XHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4gNTc0Olx0XHRcdFx0XHRcdCAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gNTc1Olx0e1xuIDU3NjpcdFx0aW50IHJldCwgbmVlZGVkX2Jsb2Nrcywgbm9fZXhwYW5kO1xuIDU3NzpcdFx0aGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7XG4gNTc4Olx0XHRpbnQgcmV0cmllcyA9IDAsIHNlbV9oZWxkID0gMDtcbiA1Nzk6XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8gPSBOVUxMO1xuIDU4MDpcdFx0dW5zaWduZWQgZnJvbSwgdG87XG4gNTgxOlx0XHRzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7XG4gNTgyOlx0XG4gNTgzOlx0XHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xuIDU4NDpcdFx0XHQvKlxuIDU4NTpcdFx0XHQgKiBjbGVhciB0aGUgZmxhZyBzbyB0aGF0IG5vIG5ldyB3cml0ZVxuIDU4NjpcdFx0XHQgKiB3aWxsIHRyYXAgaGVyZSBhZ2Fpbi5cbiA1ODc6XHRcdFx0ICovXG4gNTg4Olx0XHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbiA1ODk6XHRcdFx0cmV0dXJuIDA7XG4gNTkwOlx0XHR9XG4gNTkxOlx0XG4gNTkyOlx0XHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xuIDU5MzpcdFxuIDU5NDpcdFx0cmV0ID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcdTAwMjZpbG9jKTtcbiA1OTU6XHRcdGlmIChyZXQpXG4gNTk2Olx0XHRcdHJldHVybiByZXQ7XG4gNTk3Olx0XG4gNTk4Olx0cmV0cnk6XG4gNTk5Olx0XHRoYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDRfSFRfV1JJVEVfUEFHRSwgbmVlZGVkX2Jsb2Nrcyk7XG4gNjAwOlx0XHRpZiAoSVNfRVJSKGhhbmRsZSkpIHtcbiA2MDE6XHRcdFx0cmV0ID0gUFRSX0VSUihoYW5kbGUpO1xuIDYwMjpcdFx0XHRoYW5kbGUgPSBOVUxMO1xuIDYwMzpcdFx0XHRnb3RvIG91dDtcbiA2MDQ6XHRcdH1cbiA2MDU6XHRcbiA2MDY6XHRcdC8qIFdlIGNhbm5vdCByZWN1cnNlIGludG8gdGhlIGZpbGVzeXN0ZW0gYXMgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHlcbiA2MDc6XHRcdCAqIHN0YXJ0ZWQgKi9cbiA2MDg6XHRcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCAwLCBGR1BfV1JJVEVCRUdJTiB8IEZHUF9OT0ZTLFxuIDYwOTpcdFx0XHRcdG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpO1xuIDYxMDpcdFx0aWYgKElTX0VSUihmb2xpbykpIHtcbiA2MTE6XHRcdFx0cmV0ID0gUFRSX0VSUihmb2xpbyk7XG4gNjEyOlx0XHRcdGdvdG8gb3V0X25vZm9saW87XG4gNjEzOlx0XHR9XG4gNjE0Olx0XG4gNjE1Olx0XHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4gNjE2Olx0XHRzZW1faGVsZCA9IDE7XG4gNjE3Olx0XHQvKiBJZiBzb21lIG9uZSBoYXMgYWxyZWFkeSBkb25lIHRoaXMgZm9yIHVzLCBqdXN0IGV4aXQuICovXG4gNjE4Olx0XHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xuIDYxOTpcdFx0XHRyZXQgPSAwO1xuIDYyMDpcdFx0XHRnb3RvIG91dDtcbiA2MjE6XHRcdH1cbiA2MjI6XHRcbiA2MjM6XHRcdGZyb20gPSAwO1xuIDYyNDpcdFx0dG8gPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XG4gNjI1Olx0XHRpZiAoIWZvbGlvX3Rlc3RfdXB0b2RhdGUoZm9saW8pKSB7XG4gNjI2Olx0XHRcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oaW5vZGUsIGZvbGlvKTtcbiA2Mjc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbiA2Mjg6XHRcdFx0XHRnb3RvIG91dDtcbiA2Mjk6XHRcdH1cbiA2MzA6XHRcbiA2MzE6XHRcdGV4dDRfZmNfdHJhY2tfaW5vZGUoaGFuZGxlLCBpbm9kZSk7XG4gNjMyOlx0XHRyZXQgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xuIDYzMzpcdFx0aWYgKHJldClcbiA2MzQ6XHRcdFx0Z290byBvdXQ7XG4gNjM1Olx0XG4gNjM2Olx0XHRpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKSB7XG4gNjM3Olx0XHRcdHJldCA9IGV4dDRfYmxvY2tfd3JpdGVfYmVnaW4oaGFuZGxlLCBmb2xpbywgZnJvbSwgdG8sXG4gNjM4Olx0XHRcdFx0XHRcdCAgICAgZXh0NF9nZXRfYmxvY2tfdW53cml0dGVuKTtcbiA2Mzk6XHRcdH0gZWxzZVxuIDY0MDpcdFx0XHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxuIDY0MTpcdFx0XHRcdFx0XHQgICAgIGV4dDRfZ2V0X2Jsb2NrKTtcbiA2NDI6XHRcdGNsZWFyX2J1ZmZlcl9uZXcoZm9saW9fYnVmZmVycyhmb2xpbykpO1xuIDY0MzpcdFxuIDY0NDpcdFx0aWYgKCFyZXQgXHUwMDI2XHUwMDI2IGV4dDRfc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpIHtcbiA2NDU6XHRcdFx0cmV0ID0gZXh0NF93YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIGlub2RlLFxuIDY0NjpcdFx0XHRcdFx0XHQgICAgIGZvbGlvX2J1ZmZlcnMoZm9saW8pLCBmcm9tLCB0byxcbiA2NDc6XHRcdFx0XHRcdFx0ICAgICBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpO1xuIDY0ODpcdFx0fVxuIDY0OTpcdFxuIDY1MDpcdFx0aWYgKHJldCkge1xuIDY1MTpcdFx0XHRmb2xpb191bmxvY2soZm9saW8pO1xuIDY1MjpcdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuIDY1MzpcdFx0XHRmb2xpbyA9IE5VTEw7XG4gNjU0Olx0XHRcdGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTtcbiA2NTU6XHRcdFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFx1MDAyNm5vX2V4cGFuZCk7XG4gNjU2Olx0XHRcdHNlbV9oZWxkID0gMDtcbiA2NTc6XHRcdFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcbiA2NTg6XHRcdFx0aGFuZGxlID0gTlVMTDtcbiA2NTk6XHRcdFx0ZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpO1xuIDY2MDpcdFx0XHQvKlxuIDY2MTpcdFx0XHQgKiBJZiB0cnVuY2F0ZSBmYWlsZWQgZWFybHkgdGhlIGlub2RlIG1pZ2h0XG4gNjYyOlx0XHRcdCAqIHN0aWxsIGJlIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0b1xuIDY2MzpcdFx0XHQgKiBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGVcbiA2NjQ6XHRcdFx0ICogb3JwaGFuIGxpc3QgaW4gdGhhdCBjYXNlLlxuIDY2NTpcdFx0XHQgKi9cbiA2NjY6XHRcdFx0aWYgKGlub2RlLVx1MDAzZWlfbmxpbmspXG4gNjY3Olx0XHRcdFx0ZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTtcbiA2Njg6XHRcdH1cbiA2Njk6XHRcbiA2NzA6XHRcdGlmIChyZXQgPT0gLUVOT1NQQyBcdTAwMjZcdTAwMjYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtXHUwMDNlaV9zYiwgXHUwMDI2cmV0cmllcykpXG4gNjcxOlx0XHRcdGdvdG8gcmV0cnk7XG4gNjcyOlx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTgxMQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDEwMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFeGFtaW5pbmcgdGhlIGV4dDQgSW5saW5lIERhdGEgQ29udmVyc2lvbiBMb2dpYyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcyBpbiBleHQ0LiBJdCYjMzk7cyBzdHJpa2luZyBtZSB0aGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCAqZG9lc24mIzM5O3QqIGNhbGwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBUaGF0IGZlZWxz4oCmdW51c3VhbC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5LiBIYW5nIG9uLCBpcyBpdCB0aGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBpcyBzcGVjaWZpY2FsbHkgZm9yIGRpcmVjdG9yaWVzLCB3aGVyZWFzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBpcyBoYW5kbGluZyByZWd1bGFyIGZpbGVzPyBUaGF0JiMzOTtzIGEgcGxhdXNpYmxlIGRpc3RpbmN0aW9uLiBJIG5lZWQgdG8gY29uZmlybSB0aGlzLiBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEkmIzM5O2xsIGRpdmUgaW50byB0aGUgc291cmNlIGNvZGUgZm9yIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCBkaXJlY3RseSwgc3BlY2lmaWNhbGx5IGluIGBmcy9leHQ0L2lubGluZS5jYC4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaXRzIGludGVuZGVkIHVzZSBjYXNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxMTg1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTg1Olx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4xMTg2Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4xMTg3Olx0XHRcdFx0XHRcdCAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MpXG4xMTg4Olx0e1xuMTE4OTpcdFx0aW50IGVycm9yO1xuMTE5MDpcdFx0dm9pZCAqYnVmID0gTlVMTDtcbjExOTE6XHRcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4xMTkyOlx0XHRpbnQgaW5saW5lX3NpemU7XG4xMTkzOlx0XHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuMTE5NDpcdFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xuMTE5NTpcdFx0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKTtcbjExOTY6XHRcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4xMTk3Olx0XG4xMTk4Olx0XHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbjExOTk6XHRcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbjEyMDA6XHRcdGlmICghYnVmKSB7XG4xMjAxOlx0XHRcdGVycm9yID0gLUVOT01FTTtcbjEyMDI6XHRcdFx0Z290byBvdXQ7XG4xMjAzOlx0XHR9XG4xMjA0Olx0XG4xMjA1Olx0XHRlcnJvciA9IGV4dDRfcmVhZF9pbmxpbmVfZGF0YShpbm9kZSwgYnVmLCBpbmxpbmVfc2l6ZSwgaWxvYyk7XG4xMjA2Olx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMjA3Olx0XHRcdGdvdG8gb3V0O1xuMTIwODpcdFxuMTIwOTpcdFx0LypcbjEyMTA6XHRcdCAqIE1ha2Ugc3VyZSB0aGUgaW5saW5lIGRpcmVjdG9yeSBlbnRyaWVzIHBhc3MgY2hlY2tzIGJlZm9yZSB3ZSB0cnkgdG9cbjEyMTE6XHRcdCAqIGNvbnZlcnQgdGhlbSwgc28gdGhhdCB3ZSBhdm9pZCB0b3VjaGluZyBzdHVmZiB0aGF0IG5lZWRzIGZzY2suXG4xMjEyOlx0XHQgKi9cbjEyMTM6XHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbjEyMTQ6XHRcdFx0ZXJyb3IgPSBleHQ0X2NoZWNrX2FsbF9kZShpbm9kZSwgaWxvYy1cdTAwM2ViaCxcbjEyMTU6XHRcdFx0XHRcdFx0YnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTIxNjpcdFx0XHRcdFx0XHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbjEyMTc6XHRcdFx0aWYgKGVycm9yKVxuMTIxODpcdFx0XHRcdGdvdG8gb3V0O1xuMTIxOTpcdFx0fVxuMTIyMDpcdFxuMTIyMTpcdFx0bWVtc2V0KFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcbjEyMjI6XHRcdGFyLmlub2RlID0gaW5vZGU7XG4xMjIzOlx0XHRhci5sb2dpY2FsID0gMDtcbjEyMjQ6XHRcdGFyLmxlbiA9IDE7XG4xMjI1Olx0XHRpZiAoU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpKVxuMTIyNjpcdFx0XHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xuMTIyNzpcdFx0ZWxzZVxuMTIyODpcdFx0XHRhci5mbGFncyA9IDA7XG4xMjI5Olx0XHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFx1MDAyNmFyLCBcdTAwMjZlcnJvcik7XG4xMjMwOlx0XHRpZiAoZXJyb3IgXHUwMDNjIDApXG4xMjMxOlx0XHRcdGdvdG8gb3V0O1xuMTIzMjpcdFx0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuMTIzMzpcdFx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4xMjM0Olx0XHRpZiAoIWRhdGFfYmgpIHtcbjEyMzU6XHRcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuMTIzNjpcdFx0XHRnb3RvIG91dF9iaDtcbjEyMzc6XHRcdH1cbjEyMzg6XHRcbjEyMzk6XHRcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI0MDpcdFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cdTAwM2VpX3NiLCBkYXRhX2JoLFxuMTI0MTpcdFx0XHRcdFx0XHQgICAgICAgRVhUNF9KVFJfTk9ORSk7XG4xMjQyOlx0XHRpZiAoZXJyb3IpIHtcbjEyNDM6XHRcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbjEyNDQ6XHRcdFx0ZXJyb3IgPSAtRUlPO1xuMTI0NTpcdFx0XHRnb3RvIG91dF9iaDtcbjEyNDY6XHRcdH1cbjEyNDc6XHRcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4xMjQ4Olx0XG4xMjQ5Olx0XHRpZiAoIVNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuMTI1MDpcdFx0XHRtZW1jcHkoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIGJ1ZiwgaW5saW5lX3NpemUpO1xuMTI1MTpcdFx0XHRzZXRfYnVmZmVyX3VwdG9kYXRlKGRhdGFfYmgpO1xuMTI1MjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI1MzpcdFx0XHRlcnJvciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSxcbjEyNTQ6XHRcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4xMjU1Olx0XHR9IGVsc2Uge1xuMTI1NjpcdFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuMTI1NzpcdFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuMTI1ODpcdFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuMTI1OTpcdFx0XHRcdCAgYnVmICYjNDM7IEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuMTI2MDpcdFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4xMjYxOlx0XHR9XG4xMjYyOlx0b3V0X2JoOlxuMTI2MzpcdFx0aWYgKGVycm9yKSB7XG4xMjY0Olx0XHRcdGludCBmbGFncyA9IDA7XG4xMjY1Olx0XG4xMjY2Olx0XHRcdGlmIChkYXRhX2JoKVxuMTI2NzpcdFx0XHRcdGZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUO1xuMTI2ODpcdFx0XHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XG4xMjY5Olx0XG4xMjcwOlx0XHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4xMjcxOlx0XHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4xMjcyOlx0XHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xuMTI3MzpcdFx0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbjEyNzQ6XHRcdH0gZWxzZSB7XG4xMjc1Olx0XHRcdGVycm9yID0gZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlLCBpbm9kZSxcbjEyNzY6XHRcdFx0XHRcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xuMTI3NzpcdFx0fVxuMTI3ODpcdG91dDpcbjEyNzk6XHRcdGtmcmVlKGJ1Zik7XG4xMjgwOlx0XHRyZXR1cm4gZXJyb3I7XG4xMjgxOlx0fVxuMTI4MjpcdFxuMTI4MzpcdC8qXG4xMjg0Olx0ICogVHJ5IHRvIGFkZCB0aGUgbmV3IGVudHJ5IHRvIHRoZSBpbmxpbmUgZGF0YS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE3MDEKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBVc2FnZSoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBob3cgaW5saW5lIGRhdGEgaXMgaGFuZGxlZCBpbiBleHQ0LiBJdCBzZWVtcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgdGhlIHdvcmtob3JzZSBoZXJlLCBhbmQgaXQmIzM5O3MgdXNlZCBmb3IgYm90aCBkaXJlY3RvcmllcyBhbmQgcmVndWxhciBmaWxlcyDigJMgY2xldmVyLCBpdCBjaGVja3MgdGhlIGlub2RlJiMzOTtzIG1vZGUgd2l0aCBgU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKWAgdG8gZmlndXJlIG91dCB0aGUgZmlsZSB0eXBlLiBHb3QgaXQuIEFuZCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AsIHdoaWNoIG1ha2VzIHNlbnNlIGZvciB0aGUgb3ZlcmFsbCBmbG93LiBMZXQgbWUganVzdCBkb3VibGUtY2hlY2sgdGhhdCBmdW5jdGlvbiBjYWxsIGFuZCB0aGUgbG9naWMgYXJvdW5kIHRoYXQuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGUgbG9jayBpcyBoYW5kbGVkIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvaW5saW5lLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDU1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwNTU6XHRpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4yMDU2Olx0e1xuMjA1NzpcdFx0aW50IGVycm9yLCBuZWVkZWRfYmxvY2tzLCBub19leHBhbmQ7XG4yMDU4Olx0XHRoYW5kbGVfdCAqaGFuZGxlO1xuMjA1OTpcdFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xuMjA2MDpcdFxuMjA2MTpcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcbjIwNjI6XHRcdFx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuMjA2MzpcdFx0XHRyZXR1cm4gMDtcbjIwNjQ6XHRcdH0gZWxzZSBpZiAoIWV4dDRfdGVzdF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpKSB7XG4yMDY1Olx0XHRcdC8qXG4yMDY2Olx0XHRcdCAqIElub2RlIGhhcyBpbmxpbmUgZGF0YSBidXQgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEgaXNcbjIwNjc6XHRcdFx0ICogY2xlYXJlZC4gVGhpcyBtZWFucyB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBtb3Zpbmcgb2ZcbjIwNjg6XHRcdFx0ICogaW5saW5lIGRhdGEgdG8gZGVsYXkgYWxsb2NhdGVkIGJsb2NrLiBKdXN0IGZvcmNlIHdyaXRlb3V0XG4yMDY5Olx0XHRcdCAqIGhlcmUgdG8gZmluaXNoIGNvbnZlcnNpb24uXG4yMDcwOlx0XHRcdCAqL1xuMjA3MTpcdFx0XHRlcnJvciA9IGZpbGVtYXBfZmx1c2goaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbjIwNzI6XHRcdFx0aWYgKGVycm9yKVxuMjA3MzpcdFx0XHRcdHJldHVybiBlcnJvcjtcbjIwNzQ6XHRcdFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG4yMDc1Olx0XHRcdFx0cmV0dXJuIDA7XG4yMDc2Olx0XHR9XG4yMDc3Olx0XG4yMDc4Olx0XHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xuMjA3OTpcdFxuMjA4MDpcdFx0aWxvYy5iaCA9IE5VTEw7XG4yMDgxOlx0XHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aWxvYyk7XG4yMDgyOlx0XHRpZiAoZXJyb3IpXG4yMDgzOlx0XHRcdHJldHVybiBlcnJvcjtcbjIwODQ6XHRcbjIwODU6XHRcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcbjIwODY6XHRcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuMjA4NzpcdFx0XHRlcnJvciA9IFBUUl9FUlIoaGFuZGxlKTtcbjIwODg6XHRcdFx0Z290byBvdXRfZnJlZTtcbjIwODk6XHRcdH1cbjIwOTA6XHRcbjIwOTE6XHRcdGV4dDRfd3JpdGVfbG9ja194YXR0cihpbm9kZSwgXHUwMDI2bm9fZXhwYW5kKTtcbjIwOTI6XHRcdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpXG4yMDkzOlx0XHRcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcdTAwMjZpbG9jKTtcbjIwOTQ6XHRcdGV4dDRfd3JpdGVfdW5sb2NrX3hhdHRyKGlub2RlLCBcdTAwMjZub19leHBhbmQpO1xuMjA5NTpcdFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcbjIwOTY6XHRvdXRfZnJlZTpcbjIwOTc6XHRcdGJyZWxzZShpbG9jLmJoKTtcbjIwOTg6XHRcdHJldHVybiBlcnJvcjtcbjIwOTk6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyNzE1CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMjA5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgY2FsbGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoaXMgbG9va3MgbGlrZSBhIHByb21pc2luZyBhcmVhIGZvciBmdXp6aW5nLCBkZWZpbml0ZWx5IHdvcnRoIGEgY2xvc2VyIGxvb2suIE15IGluaXRpYWwgZm9jdXMgc3ltYm9scyBhcmUgZ29pbmcgdG8gYmUgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YC4gSGFuZyBvbiwgdGhvdWdoIOKAkyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgKnN0YXRpYyosIHNvIGl0IHdvbiYjMzk7dCBiZSBkaXJlY3RseSBleHBvc2VkIGFzIGEgZm9jdXMgZm9yIGZ1enppbmcuIFRoYXQgbmFycm93cyB0aGluZ3MgZG93biBhIGJpdC4KClJpZ2h0LCBzbyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCAqaXMqIGV4cG9ydGVkIOKAkyBpdCYjMzk7cyBnbG9iYWwuIEFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgaXMgYWxzbyBnbG9iYWwuIE5vdywgSSB3YW50IHRvIHNlZSBpZiBhbnl0aGluZyAqZWxzZSogY2FsbHMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBMZXQgbWUganVzdCBkb3VibGUgY2hlY2s7IG9oLCB5ZXAsIGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBjYWxscyBpdC4gQW5kIG9idmlvdXNseSwgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXRzZWxmIGRvZXMuIAoKVGhlIGNvbmZpZ3VyYXRpb24gaGVyZSBpcyBgRVhUNF9GU2AsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgY29udGV4dC4gTGV0IG1lIGp1c3QgY29uZmlybSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhY3R1YWxseSBhIGdsb2JhbCBmdW5jdGlvbiBhcyB3ZWxsLCBmb3IgY2xhcml0eS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM3NDc9ZXh0ZXJuIGludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXG4tLVxuZnMvZXh0NC9leHQ0LmgtMzc1MS1cdFx0XHRcdFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcbmZzL2V4dDQvZXh0NC5oOjM3NTI6ZXh0ZXJuIGludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsXG5mcy9leHQ0L2V4dDQuaC0zNzUzLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9pbmxpbmUuYz0xMTg1PXN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtMTI4Ny0gKi9cbmZzL2V4dDQvaW5saW5lLmM6MTI4ODppbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG5mcy9leHQ0L2lubGluZS5jLTEyODktXHRcdFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4tLVxuZnMvZXh0NC9uYW1laS5jPTIzNTY9c3RhdGljIGludCBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yMzgzLVx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGRpcikpIHtcbmZzL2V4dDQvbmFtZWkuYzoyMzg0Olx0XHRyZXR2YWwgPSBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZSwgXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xuZnMvZXh0NC9uYW1laS5jLTIzODUtXHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNjQ3CgkJCQkJCQlvdXRwdXQ6IDE2NgoJCQkJCQkJdGhvdWdodHM6IDE1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgRXh0NCBJbmxpbmUgRGF0YSBGdW5jdGlvbnMqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkmIzM5O20gbm90aW5nIHRoZSBzY29wZSBvZiB0aGVzZSBleHQ0IGlubGluZSBkYXRhIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFyZSBnbG9iYWwsIHdoaWNoIGlzIGltcG9ydGFudCB0byBjb25zaWRlciBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzIGFuZCBob3cgdGhleSYjMzk7cmUgZXhwb3NlZC4gVGhlbiwgSSBzZWUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBpcyBzdGF0aWM7IHRoYXQmIzM5O3MgZ29vZCwgaXQmIzM5O3Mgc2NvcGVkIGFuZCBsaWtlbHkgbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5LgoKTm93LCBJJiMzOTttIG1vdmluZyBvbiB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAsIGFuZCBpdCYjMzk7cyBhbHNvIHN0YXRpYywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gaXRzIHNwZWNpZmljIHB1cnBvc2UuIE5leHQsIEkmIzM5O3ZlIGdvdCBgZXh0NF9nZW5lcmljX3dyaXRlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhYCB3aGljaCBhcmUgYm90aCBnbG9iYWwgZnVuY3Rpb25zLgoKSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24gbGFuZHNjYXBlIGhlcmUuIFRoZSBjZW50cmFsIGNvbmZpZyBvcHRpb24gc2VlbXMgdG8gYmUgYEVYVDRfRlNgLCB3aGljaCBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGlubGluZSBkYXRhIHN1cHBvcnQuIFRoaXMgaXMgdGhlIG1haW4gb25lIHRoYXQgbWF0dGVycyBoZXJlLgoKT2theSwgSSB0aGluayBJJiMzOTt2ZSBnb3QgdGhlIGxheSBvZiB0aGUgbGFuZCBub3cuIExldCYjMzk7cyB1c2UgdGhlIGBzZXQtcmVzdWx0c2AgdG9vbCB0byBhbmFseXplIHRoaXMgZnVydGhlci4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBpbiBleHQ0LCBzcGVjaWZpY2FsbHkgaG93IGlubGluZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgYmxvY2suIEl0IHJlcGxhY2VzIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YSB3aXRoIGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrIGFuZCBjaGFuZ2VzIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2sgdG8gdXNlIGV4dDRfbWJfbmV3X2Jsb2NrcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGV4dDRfbWFwX2Jsb2Nrcy4gVGhlc2UgYXJlIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBhZGRpbmcgZGlyZWN0b3J5IGVudHJpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBpbiBleHQ0LCBzcGVjaWZpY2FsbHkgaG93IGlubGluZSBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIHJlZ3VsYXIgYmxvY2suIEl0IHJlcGxhY2VzIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YSB3aXRoIGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrIGFuZCBjaGFuZ2VzIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2sgdG8gdXNlIGV4dDRfbWJfbmV3X2Jsb2NrcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGV4dDRfbWFwX2Jsb2Nrcy4gVGhlc2UgYXJlIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIG9wZXJhdGlvbnMgbGlrZSBmYWxsb2NhdGUsIHNldGF0dHIsIGFuZCBhZGRpbmcgZGlyZWN0b3J5IGVudHJpZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjltPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+OW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cblxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxuMi4gYHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleGAgaXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgYnV0IGFsbCBvZiBpdHMgZmllbGRzIChgZWVfYmxvY2tgLCBgZWVfbGVuYCwgYGVlX3N0YXJ0X2hpYCwgYGVlX3N0YXJ0X2xvYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgKHRoZSBsYXR0ZXIgdHdvIHZpYSBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCksIGFuZCB0aGUgc3RydWN0IGNvbnRhaW5zIG5vIHBhZGRpbmcuXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXG41LiBUaGUgbmV3IGJsb2NrIGJ1ZmZlciBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXG5cblRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgcmVhZCwgdXNlZCBpbiBjb250cm9sIGZsb3csIG9yIGxlYWtlZCB0byB1c2VyIHNwYWNlLiBUaGUgcGF0Y2ggcHJpbWFyaWx5IGFkZHJlc3NlcyBleHQ0IGludGVybmFsIG1ldGFkYXRhIG1hbmlwdWxhdGlvbiAobGlrZWx5IHRvIGZpeCBhIGRlYWRsb2NrLCB0cmFuc2FjdGlvbiBpc3N1ZSwgb3IgdXNlLWFmdGVyLWZyZWUpLiBTdGFuZGFyZCBLQVNBTiwgTE9DS0RFUCwgYW5kIG90aGVyIGJ1ZyBkZXRlY3RvcnMgYXJlIGZ1bGx5IHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBpc3N1ZXMgKHN1Y2ggYXMgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBsb2NraW5nIGJ1Z3MpIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaC4gQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCBuZWNlc3NhcnkuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGJkYjI3MjA4NDk3NzU0MTAxYWM0ZWNlMDFlZTQ4ODA5ZTFmNWQzNTgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jCmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5saW5lLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuYwpAQCAtMTQsNiAmIzQzOzE0LDcgQEAKICNpbmNsdWRlICYjMzQ7ZXh0NC5oJiMzNDsKICNpbmNsdWRlICYjMzQ7eGF0dHIuaCYjMzQ7CiAjaW5jbHVkZSAmIzM0O3RydW5jYXRlLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7ZXh0NF9leHRlbnRzLmgmIzM0OwogCiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEEJJiMzNDtkYXRhJiMzNDsKICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRQkoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpCkBAIC0xMDcwLDIxICYjNDM7MTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsCi0JCQkJICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSkKJiM0MztzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jaywKJiM0MzsJCQkJCXVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0JaW50IHJldDsKJiM0MzsJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzID0gewomIzQzOwkJLnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LAomIzQzOwl9OwomIzQzOwlzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7CiYjNDM7CQkubmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfU1lTVEVNLAomIzQzOwkJLm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLAomIzQzOwkJLnZhbHVlID0gTlVMTCwKJiM0MzsJCS52YWx1ZV9sZW4gPSAwLAomIzQzOwl9OwomIzQzOwlpbnQgZXJyb3I7CiYjNDM7CWludCBpbm9kZV9zaXplOwomIzQzOwl2b2lkICppbm9kZV9idWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlOwogCi0JcmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpOwotCWlmIChyZXQpIHsKLQkJZXh0NF9tc2coaW5vZGUtJmd0O2lfc2IsIEtFUk5fRU1FUkcsCi0JCQkmIzM0O2Vycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKSYjMzQ7LAotCQkJaW5vZGUtJmd0O2lfaW5vLCByZXQpOwotCQlyZXR1cm47CiYjNDM7CWlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtJmd0O2lfc2IpOwomIzQzOwlpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTsKJiM0MzsJaWYgKCFpbm9kZV9idWYpIHsKJiM0MzsJCWVycm9yID0gLUVOT01FTTsKJiM0MzsJCWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiAJfQotCWV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpOwotCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CWRvd25fd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmYW1wO2lzLmlsb2MpOwomIzQzOwlpZiAoZXJyb3IpIHsKJiM0MzsJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiYjNDM7CQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CiYjNDM7CQl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJCWtmcmVlKGlub2RlX2J1Zik7CiYjNDM7CQlyZXR1cm4gZXJyb3I7CiYjNDM7CX0KJiM0MzsJcmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoJmFtcDtpcy5pbG9jKTsKJiM0MzsJQlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsICYjMzQ7Z2V0X3dyaXRlX2FjY2VzcyYjMzQ7KTsKJiM0MzsJZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLSZndDtpX3NiLCBpcy5pbG9jLmJoLCBFWFQ0X0pUUl9OT05FKTsKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwomIzQzOwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJbWVtY3B5KGlub2RlX2J1ZiwgKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX3NpemUpOwomIzQzOwltZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtJmd0O2lfYmxvY2ssIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpOwomIzQzOwltZW1zZXQoZWktJmd0O2lfZGF0YSwgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7CiYjNDM7CWlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtJmd0O2lfc2IpICZhbXA7JmFtcDsKJiM0MzsJCShTX0lTRElSKGlub2RlLSZndDtpX21vZGUpIHx8IFNfSVNSRUcoaW5vZGUtJmd0O2lfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0mZ3Q7aV9tb2RlKSkpIHsKJiM0MzsJCWV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7CiYjNDM7CQlleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7CiYjNDM7CQlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApOwomIzQzOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlnb3RvIHJlY292ZXJ5OwomIzQzOwkJfQomIzQzOwkJc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4OwomIzQzOwomIzQzOwkJbmV3ZXguZWVfYmxvY2sgPSBjcHVfdG9fbGUzMigwKTsKJiM0MzsJCW5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpOwomIzQzOwkJZXh0NF9leHRfc3RvcmVfcGJsb2NrKCZhbXA7bmV3ZXgsIGJsb2NrKTsKJiM0MzsJCXBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZhbXA7bmV3ZXgsIDApOwomIzQzOwkJaWYgKElTX0VSUihwYXRoKSkgewomIzQzOwkJCWVycm9yID0gUFRSX0VSUihwYXRoKTsKJiM0MzsJCQlpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7CiYjNDM7CQkJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CQkJfSBlbHNlIHsKJiM0MzsJCQkJZXh0NF9mb3JnZXQoaGFuZGxlLCAwLCBpbm9kZSwgYmgsIGJsb2NrKTsKJiM0MzsJCQkJZ290byBub2ZyZWU7CiYjNDM7CQkJfQomIzQzOwkJfSBlbHNlIHsKJiM0MzsJCQlleHQ0X2ZyZWVfZXh0X3BhdGgocGF0aCk7CiYjNDM7CQl9CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7CiYjNDM7CX0KJiM0MzsJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7CWlmIChlcnJvcikKJiM0MzsJCWdvdG8gcmVjb3Zlcnk7CiYjNDM7CWlmICghaXMucy5ub3RfZm91bmQpCiYjNDM7CQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZhbXA7aSwgJmFtcDtpcyk7CiYjNDM7cmVjb3Zlcnk6CiYjNDM7CWlmIChlcnJvcikgewomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKJiM0Mztub2ZyZWU6CiYjNDM7CQltZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7CiYjNDM7CQltZW1jcHkoZWktJmd0O2lfZGF0YSwgcmF3X2lub2RlLSZndDtpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7CiYjNDM7CQlnZXRfYmgoaXMuaWxvYy5iaCk7CiYjNDM7CQllcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZhbXA7aXMuaWxvYyk7CiYjNDM7CQlFWFQ0X0koaW5vZGUpLSZndDtpX2lubGluZV9vZmYgPSAwOwomIzQzOwkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9pbmxpbmVfc2l6ZSA9IDA7CiYjNDM7CQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7CiYjNDM7CQlpZiAoU19JU0RJUihpbm9kZS0mZ3Q7aV9tb2RlKSkgewomIzQzOwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCQlFWFQ0X0koaW5vZGUpLSZndDtpX2Rpc2tzaXplID0gaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwkJfQomIzQzOwkJYnJlbHNlKGJoKTsKJiM0MzsJfQomIzQzO291dDoKJiM0MzsJYnJlbHNlKGlzLmlsb2MuYmgpOwomIzQzOwl1cF93cml0ZSgmYW1wO2VpLSZndDtpX2RhdGFfc2VtKTsKJiM0MzsJa2ZyZWUoaW5vZGVfYnVmKTsKJiM0MzsJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKQEAgLTEwOTQsOCAmIzQzOzExODksMTEgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsCiAJaW50IGVycm9yOwogCXZvaWQgKmJ1ZiA9IE5VTEw7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2JoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAlpbnQgaW5saW5lX3NpemU7CiYjNDM7CWV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7CiYjNDM7CXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKJiM0MzsJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYik7CiYjNDM7CXVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7CiAKIAlpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTsKIAlidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7CkBAIC0xMTIwLDI1ICYjNDM7MTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAkJCWdvdG8gb3V0OwogCX0KIAotCWVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JbWFwLm1fbGJsayA9IDA7Ci0JbWFwLm1fbGVuID0gMTsKLQltYXAubV9mbGFncyA9IDA7Ci0JZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgJmFtcDttYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpOwomIzQzOwltZW1zZXQoJmFtcDthciwgMCwgc2l6ZW9mKGFyKSk7CiYjNDM7CWFyLmlub2RlID0gaW5vZGU7CiYjNDM7CWFyLmxvZ2ljYWwgPSAwOwomIzQzOwlhci5sZW4gPSAxOwomIzQzOwlpZiAoU19JU1JFRyhpbm9kZS0mZ3Q7aV9tb2RlKSkKJiM0MzsJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CiYjNDM7CWVsc2UKJiM0MzsJCWFyLmZsYWdzID0gMDsKJiM0MzsJbmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYW1wO2FyLCAmYW1wO2Vycm9yKTsKIAlpZiAoZXJyb3IgJmx0OyAwKQotCQlnb3RvIG91dF9yZXN0b3JlOwotCWlmICghKG1hcC5tX2ZsYWdzICZhbXA7IEVYVDRfTUFQX01BUFBFRCkpIHsKLQkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwotCX0KLQotCWRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtJmd0O2lfc2IsIG1hcC5tX3BibGspOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTsKJiM0MzsJZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS0mZ3Q7aV9zYiwgbmV3YmxvY2spOwogCWlmICghZGF0YV9iaCkgewogCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3Jlc3RvcmU7CiYjNDM7CQlnb3RvIG91dF9iaDsKIAl9CiAKIAlsb2NrX2J1ZmZlcihkYXRhX2JoKTsKQEAgLTExNDcsNyAmIzQzOzEyNDIsNyBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSwKIAlpZiAoZXJyb3IpIHsKIAkJdW5sb2NrX2J1ZmZlcihkYXRhX2JoKTsKIAkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dF9yZXN0b3JlOwomIzQzOwkJZ290byBvdXRfYmg7CiAJfQogCW1lbXNldChkYXRhX2JoLSZndDtiX2RhdGEsIDAsIGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiAKQEAgLTExNTksMjQgJiM0MzsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkJICAgaW5vZGUsIGRhdGFfYmgpOwogCX0gZWxzZSB7CiAJCXVubG9ja19idWZmZXIoZGF0YV9iaCk7Ci0JCWlub2RlLSZndDtpX3NpemUgPSBpbm9kZS0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemU7Ci0JCWlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKLQkJRVhUNF9JKGlub2RlKS0mZ3Q7aV9kaXNrc2l6ZSA9IGlub2RlLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQogCQllcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLAogCQkJICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS0mZ3Q7aW5vZGUpLAogCQkJICBidWYgJiM0MzsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsCiAJCQkgIGlubGluZV9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUpOwotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJfQomIzQzO291dF9iaDoKJiM0MzsJaWYgKGVycm9yKSB7CiYjNDM7CQlpbnQgZmxhZ3MgPSAwOwogCi1vdXRfcmVzdG9yZToKLQlpZiAoZXJyb3IpCi0JCWV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTsKJiM0MzsJCWlmIChkYXRhX2JoKQomIzQzOwkJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUOwomIzQzOwkJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwogCiYjNDM7CQlkb3duX3dyaXRlKCZhbXA7ZWktJmd0O2lfZGF0YV9zZW0pOwomIzQzOwkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKJiM0MzsJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpOwomIzQzOwkJdXBfd3JpdGUoJmFtcDtlaS0mZ3Q7aV9kYXRhX3NlbSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQllcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsCiYjNDM7CQkJCW5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpOwomIzQzOwl9CiBvdXQ6Ci0JYnJlbHNlKGRhdGFfYmgpOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycm9yOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTA3NgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDE4MjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgSW5saW5lIERhdGEgQ29udmVyc2lvbiBQYXRjaCBpbiBleHQ0KioKCk9rYXksIHNvIEkmIzM5O3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgcGF0Y2ggdGhhdCYjMzk7cyBtb2RpZnlpbmcgYGZzL2V4dDQvaW5saW5lLmNgIGluIHRoZSBMaW51eCBrZXJuZWwuIFRoZSBjb3JlIG9mIGl0IHNlZW1zIHRvIGJlIGNoYW5naW5nIGhvdyBpbmxpbmUgZGF0YSBnZXRzIGNvbnZlcnRlZCBpbnRvIGEgcmVndWxhciBibG9jayBvbiBkaXNrLiBJbnN0ZWFkIG9mIHRoZSBvbGQgZnVuY3Rpb25zLCBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3ZSYjMzk7cmUgbm93IGxvb2tpbmcgYXQgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gSXQmIzM5O3MgYWxzbyBkaXRjaGluZyB0aGUgdXNlIG9mIGBleHQ0X21hcF9ibG9ja3NgIGluIGZhdm9yIG9mIGRpcmVjdGx5IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGZvciBibG9jayBhbGxvY2F0aW9uLgoKTGV0JiMzOTtzIGJyZWFrIGRvd24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gSSYjMzk7bSBzZWVpbmcgaXQgYWxsb2NhdGVzIGBpbm9kZV9idWZgIHdpdGggYGttYWxsb2NgLCB3aGljaCBtZWFucyBpdCBpc24mIzM5O3QgaW5pdGlhbGl6ZWQuIFRoZW4sIGl0IGltbWVkaWF0ZWx5IGNvcGllcyB0aGUgZW50aXJlIGByYXdfaW5vZGVgIGludG8gaXQuIElmIGFueSBlcnJvciBwb3BzIHVwIGxhdGVyLCBpdCByZXN0b3JlcyBgcmF3X2lub2RlYCBmcm9tIHRoaXMgYmFja3VwLiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgbWlnaHQgbG9vayBsaWtlIGEgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLCBidXQgc2luY2UgYGlub2RlX2J1ZmAgaXMgaW1tZWRpYXRlbHkgZmlsbGVkIHdpdGggYSBjb3B5IG9mIGByYXdfaW5vZGVgLCBpdCBzaG91bGQgYmUgZmluZS4gSXQgaXMgb25seSB1c2VkIGlmIHRoZXJlJiMzOTtzIGEgcmVjb3ZlcnkuCgpOb3csIGNoZWNraW5nIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIGBidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7YCBmb3IgYSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEsIHdoaWNoIHNlZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggZGF0YSByZWFkIGZyb20gZGlzay4gVGhlIG5ldyBibG9jayBgZGF0YV9iaGAgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIHRoZXJlJiMzOTtzIG5vIG9idmlvdXMgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgdXNlZCBoZXJlLgoKVGhlIG1haW4gY29uY2VybiBpbiBhIHBhdGNoIGxpa2UgdGhpcyBpcyB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSB0byBlaXRoZXIgZ2V0IHdyaXR0ZW4gdG8gZGlzaywgd2hpY2ggd291bGQgYmUgZGlzYXN0cm91cywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UsIHdoaWNoIHdvdWxkIGJlIGEgc2VjdXJpdHkgaXNzdWUuIE15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB0aGUgYGlub2RlX2J1ZmAgaXMgYSBiYWNrdXAgZm9yIHRoZSBgcmF3X2lub2RlYCwgcmVhZCBmcm9tIGRpc2sgYW5kIHRoZSBjb3B5IGlzIGRvbmUgZnJvbSBpdCBhbmQgdGhlIG90aGVyIGJ1ZmZlciBpcyByZWFkIGZyb20gZGlzay4gU28sIGFzIGxvbmcgYXMgYGV4dDRfZ2V0X2lub2RlX2xvY2Agc3VjY2VlZHMsIGFuZCBgaW5vZGVfc2l6ZWAgaXMgZnVsbHkgcmVhZCBmcm9tIGRpc2ssIHRoZSBgcmF3X2lub2RlYCBzaG91bGQgYmUgdmFsaWQuCgpPa2F5LCBsZXQmIzM5O3MgbG9vayBmb3IgbW9yZSBoaW50cy4gSW5zaWRlIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIEkgc2VlIGEgY291cGxlIG9mIHN0cnVjdHMgYmVpbmcgaW5pdGlhbGl6ZWQuIFRoZSBmaXJzdCBpcyBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AsIHdoZXJlIEkgc2VlIGAucy5ub3RfZm91bmQgPSAwYCBiZWluZyBleHBsaWNpdGx5IGluaXRpYWxpemVkLiBJbiBDLCBpZiBvbmUgZmllbGQgb2YgYSBzdHJ1Y3R1cmUgaXMgaW5pdGlhbGl6ZWQsIHRoZSBvdGhlcnMgYXJlIGluaXRpYWxpemVkIHRvIHplcm8sIHNvIG5vIHByb2JsZW1zIHRoZXJlLiBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCwgd2hlcmUgYC5uYW1lX2luZGV4YCwgYC5uYW1lYCwgYC52YWx1ZWAsIGFuZCBgLnZhbHVlX2xlbmAgYXJlIGluaXRpYWxpemVkIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSwgdGhyb3VnaCB6ZXJvaW5nLiBBbHNvIGBpbnQgZXJyb3JgLCBgaW50IGlub2RlX3NpemVgLCBgdm9pZCAqaW5vZGVfYnVmID0gTlVMTGAsIGFuZCBgc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtgIGRvbiYjMzk7dCBzZWVtIHRvIGJlIHByb2JsZW1hdGljLiBUaGV5IGFyZSBlaXRoZXIgYXNzaWduZWQgb3IgcmUtaW5pdGlhbGl6ZWQgbGF0ZXIuCgpMb29raW5nIGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgc2ltaWxhciB2YXJpYWJsZXMgbGlrZSBgZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS0mZ3Q7aV9zYilgLCBhbmQgYHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7YCBzZWVtIHNhZmU7IGBhcmAgaXMgZnVsbHkgemVyb2VkLgoKU28sIGFtIEkgc2VlaW5nIGFueSByZWFsIHJpc2s/IFRoZSBwYXRjaCBzZWVtcyB0byBiZSBhYm91dCBmaXhpbmcgYW4gZXhpc3RpbmcgYnVnIGR1cmluZyBpbmxpbmUgZGF0YSBjb252ZXJzaW9uLiBUaGUgbmV3IGJsb2NrIGlzIGZ1bGx5IHplcm9lZCBvdXQsIGFuZCB0aGUgYGlub2RlX2J1ZmAgaXMgZmlsbGVkIHdpdGggdmFsaWQgZGF0YSBpbW1lZGlhdGVseS4gU28gSSYjMzk7bSB0aGlua2luZyB0aGUgYnVnIGZpeGVkIGJ5IHRoaXMgaXMgbGlrZWx5IGEgY3Jhc2gsIGEgZGVhZGxvY2ssIG9yIGRhdGEgY29ycnVwdGlvbiwgc29tZXRoaW5nIHRoYXQgbWlnaHQgdHJpZ2dlciBLQVNBTiwgYnV0IEkgZG9uJiMzOTt0IHNlZSBhbnkgaW50cm9kdWN0aW9uIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgoKTGV0IG1lIGdvIGJhY2sgYW5kIGRvdWJsZSBjaGVjayBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLiBBaCwgaGVyZSEgVGhlcmUmIzM5O3MgYW4gYGV4dDRfZXh0ZW50YCBiZWluZyB1c2VkLiBJdCYjMzk7cyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrIGFuZCB0aGVuIGAuZWVfYmxvY2tgLCBgLmVlX2xlbmAgYXJlIGFzc2lnbmVkLiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgcmVzdCBvZiB0aGUgc3RydWN0IHdpbGwgYmUgc2V0IGxhdGVyLiBBcyB0aGUgdG9vbCBpbmRpY2F0ZXM6CmBgYGMKc3RydWN0IGV4dDRfZXh0ZW50IHsKICBfX2xlMzIgIGVlX2Jsb2NrOwogIF9fbGUxNiAgZWVfbGVuOwogIF9fbGUxNiAgZWVfc3RhcnRfaGk7CiAgX19sZTMyICBlZV9zdGFydF9sbzsKICBfX2xlMTYgIGVlX2ZpbGVfYWNsOwogIF9fbGUxNiAgZWVfZmxhZ3M7Cn07CmBgYApFdmVyeXRoaW5nIHdpdGhpbiB0aGF0IHN0cnVjdCBpcyBhc3NpZ25lZC4gU28sIEkgZG9uJiMzOTt0IHNlZSBhbnkgdW4KCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoxOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzdHJ1Y3QgZXh0NF9leHRlbnQgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC01NS0gKi9cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtNTctXHRfX2xlMzJcdGVlX2Jsb2NrO1x0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjE5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgwNjgKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqRGl2aW5nIGludG8gdGhlIEV4dGVudCBTdHJ1Y3R1cmUqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgcmVhbGx5IHVuZGVyc3RhbmQgaG93IGV4dGVudHMgYXJlIGltcGxlbWVudGVkIGluIGV4dDQuIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGUgaGVhZGVyIGZpbGUsIHNwZWNpZmljYWxseSBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAuIE5vIGZsdWZmLCBqdXN0IHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYHN0cnVjdCBleHQ0X2V4dGVudGAuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgZXhhY3QgbGF5b3V0LCB0aGUgZmllbGRzLCBhbmQgaG93IHRoZSB2YXJpb3VzIGZsYWdzIGFuZCB2YWx1ZXMgYWxsIGludGVyYWN0LiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQ7IHVuZGVyc3RhbmRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIGl0c2VsZiBpcyBrZXkgdG8gYW55IHJlYWwgYW5hbHlzaXMgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBleHRlbnQgaW1wbGVtZW50YXRpb24uIExldCYjMzk7cyBzZWUgd2hhdCB3ZSYjMzk7dmUgZ290IGluIHRoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDUwOlx0fTtcbiAgNTE6XHRcbiAgNTI6XHQvKlxuICA1MzpcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNTQ6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyZWUuXG4gIDU1Olx0ICovXG4gIDU2Olx0c3RydWN0IGV4dDRfZXh0ZW50IHtcbiAgNTc6XHRcdF9fbGUzMlx0ZWVfYmxvY2s7XHQvKiBmaXJzdCBsb2dpY2FsIGJsb2NrIGV4dGVudCBjb3ZlcnMgKi9cbiAgNTg6XHRcdF9fbGUxNlx0ZWVfbGVuO1x0XHQvKiBudW1iZXIgb2YgYmxvY2tzIGNvdmVyZWQgYnkgZXh0ZW50ICovXG4gIDU5Olx0XHRfX2xlMTZcdGVlX3N0YXJ0X2hpO1x0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXG4gIDYwOlx0XHRfX2xlMzJcdGVlX3N0YXJ0X2xvO1x0LyogbG93IDMyIGJpdHMgb2YgcGh5c2ljYWwgYmxvY2sgKi9cbiAgNjE6XHR9O1xuICA2MjpcdFxuICA2MzpcdC8qXG4gIDY0Olx0ICogVGhpcyBpcyBpbmRleCBvbi1kaXNrIHN0cnVjdHVyZS5cbiAgNjU6XHQgKiBJdCYjMzk7cyB1c2VkIGF0IGFsbCB0aGUgbGV2ZWxzIGV4Y2VwdCB0aGUgYm90dG9tLlxuICA2NjpcdCAqL1xuICA2NzpcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xuICA2ODpcdFx0X19sZTMyXHRlaV9ibG9jaztcdC8qIGluZGV4IGNvdmVycyBsb2dpY2FsIGJsb2NrcyBmcm9tICYjMzk7YmxvY2smIzM5OyAqL1xuICA2OTpcdFx0X19sZTMyXHRlaV9sZWFmX2xvO1x0LyogcG9pbnRlciB0byB0aGUgcGh5c2ljYWwgYmxvY2sgb2YgdGhlIG5leHQgKlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NjE0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogMTYwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRXh0NCBFeHRlbnQgU3RydWN0dXJlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLCBhbmQgaXQmIzM5O3MgZ290IGZvdXIga2V5IGZpZWxkczogYGVlX2Jsb2NrYCAoMzItYml0LCBJIHJlbWVtYmVyIHRoYXQpLCBgZWVfbGVuYCAoMTYtYml0LCB0aGF0JiMzOTtzIGV4cGVjdGVkKSwgYW5kIHRoZW4gd2UgaGF2ZSBgZWVfc3RhcnRfaGlgIGFuZCBgZWVfc3RhcnRfbG9gIHdoaWNoIGFyZSBlYWNoIDE2IGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gR290IGl0LiBOb3csIGluIHRoaXMgcGF0Y2gsIEkgc2VlIHRoZXkmIzM5O3JlIGNyZWF0aW5nIGEgbmV3IGBzdHJ1Y3QgZXh0NF9leHRlbnRgIG5hbWVkIGBuZXdleGAuIFRoZXkmIzM5O3JlIGluaXRpYWxpemluZyBgZWVfYmxvY2tgIHRvIDAsIHdoaWNoIGlzIGFsd2F5cyBhIHN0YXJ0aW5nIHBvaW50LCBhbmQgYGVlX2xlbmAgdG8gMSwgb2theSwgbWFrZXMgc2Vuc2UuIEJ1dCB0aGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGlzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGNhbGwuIEkgbmVlZCB0byBkaXZlIGludG8gd2hhdCB0aGlzIGZ1bmN0aW9uICphY3R1YWxseSogZG9lcy4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGdvaW5nIG9uIHVuZGVyIHRoZSBob29kIHdpdGggdGhpcyBmdW5jdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjIgMTc6MjE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9leHRfc3RvcmVfcGJsb2NrJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yMzI9c3RhdGljIGlubGluZSBleHQ0X2ZzYmxrX3QgZXh0NF9pZHhfcGJsb2NrKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKml4KVxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQxLS8qXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oOjI0MjogKiBleHQ0X2V4dF9zdG9yZV9wYmxvY2s6XG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0My0gKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxuLS1cbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ1LSAqL1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDctXHRcdFx0XHRcdCBleHQ0X2ZzYmxrX3QgcGIpXG4tLVxuZnMvZXh0NC9leHRlbnRzLXRlc3QuYz0yMjc9c3RhdGljIGludCBleHRlbnRzX2t1bml0X2luaXQoc3RydWN0IGt1bml0ICp0ZXN0KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzE5LVx0RVhUX0ZJUlNUX0VYVEVOVChlaCktXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoRVhUX0RBVEFfTEVOKTtcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmM6MzIwOlx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKEVYVF9GSVJTVF9FWFRFTlQoZWgpLCBFWFRfREFUQV9QQkxLKTtcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzIxLVx0aWYgKCFwYXJhbSB8fCBwYXJhbS1cdTAwM2Vpc191bndyaXRfYXRfc3RhcnQpXG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9MTk5Mj1leHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMjA4NS1cdFx0XHRleC1cdTAwM2VlZV9ibG9jayA9IG5ld2V4dC1cdTAwM2VlZV9ibG9jaztcbmZzL2V4dDQvZXh0ZW50cy5jOjIwODY6XHRcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XG5mcy9leHQ0L2V4dGVudHMuYy0yMDg3LVx0XHRcdGV4LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTIxOTYtXHRuZWFyZXgtXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXHUwMDNlZWVfYmxvY2s7XG5mcy9leHQ0L2V4dGVudHMuYzoyMTk3Olx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xuZnMvZXh0NC9leHRlbnRzLmMtMjE5OC1cdG5lYXJleC1cdTAwM2VlZV9sZW4gPSBuZXdleHQtXHUwMDNlZWVfbGVuO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTI2MTQ9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTI3MzktXHRcdFx0LyogdGhpcyBleHRlbnQgaXMgcmVtb3ZlZDsgbWFyayBzbG90IGVudGlyZWx5IHVudXNlZCAqL1xuZnMvZXh0NC9leHRlbnRzLmM6Mjc0MDpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIDApO1xuZnMvZXh0NC9leHRlbnRzLmMtMjc0MS1cbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ2LVx0ZXgyLVx1MDAzZWVlX2xlbiAgID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gKHNwbGl0IC0gZWVfYmxvY2spKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjMyNDc6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBuZXdibG9jayk7XG5mcy9leHQ0L2V4dGVudHMuYy0zMjQ4LVx0aWYgKGlzX3Vud3JpdClcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz0zNTU3PWV4dDRfZXh0X2NvbnZlcnRfdG9faW5pdGlhbGl6ZWQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ1LVx0XHRcdGV4LVx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoZWVfYmxvY2sgJiM0MzsgbWFwX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNjQ2Olx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZWVfcGJsayAmIzQzOyBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM2NDctXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzY5MS1cdFx0XHRhYnV0X2V4LVx1MDAzZWVlX2Jsb2NrID0gY3B1X3RvX2xlMzIobmV4dF9sYmxrIC0gbWFwX2xlbik7XG5mcy9leHQ0L2V4dGVudHMuYzozNjkyOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhhYnV0X2V4LCBuZXh0X3BibGsgLSBtYXBfbGVuKTtcbmZzL2V4dDQvZXh0ZW50cy5jLTM2OTMtXHRcdFx0ZXgtXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZWVfbGVuIC0gbWFwX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzc0NS1cdFx0XHRcdGNwdV90b19sZTE2KCphbGxvY2F0ZWQgLSBzcGxpdF9tYXAubV9sZW4pO1xuZnMvZXh0NC9leHRlbnRzLmM6Mzc0NjpcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2emVyb19leDEsXG5mcy9leHQ0L2V4dGVudHMuYy0zNzQ3LVx0XHRcdFx0ZXh0NF9leHRfcGJsb2NrKGV4KSAmIzQzOyBzcGxpdF9tYXAubV9sYmxrICYjNDM7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmMtMzc2MC1cdFx0XHRcdFx0XHRcdGVlX2Jsb2NrKTtcbmZzL2V4dDQvZXh0ZW50cy5jOjM3NjE6XHRcdFx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2emVyb19leDIsXG5mcy9leHQ0L2V4dGVudHMuYy0zNzYyLVx0XHRcdFx0XHRcdCAgICAgIGV4dDRfZXh0X3BibG9jayhleCkpO1xuLS1cbmZzL2V4dDQvZXh0ZW50cy5jPTQyNjk9aW50IGV4dDRfZXh0X21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy00NDczLVx0cGJsayA9IG5ld2Jsb2NrICYjNDM7IG9mZnNldDtcbmZzL2V4dDQvZXh0ZW50cy5jOjQ0NzQ6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIHBibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNDQ3NS1cdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KGFyLmxlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NTc2Mz1leHQ0X3N3YXBfZXh0ZW50cyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlMSxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy01ODk3LVx0XHR0bXBfZXggPSAqZXgxO1xuZnMvZXh0NC9leHRlbnRzLmM6NTg5ODpcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MSwgZXh0NF9leHRfcGJsb2NrKGV4MikpO1xuZnMvZXh0NC9leHRlbnRzLmM6NTg5OTpcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4MiwgZXh0NF9leHRfcGJsb2NrKFx1MDAyNnRtcF9leCkpO1xuZnMvZXh0NC9leHRlbnRzLmMtNTkwMC1cdFx0ZXgxLVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KGUyX2xlbik7XG4tLVxuZnMvZXh0NC9leHRlbnRzLmM9NjAyNz1pbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcbi0tXG5mcy9leHQ0L2V4dGVudHMuYy02MDgwLVx0XHRleHQ0X2V4dF9tYXJrX2luaXRpYWxpemVkKGV4KTtcbmZzL2V4dDQvZXh0ZW50cy5jOjYwODE6XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHBibGspO1xuZnMvZXh0NC9leHRlbnRzLmMtNjA4Mi1cdGRvd25fd3JpdGUoXHUwMDI2RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFfc2VtKTtcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9OTMxPXN0YXRpYyBpbnQgZXh0NF9mY193cml0ZV9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqY3JjKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy05NjEtXHRcdGV4LVx1MDAzZWVlX2xlbiA9IGNwdV90b19sZTE2KHJhbmdlLVx1MDAzZWxlbik7XG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6OTYyOlx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHJhbmdlLVx1MDAzZXBibGspO1xuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2My1cdFx0aWYgKHJhbmdlLVx1MDAzZXVud3JpdHRlbilcbi0tXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9MjE0OD1zdGF0aWMgaW50IGV4dDRfZmNfcmVwbGF5X2FkZF9yYW5nZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1OCAqdmFsKVxuLS1cbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjAyLVx0XHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY3VyKTtcbmZzL2V4dDQvZmFzdF9jb21taXQuYzoyMjAzOlx0XHRcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjA0LVx0XHRcdFx0XHUwMDI2bmV3ZXgsIHN0YXJ0X3BibGsgJiM0MzsgY3VyIC0gc3RhcnQpO1xuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTA3ND1zdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jayxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTExMzUtXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuZnMvZXh0NC9pbmxpbmUuYzoxMTM2Olx0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbmZzL2V4dDQvaW5saW5lLmMtMTEzNy1cdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuLS1cbmZzL2V4dDQvbWlncmF0ZS5jPTIxPXN0YXRpYyBpbnQgZmluaXNoX3JhbmdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXHRuZXdleHQuZWVfbGVuICAgPSBjcHVfdG9fbGUxNihsYi1cdTAwM2VsYXN0X2Jsb2NrIC0gbGItXHUwMDNlZmlyc3RfYmxvY2sgJiM0MzsgMSk7XG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcdTAwMjZuZXdleHQsIGxiLVx1MDAzZWZpcnN0X3BibG9jayk7XG5mcy9leHQ0L21pZ3JhdGUuYy0zNS1cdC8qIExvY2tpbmcgb25seSBmb3IgY29udmVuaWVuY2Ugc2luY2Ugd2UgYXJlIG9wZXJhdGluZyBvbiB0ZW1wIGlub2RlICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT43bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExNDI5CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUgd2UgZ28uIEhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czoKCioqUGVla2luZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgIGZ1bmN0aW9uLiBJdCYjMzk7cyBpbiBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAsIHNvIGl0JiMzOTtzIGNsZWFybHkgcmVsYXRlZCB0byB0aGUgZXh0ZW50cyBjb2RlIHdpdGhpbiB0aGUgZXh0NCBmaWxlc3lzdGVtLiBNeSBpbW1lZGlhdGUgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2x2ZWQgaW4gKnN0b3JpbmcqIHRoZSBwaHlzaWNhbCBibG9jayAocGJsb2NrKSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGV4dGVudCBtYXBwaW5ncy4gR2l2ZW4gaXRzIG5hbWUsIGl0IHNvdW5kcyBsaWtlIGEgY29yZSBidWlsZGluZyBibG9jayBmb3IgbWFuYWdpbmcgdGhvc2UgZXh0ZW50IHN0cnVjdHVyZXMuIEkmIzM5O2xsIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyByZWxhdGVzIHRvIHRoZSBvdmVyYWxsIGV4dGVudCB0cmVlIHN0cnVjdHVyZSBhbmQgaG93IGl0IGhhbmRsZXMgdGhpbmdzIGxpa2UgYmxvY2sgYWxsb2NhdGlvbiwgbWV0YWRhdGEgdXBkYXRlcywgYW5kIHBvdGVudGlhbCBlcnJvciBoYW5kbGluZy4gSSB3b25kZXIgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIGJsb2NrIGRldmljZSBpbnRlcmZhY2UuIFRpbWUgdG8gZGlnIGluIGFuZCBzZWUgaG93IHRoaXMgc3BlY2lmaWMgcGllY2UgZml0cyBpbnRvIHRoZSBsYXJnZXIgZXh0NCBleHRlbnQgamlnc2F3LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NF9leHRlbnRzLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDI0MDpcdFxuIDI0MTpcdC8qXG4gMjQyOlx0ICogZXh0NF9leHRfc3RvcmVfcGJsb2NrOlxuIDI0MzpcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGV4dGVudCBzdHJ1Y3QsXG4gMjQ0Olx0ICogYnJlYWtpbmcgaXQgaW50byBwYXJ0c1xuIDI0NTpcdCAqL1xuIDI0NjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2V4dF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50ICpleCxcbiAyNDc6XHRcdFx0XHRcdFx0IGV4dDRfZnNibGtfdCBwYilcbiAyNDg6XHR7XG4gMjQ5Olx0XHRleC1cdTAwM2VlZV9zdGFydF9sbyA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBsb25nKSAocGIgXHUwMDI2IDB4ZmZmZmZmZmYpKTtcbiAyNTA6XHRcdGV4LVx1MDAzZWVlX3N0YXJ0X2hpID0gY3B1X3RvX2xlMTYoKHVuc2lnbmVkIGxvbmcpICgocGIgXHUwMDNlXHUwMDNlIDMxKSBcdTAwM2VcdTAwM2UgMSkgXHUwMDI2XG4gMjUxOlx0XHRcdFx0XHQgICAgICAweGZmZmYpO1xuIDI1MjpcdH1cbiAyNTM6XHRcbiAyNTQ6XHQvKlxuIDI1NTpcdCAqIGV4dDRfaWR4X3N0b3JlX3BibG9jazpcbiAyNTY6XHQgKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBpbmRleCBzdHJ1Y3QsXG4gMjU3Olx0ICogYnJlYWtpbmcgaXQgaW50byBwYXJ0c1xuIDI1ODpcdCAqL1xuIDI1OTpcdHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2lkeF9zdG9yZV9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMDI1CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogODcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBNZW1vcnkgSW5pdGlhbGl6YXRpb24gaW4gZXh0NCBGaWxlIFN5c3RlbSBPcGVyYXRpb25zKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLiBGaXJzdCwgSSBzZWUgdGhhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBzZXRzIGJvdGggYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLiBHb29kLCBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGFmdGVyIHRoYXQgY2FsbCwgd2hpY2ggaXMgd2hhdCBJIGV4cGVjdC4KClRoZW4sIEkgc2hpZnRlZCBteSBmb2N1cyB0byBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIEkgc2VlIGBidWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBhbmQgdGhlbiBmaWxsZWQgYnkgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAuIE15IHF1ZXN0aW9uIHRoZW4gaXM6IERvZXMgYGV4dDRfcmVhZF9pbmxpbmVfZGF0YWAgZnVsbHkgaW5pdGlhbGl6ZSBpdD8gWWVzLCBpdCByZWFkcyBpbiB0aGUgaW5saW5lIGRhdGEgZnJvbSB0aGUgcmVsZXZhbnQgc291cmNlLCBzbyBpdCBzaG91bGQgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhhdCBjYWxsLiBJIGNhbiBtb3ZlIG9uIHRvIHRoZSBuZXh0IHNlY3Rpb24uCgpOZXh0IHVwLCBJIHNlZSBgbWVtc2V0KCZhbXA7YXIsIDAsIHNpemVvZihhcikpYCB3aGljaCBlbnN1cmVzIHRoYXQgYGFyYCBpcyBmdWxseSB6ZXJvZWQgb3V0LCB3aGljaCBpcyBnb29kLgoKQWZ0ZXIgdGhhdCwgdGhlIGNvZGUgZ3JhYnMgYSBuZXcgYmxvY2ssIGFuZCB0aGVuIGdldHMgYSBidWZmZXIgaGVhZC4gYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgb3V0LCBzbyB0aGF0JiMzOTtzIHRha2VuIGNhcmUgb2YuCgpGaW5hbGx5LCBpbiB0aGUgc3Vic2VxdWVudCBjb25kaXRpb25hbCwgSSBzZWUgdGhhdCBpZiBpdCYjMzk7cyBub3QgYSBkaXJlY3RvcnksIGEgYG1lbWNweWAgY29waWVzIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtJmd0O2JfZGF0YWAg4oCTIHdoaWNoIGlzIGZpbmUgc2luY2UgYGJ1ZmAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQg4oCTIGFmdGVyIGBkYXRhX2JoLSZndDtiX2RhdGFgIHdhcyB6ZXJvZWQuIE90aGVyd2lzZSwgYGV4dDRfaW5pdF9kaXJibG9ja2AgaXMgY2FsbGVkLiBTbywgSSBuZWVkIHRvIGNoZWNrIGBleHQ0X2luaXRfZGlyYmxvY2tgIG5leHQgdG8gbWFrZSBzdXJlIHRoYXQgYnJhbmNoIGlzIGhhbmRsZWQgY29ycmVjdGx5IGFzIHdlbGwuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfaW5pdF9kaXJibG9jayYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvZXh0NC5oPTM3OTc9ZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7XG5mcy9leHQ0L2V4dDQuaDozNzk4OmV4dGVybiBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dDQuaC0zNzk5LVx0XHRcdCAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqZGlyX2Jsb2NrLFxuLS1cbmZzL2V4dDQvaW5saW5lLmM9MTE4NT1zdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbi0tXG5mcy9leHQ0L2lubGluZS5jLTEyNTYtXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG5mcy9leHQ0L2lubGluZS5jOjEyNTc6XHRcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXG5mcy9leHQ0L2lubGluZS5jLTEyNTgtXHRcdFx0ICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS1cdTAwM2Vpbm9kZSksXG4tLVxuZnMvZXh0NC9uYW1laS5jPTI4ODI9c3RhdGljIGludCBleHQ0X3RtcGZpbGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yOTIyLVxuZnMvZXh0NC9uYW1laS5jOjI5MjM6aW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuZnMvZXh0NC9uYW1laS5jLTI5MjQtXHRcdCAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgcGFyZW50X2lubyxcbi0tXG5mcy9leHQ0L25hbWVpLmM9Mjk2OT1pbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTI5ODgtXHRcdHJldHVybiBQVFJfRVJSKGRpcl9ibG9jayk7XG5mcy9leHQ0L25hbWVpLmM6Mjk4OTpcdGVyciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkaXJfYmxvY2ssIGRpci1cdTAwM2VpX2lubywgTlVMTCwgMCk7XG5mcy9leHQ0L25hbWVpLmMtMjk5MC1vdXQ6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzIyIDE3OjI4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzODA0CgkJCQkJCQlvdXRwdXQ6IDQxNQoJCQkJCQkJdGhvdWdodHM6IDE1ODIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGZ1bmN0aW9uLiBNeSBpbml0aWFsIGNvbmNlcm4gd2FzIGFib3V0IHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSwgYnV0IGFmdGVyIGNhcmVmdWwgaW5zcGVjdGlvbiwgSSYjMzk7bSBmYWlybHkgY29uZmlkZW50IHRoZXJlIGFyZW4mIzM5O3QgYW55IGlzc3Vlcy4KCkZpcnN0LCBJIHNlZSB0aGUgYWxsb2NhdGlvbiBvZiBgaW5vZGVfYnVmYCB1c2luZyBga21hbGxvY2AuIFRoZW4sIHRoZSBkYXRhIGlzIGNvcGllZCBmcm9tIGRpc2sgdXNpbmcgYG1lbWNweWAgaW50byBgaW5vZGVfYnVmYC4gIFRoZSBjcml0aWNhbCBwb2ludCBoZXJlIGlzIHRoYXQgYGV4dDRfZ2V0X2lub2RlX2xvY2AgZW5zdXJlcyBgcmF3X2lub2RlYCBwb2ludHMgdG8gdmFsaWQgaW5vZGUgZGF0YSByZWFkIGZyb20gdGhlIGRpc2suIFRoZSBzaXplIG9mIHRoZSBjb3B5LCBgaW5vZGVfc2l6ZWAsIGlzIGRldGVybWluZWQgYnkgYEVYVDRfSU5PREVfU0laRWAgd2hpY2ggaXMgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIGlub2RlIG9uIGRpc2suIFNpbmNlIHRoaXMgZGF0YSBjb21lcyBkaXJlY3RseSBmcm9tIGRpc2ssIGl0JiMzOTtzIGZ1bGx5IGluaXRpYWxpemVkLiBFdmVuIGlmIGBpbm9kZV9zaXplYCBoYXBwZW5zIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBsb2dpY2FsbHkgJiMzNDt1c2VkJiMzNDsgcGFydCBvZiB0aGUgZGF0YSBvbiBkaXNrLCBgbWVtY3B5YCB3aWxsIHN0aWxsIHJlYWQgYSBjb2hlcmVudCBibG9jayBmcm9tIGRpc2sgdG8gdGhlIGJ1ZmZlci4KClRoZSBmb2xsb3dpbmcgYG1lbXNldGAgY2FsbHMgemVybyBvdXQgdGhlIGlubGluZSBkYXRhIGFyZWEgYWZ0ZXIgdGhlIGRpc2sgZGF0YSBpcyBzYWZlbHkgY29waWVkLiBJbXBvcnRhbnRseSwgdGhlcmUmIzM5O3MgYSBzYWZlZ3VhcmQgdXNpbmcgYG1lbWNweWAgdGhhdCByZXN0b3JlcyB0aGUgaW5vZGUgdG8gaXRzIG9yaWdpbmFsIHN0YXRlIGlmIGFuIGVycm9yIG9jY3Vycy4gIFRoaXMgbWVhbnMgd2XigJlyZSBlaXRoZXIgdXNpbmcgaW5pdGlhbGl6ZWQgZGlzayBkYXRhLCBvciByZXN0b3JpbmcgaXQgdG8gdGhlIG9yaWdpbmFsLCBrbm93biBnb29kIHN0YXRlLiBTbywgdGhlIGRhdGEgZmxvd2luZyB0aHJvdWdoIGhlcmUgaXMgY2xlYW4uCgpUaGUgY2hhbmdlcyBwcmltYXJpbHkgZGVhbCB3aXRoIGJsb2NrIGFsbG9jYXRpb24gYW5kIGlub2RlIHVwZGF0ZXMuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyB1c2luZyBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByb2JhYmx5IGNhdXNpbmcgaXNzdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG1hbnVhbC4gSSYjMzk7bSBzYXRpc2ZpZWQgdGhhdCB0aGlzIHBhdGNoIGZpeGVzIGEgYnVnIHdpdGggaW5saW5lIGRhdGEgY29udmVyc2lvbi4gVGhlcmUmIzM5O3Mgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZCB0byB1c2VyIHNwYWNlLCBub3IgaXMgaXQgdXNlZCBpbiBhbnkgY29udHJvbCBmbG93IGRlY2lzaW9ucy4gVGhlIHN0cnVjdHVyZXMgaW52b2x2ZWQgYXJlICpmdWxseSogaW5pdGlhbGl6ZWQuCgpJIGFsc28gY2hlY2tlZCBmb3IgcGFkZGluZy4gVGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIChhbmQgdGhlIHN0cnVjdHMgdXNlZCBpbiB4YXR0cnMgYW5kIGFsbG9jYXRpb25zKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgZWl0aGVyIHRocm91Z2ggemVyb2luZyBvciBieSBzcGVjaWZ5aW5nIHRoZWlyIGluaXRpYWwgdmFsdWVzLiBObyBpc3N1ZXMgdGhlcmUuIEkgZW5zdXJlZCB0aGUgc3RydWN0dXJlIHNpemVzIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHZhbHVlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEluIHNob3J0LCBhbGwgdGhlc2Ugc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBhbnkgbWVtb3J5IGJlaW5nIHVzZWQgaXMgZmlsbGVkIGZyb20gYSBrbm93biBzb3VyY2UuCgpUaGUgYGJ1ZmAgdmFyaWFibGUgYWxsb2NhdGVkIGZvciBpbmxpbmUgZGF0YSBhbHNvIGZvbGxvd3MgYSBzaW1pbGFyIHBhdHRlcm4uIEl0IGlzIGVpdGhlciB6ZXJvLWluaXRpYWxpemVkIG9yIGZpbGxlZCB3aXRoIHZhbGlkIGRhdGEgcmVhZCBmcm9tIHRoZSBkaXNrLiBGdXJ0aGVybW9yZSwgYGRhdGFfYmgtJmd0O2JfZGF0YWAgaXMgYmVpbmcgemVyb2VkIG91dC4gU28gd2UgaGF2ZSB2YWxpZCBhbmQgaW5pdGlhbGl6ZWQgZGF0YS4KCioqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGluLWRlcHRoIHJldmlldywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gIFRoZSBwYXRjaCBwcm9wZXJseSBpbml0aWFsaXplcyBhbGwgbmV3bHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgdXNpbmcgYG1lbXNldGAsIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXgsIG9yIGBtZW1jcHlgIGZyb20ga25vd24gYW5kIHZhbGlkIGRhdGEgc291cmNlcyAobGlrZSBkaXNrIGRhdGEpLiAgU3RhbmRhcmQgZGVidWdnaW5nIGFuZCB2YWxpZGF0aW9uIHRvb2xzIChLQVNBTiwgTE9DS0RFUCwgZXRjLikgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiwgbG9ja2luZywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXNzdWVzLiBUaGVyZWZvcmUsIGEgc3BlY2lhbGl6ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIHBhdGNoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yMiAxNzoyODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgZXh0NCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGJ5IHJlcGxhY2luZyBgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhYCBhbmQgYGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2tgIHdpdGggYSBuZXcgZnVuY3Rpb24gYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgYW5kIG1hbnVhbGx5IGFsbG9jYXRpbmcgYmxvY2tzIHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgLlxuXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcbjEuIGBpbm9kZV9idWZgIGlzIGFsbG9jYXRlZCB3aXRoIGBrbWFsbG9jYCBidXQgaW1tZWRpYXRlbHkgb3ZlcndyaXR0ZW4gd2l0aCBhIGZ1bGwgY29weSBvZiB0aGUgdmFsaWQgb24tZGlzayBgcmF3X2lub2RlYCB2aWEgYG1lbWNweWAuXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cbjQuIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YC5cbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cblxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXG5cbkFsbCBuZXdseSBpbnRyb2R1Y2VkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgYXJlIGZ1bGx5IGluaXRpYWxpemVkOlxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxuMy4gYHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXNgIGFuZCBgc3RydWN0IGV4dDRfeGF0dHJfaW5mbyBpYCBhcmUgaW5pdGlhbGl6ZWQgdXNpbmcgZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIHdoaWNoIGd1YXJhbnRlZXMgemVyby1pbml0aWFsaXphdGlvbiBvZiBhbGwgdW5tZW50aW9uZWQgZmllbGRzIGFuZCBwYWRkaW5nLlxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAgYmVmb3JlIGlubGluZSBkYXRhIGlzIGNvcGllZCBpbnRvIGl0LlxuXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODozMi4xNzQxNDI3NDVaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDcyMjczMzk4MzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cXG5cXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcXG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxcbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxcbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXFxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cXG5cXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTg6MzIuMTc0MTQ3NDg1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTkxMzA1OTYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAyMiAxNzoxODozMCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcXG5AQCAtMTQsNiArMTQsNyBAQFxcbiAjaW5jbHVkZSBcXFwiZXh0NC5oXFxcIlxcbiAjaW5jbHVkZSBcXFwieGF0dHIuaFxcXCJcXG4gI2luY2x1ZGUgXFxcInRydW5jYXRlLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJleHQ0X2V4dGVudHMuaFxcXCJcXG4gXFxuICNkZWZpbmUgRVhUNF9YQVRUUl9TWVNURU1fREFUQVxcdFxcXCJkYXRhXFxcIlxcbiAjZGVmaW5lIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkVcXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXFxuQEAgLTEwNzAsMjEgKzEwNzEsMTE1IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi1cXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsXFxuLVxcdFxcdFxcdFxcdCAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpXFxuK3N0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKVxcbiB7XFxuLVxcdGludCByZXQ7XFxuK1xcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4rXFx0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHtcXG4rXFx0XFx0LnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LFxcbitcXHR9O1xcbitcXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XFxuK1xcdFxcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXFxuK1xcdFxcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcXG4rXFx0XFx0LnZhbHVlID0gTlVMTCxcXG4rXFx0XFx0LnZhbHVlX2xlbiA9IDAsXFxuK1xcdH07XFxuK1xcdGludCBlcnJvcjtcXG4rXFx0aW50IGlub2RlX3NpemU7XFxuK1xcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XFxuK1xcdHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGU7XFxuIFxcbi1cXHRyZXQgPSBleHQ0X2NyZWF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbmxpbmVfc2l6ZSk7XFxuLVxcdGlmIChyZXQpIHtcXG4tXFx0XFx0ZXh0NF9tc2coaW5vZGUtXFx1MDAzZWlfc2IsIEtFUk5fRU1FUkcsXFxuLVxcdFxcdFxcdFxcXCJlcnJvciByZXN0b3JpbmcgaW5saW5lX2RhdGEgZm9yIGlub2RlIC0tIHBvdGVudGlhbCBkYXRhIGxvc3MhIChpbm9kZSAlbGx1LCBlcnJvciAlZClcXFwiLFxcbi1cXHRcXHRcXHRpbm9kZS1cXHUwMDNlaV9pbm8sIHJldCk7XFxuLVxcdFxcdHJldHVybjtcXG4rXFx0aW5vZGVfc2l6ZSA9IEVYVDRfSU5PREVfU0laRShpbm9kZS1cXHUwMDNlaV9zYik7XFxuK1xcdGlub2RlX2J1ZiA9IGttYWxsb2MoaW5vZGVfc2l6ZSwgR0ZQX05PRlMpO1xcbitcXHRpZiAoIWlub2RlX2J1Zikge1xcbitcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuK1xcdFxcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4rXFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbitcXHRcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHRcXHRyZXR1cm4gZXJyb3I7XFxuIFxcdH1cXG4tXFx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XFxuLVxcdGV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XFxuK1xcdGRvd25fd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0ZXJyb3IgPSBleHQ0X2dldF9pbm9kZV9sb2MoaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0aWYgKGVycm9yKSB7XFxuK1xcdFxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcXG4rXFx0XFx0dXBfd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4rXFx0XFx0a2ZyZWUoaW5vZGVfYnVmKTtcXG4rXFx0XFx0cmV0dXJuIGVycm9yO1xcbitcXHR9XFxuK1xcdHJhd19pbm9kZSA9IGV4dDRfcmF3X2lub2RlKFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0QlVGRkVSX1RSQUNFKGlzLmlsb2MuYmgsIFxcXCJnZXRfd3JpdGVfYWNjZXNzXFxcIik7XFxuK1xcdGVycm9yID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cXHUwMDNlaV9zYiwgaXMuaWxvYy5iaCwgRVhUNF9KVFJfTk9ORSk7XFxuK1xcdGlmIChlcnJvcikge1xcbitcXHRcXHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xcbitcXHRcXHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdG1lbWNweShpbm9kZV9idWYsICh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9zaXplKTtcXG4rXFx0bWVtc2V0KCh2b2lkICopcmF3X2lub2RlLVxcdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcXG4rXFx0bWVtc2V0KGVpLVxcdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xcbitcXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9leHRlbnRzKGlub2RlLVxcdTAwM2VpX3NiKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQoU19JU0RJUihpbm9kZS1cXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXFx1MDAzZWlfbW9kZSkpKSB7XFxuK1xcdFxcdGV4dDRfc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUyk7XFxuK1xcdFxcdGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGUsIGlub2RlKTtcXG4rXFx0XFx0c3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGggPSBleHQ0X2ZpbmRfZXh0ZW50KGlub2RlLCAwLCBOVUxMLCAwKTtcXG4rXFxuK1xcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4rXFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRnb3RvIHJlY292ZXJ5O1xcbitcXHRcXHR9XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2V4dGVudCBuZXdleDtcXG4rXFxuK1xcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XFxuK1xcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xcbitcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuK1xcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuK1xcdFxcdGlmIChJU19FUlIocGF0aCkpIHtcXG4rXFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xcbitcXHRcXHRcXHRpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7XFxuK1xcdFxcdFxcdFxcdGdvdG8gcmVjb3Zlcnk7XFxuK1xcdFxcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdFxcdGV4dDRfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBibG9jayk7XFxuK1xcdFxcdFxcdFxcdGdvdG8gbm9mcmVlO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcXG4rXFx0XFx0fVxcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XFxuK1xcdH1cXG4rXFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsIFxcdTAwMjZpLCBcXHUwMDI2aXMpO1xcbitcXHRpZiAoZXJyb3IpXFxuK1xcdFxcdGdvdG8gcmVjb3Zlcnk7XFxuK1xcdGlmICghaXMucy5ub3RfZm91bmQpXFxuK1xcdFxcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmksIFxcdTAwMjZpcyk7XFxuK3JlY292ZXJ5OlxcbitcXHRpZiAoZXJyb3IpIHtcXG4rXFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4rXFx0XFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xcbitub2ZyZWU6XFxuK1xcdFxcdG1lbWNweSgodm9pZCAqKXJhd19pbm9kZSwgaW5vZGVfYnVmLCBpbm9kZV9zaXplKTtcXG4rXFx0XFx0bWVtY3B5KGVpLVxcdTAwM2VpX2RhdGEsIHJhd19pbm9kZS1cXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XFxuK1xcdFxcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcXG4rXFx0XFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xcbitcXHRcXHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZpcy5pbG9jKTtcXG4rXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfb2ZmID0gMDtcXG4rXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XFxuK1xcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4rXFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4rXFx0XFx0XFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbitcXHRcXHRcXHRFWFQ0X0koaW5vZGUpLVxcdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbitcXHRcXHR9XFxuK1xcdFxcdGJyZWxzZShiaCk7XFxuK1xcdH1cXG4rb3V0OlxcbitcXHRicmVsc2UoaXMuaWxvYy5iaCk7XFxuK1xcdHVwX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdGtmcmVlKGlub2RlX2J1Zik7XFxuK1xcdHJldHVybiBlcnJvcjtcXG4gfVxcbiBcXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuQEAgLTEwOTQsOCArMTE4OSwxMSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0aW50IGVycm9yO1xcbiBcXHR2b2lkICpidWYgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xcbi1cXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcXG4gXFx0aW50IGlubGluZV9zaXplO1xcbitcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbitcXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XFxuK1xcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0IoaW5vZGUtXFx1MDAzZWlfc2IpO1xcbitcXHR1bnNpZ25lZCBpbnQgYWxsb2NhdGVkX2Jsb2NrO1xcbiBcXG4gXFx0aW5saW5lX3NpemUgPSBleHQ0X2dldF9pbmxpbmVfc2l6ZShpbm9kZSk7XFxuIFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG5AQCAtMTEyMCwyNSArMTIxOCwyMiBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4gXFx0XFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuLVxcdGVycm9yID0gZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlKTtcXG4tXFx0aWYgKGVycm9yKVxcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFxuLVxcdG1hcC5tX2xibGsgPSAwO1xcbi1cXHRtYXAubV9sZW4gPSAxO1xcbi1cXHRtYXAubV9mbGFncyA9IDA7XFxuLVxcdGVycm9yID0gZXh0NF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIFxcdTAwMjZtYXAsIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpO1xcbitcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4rXFx0YXIuaW5vZGUgPSBpbm9kZTtcXG4rXFx0YXIubG9naWNhbCA9IDA7XFxuK1xcdGFyLmxlbiA9IDE7XFxuK1xcdGlmIChTX0lTUkVHKGlub2RlLVxcdTAwM2VpX21vZGUpKVxcbitcXHRcXHRhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBO1xcbitcXHRlbHNlXFxuK1xcdFxcdGFyLmZsYWdzID0gMDtcXG4rXFx0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcXHUwMDI2YXIsIFxcdTAwMjZlcnJvcik7XFxuIFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuLVxcdGlmICghKG1hcC5tX2ZsYWdzIFxcdTAwMjYgRVhUNF9NQVBfTUFQUEVEKSkge1xcbi1cXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuLVxcdH1cXG4tXFxuLVxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG1hcC5tX3BibGspO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xcbitcXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVxcdTAwM2VpX3NiLCBuZXdibG9jayk7XFxuIFxcdGlmICghZGF0YV9iaCkge1xcbiBcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcbiBcXHRsb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5AQCAtMTE0Nyw3ICsxMjQyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdGlmIChlcnJvcikge1xcbiBcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbiBcXHRcXHRlcnJvciA9IC1FSU87XFxuLVxcdFxcdGdvdG8gb3V0X3Jlc3RvcmU7XFxuK1xcdFxcdGdvdG8gb3V0X2JoO1xcbiBcXHR9XFxuIFxcdG1lbXNldChkYXRhX2JoLVxcdTAwM2ViX2RhdGEsIDAsIGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuIFxcbkBAIC0xMTU5LDI0ICsxMjU0LDI4IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICBpbm9kZSwgZGF0YV9iaCk7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XFxuLVxcdFxcdGlub2RlLVxcdTAwM2VpX3NpemUgPSBpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemU7XFxuLVxcdFxcdGlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4tXFx0XFx0RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4tXFxuIFxcdFxcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXFxuIFxcdFxcdFxcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXFx1MDAzZWlub2RlKSxcXG4gXFx0XFx0XFx0ICBidWYgKyBFWFQ0X0lOTElORV9ET1RET1RfU0laRSxcXG4gXFx0XFx0XFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4tXFx0XFx0aWYgKCFlcnJvcilcXG4tXFx0XFx0XFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XFxuIFxcdH1cXG4rb3V0X2JoOlxcbitcXHRpZiAoZXJyb3IpIHtcXG4rXFx0XFx0aW50IGZsYWdzID0gMDtcXG4gXFxuLW91dF9yZXN0b3JlOlxcbi1cXHRpZiAoZXJyb3IpXFxuLVxcdFxcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcXG4rXFx0XFx0aWYgKGRhdGFfYmgpXFxuK1xcdFxcdFxcdGZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUO1xcbitcXHRcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XFxuIFxcbitcXHRcXHRkb3duX3dyaXRlKFxcdTAwMjZlaS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuK1xcdFxcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XFxuK1xcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xcbitcXHRcXHR1cF93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXFxuK1xcdFxcdFxcdFxcdG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGRhdGFfYmgpO1xcbitcXHR9XFxuIG91dDpcXG4tXFx0YnJlbHNlKGRhdGFfYmgpO1xcbiBcXHRrZnJlZShidWYpO1xcbiBcXHRyZXR1cm4gZXJyb3I7XFxuIH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTg6MzMuMzY2MTAwNDE0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiYmVzdC1leHBlbnNpdmUiLCJEdXJhdGlvbiI6NjA2MzY0NzExMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgYmRiMjcyMDg0OTc3NTQxMDFhYzRlY2UwMWVlNDg4MDllMWY1ZDM1OFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDIyIDE3OjE4OjMwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzcuLjUwNzEwNmM3MmU4MmYgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lubGluZS5jXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXG5AQCAtMTQsNiArMTQsNyBAQFxuICNpbmNsdWRlIFwiZXh0NC5oXCJcbiAjaW5jbHVkZSBcInhhdHRyLmhcIlxuICNpbmNsdWRlIFwidHJ1bmNhdGUuaFwiXG4rI2luY2x1ZGUgXCJleHQ0X2V4dGVudHMuaFwiXG4gXG4gI2RlZmluZSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBXHRcImRhdGFcIlxuICNkZWZpbmUgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRVx0KChzaXplb2YoX19sZTMyKSAqIEVYVDRfTl9CTE9DS1MpKVxuQEAgLTEwNzAsMjEgKzEwNzEsMTE1IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbi1cdFx0XHRcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcbi1cdFx0XHRcdCAgICAgdm9pZCAqYnVmLCBpbnQgaW5saW5lX3NpemUpXG4rc3RhdGljIGludCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2ZzYmxrX3QgYmxvY2ssXG4rXHRcdFx0XHRcdHVuc2lnbmVkIGludCBsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpXG4ge1xuLVx0aW50IHJldDtcbitcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQgaXMgPSB7XG4rXHRcdC5zID0geyAubm90X2ZvdW5kID0gMCwgfSxcbitcdH07XG4rXHRzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGkgPSB7XG4rXHRcdC5uYW1lX2luZGV4ID0gRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0sXG4rXHRcdC5uYW1lID0gRVhUNF9YQVRUUl9TWVNURU1fREFUQSxcbitcdFx0LnZhbHVlID0gTlVMTCxcbitcdFx0LnZhbHVlX2xlbiA9IDAsXG4rXHR9O1xuK1x0aW50IGVycm9yO1xuK1x0aW50IGlub2RlX3NpemU7XG4rXHR2b2lkICppbm9kZV9idWYgPSBOVUxMO1xuK1x0c3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTtcbiBcbi1cdHJldCA9IGV4dDRfY3JlYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlubGluZV9zaXplKTtcbi1cdGlmIChyZXQpIHtcbi1cdFx0ZXh0NF9tc2coaW5vZGUtXHUwMDNlaV9zYiwgS0VSTl9FTUVSRyxcbi1cdFx0XHRcImVycm9yIHJlc3RvcmluZyBpbmxpbmVfZGF0YSBmb3IgaW5vZGUgLS0gcG90ZW50aWFsIGRhdGEgbG9zcyEgKGlub2RlICVsbHUsIGVycm9yICVkKVwiLFxuLVx0XHRcdGlub2RlLVx1MDAzZWlfaW5vLCByZXQpO1xuLVx0XHRyZXR1cm47XG4rXHRpbm9kZV9zaXplID0gRVhUNF9JTk9ERV9TSVpFKGlub2RlLVx1MDAzZWlfc2IpO1xuK1x0aW5vZGVfYnVmID0ga21hbGxvYyhpbm9kZV9zaXplLCBHRlBfTk9GUyk7XG4rXHRpZiAoIWlub2RlX2J1Zikge1xuK1x0XHRlcnJvciA9IC1FTk9NRU07XG4rXHRcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4rXHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRcdHJldHVybiBlcnJvcjtcbiBcdH1cbi1cdGV4dDRfd3JpdGVfaW5saW5lX2RhdGEoaW5vZGUsIGlsb2MsIGJ1ZiwgMCwgaW5saW5lX3NpemUpO1xuLVx0ZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdGRvd25fd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHRlcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXHUwMDI2aXMuaWxvYyk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0a2ZyZWUoaW5vZGVfYnVmKTtcbitcdFx0cmV0dXJuIGVycm9yO1xuK1x0fVxuK1x0cmF3X2lub2RlID0gZXh0NF9yYXdfaW5vZGUoXHUwMDI2aXMuaWxvYyk7XG4rXHRCVUZGRVJfVFJBQ0UoaXMuaWxvYy5iaCwgXCJnZXRfd3JpdGVfYWNjZXNzXCIpO1xuK1x0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlub2RlLVx1MDAzZWlfc2IsIGlzLmlsb2MuYmgsIEVYVDRfSlRSX05PTkUpO1xuK1x0aWYgKGVycm9yKSB7XG4rXHRcdGV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7XG4rXHRcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgsIGJsb2NrLCBsZW4sIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRtZW1jcHkoaW5vZGVfYnVmLCAodm9pZCAqKXJhd19pbm9kZSwgaW5vZGVfc2l6ZSk7XG4rXHRtZW1zZXQoKHZvaWQgKilyYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgMCwgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4rXHRtZW1zZXQoZWktXHUwMDNlaV9kYXRhLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdGlmIChleHQ0X2hhc19mZWF0dXJlX2V4dGVudHMoaW5vZGUtXHUwMDNlaV9zYikgXHUwMDI2XHUwMDI2XG4rXHRcdChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS1cdTAwM2VpX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtXHUwMDNlaV9tb2RlKSkpIHtcbitcdFx0ZXh0NF9zZXRfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbitcdFx0ZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZSwgaW5vZGUpO1xuK1x0XHRzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IGV4dDRfZmluZF9leHRlbnQoaW5vZGUsIDAsIE5VTEwsIDApO1xuK1xuK1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4rXHRcdFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xuK1x0XHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRcdH1cbitcdFx0c3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4O1xuK1xuK1x0XHRuZXdleC5lZV9ibG9jayA9IGNwdV90b19sZTMyKDApO1xuK1x0XHRuZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNigxKTtcbitcdFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKFx1MDAyNm5ld2V4LCBibG9jayk7XG4rXHRcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFx1MDAyNm5ld2V4LCAwKTtcbitcdFx0aWYgKElTX0VSUihwYXRoKSkge1xuK1x0XHRcdGVycm9yID0gUFRSX0VSUihwYXRoKTtcbitcdFx0XHRpZiAoZXJyb3IgPT0gLUVEUVVPVCB8fCBlcnJvciA9PSAtRU5PU1BDKSB7XG4rXHRcdFx0XHRnb3RvIHJlY292ZXJ5O1xuK1x0XHRcdH0gZWxzZSB7XG4rXHRcdFx0XHRleHQ0X2ZvcmdldChoYW5kbGUsIDAsIGlub2RlLCBiaCwgYmxvY2spO1xuK1x0XHRcdFx0Z290byBub2ZyZWU7XG4rXHRcdFx0fVxuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGV4dDRfZnJlZV9leHRfcGF0aChwYXRoKTtcbitcdFx0fVxuK1x0fSBlbHNlIHtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2RhdGFbMF0gPSBjcHVfdG9fbGUzMihibG9jayk7XG4rXHR9XG4rXHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfZmluZChpbm9kZSwgXHUwMDI2aSwgXHUwMDI2aXMpO1xuK1x0aWYgKGVycm9yKVxuK1x0XHRnb3RvIHJlY292ZXJ5O1xuK1x0aWYgKCFpcy5zLm5vdF9mb3VuZClcbitcdFx0ZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rcmVjb3Zlcnk6XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK25vZnJlZTpcbitcdFx0bWVtY3B5KCh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9idWYsIGlub2RlX3NpemUpO1xuK1x0XHRtZW1jcHkoZWktXHUwMDNlaV9kYXRhLCByYXdfaW5vZGUtXHUwMDNlaV9ibG9jaywgRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRSk7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKTtcbitcdH0gZWxzZSB7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9JTkxJTkVfREFUQSk7XG4rXHRcdGdldF9iaChpcy5pbG9jLmJoKTtcbitcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2lubGluZV9vZmYgPSAwO1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX3NpemUgPSAwO1xuK1x0XHRleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSk7XG4rXHRcdGlmIChTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSkpIHtcbitcdFx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuK1x0XHRcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9kaXNrc2l6ZSA9IGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemU7XG4rXHRcdH1cbitcdFx0YnJlbHNlKGJoKTtcbitcdH1cbitvdXQ6XG4rXHRicmVsc2UoaXMuaWxvYy5iaCk7XG4rXHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdGtmcmVlKGlub2RlX2J1Zik7XG4rXHRyZXR1cm4gZXJyb3I7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuQEAgLTEwOTQsOCArMTE4OSwxMSBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdGludCBlcnJvcjtcbiBcdHZvaWQgKmJ1ZiA9IE5VTEw7XG4gXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRhdGFfYmggPSBOVUxMO1xuLVx0c3RydWN0IGV4dDRfbWFwX2Jsb2NrcyBtYXA7XG4gXHRpbnQgaW5saW5lX3NpemU7XG4rXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xuK1x0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xuK1x0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKTtcbitcdHVuc2lnbmVkIGludCBhbGxvY2F0ZWRfYmxvY2s7XG4gXG4gXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcbiBcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcbkBAIC0xMTIwLDI1ICsxMjE4LDIyIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0ZXJyb3IgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xuLVx0aWYgKGVycm9yKVxuLVx0XHRnb3RvIG91dDtcbi1cbi1cdG1hcC5tX2xibGsgPSAwO1xuLVx0bWFwLm1fbGVuID0gMTtcbi1cdG1hcC5tX2ZsYWdzID0gMDtcbi1cdGVycm9yID0gZXh0NF9tYXBfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIFx1MDAyNm1hcCwgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSk7XG4rXHRtZW1zZXQoXHUwMDI2YXIsIDAsIHNpemVvZihhcikpO1xuK1x0YXIuaW5vZGUgPSBpbm9kZTtcbitcdGFyLmxvZ2ljYWwgPSAwO1xuK1x0YXIubGVuID0gMTtcbitcdGlmIChTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkpXG4rXHRcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XG4rXHRlbHNlXG4rXHRcdGFyLmZsYWdzID0gMDtcbitcdG5ld2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgXHUwMDI2YXIsIFx1MDAyNmVycm9yKTtcbiBcdGlmIChlcnJvciBcdTAwM2MgMClcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbi1cdGlmICghKG1hcC5tX2ZsYWdzIFx1MDAyNiBFWFQ0X01BUF9NQVBQRUQpKSB7XG4tXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbi1cdH1cbi1cbi1cdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXHUwMDNlaV9zYiwgbWFwLm1fcGJsayk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0YWxsb2NhdGVkX2Jsb2NrID0gRVhUNF9DMkIoc2JpLCBhci5sZW4pO1xuK1x0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBuZXdibG9jayk7XG4gXHRpZiAoIWRhdGFfYmgpIHtcbiBcdFx0ZXJyb3IgPSAtRU5PTUVNO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcbiBcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuQEAgLTExNDcsNyArMTI0Miw3IEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aWYgKGVycm9yKSB7XG4gXHRcdHVubG9ja19idWZmZXIoZGF0YV9iaCk7XG4gXHRcdGVycm9yID0gLUVJTztcbi1cdFx0Z290byBvdXRfcmVzdG9yZTtcbitcdFx0Z290byBvdXRfYmg7XG4gXHR9XG4gXHRtZW1zZXQoZGF0YV9iaC1cdTAwM2ViX2RhdGEsIDAsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuIFxuQEAgLTExNTksMjQgKzEyNTQsMjggQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0XHRcdFx0ICAgaW5vZGUsIGRhdGFfYmgpO1xuIFx0fSBlbHNlIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbi1cdFx0aW5vZGUtXHUwMDNlaV9zaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdFx0aV9zaXplX3dyaXRlKGlub2RlLCBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbi1cdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cbiBcdFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcbiBcdFx0XHQgIGxlMzJfdG9fY3B1KCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilidWYpLVx1MDAzZWlub2RlKSxcbiBcdFx0XHQgIGJ1ZiArIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxuIFx0XHRcdCAgaW5saW5lX3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRSk7XG4tXHRcdGlmICghZXJyb3IpXG4tXHRcdFx0ZXJyb3IgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XG4gXHR9XG4rb3V0X2JoOlxuK1x0aWYgKGVycm9yKSB7XG4rXHRcdGludCBmbGFncyA9IDA7XG4gXG4tb3V0X3Jlc3RvcmU6XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGUsIGlub2RlLCBpbG9jLCBidWYsIGlubGluZV9zaXplKTtcbitcdFx0aWYgKGRhdGFfYmgpXG4rXHRcdFx0ZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQ7XG4rXHRcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcbiBcbitcdFx0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLCBuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBmbGFncyk7XG4rXHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0fSBlbHNlIHtcbitcdFx0ZXJyb3IgPSBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayhoYW5kbGUsIGlub2RlLFxuK1x0XHRcdFx0bmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZGF0YV9iaCk7XG4rXHR9XG4gb3V0OlxuLVx0YnJlbHNlKGRhdGFfYmgpO1xuIFx0a2ZyZWUoYnVmKTtcbiBcdHJldHVybiBlcnJvcjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODozMy4zNjYxMDE1ODRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMzgwODU4NzA4OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgSW5saW5lIERhdGEgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGlzIHBhdGNoIG1vZGlmeWluZyBgZnMvZXh0NC9pbmxpbmUuY2AgaGFzIGNhdWdodCBteSBhdHRlbnRpb24uIFRoZSByZW1vdmFsIG9mIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBpbnRyb2R1Y3Rpb24gb2YgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgY291cGxlZCB3aXRoIHRoZSBtb2RpZmljYXRpb24gb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3aGljaCBub3cgdXNlcyBgZXh0NF9tYl9uZXdfYmxvY2tzYCBhbmQgY2FsbHMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgc2NyZWFtcyBcImZ1bmN0aW9uYWwgY2hhbmdlXCIgdG8gbWUsIHBhcnRpY3VsYXJseSBpbiBob3cgdGhlIGV4dDQgZmlsZXN5c3RlbSBoYW5kbGVzIGlubGluZSBkYXRhIGNvbnZlcnNpb24gdG8gcmVndWxhciBibG9ja3MuIFRoaXMgZGVtYW5kcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gZm9yIGZ1enppbmcgb3Bwb3J0dW5pdGllcy5cblxuU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gZm9jdXMgb24gdGhlc2UgbW9kaWZpZWQgZnVuY3Rpb25zOiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgICh0aGUgbmV3IG9uZSwgb2J2aW91c2x5IGEga2V5IHRhcmdldCkgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCAod2hpY2ggaXMgbm93IGJlaGF2aW5nIGRpZmZlcmVudGx5KS4gVGhlIGNvcmUgb2YgdGhpcyBwYXRjaCBzZWVtcyB0byBiZSBmdW5kYW1lbnRhbGx5IGNoYW5naW5nIGhvdyBpbmxpbmUgZGF0YSBpcyBoYW5kbGVkIGR1cmluZyB0aGUgY29udmVyc2lvbiBwcm9jZXNzLCB3aGljaCBtYWtlcyBpdCBhYnNvbHV0ZWx5IHdvcnRoIGZ1enppbmcuXG5cbk15IG5leHQgc3RlcHMgd2lsbCBiZSB0byBpZGVudGlmeSB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBleHQ0OyBJIG5lZWQgdG8gZW5zdXJlIHRoaXMgY29kZSBwYXRoIGlzIGVuYWJsZWQgaW4gdGhlIHRhcmdldCBjb25maWd1cmF0aW9uLiBJJ2xsIG5lZWQgdG8gY29uZmlybSB0aGF0IGBDT05GSUdfRVhUNF9GU2AgaXMgdGhlIHJlbGV2YW50IGZsYWcuXG5cblRoZW4sIEknbGwgdHJhY2UgdGhlIGNhbGwgZ3JhcGggdG8gZmluZCBwb3RlbnRpYWwgZW50cnkgcG9pbnRzIGZvciBvdXIgZnV6emluZyBjYW1wYWlnbnMuIExvb2tzIGxpa2UgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIGNhbGxlZCBieSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCwgc28gdGhhdCdzIHdoZXJlIEkgd2lsbCBzdGFydCwgYnkgdHJhY2luZyB3aGVyZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhYCBpcyBjYWxsZWQuIFRoaXMgd2lsbCBnaXZlIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgY29uc3RydWN0aW5nIGVmZmVjdGl2ZSBmdXp6aW5nIGhhcm5lc3Nlcy4gVGhpcyB3aWxsIGJlIGFuIGludGVyZXN0aW5nIG9uZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTA3OSwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE4OjQ3LjE3NDY5MTgyNFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTcyNjE4NiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9jcnlwdG8uYz0xMzI9c3RhdGljIGludCBleHQ0X3NldF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHZvaWQgKmN0eCwgc2l6ZV90IGxlbixcXG4tLVxcbmZzL2V4dDQvY3J5cHRvLmMtMTUyLVxcbmZzL2V4dDQvY3J5cHRvLmM6MTUzOlxcdHJlcyA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9jcnlwdG8uYy0xNTQtXFx0aWYgKHJlcylcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTM3ODQ9ZXh0ZXJuIGludCBleHQ0X2lubGluZV9kYXRhX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqaGFzX2lubGluZSk7XFxuZnMvZXh0NC9leHQ0LmgtMzc4NS1cXG5mcy9leHQ0L2V4dDQuaDozNzg2OmV4dGVybiBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbmZzL2V4dDQvZXh0NC5oLTM3ODctXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00ODU0PWxvbmcgZXh0NF9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LCBsb2ZmX3QgbGVuKVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4My1cXHRpbm9kZV9sb2NrKGlub2RlKTtcXG5mcy9leHQ0L2V4dGVudHMuYzo0ODg0OlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtNDg4NS1cXHRpZiAocmV0KVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz01NDY9aW50IGV4dDRfcmVhZHBhZ2VfaW5saW5lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTU3Mi1cXG5mcy9leHQ0L2lubGluZS5jOjU3MzpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuZnMvZXh0NC9pbmxpbmUuYy01NzQtXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9Njk3PWludCBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTcyOC1cXHRcXHRcXHQvKiBSZXRyeSBpbnNpZGUgKi9cXG5mcy9leHQ0L2lubGluZS5jOjcyOTpcXHRcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03MzAtXFx0XFx0fVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz03ODQ9aW50IGV4dDRfdHJ5X3RvX3dyaXRlX2lubGluZV9kYXRhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy03ODktXFx0aWYgKHBvcyArIGxlbiBcXHUwMDNlIGV4dDRfZ2V0X21heF9pbmxpbmVfc2l6ZShpbm9kZSkpXFxuZnMvZXh0NC9pbmxpbmUuYzo3OTA6XFx0XFx0cmV0dXJuIGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnQobWFwcGluZywgaW5vZGUpO1xcbmZzL2V4dDQvaW5saW5lLmMtNzkxLVxcdHJldHVybiBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGEobWFwcGluZywgaW5vZGUsIHBvcywgbGVuLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTg0LVxcbmZzL2V4dDQvaW5saW5lLmM6MTE4NTpzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG5mcy9leHQ0L2lubGluZS5jLTExODYtXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmM9MTI4OD1pbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEzNDAtXFx0ICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMzQxOlxcdHJldCA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBkaXIsIFxcdTAwMjZpbG9jKTtcXG5mcy9leHQ0L2lubGluZS5jLTEzNDItXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTE5NDM9aW50IGV4dDRfaW5saW5lX2RhdGFfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50ICpoYXNfaW5saW5lKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0yMDU0LVxcbmZzL2V4dDQvaW5saW5lLmM6MjA1NTppbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuZnMvZXh0NC9pbmxpbmUuYy0yMDU2LXtcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtMjA5Mi1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoaW5vZGUpKVxcbmZzL2V4dDQvaW5saW5lLmM6MjA5MzpcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbmZzL2V4dDQvaW5saW5lLmMtMjA5NC1cXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuLS1cXG5mcy9leHQ0L2lub2RlLmM9NTkzND1pbnQgZXh0NF9zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuLS1cXG5mcy9leHQ0L2lub2RlLmMtNjAzMS1cXHRcXHQgICAgYXR0ci1cXHUwMDNlaWFfc2l6ZSBcXHUwMDNlIEVYVDRfSShpbm9kZSktXFx1MDAzZWlfaW5saW5lX3NpemUpIHtcXG5mcy9leHQ0L2lub2RlLmM6NjAzMjpcXHRcXHRcXHRlcnJvciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9pbm9kZS5jLTYwMzMtXFx0XFx0XFx0aWYgKGVycm9yKVxcbi0tXFxuZnMvZXh0NC9pbm9kZS5jPTY3ODc9dm1fZmF1bHRfdCBleHQ0X3BhZ2VfbWt3cml0ZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy02ODA4LVxcbmZzL2V4dDQvaW5vZGUuYzo2ODA5OlxcdGVyciA9IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YShpbm9kZSk7XFxuZnMvZXh0NC9pbm9kZS5jLTY4MTAtXFx0aWYgKGVycilcXG4tLVxcbmZzL2V4dDQvdmVyaXR5LmM9MTAyPXN0YXRpYyBpbnQgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5KHN0cnVjdCBmaWxlICpmaWxwKVxcbi0tXFxuZnMvZXh0NC92ZXJpdHkuYy0xMjgtXFxuZnMvZXh0NC92ZXJpdHkuYzoxMjk6XFx0ZXJyID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhKGlub2RlKTtcXG5mcy9leHQ0L3Zlcml0eS5jLTEzMC1cXHRpZiAoZXJyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODo0Ny4yMjA0MjM0MTlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMTk0NzMxNzM5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKk15IEFuYWx5c2lzIG9mIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBpdHMgQ2FsbGVycyoqXG5cbkFscmlnaHQsIHNvIEknbSB0cmFjaW5nIHRoZSBleGVjdXRpb24gb2YgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSBjb2RlLCBhbmQgSSBzZWUgaXQncyBjYWxsZWQgZnJvbSBhIGZldyBkaWZmZXJlbnQgcGxhY2VzOiBgZXh0NF9zZXRfY29udGV4dGAgKHNwZWNpZmljYWxseSByZWxhdGVkIHRvIGNyeXB0byBvcGVyYXRpb25zKSwgYGV4dDRfZmFsbG9jYXRlYCwgYGV4dDRfc2V0YXR0cmAsIGBleHQ0X3BhZ2VfbWt3cml0ZWAsIGFuZCBgZXh0NF9iZWdpbl9lbmFibGVfdmVyaXR5YC4gSW50ZXJlc3RpbmcgcmFuZ2UgdGhlcmUg4oCTIGNvdmVyaW5nIGEgZmV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIGZpbGUgbWFuaXB1bGF0aW9uLlxuXG5UaGVuLCB0aGluZ3MgZ2V0IGEgbGl0dGxlIGxlc3Mgc3RyYWlnaHRmb3J3YXJkLiBJIHNlZSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBkaXJlY3RseSBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIFRoYXQgc3VnZ2VzdHMgd2UgYXJlIGxvb2tpbmcgYXQgYW4gYXR0ZW1wdCB0byBhZGQgZGF0YSBpbmxpbmUgdG8gYW4gaW5vZGUsIHdpdGhvdXQgdGFraW5nIHRoZSBnbG9iYWwgbG9jaywgc28gaXQncyBwcm9iYWJseSBjYWxsZWQgZHVyaW5nIGEgZmlsZSBjcmVhdGUgb3Igc2ltaWxhciBvcGVyYXRpb24uXG5cbkFuZCBoZXJl4oCZcyB3aGVyZSBJIG5lZWQgdG8gYmUgY2FyZWZ1bDsgaXQgbG9va3MgbGlrZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgYWxzbyBjYWxscyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AuIE9rYXksICp0aGF0KiB3YXJyYW50cyBhIGNsb3NlciBsb29rLCBsZXQgbWUganVzdCBkb3VibGUgY2hlY2sgaG93IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50YCBmdW5jdGlvbnMuIEkgbmVlZCB0byBiZSBjZXJ0YWluIGFib3V0IHRoZSBmbG93IGFuZCB0aGUgbG9ja2luZyBzZW1hbnRpY3MgaW52b2x2ZWQuIEl0IHNlZW1zIGxpa2VseSB0aGF0IHRoZSBcIm5vbG9ja1wiIHZhcmlhbnQgaXMgdXNlZCAqd2l0aGluKiB0aGUgY29udGV4dCBvZiBhbiBleGlzdGluZyBsb2NrIGluIHRoaXMgY2FzZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NzI1MSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxODo1OS4xNjc3NDI5NTZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDU4NzgwOTUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2lubGluZS5jPTU0Nj1pbnQgZXh0NF9yZWFkcGFnZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbylcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNTcyLVxcbmZzL2V4dDQvaW5saW5lLmM6NTczOnN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG5mcy9leHQ0L2lubGluZS5jLTU3NC1cXHRcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz02OTc9aW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvaW5saW5lLmMtNzI4LVxcdFxcdFxcdC8qIFJldHJ5IGluc2lkZSAqL1xcbmZzL2V4dDQvaW5saW5lLmM6NzI5OlxcdFxcdFxcdHJldHVybiBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KG1hcHBpbmcsIGlub2RlKTtcXG5mcy9leHQ0L2lubGluZS5jLTczMC1cXHRcXHR9XFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTc4ND1pbnQgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTc4OS1cXHRpZiAocG9zICsgbGVuIFxcdTAwM2UgZXh0NF9nZXRfbWF4X2lubGluZV9zaXplKGlub2RlKSlcXG5mcy9leHQ0L2lubGluZS5jOjc5MDpcXHRcXHRyZXR1cm4gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudChtYXBwaW5nLCBpbm9kZSk7XFxuZnMvZXh0NC9pbmxpbmUuYy03OTEtXFx0cmV0dXJuIGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShtYXBwaW5nLCBpbm9kZSwgcG9zLCBsZW4sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE4OjU5LjIxMzYyNDcxMVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMwMDUwMjQ3NDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEZWNvbnN0cnVjdGluZyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYWN0dWFsbHkgaGFwcGVuaW5nIHVuZGVyIHRoZSBob29kIHdoZW4gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgIGdldHMgY2FsbGVkLiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIHRyYWNlIGl0cyBkZXBlbmRlbmNpZXMuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMgZnVuY3Rpb24gb3BlcmF0ZXMuIEVzc2VudGlhbGx5LCBJJ20gdGhpbmtpbmcsIFwiV2hlcmUgZG9lcyB0aGlzIHBpZWNlIGZpdCBpbnRvIHRoZSBsYXJnZXIgZXh0NCBmaWxlc3lzdGVtIHB1enpsZT9cIiBXaGF0IG90aGVyIGZ1bmN0aW9ucyBvciBwcm9jZXNzZXMgdHJpZ2dlciB0aGlzIGNvbnZlcnNpb24/IFVuZGVyc3RhbmRpbmcgdGhlIGNhbGxpbmcgY2hhaW4gd2lsbCBnaXZlIG1lIHRoZSBjcnVjaWFsIGNvbnRleHQgZm9yIHdoeSBhbmQgaG93IHRoaXMgZnVuY3Rpb24gaXMgdXRpbGl6ZWQuIEkgd2FudCB0byBidWlsZCBhIG1lbnRhbCBtYXAgb2YgaXRzIGludGVyYWN0aW9ucy5cblxuXG4iLCJJbnB1dFRva2VucyI6ODExNSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjAyLjIxODY1MTcyOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMzIxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJmcy9leHQ0L2lubGluZS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDU3MyxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NzM6XFx0c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfdG9fZXh0ZW50KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLFxcbiA1NzQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4gNTc1OlxcdHtcXG4gNTc2OlxcdFxcdGludCByZXQsIG5lZWRlZF9ibG9ja3MsIG5vX2V4cGFuZDtcXG4gNTc3OlxcdFxcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xcbiA1Nzg6XFx0XFx0aW50IHJldHJpZXMgPSAwLCBzZW1faGVsZCA9IDA7XFxuIDU3OTpcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvID0gTlVMTDtcXG4gNTgwOlxcdFxcdHVuc2lnbmVkIGZyb20sIHRvO1xcbiA1ODE6XFx0XFx0c3RydWN0IGV4dDRfaWxvYyBpbG9jO1xcbiA1ODI6XFx0XFxuIDU4MzpcXHRcXHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSkge1xcbiA1ODQ6XFx0XFx0XFx0LypcXG4gNTg1OlxcdFxcdFxcdCAqIGNsZWFyIHRoZSBmbGFnIHNvIHRoYXQgbm8gbmV3IHdyaXRlXFxuIDU4NjpcXHRcXHRcXHQgKiB3aWxsIHRyYXAgaGVyZSBhZ2Fpbi5cXG4gNTg3OlxcdFxcdFxcdCAqL1xcbiA1ODg6XFx0XFx0XFx0ZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xcbiA1ODk6XFx0XFx0XFx0cmV0dXJuIDA7XFxuIDU5MDpcXHRcXHR9XFxuIDU5MTpcXHRcXG4gNTkyOlxcdFxcdG5lZWRlZF9ibG9ja3MgPSBleHQ0X2NodW5rX3RyYW5zX2V4dGVudChpbm9kZSwgMSk7XFxuIDU5MzpcXHRcXG4gNTk0OlxcdFxcdHJldCA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgXFx1MDAyNmlsb2MpO1xcbiA1OTU6XFx0XFx0aWYgKHJldClcXG4gNTk2OlxcdFxcdFxcdHJldHVybiByZXQ7XFxuIDU5NzpcXHRcXG4gNTk4OlxcdHJldHJ5OlxcbiA1OTk6XFx0XFx0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQ0X0hUX1dSSVRFX1BBR0UsIG5lZWRlZF9ibG9ja3MpO1xcbiA2MDA6XFx0XFx0aWYgKElTX0VSUihoYW5kbGUpKSB7XFxuIDYwMTpcXHRcXHRcXHRyZXQgPSBQVFJfRVJSKGhhbmRsZSk7XFxuIDYwMjpcXHRcXHRcXHRoYW5kbGUgPSBOVUxMO1xcbiA2MDM6XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYwNDpcXHRcXHR9XFxuIDYwNTpcXHRcXG4gNjA2OlxcdFxcdC8qIFdlIGNhbm5vdCByZWN1cnNlIGludG8gdGhlIGZpbGVzeXN0ZW0gYXMgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHlcXG4gNjA3OlxcdFxcdCAqIHN0YXJ0ZWQgKi9cXG4gNjA4OlxcdFxcdGZvbGlvID0gX19maWxlbWFwX2dldF9mb2xpbyhtYXBwaW5nLCAwLCBGR1BfV1JJVEVCRUdJTiB8IEZHUF9OT0ZTLFxcbiA2MDk6XFx0XFx0XFx0XFx0bWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7XFxuIDYxMDpcXHRcXHRpZiAoSVNfRVJSKGZvbGlvKSkge1xcbiA2MTE6XFx0XFx0XFx0cmV0ID0gUFRSX0VSUihmb2xpbyk7XFxuIDYxMjpcXHRcXHRcXHRnb3RvIG91dF9ub2ZvbGlvO1xcbiA2MTM6XFx0XFx0fVxcbiA2MTQ6XFx0XFxuIDYxNTpcXHRcXHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbiA2MTY6XFx0XFx0c2VtX2hlbGQgPSAxO1xcbiA2MTc6XFx0XFx0LyogSWYgc29tZSBvbmUgaGFzIGFscmVhZHkgZG9uZSB0aGlzIGZvciB1cywganVzdCBleGl0LiAqL1xcbiA2MTg6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4gNjE5OlxcdFxcdFxcdHJldCA9IDA7XFxuIDYyMDpcXHRcXHRcXHRnb3RvIG91dDtcXG4gNjIxOlxcdFxcdH1cXG4gNjIyOlxcdFxcbiA2MjM6XFx0XFx0ZnJvbSA9IDA7XFxuIDYyNDpcXHRcXHR0byA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4gNjI1OlxcdFxcdGlmICghZm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpIHtcXG4gNjI2OlxcdFxcdFxcdHJldCA9IGV4dDRfcmVhZF9pbmxpbmVfZm9saW8oaW5vZGUsIGZvbGlvKTtcXG4gNjI3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbiA2Mjg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuIDYyOTpcXHRcXHR9XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdGV4dDRfZmNfdHJhY2tfaW5vZGUoaGFuZGxlLCBpbm9kZSk7XFxuIDYzMjpcXHRcXHRyZXQgPSBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZSwgaW5vZGUpO1xcbiA2MzM6XFx0XFx0aWYgKHJldClcXG4gNjM0OlxcdFxcdFxcdGdvdG8gb3V0O1xcbiA2MzU6XFx0XFxuIDYzNjpcXHRcXHRpZiAoZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKSB7XFxuIDYzNzpcXHRcXHRcXHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxcbiA2Mzg6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBleHQ0X2dldF9ibG9ja191bndyaXR0ZW4pO1xcbiA2Mzk6XFx0XFx0fSBlbHNlXFxuIDY0MDpcXHRcXHRcXHRyZXQgPSBleHQ0X2Jsb2NrX3dyaXRlX2JlZ2luKGhhbmRsZSwgZm9saW8sIGZyb20sIHRvLFxcbiA2NDE6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBleHQ0X2dldF9ibG9jayk7XFxuIDY0MjpcXHRcXHRjbGVhcl9idWZmZXJfbmV3KGZvbGlvX2J1ZmZlcnMoZm9saW8pKTtcXG4gNjQzOlxcdFxcbiA2NDQ6XFx0XFx0aWYgKCFyZXQgXFx1MDAyNlxcdTAwMjYgZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkge1xcbiA2NDU6XFx0XFx0XFx0cmV0ID0gZXh0NF93YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIGlub2RlLFxcbiA2NDY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBmb2xpb19idWZmZXJzKGZvbGlvKSwgZnJvbSwgdG8sXFxuIDY0NzpcXHRcXHRcXHRcXHRcXHRcXHQgICAgIE5VTEwsIGRvX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2Vzcyk7XFxuIDY0ODpcXHRcXHR9XFxuIDY0OTpcXHRcXG4gNjUwOlxcdFxcdGlmIChyZXQpIHtcXG4gNjUxOlxcdFxcdFxcdGZvbGlvX3VubG9jayhmb2xpbyk7XFxuIDY1MjpcXHRcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbiA2NTM6XFx0XFx0XFx0Zm9saW8gPSBOVUxMO1xcbiA2NTQ6XFx0XFx0XFx0ZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpO1xcbiA2NTU6XFx0XFx0XFx0ZXh0NF93cml0ZV91bmxvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbiA2NTY6XFx0XFx0XFx0c2VtX2hlbGQgPSAwO1xcbiA2NTc6XFx0XFx0XFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4gNjU4OlxcdFxcdFxcdGhhbmRsZSA9IE5VTEw7XFxuIDY1OTpcXHRcXHRcXHRleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7XFxuIDY2MDpcXHRcXHRcXHQvKlxcbiA2NjE6XFx0XFx0XFx0ICogSWYgdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodFxcbiA2NjI6XFx0XFx0XFx0ICogc3RpbGwgYmUgb24gdGhlIG9ycGhhbiBsaXN0OyB3ZSBuZWVkIHRvXFxuIDY2MzpcXHRcXHRcXHQgKiBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGVcXG4gNjY0OlxcdFxcdFxcdCAqIG9ycGhhbiBsaXN0IGluIHRoYXQgY2FzZS5cXG4gNjY1OlxcdFxcdFxcdCAqL1xcbiA2NjY6XFx0XFx0XFx0aWYgKGlub2RlLVxcdTAwM2VpX25saW5rKVxcbiA2Njc6XFx0XFx0XFx0XFx0ZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTtcXG4gNjY4OlxcdFxcdH1cXG4gNjY5OlxcdFxcbiA2NzA6XFx0XFx0aWYgKHJldCA9PSAtRU5PU1BDIFxcdTAwMjZcXHUwMDI2IGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLVxcdTAwM2VpX3NiLCBcXHUwMDI2cmV0cmllcykpXFxuIDY3MTpcXHRcXHRcXHRnb3RvIHJldHJ5O1xcbiA2NzI6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjAyLjIxODc3NjM1OFoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE2NzgzMTcyOTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyB0aGUgZXh0NCBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIExvZ2ljKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgaW50byB0aGUgaW5saW5lIGRhdGEgY29udmVyc2lvbiByb3V0aW5lcyBpbiBleHQ0LiBJdCdzIHN0cmlraW5nIG1lIHRoYXQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgICpkb2Vzbid0KiBjYWxsIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gVGhhdCBmZWVsc+KApnVudXN1YWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeS4gSGFuZyBvbiwgaXMgaXQgdGhhdCBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgaXMgc3BlY2lmaWNhbGx5IGZvciBkaXJlY3Rvcmllcywgd2hlcmVhcyBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX3RvX2V4dGVudGAgaXMgaGFuZGxpbmcgcmVndWxhciBmaWxlcz8gVGhhdCdzIGEgcGxhdXNpYmxlIGRpc3RpbmN0aW9uLiBJIG5lZWQgdG8gY29uZmlybSB0aGlzLiBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUsIEknbGwgZGl2ZSBpbnRvIHRoZSBzb3VyY2UgY29kZSBmb3IgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGRpcmVjdGx5LCBzcGVjaWZpY2FsbHkgaW4gYGZzL2V4dDQvaW5saW5lLmNgLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgaW50ZW5kZWQgdXNlIGNhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk4MTEsIk91dHB1dFRva2VucyI6MzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToxOS4wMDE5NTExNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjc1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxMTg1LFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE4NTpcXHRzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcXG4xMTg2OlxcdFxcdFxcdFxcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuMTE4NzpcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jKVxcbjExODg6XFx0e1xcbjExODk6XFx0XFx0aW50IGVycm9yO1xcbjExOTA6XFx0XFx0dm9pZCAqYnVmID0gTlVMTDtcXG4xMTkxOlxcdFxcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XFxuMTE5MjpcXHRcXHRpbnQgaW5saW5lX3NpemU7XFxuMTE5MzpcXHRcXHRleHQ0X2ZzYmxrX3QgbmV3YmxvY2sgPSAwO1xcbjExOTQ6XFx0XFx0c3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyO1xcbjExOTU6XFx0XFx0c3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cXHUwMDNlaV9zYik7XFxuMTE5NjpcXHRcXHR1bnNpZ25lZCBpbnQgYWxsb2NhdGVkX2Jsb2NrO1xcbjExOTc6XFx0XFxuMTE5ODpcXHRcXHRpbmxpbmVfc2l6ZSA9IGV4dDRfZ2V0X2lubGluZV9zaXplKGlub2RlKTtcXG4xMTk5OlxcdFxcdGJ1ZiA9IGttYWxsb2MoaW5saW5lX3NpemUsIEdGUF9OT0ZTKTtcXG4xMjAwOlxcdFxcdGlmICghYnVmKSB7XFxuMTIwMTpcXHRcXHRcXHRlcnJvciA9IC1FTk9NRU07XFxuMTIwMjpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMjAzOlxcdFxcdH1cXG4xMjA0OlxcdFxcbjEyMDU6XFx0XFx0ZXJyb3IgPSBleHQ0X3JlYWRfaW5saW5lX2RhdGEoaW5vZGUsIGJ1ZiwgaW5saW5lX3NpemUsIGlsb2MpO1xcbjEyMDY6XFx0XFx0aWYgKGVycm9yIFxcdTAwM2MgMClcXG4xMjA3OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjEyMDg6XFx0XFxuMTIwOTpcXHRcXHQvKlxcbjEyMTA6XFx0XFx0ICogTWFrZSBzdXJlIHRoZSBpbmxpbmUgZGlyZWN0b3J5IGVudHJpZXMgcGFzcyBjaGVja3MgYmVmb3JlIHdlIHRyeSB0b1xcbjEyMTE6XFx0XFx0ICogY29udmVydCB0aGVtLCBzbyB0aGF0IHdlIGF2b2lkIHRvdWNoaW5nIHN0dWZmIHRoYXQgbmVlZHMgZnNjay5cXG4xMjEyOlxcdFxcdCAqL1xcbjEyMTM6XFx0XFx0aWYgKFNfSVNESVIoaW5vZGUtXFx1MDAzZWlfbW9kZSkpIHtcXG4xMjE0OlxcdFxcdFxcdGVycm9yID0gZXh0NF9jaGVja19hbGxfZGUoaW5vZGUsIGlsb2MtXFx1MDAzZWJoLFxcbjEyMTU6XFx0XFx0XFx0XFx0XFx0XFx0YnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXFxuMTIxNjpcXHRcXHRcXHRcXHRcXHRcXHRpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMjE3OlxcdFxcdFxcdGlmIChlcnJvcilcXG4xMjE4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjEyMTk6XFx0XFx0fVxcbjEyMjA6XFx0XFxuMTIyMTpcXHRcXHRtZW1zZXQoXFx1MDAyNmFyLCAwLCBzaXplb2YoYXIpKTtcXG4xMjIyOlxcdFxcdGFyLmlub2RlID0gaW5vZGU7XFxuMTIyMzpcXHRcXHRhci5sb2dpY2FsID0gMDtcXG4xMjI0OlxcdFxcdGFyLmxlbiA9IDE7XFxuMTIyNTpcXHRcXHRpZiAoU19JU1JFRyhpbm9kZS1cXHUwMDNlaV9tb2RlKSlcXG4xMjI2OlxcdFxcdFxcdGFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7XFxuMTIyNzpcXHRcXHRlbHNlXFxuMTIyODpcXHRcXHRcXHRhci5mbGFncyA9IDA7XFxuMTIyOTpcXHRcXHRuZXdibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsIFxcdTAwMjZhciwgXFx1MDAyNmVycm9yKTtcXG4xMjMwOlxcdFxcdGlmIChlcnJvciBcXHUwMDNjIDApXFxuMTIzMTpcXHRcXHRcXHRnb3RvIG91dDtcXG4xMjMyOlxcdFxcdGFsbG9jYXRlZF9ibG9jayA9IEVYVDRfQzJCKHNiaSwgYXIubGVuKTtcXG4xMjMzOlxcdFxcdGRhdGFfYmggPSBzYl9nZXRibGsoaW5vZGUtXFx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcXG4xMjM0OlxcdFxcdGlmICghZGF0YV9iaCkge1xcbjEyMzU6XFx0XFx0XFx0ZXJyb3IgPSAtRU5PTUVNO1xcbjEyMzY6XFx0XFx0XFx0Z290byBvdXRfYmg7XFxuMTIzNzpcXHRcXHR9XFxuMTIzODpcXHRcXG4xMjM5OlxcdFxcdGxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbjEyNDA6XFx0XFx0ZXJyb3IgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBpbm9kZS1cXHUwMDNlaV9zYiwgZGF0YV9iaCxcXG4xMjQxOlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBFWFQ0X0pUUl9OT05FKTtcXG4xMjQyOlxcdFxcdGlmIChlcnJvcikge1xcbjEyNDM6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjQ0OlxcdFxcdFxcdGVycm9yID0gLUVJTztcXG4xMjQ1OlxcdFxcdFxcdGdvdG8gb3V0X2JoO1xcbjEyNDY6XFx0XFx0fVxcbjEyNDc6XFx0XFx0bWVtc2V0KGRhdGFfYmgtXFx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4xMjQ4OlxcdFxcbjEyNDk6XFx0XFx0aWYgKCFTX0lTRElSKGlub2RlLVxcdTAwM2VpX21vZGUpKSB7XFxuMTI1MDpcXHRcXHRcXHRtZW1jcHkoZGF0YV9iaC1cXHUwMDNlYl9kYXRhLCBidWYsIGlubGluZV9zaXplKTtcXG4xMjUxOlxcdFxcdFxcdHNldF9idWZmZXJfdXB0b2RhdGUoZGF0YV9iaCk7XFxuMTI1MjpcXHRcXHRcXHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xcbjEyNTM6XFx0XFx0XFx0ZXJyb3IgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsXFxuMTI1NDpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBpbm9kZSwgZGF0YV9iaCk7XFxuMTI1NTpcXHRcXHR9IGVsc2Uge1xcbjEyNTY6XFx0XFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG4xMjU3OlxcdFxcdFxcdGVycm9yID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsXFxuMTI1ODpcXHRcXHRcXHRcXHQgIGxlMzJfdG9fY3B1KCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilidWYpLVxcdTAwM2Vpbm9kZSksXFxuMTI1OTpcXHRcXHRcXHRcXHQgIGJ1ZiArIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFLFxcbjEyNjA6XFx0XFx0XFx0XFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcXG4xMjYxOlxcdFxcdH1cXG4xMjYyOlxcdG91dF9iaDpcXG4xMjYzOlxcdFxcdGlmIChlcnJvcikge1xcbjEyNjQ6XFx0XFx0XFx0aW50IGZsYWdzID0gMDtcXG4xMjY1OlxcdFxcbjEyNjY6XFx0XFx0XFx0aWYgKGRhdGFfYmgpXFxuMTI2NzpcXHRcXHRcXHRcXHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcXG4xMjY4OlxcdFxcdFxcdHN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTtcXG4xMjY5OlxcdFxcbjEyNzA6XFx0XFx0XFx0ZG93bl93cml0ZShcXHUwMDI2ZWktXFx1MDAzZWlfZGF0YV9zZW0pO1xcbjEyNzE6XFx0XFx0XFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcXG4xMjcyOlxcdFxcdFxcdGV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCwgbmV3YmxvY2ssIGFsbG9jYXRlZF9ibG9jaywgZmxhZ3MpO1xcbjEyNzM6XFx0XFx0XFx0dXBfd3JpdGUoXFx1MDAyNmVpLVxcdTAwM2VpX2RhdGFfc2VtKTtcXG4xMjc0OlxcdFxcdH0gZWxzZSB7XFxuMTI3NTpcXHRcXHRcXHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXFxuMTI3NjpcXHRcXHRcXHRcXHRcXHRuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBkYXRhX2JoKTtcXG4xMjc3OlxcdFxcdH1cXG4xMjc4OlxcdG91dDpcXG4xMjc5OlxcdFxcdGtmcmVlKGJ1Zik7XFxuMTI4MDpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMTI4MTpcXHR9XFxuMTI4MjpcXHRcXG4xMjgzOlxcdC8qXFxuMTI4NDpcXHQgKiBUcnkgdG8gYWRkIHRoZSBuZXcgZW50cnkgdG8gdGhlIGlubGluZSBkYXRhLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToxOS4wMDIwODA1M1oiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NDg0NTI0OTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgYW5kIGl0cyBVc2FnZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gaG93IGlubGluZSBkYXRhIGlzIGhhbmRsZWQgaW4gZXh0NC4gSXQgc2VlbXMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzIHRoZSB3b3JraG9yc2UgaGVyZSwgYW5kIGl0J3MgdXNlZCBmb3IgYm90aCBkaXJlY3RvcmllcyBhbmQgcmVndWxhciBmaWxlcyDigJMgY2xldmVyLCBpdCBjaGVja3MgdGhlIGlub2RlJ3MgbW9kZSB3aXRoIGBTX0lTRElSKGlub2RlLVx1MDAzZWlfbW9kZSlgIHRvIGZpZ3VyZSBvdXQgdGhlIGZpbGUgdHlwZS4gR290IGl0LiBBbmQgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YWAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYWN0dWFsbHkgY2FsbHMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLCB3aGljaCBtYWtlcyBzZW5zZSBmb3IgdGhlIG92ZXJhbGwgZmxvdy4gTGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRoYXQgZnVuY3Rpb24gY2FsbCBhbmQgdGhlIGxvZ2ljIGFyb3VuZCB0aGF0LiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgdW5kZXJzdGFuZCB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgdGhlIGxvY2sgaXMgaGFuZGxlZCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE3MDEsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjIzLjQ4NjYwNzkwMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTc4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9pbmxpbmUuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDU1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMDU1OlxcdGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSlcXG4yMDU2OlxcdHtcXG4yMDU3OlxcdFxcdGludCBlcnJvciwgbmVlZGVkX2Jsb2Nrcywgbm9fZXhwYW5kO1xcbjIwNTg6XFx0XFx0aGFuZGxlX3QgKmhhbmRsZTtcXG4yMDU5OlxcdFxcdHN0cnVjdCBleHQ0X2lsb2MgaWxvYztcXG4yMDYwOlxcdFxcbjIwNjE6XFx0XFx0aWYgKCFleHQ0X2hhc19pbmxpbmVfZGF0YShpbm9kZSkpIHtcXG4yMDYyOlxcdFxcdFxcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcXG4yMDYzOlxcdFxcdFxcdHJldHVybiAwO1xcbjIwNjQ6XFx0XFx0fSBlbHNlIGlmICghZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX01BWV9JTkxJTkVfREFUQSkpIHtcXG4yMDY1OlxcdFxcdFxcdC8qXFxuMjA2NjpcXHRcXHRcXHQgKiBJbm9kZSBoYXMgaW5saW5lIGRhdGEgYnV0IEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBIGlzXFxuMjA2NzpcXHRcXHRcXHQgKiBjbGVhcmVkLiBUaGlzIG1lYW5zIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIG1vdmluZyBvZlxcbjIwNjg6XFx0XFx0XFx0ICogaW5saW5lIGRhdGEgdG8gZGVsYXkgYWxsb2NhdGVkIGJsb2NrLiBKdXN0IGZvcmNlIHdyaXRlb3V0XFxuMjA2OTpcXHRcXHRcXHQgKiBoZXJlIHRvIGZpbmlzaCBjb252ZXJzaW9uLlxcbjIwNzA6XFx0XFx0XFx0ICovXFxuMjA3MTpcXHRcXHRcXHRlcnJvciA9IGZpbGVtYXBfZmx1c2goaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuMjA3MjpcXHRcXHRcXHRpZiAoZXJyb3IpXFxuMjA3MzpcXHRcXHRcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA3NDpcXHRcXHRcXHRpZiAoIWV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4yMDc1OlxcdFxcdFxcdFxcdHJldHVybiAwO1xcbjIwNzY6XFx0XFx0fVxcbjIwNzc6XFx0XFxuMjA3ODpcXHRcXHRuZWVkZWRfYmxvY2tzID0gZXh0NF9jaHVua190cmFuc19leHRlbnQoaW5vZGUsIDEpO1xcbjIwNzk6XFx0XFxuMjA4MDpcXHRcXHRpbG9jLmJoID0gTlVMTDtcXG4yMDgxOlxcdFxcdGVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcXHUwMDI2aWxvYyk7XFxuMjA4MjpcXHRcXHRpZiAoZXJyb3IpXFxuMjA4MzpcXHRcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA4NDpcXHRcXG4yMDg1OlxcdFxcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgRVhUNF9IVF9XUklURV9QQUdFLCBuZWVkZWRfYmxvY2tzKTtcXG4yMDg2OlxcdFxcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbjIwODc6XFx0XFx0XFx0ZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7XFxuMjA4ODpcXHRcXHRcXHRnb3RvIG91dF9mcmVlO1xcbjIwODk6XFx0XFx0fVxcbjIwOTA6XFx0XFxuMjA5MTpcXHRcXHRleHQ0X3dyaXRlX2xvY2tfeGF0dHIoaW5vZGUsIFxcdTAwMjZub19leHBhbmQpO1xcbjIwOTI6XFx0XFx0aWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGlub2RlKSlcXG4yMDkzOlxcdFxcdFxcdGVycm9yID0gZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGUsIGlub2RlLCBcXHUwMDI2aWxvYyk7XFxuMjA5NDpcXHRcXHRleHQ0X3dyaXRlX3VubG9ja194YXR0cihpbm9kZSwgXFx1MDAyNm5vX2V4cGFuZCk7XFxuMjA5NTpcXHRcXHRleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpO1xcbjIwOTY6XFx0b3V0X2ZyZWU6XFxuMjA5NzpcXHRcXHRicmVsc2UoaWxvYy5iaCk7XFxuMjA5ODpcXHRcXHRyZXR1cm4gZXJyb3I7XFxuMjA5OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjIzLjQ4NjcyNzA2MloiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0ODM5Njc4MjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0IElkZW50aWZpY2F0aW9uKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgaW1tZWRpYXRlbHksIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGlzIGNhbGxpbmcgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgLiBUaGlzIGxvb2tzIGxpa2UgYSBwcm9taXNpbmcgYXJlYSBmb3IgZnV6emluZywgZGVmaW5pdGVseSB3b3J0aCBhIGNsb3NlciBsb29rLiBNeSBpbml0aWFsIGZvY3VzIHN5bWJvbHMgYXJlIGdvaW5nIHRvIGJlIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAuIEhhbmcgb24sIHRob3VnaCDigJMgYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2tgIGlzICpzdGF0aWMqLCBzbyBpdCB3b24ndCBiZSBkaXJlY3RseSBleHBvc2VkIGFzIGEgZm9jdXMgZm9yIGZ1enppbmcuIFRoYXQgbmFycm93cyB0aGluZ3MgZG93biBhIGJpdC5cblxuUmlnaHQsIHNvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgICppcyogZXhwb3J0ZWQg4oCTIGl0J3MgZ2xvYmFsLiBBbmQgYGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlgIGlzIGFsc28gZ2xvYmFsLiBOb3csIEkgd2FudCB0byBzZWUgaWYgYW55dGhpbmcgKmVsc2UqIGNhbGxzIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gTGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrOyBvaCwgeWVwLCBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgY2FsbHMgaXQuIEFuZCBvYnZpb3VzbHksIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGl0c2VsZiBkb2VzLiBcblxuVGhlIGNvbmZpZ3VyYXRpb24gaGVyZSBpcyBgRVhUNF9GU2AsIHdoaWNoIGlzIGdvb2QgdG8ga25vdyBmb3IgY29udGV4dC4gTGV0IG1lIGp1c3QgY29uZmlybSB0aGF0IGBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5YCBpcyBhY3R1YWxseSBhIGdsb2JhbCBmdW5jdGlvbiBhcyB3ZWxsLCBmb3IgY2xhcml0eS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTI3MTUsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMDksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToyOC4zMjY0MDcyMThaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1ODUzMDg2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnlcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0Lmg9Mzc0Nz1leHRlcm4gaW50IGV4dDRfZ2VuZXJpY193cml0ZV9pbmxpbmVfZGF0YShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTM3NTEtXFx0XFx0XFx0XFx0XFx0ICB2b2lkICoqZnNkYXRhLCBib29sIGRhKTtcXG5mcy9leHQ0L2V4dDQuaDozNzUyOmV4dGVybiBpbnQgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLFxcbmZzL2V4dDQvZXh0NC5oLTM3NTMtXFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExODU9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyODctICovXFxuZnMvZXh0NC9pbmxpbmUuYzoxMjg4OmludCBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG5mcy9leHQ0L2lubGluZS5jLTEyODktXFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjM1Nj1zdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjM4My1cXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xcbmZzL2V4dDQvbmFtZWkuYzoyMzg0OlxcdFxcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xcbmZzL2V4dDQvbmFtZWkuYy0yMzg1LVxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOToyOC4zNzIyNjMyNDRaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTU1MzYzODgyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgRXh0NCBJbmxpbmUgRGF0YSBGdW5jdGlvbnMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJJ20gbm90aW5nIHRoZSBzY29wZSBvZiB0aGVzZSBleHQ0IGlubGluZSBkYXRhIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBgZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeWAgYW5kIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFgIGFyZSBnbG9iYWwsIHdoaWNoIGlzIGltcG9ydGFudCB0byBjb25zaWRlciBpbiB0ZXJtcyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzIGFuZCBob3cgdGhleSdyZSBleHBvc2VkLiBUaGVuLCBJIHNlZSBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgIGlzIHN0YXRpYzsgdGhhdCdzIGdvb2QsIGl0J3Mgc2NvcGVkIGFuZCBsaWtlbHkgbWVhbnQgZm9yIGludGVybmFsIHVzZSBvbmx5LlxuXG5Ob3csIEknbSBtb3Zpbmcgb24gdG8gYGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV90b19leHRlbnRgLCBhbmQgaXQncyBhbHNvIHN0YXRpYywgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gaXRzIHNwZWNpZmljIHB1cnBvc2UuIE5leHQsIEkndmUgZ290IGBleHQ0X2dlbmVyaWNfd3JpdGVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF90cnlfdG9fd3JpdGVfaW5saW5lX2RhdGFgIHdoaWNoIGFyZSBib3RoIGdsb2JhbCBmdW5jdGlvbnMuXG5cbkkgbmVlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uIGxhbmRzY2FwZSBoZXJlLiBUaGUgY2VudHJhbCBjb25maWcgb3B0aW9uIHNlZW1zIHRvIGJlIGBFWFQ0X0ZTYCwgd2hpY2ggaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBpbmxpbmUgZGF0YSBzdXBwb3J0LiBUaGlzIGlzIHRoZSBtYWluIG9uZSB0aGF0IG1hdHRlcnMgaGVyZS5cblxuT2theSwgSSB0aGluayBJJ3ZlIGdvdCB0aGUgbGF5IG9mIHRoZSBsYW5kIG5vdy4gTGV0J3MgdXNlIHRoZSBgc2V0LXJlc3VsdHNgIHRvb2wgdG8gYW5hbHl6ZSB0aGlzIGZ1cnRoZXIuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNjQ3LCJPdXRwdXRUb2tlbnMiOjE2NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTozMy45MjU5MDM4NTlaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjY2NDQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfY29udmVydF9pbmxpbmVfZGF0YVwiLFxuICAgIFwiZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBpbmxpbmUgZGF0YSBjb252ZXJzaW9uIGxvZ2ljIGluIGV4dDQsIHNwZWNpZmljYWxseSBob3cgaW5saW5lIGRhdGEgaXMgY29udmVydGVkIHRvIGEgcmVndWxhciBibG9jay4gSXQgcmVwbGFjZXMgZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhIHdpdGggZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2sgYW5kIGNoYW5nZXMgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayB0byB1c2UgZXh0NF9tYl9uZXdfYmxvY2tzIGRpcmVjdGx5IGluc3RlYWQgb2YgZXh0NF9tYXBfYmxvY2tzLiBUaGVzZSBhcmUgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgb3BlcmF0aW9ucyBsaWtlIGZhbGxvY2F0ZSwgc2V0YXR0ciwgYW5kIGFkZGluZyBkaXJlY3RvcnkgZW50cmllcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhXCIsXG4gICAgXCJleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgaW4gZXh0NCwgc3BlY2lmaWNhbGx5IGhvdyBpbmxpbmUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYSByZWd1bGFyIGJsb2NrLiBJdCByZXBsYWNlcyBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGEgd2l0aCBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9jayBhbmQgY2hhbmdlcyBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrIHRvIHVzZSBleHQ0X21iX25ld19ibG9ja3MgZGlyZWN0bHkgaW5zdGVhZCBvZiBleHQ0X21hcF9ibG9ja3MuIFRoZXNlIGFyZSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZXMgaW4gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBvcGVyYXRpb25zIGxpa2UgZmFsbG9jYXRlLCBzZXRhdHRyLCBhbmQgYWRkaW5nIGRpcmVjdG9yeSBlbnRyaWVzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTozNC4wMDI1NzUyNzlaIiwiU2VxIjoxNywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU0NTM5ODg5NzQwNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjM0LjAwMzAwMTYyOVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo1NDUzOTg0NjczOTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXFxuXFxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XFxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXFxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxcbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXFxuXFxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiZGIyNzIwODQ5Nzc1NDEwMWFjNGVjZTAxZWU0ODgwOWUxZjVkMzU4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjIgMTc6MTg6MzAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xuaW5kZXggODA0NWU0ZmYyNzBjNy4uNTA3MTA2YzcyZTgyZiAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvaW5saW5lLmNcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcbkBAIC0xNCw2ICsxNCw3IEBAXG4gI2luY2x1ZGUgXCJleHQ0LmhcIlxuICNpbmNsdWRlIFwieGF0dHIuaFwiXG4gI2luY2x1ZGUgXCJ0cnVuY2F0ZS5oXCJcbisjaW5jbHVkZSBcImV4dDRfZXh0ZW50cy5oXCJcbiBcbiAjZGVmaW5lIEVYVDRfWEFUVFJfU1lTVEVNX0RBVEFcdFwiZGF0YVwiXG4gI2RlZmluZSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFXHQoKHNpemVvZihfX2xlMzIpICogRVhUNF9OX0JMT0NLUykpXG5AQCAtMTA3MCwyMSArMTA3MSwxMTUgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9pbG9jICppbG9jLFxuLVx0XHRcdFx0ICAgICB2b2lkICpidWYsIGludCBpbmxpbmVfc2l6ZSlcbitzdGF0aWMgaW50IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfZnNibGtfdCBibG9jayxcbitcdFx0XHRcdFx0dW5zaWduZWQgaW50IGxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcbiB7XG4tXHRpbnQgcmV0O1xuK1x0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuK1x0c3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHtcbitcdFx0LnMgPSB7IC5ub3RfZm91bmQgPSAwLCB9LFxuK1x0fTtcbitcdHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHtcbitcdFx0Lm5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1NZU1RFTSxcbitcdFx0Lm5hbWUgPSBFWFQ0X1hBVFRSX1NZU1RFTV9EQVRBLFxuK1x0XHQudmFsdWUgPSBOVUxMLFxuK1x0XHQudmFsdWVfbGVuID0gMCxcbitcdH07XG4rXHRpbnQgZXJyb3I7XG4rXHRpbnQgaW5vZGVfc2l6ZTtcbitcdHZvaWQgKmlub2RlX2J1ZiA9IE5VTEw7XG4rXHRzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlO1xuIFxuLVx0cmV0ID0gZXh0NF9jcmVhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBpbm9kZSwgaW5saW5lX3NpemUpO1xuLVx0aWYgKHJldCkge1xuLVx0XHRleHQ0X21zZyhpbm9kZS1cdTAwM2VpX3NiLCBLRVJOX0VNRVJHLFxuLVx0XHRcdFwiZXJyb3IgcmVzdG9yaW5nIGlubGluZV9kYXRhIGZvciBpbm9kZSAtLSBwb3RlbnRpYWwgZGF0YSBsb3NzISAoaW5vZGUgJWxsdSwgZXJyb3IgJWQpXCIsXG4tXHRcdFx0aW5vZGUtXHUwMDNlaV9pbm8sIHJldCk7XG4tXHRcdHJldHVybjtcbitcdGlub2RlX3NpemUgPSBFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtXHUwMDNlaV9zYik7XG4rXHRpbm9kZV9idWYgPSBrbWFsbG9jKGlub2RlX3NpemUsIEdGUF9OT0ZTKTtcbitcdGlmICghaW5vZGVfYnVmKSB7XG4rXHRcdGVycm9yID0gLUVOT01FTTtcbitcdFx0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHR1cF93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdFx0cmV0dXJuIGVycm9yO1xuIFx0fVxuLVx0ZXh0NF93cml0ZV9pbmxpbmVfZGF0YShpbm9kZSwgaWxvYywgYnVmLCAwLCBpbmxpbmVfc2l6ZSk7XG4tXHRleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9NQVlfSU5MSU5FX0RBVEEpO1xuK1x0ZG93bl93cml0ZShcdTAwMjZlaS1cdTAwM2VpX2RhdGFfc2VtKTtcbitcdGVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCBcdTAwMjZpcy5pbG9jKTtcbitcdGlmIChlcnJvcikge1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4rXHRcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0XHRrZnJlZShpbm9kZV9idWYpO1xuK1x0XHRyZXR1cm4gZXJyb3I7XG4rXHR9XG4rXHRyYXdfaW5vZGUgPSBleHQ0X3Jhd19pbm9kZShcdTAwMjZpcy5pbG9jKTtcbitcdEJVRkZFUl9UUkFDRShpcy5pbG9jLmJoLCBcImdldF93cml0ZV9hY2Nlc3NcIik7XG4rXHRlcnJvciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaW5vZGUtXHUwMDNlaV9zYiwgaXMuaWxvYy5iaCwgRVhUNF9KVFJfTk9ORSk7XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0ZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTtcbitcdFx0ZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBiaCwgYmxvY2ssIGxlbiwgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdG1lbWNweShpbm9kZV9idWYsICh2b2lkICopcmF3X2lub2RlLCBpbm9kZV9zaXplKTtcbitcdG1lbXNldCgodm9pZCAqKXJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCAwLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdG1lbXNldChlaS1cdTAwM2VpX2RhdGEsIDAsIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkUpO1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZXh0ZW50cyhpbm9kZS1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbitcdFx0KFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLVx1MDAzZWlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS1cdTAwM2VpX21vZGUpKSkge1xuK1x0XHRleHQ0X3NldF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0XHRleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlLCBpbm9kZSk7XG4rXHRcdHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoID0gZXh0NF9maW5kX2V4dGVudChpbm9kZSwgMCwgTlVMTCwgMCk7XG4rXG4rXHRcdGlmIChJU19FUlIocGF0aCkpIHtcbitcdFx0XHRlcnJvciA9IFBUUl9FUlIocGF0aCk7XG4rXHRcdFx0Z290byByZWNvdmVyeTtcbitcdFx0fVxuK1x0XHRzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXg7XG4rXG4rXHRcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoMCk7XG4rXHRcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xuK1x0XHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXHUwMDI2bmV3ZXgsIGJsb2NrKTtcbitcdFx0cGF0aCA9IGV4dDRfZXh0X2luc2VydF9leHRlbnQoaGFuZGxlLCBpbm9kZSwgcGF0aCwgXHUwMDI2bmV3ZXgsIDApO1xuK1x0XHRpZiAoSVNfRVJSKHBhdGgpKSB7XG4rXHRcdFx0ZXJyb3IgPSBQVFJfRVJSKHBhdGgpO1xuK1x0XHRcdGlmIChlcnJvciA9PSAtRURRVU9UIHx8IGVycm9yID09IC1FTk9TUEMpIHtcbitcdFx0XHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRcdFx0fSBlbHNlIHtcbitcdFx0XHRcdGV4dDRfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBibG9jayk7XG4rXHRcdFx0XHRnb3RvIG5vZnJlZTtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0ZXh0NF9mcmVlX2V4dF9wYXRoKHBhdGgpO1xuK1x0XHR9XG4rXHR9IGVsc2Uge1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGF0YVswXSA9IGNwdV90b19sZTMyKGJsb2NrKTtcbitcdH1cbitcdGVycm9yID0gZXh0NF94YXR0cl9pYm9keV9maW5kKGlub2RlLCBcdTAwMjZpLCBcdTAwMjZpcyk7XG4rXHRpZiAoZXJyb3IpXG4rXHRcdGdvdG8gcmVjb3Zlcnk7XG4rXHRpZiAoIWlzLnMubm90X2ZvdW5kKVxuK1x0XHRlcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmksIFx1MDAyNmlzKTtcbityZWNvdmVyeTpcbitcdGlmIChlcnJvcikge1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJoLCBibG9jaywgbGVuLCBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7XG4rbm9mcmVlOlxuK1x0XHRtZW1jcHkoKHZvaWQgKilyYXdfaW5vZGUsIGlub2RlX2J1ZiwgaW5vZGVfc2l6ZSk7XG4rXHRcdG1lbWNweShlaS1cdTAwM2VpX2RhdGEsIHJhd19pbm9kZS1cdTAwM2VpX2Jsb2NrLCBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFKTtcbitcdFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpO1xuK1x0fSBlbHNlIHtcbitcdFx0ZXh0NF9jbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0lOTElORV9EQVRBKTtcbitcdFx0Z2V0X2JoKGlzLmlsb2MuYmgpO1xuK1x0XHRlcnJvciA9IGV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsIFx1MDAyNmlzLmlsb2MpO1xuK1x0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfaW5saW5lX29mZiA9IDA7XG4rXHRcdEVYVDRfSShpbm9kZSktXHUwMDNlaV9pbmxpbmVfc2l6ZSA9IDA7XG4rXHRcdGV4dDRfY2xlYXJfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTUFZX0lOTElORV9EQVRBKTtcbitcdFx0aWYgKFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSkge1xuK1x0XHRcdGlfc2l6ZV93cml0ZShpbm9kZSwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4rXHRcdFx0RVhUNF9JKGlub2RlKS1cdTAwM2VpX2Rpc2tzaXplID0gaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbitcdFx0fVxuK1x0XHRicmVsc2UoYmgpO1xuK1x0fVxuK291dDpcbitcdGJyZWxzZShpcy5pbG9jLmJoKTtcbitcdHVwX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0a2ZyZWUoaW5vZGVfYnVmKTtcbitcdHJldHVybiBlcnJvcjtcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG5AQCAtMTA5NCw4ICsxMTg5LDExIEBAIHN0YXRpYyBpbnQgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIFx0aW50IGVycm9yO1xuIFx0dm9pZCAqYnVmID0gTlVMTDtcbiBcdHN0cnVjdCBidWZmZXJfaGVhZCAqZGF0YV9iaCA9IE5VTEw7XG4tXHRzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDtcbiBcdGludCBpbmxpbmVfc2l6ZTtcbitcdGV4dDRfZnNibGtfdCBuZXdibG9jayA9IDA7XG4rXHRzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7XG4rXHRzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKGlub2RlLVx1MDAzZWlfc2IpO1xuK1x0dW5zaWduZWQgaW50IGFsbG9jYXRlZF9ibG9jaztcbiBcbiBcdGlubGluZV9zaXplID0gZXh0NF9nZXRfaW5saW5lX3NpemUoaW5vZGUpO1xuIFx0YnVmID0ga21hbGxvYyhpbmxpbmVfc2l6ZSwgR0ZQX05PRlMpO1xuQEAgLTExMjAsMjUgKzEyMTgsMjIgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRlcnJvciA9IGV4dDRfZGVzdHJveV9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlLCBpbm9kZSk7XG4tXHRpZiAoZXJyb3IpXG4tXHRcdGdvdG8gb3V0O1xuLVxuLVx0bWFwLm1fbGJsayA9IDA7XG4tXHRtYXAubV9sZW4gPSAxO1xuLVx0bWFwLm1fZmxhZ3MgPSAwO1xuLVx0ZXJyb3IgPSBleHQ0X21hcF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgXHUwMDI2bWFwLCBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKTtcbitcdG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSk7XG4rXHRhci5pbm9kZSA9IGlub2RlO1xuK1x0YXIubG9naWNhbCA9IDA7XG4rXHRhci5sZW4gPSAxO1xuK1x0aWYgKFNfSVNSRUcoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbitcdFx0YXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTtcbitcdGVsc2VcbitcdFx0YXIuZmxhZ3MgPSAwO1xuK1x0bmV3YmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCBcdTAwMjZhciwgXHUwMDI2ZXJyb3IpO1xuIFx0aWYgKGVycm9yIFx1MDAzYyAwKVxuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0aWYgKCEobWFwLm1fZmxhZ3MgXHUwMDI2IEVYVDRfTUFQX01BUFBFRCkpIHtcbi1cdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuLVx0fVxuLVxuLVx0ZGF0YV9iaCA9IHNiX2dldGJsayhpbm9kZS1cdTAwM2VpX3NiLCBtYXAubV9wYmxrKTtcbitcdFx0Z290byBvdXQ7XG4rXHRhbGxvY2F0ZWRfYmxvY2sgPSBFWFQ0X0MyQihzYmksIGFyLmxlbik7XG4rXHRkYXRhX2JoID0gc2JfZ2V0YmxrKGlub2RlLVx1MDAzZWlfc2IsIG5ld2Jsb2NrKTtcbiBcdGlmICghZGF0YV9iaCkge1xuIFx0XHRlcnJvciA9IC1FTk9NRU07XG4tXHRcdGdvdG8gb3V0X3Jlc3RvcmU7XG4rXHRcdGdvdG8gb3V0X2JoO1xuIFx0fVxuIFxuIFx0bG9ja19idWZmZXIoZGF0YV9iaCk7XG5AQCAtMTE0Nyw3ICsxMjQyLDcgQEAgc3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRpZiAoZXJyb3IpIHtcbiBcdFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcbiBcdFx0ZXJyb3IgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9yZXN0b3JlO1xuK1x0XHRnb3RvIG91dF9iaDtcbiBcdH1cbiBcdG1lbXNldChkYXRhX2JoLVx1MDAzZWJfZGF0YSwgMCwgaW5vZGUtXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4gXG5AQCAtMTE1OSwyNCArMTI1NCwyOCBAQCBzdGF0aWMgaW50IGV4dDRfY29udmVydF9pbmxpbmVfZGF0YV9ub2xvY2soaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdFx0XHQgICBpbm9kZSwgZGF0YV9iaCk7XG4gXHR9IGVsc2Uge1xuIFx0XHR1bmxvY2tfYnVmZmVyKGRhdGFfYmgpO1xuLVx0XHRpbm9kZS1cdTAwM2VpX3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVx0XHRpX3NpemVfd3JpdGUoaW5vZGUsIGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuLVx0XHRFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlza3NpemUgPSBpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuLVxuIFx0XHRlcnJvciA9IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBkYXRhX2JoLFxuIFx0XHRcdCAgbGUzMl90b19jcHUoKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJ1ZiktXHUwMDNlaW5vZGUpLFxuIFx0XHRcdCAgYnVmICsgRVhUNF9JTkxJTkVfRE9URE9UX1NJWkUsXG4gXHRcdFx0ICBpbmxpbmVfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFKTtcbi1cdFx0aWYgKCFlcnJvcilcbi1cdFx0XHRlcnJvciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdH1cbitvdXRfYmg6XG4rXHRpZiAoZXJyb3IpIHtcbitcdFx0aW50IGZsYWdzID0gMDtcbiBcbi1vdXRfcmVzdG9yZTpcbi1cdGlmIChlcnJvcilcbi1cdFx0ZXh0NF9yZXN0b3JlX2lubGluZV9kYXRhKGhhbmRsZSwgaW5vZGUsIGlsb2MsIGJ1ZiwgaW5saW5lX3NpemUpO1xuK1x0XHRpZiAoZGF0YV9iaClcbitcdFx0XHRmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVDtcbitcdFx0c3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpO1xuIFxuK1x0XHRkb3duX3dyaXRlKFx1MDAyNmVpLVx1MDAzZWlfZGF0YV9zZW0pO1xuK1x0XHRleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpO1xuK1x0XHRleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGRhdGFfYmgsIG5ld2Jsb2NrLCBhbGxvY2F0ZWRfYmxvY2ssIGZsYWdzKTtcbitcdFx0dXBfd3JpdGUoXHUwMDI2ZWktXHUwMDNlaV9kYXRhX3NlbSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRlcnJvciA9IGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrKGhhbmRsZSwgaW5vZGUsXG4rXHRcdFx0XHRuZXdibG9jaywgYWxsb2NhdGVkX2Jsb2NrLCBkYXRhX2JoKTtcbitcdH1cbiBvdXQ6XG4tXHRicmVsc2UoZGF0YV9iaCk7XG4gXHRrZnJlZShidWYpO1xuIFx0cmV0dXJuIGVycm9yO1xuIH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjE5OjM0LjAwMzAwMjMyOVoiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxOTg1NDU4MzA4NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBJbmxpbmUgRGF0YSBDb252ZXJzaW9uIFBhdGNoIGluIGV4dDQqKlxuXG5Pa2F5LCBzbyBJJ3ZlIGJlZW4gZGlnZ2luZyBpbnRvIHRoaXMgcGF0Y2ggdGhhdCdzIG1vZGlmeWluZyBgZnMvZXh0NC9pbmxpbmUuY2AgaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhlIGNvcmUgb2YgaXQgc2VlbXMgdG8gYmUgY2hhbmdpbmcgaG93IGlubGluZSBkYXRhIGdldHMgY29udmVydGVkIGludG8gYSByZWd1bGFyIGJsb2NrIG9uIGRpc2suIEluc3RlYWQgb2YgdGhlIG9sZCBmdW5jdGlvbnMsIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2AsIHdlJ3JlIG5vdyBsb29raW5nIGF0IGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEl0J3MgYWxzbyBkaXRjaGluZyB0aGUgdXNlIG9mIGBleHQ0X21hcF9ibG9ja3NgIGluIGZhdm9yIG9mIGRpcmVjdGx5IHVzaW5nIGBleHQ0X21iX25ld19ibG9ja3NgIGZvciBibG9jayBhbGxvY2F0aW9uLlxuXG5MZXQncyBicmVhayBkb3duIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AuIEknbSBzZWVpbmcgaXQgYWxsb2NhdGVzIGBpbm9kZV9idWZgIHdpdGggYGttYWxsb2NgLCB3aGljaCBtZWFucyBpdCBpc24ndCBpbml0aWFsaXplZC4gVGhlbiwgaXQgaW1tZWRpYXRlbHkgY29waWVzIHRoZSBlbnRpcmUgYHJhd19pbm9kZWAgaW50byBpdC4gSWYgYW55IGVycm9yIHBvcHMgdXAgbGF0ZXIsIGl0IHJlc3RvcmVzIGByYXdfaW5vZGVgIGZyb20gdGhpcyBiYWNrdXAuIEF0IGZpcnN0IGdsYW5jZSwgdGhpcyBtaWdodCBsb29rIGxpa2UgYSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWUsIGJ1dCBzaW5jZSBgaW5vZGVfYnVmYCBpcyBpbW1lZGlhdGVseSBmaWxsZWQgd2l0aCBhIGNvcHkgb2YgYHJhd19pbm9kZWAsIGl0IHNob3VsZCBiZSBmaW5lLiBJdCBpcyBvbmx5IHVzZWQgaWYgdGhlcmUncyBhIHJlY292ZXJ5LlxuXG5Ob3csIGNoZWNraW5nIHRoZSBgZXh0NF9jb252ZXJ0X2lubGluZV9kYXRhX25vbG9ja2AgZnVuY3Rpb24sIEkgc2VlIGBidWYgPSBrbWFsbG9jKGlubGluZV9zaXplLCBHRlBfTk9GUyk7YCBmb3IgYSBidWZmZXIgdGhhdCBzdG9yZXMgdGhlIGRhdGEsIHdoaWNoIHNlZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggZGF0YSByZWFkIGZyb20gZGlzay4gVGhlIG5ldyBibG9jayBgZGF0YV9iaGAgaXMgYWxsb2NhdGVkIGFuZCB0aGVuIHplcm9lZCBvdXQgd2l0aCBgbWVtc2V0YC4gU28sIHRoZXJlJ3Mgbm8gb2J2aW91cyB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyB1c2VkIGhlcmUuXG5cblRoZSBtYWluIGNvbmNlcm4gaW4gYSBwYXRjaCBsaWtlIHRoaXMgaXMgdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gZWl0aGVyIGdldCB3cml0dGVuIHRvIGRpc2ssIHdoaWNoIHdvdWxkIGJlIGRpc2FzdHJvdXMsIG9yIGxlYWtlZCB0byB1c2VyIHNwYWNlLCB3aGljaCB3b3VsZCBiZSBhIHNlY3VyaXR5IGlzc3VlLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhlIGBpbm9kZV9idWZgIGlzIGEgYmFja3VwIGZvciB0aGUgYHJhd19pbm9kZWAsIHJlYWQgZnJvbSBkaXNrIGFuZCB0aGUgY29weSBpcyBkb25lIGZyb20gaXQgYW5kIHRoZSBvdGhlciBidWZmZXIgaXMgcmVhZCBmcm9tIGRpc2suIFNvLCBhcyBsb25nIGFzIGBleHQ0X2dldF9pbm9kZV9sb2NgIHN1Y2NlZWRzLCBhbmQgYGlub2RlX3NpemVgIGlzIGZ1bGx5IHJlYWQgZnJvbSBkaXNrLCB0aGUgYHJhd19pbm9kZWAgc2hvdWxkIGJlIHZhbGlkLlxuXG5Pa2F5LCBsZXQncyBsb29rIGZvciBtb3JlIGhpbnRzLiBJbnNpZGUgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCwgSSBzZWUgYSBjb3VwbGUgb2Ygc3RydWN0cyBiZWluZyBpbml0aWFsaXplZC4gVGhlIGZpcnN0IGlzIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCwgd2hlcmUgSSBzZWUgYC5zLm5vdF9mb3VuZCA9IDBgIGJlaW5nIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuIEluIEMsIGlmIG9uZSBmaWVsZCBvZiBhIHN0cnVjdHVyZSBpcyBpbml0aWFsaXplZCwgdGhlIG90aGVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gemVybywgc28gbm8gcHJvYmxlbXMgdGhlcmUuIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgLCB3aGVyZSBgLm5hbWVfaW5kZXhgLCBgLm5hbWVgLCBgLnZhbHVlYCwgYW5kIGAudmFsdWVfbGVuYCBhcmUgaW5pdGlhbGl6ZWQgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LCB0aHJvdWdoIHplcm9pbmcuIEFsc28gYGludCBlcnJvcmAsIGBpbnQgaW5vZGVfc2l6ZWAsIGB2b2lkICppbm9kZV9idWYgPSBOVUxMYCwgYW5kIGBzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlO2AgZG9uJ3Qgc2VlbSB0byBiZSBwcm9ibGVtYXRpYy4gVGhleSBhcmUgZWl0aGVyIGFzc2lnbmVkIG9yIHJlLWluaXRpYWxpemVkIGxhdGVyLlxuXG5Mb29raW5nIGF0IGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYCwgc2ltaWxhciB2YXJpYWJsZXMgbGlrZSBgZXh0NF9mc2Jsa190IG5ld2Jsb2NrID0gMGAsIGBzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXJgLCBgc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihpbm9kZS1cdTAwM2VpX3NiKWAsIGFuZCBgdW5zaWduZWQgaW50IGFsbG9jYXRlZF9ibG9jaztgIHNlZW0gc2FmZTsgYGFyYCBpcyBmdWxseSB6ZXJvZWQuXG5cblNvLCBhbSBJIHNlZWluZyBhbnkgcmVhbCByaXNrPyBUaGUgcGF0Y2ggc2VlbXMgdG8gYmUgYWJvdXQgZml4aW5nIGFuIGV4aXN0aW5nIGJ1ZyBkdXJpbmcgaW5saW5lIGRhdGEgY29udmVyc2lvbi4gVGhlIG5ldyBibG9jayBpcyBmdWxseSB6ZXJvZWQgb3V0LCBhbmQgdGhlIGBpbm9kZV9idWZgIGlzIGZpbGxlZCB3aXRoIHZhbGlkIGRhdGEgaW1tZWRpYXRlbHkuIFNvIEknbSB0aGlua2luZyB0aGUgYnVnIGZpeGVkIGJ5IHRoaXMgaXMgbGlrZWx5IGEgY3Jhc2gsIGEgZGVhZGxvY2ssIG9yIGRhdGEgY29ycnVwdGlvbiwgc29tZXRoaW5nIHRoYXQgbWlnaHQgdHJpZ2dlciBLQVNBTiwgYnV0IEkgZG9uJ3Qgc2VlIGFueSBpbnRyb2R1Y3Rpb24gb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbkxldCBtZSBnbyBiYWNrIGFuZCBkb3VibGUgY2hlY2sgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYC4gQWgsIGhlcmUhIFRoZXJlJ3MgYW4gYGV4dDRfZXh0ZW50YCBiZWluZyB1c2VkLiBJdCdzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgYW5kIHRoZW4gYC5lZV9ibG9ja2AsIGAuZWVfbGVuYCBhcmUgYXNzaWduZWQuIEFuZCBpdCBsb29rcyBsaWtlIHRoZSByZXN0IG9mIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBzZXQgbGF0ZXIuIEFzIHRoZSB0b29sIGluZGljYXRlczpcbmBgYGNcbnN0cnVjdCBleHQ0X2V4dGVudCB7XG4gIF9fbGUzMiAgZWVfYmxvY2s7XG4gIF9fbGUxNiAgZWVfbGVuO1xuICBfX2xlMTYgIGVlX3N0YXJ0X2hpO1xuICBfX2xlMzIgIGVlX3N0YXJ0X2xvO1xuICBfX2xlMTYgIGVlX2ZpbGVfYWNsO1xuICBfX2xlMTYgIGVlX2ZsYWdzO1xufTtcbmBgYFxuRXZlcnl0aGluZyB3aXRoaW4gdGhhdCBzdHJ1Y3QgaXMgYXNzaWduZWQuIFNvLCBJIGRvbid0IHNlZSBhbnkgdW5cblxuIiwiSW5wdXRUb2tlbnMiOjUwNzYsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODIxLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MTk6NTMuODU3NTg4NjA2WiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDg3NjA1NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3QgZXh0NF9leHRlbnQgXFxcXHtcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaD00OD1zdHJ1Y3QgZXh0NF9leHRlbnRfdGFpbCB7XFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU1LSAqL1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6NTY6c3RydWN0IGV4dDRfZXh0ZW50IHtcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTU3LVxcdF9fbGUzMlxcdGVlX2Jsb2NrO1xcdC8qIGZpcnN0IGxvZ2ljYWwgYmxvY2sgZXh0ZW50IGNvdmVycyAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoxOTo1My45MDI0NjkwMDJaIiwiU2VxIjoyMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjQ2NjgwMDUxMzksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBFeHRlbnQgU3RydWN0dXJlKipcblxuQWxyaWdodCwgdGltZSB0byBnZXQgZG93biB0byBicmFzcyB0YWNrcyBhbmQgcmVhbGx5IHVuZGVyc3RhbmQgaG93IGV4dGVudHMgYXJlIGltcGxlbWVudGVkIGluIGV4dDQuIEknbSBnb2luZyB0byBwdWxsIHVwIHRoZSBoZWFkZXIgZmlsZSwgc3BlY2lmaWNhbGx5IGBmcy9leHQ0L2V4dDRfZXh0ZW50cy5oYC4gTm8gZmx1ZmYsIGp1c3QgdGhlIGZ1bGwgZGVmaW5pdGlvbiBvZiBgc3RydWN0IGV4dDRfZXh0ZW50YC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBleGFjdCBsYXlvdXQsIHRoZSBmaWVsZHMsIGFuZCBob3cgdGhlIHZhcmlvdXMgZmxhZ3MgYW5kIHZhbHVlcyBhbGwgaW50ZXJhY3QuIFRoaXMgaXMgd2hlcmUgdGhlIHJ1YmJlciBtZWV0cyB0aGUgcm9hZDsgdW5kZXJzdGFuZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgaXRzZWxmIGlzIGtleSB0byBhbnkgcmVhbCBhbmFseXNpcyBvciBtb2RpZmljYXRpb24gb2YgdGhlIGV4dGVudCBpbXBsZW1lbnRhdGlvbi4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290IGluIHRoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MDY4LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjA6MTguNTcwNDc2NDkxWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2V4dDQvZXh0NF9leHRlbnRzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNTAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgNTA6XFx0fTtcXG4gIDUxOlxcdFxcbiAgNTI6XFx0LypcXG4gIDUzOlxcdCAqIFRoaXMgaXMgdGhlIGV4dGVudCBvbi1kaXNrIHN0cnVjdHVyZS5cXG4gIDU0OlxcdCAqIEl0J3MgdXNlZCBhdCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlLlxcbiAgNTU6XFx0ICovXFxuICA1NjpcXHRzdHJ1Y3QgZXh0NF9leHRlbnQge1xcbiAgNTc6XFx0XFx0X19sZTMyXFx0ZWVfYmxvY2s7XFx0LyogZmlyc3QgbG9naWNhbCBibG9jayBleHRlbnQgY292ZXJzICovXFxuICA1ODpcXHRcXHRfX2xlMTZcXHRlZV9sZW47XFx0XFx0LyogbnVtYmVyIG9mIGJsb2NrcyBjb3ZlcmVkIGJ5IGV4dGVudCAqL1xcbiAgNTk6XFx0XFx0X19sZTE2XFx0ZWVfc3RhcnRfaGk7XFx0LyogaGlnaCAxNiBiaXRzIG9mIHBoeXNpY2FsIGJsb2NrICovXFxuICA2MDpcXHRcXHRfX2xlMzJcXHRlZV9zdGFydF9sbztcXHQvKiBsb3cgMzIgYml0cyBvZiBwaHlzaWNhbCBibG9jayAqL1xcbiAgNjE6XFx0fTtcXG4gIDYyOlxcdFxcbiAgNjM6XFx0LypcXG4gIDY0OlxcdCAqIFRoaXMgaXMgaW5kZXggb24tZGlzayBzdHJ1Y3R1cmUuXFxuICA2NTpcXHQgKiBJdCdzIHVzZWQgYXQgYWxsIHRoZSBsZXZlbHMgZXhjZXB0IHRoZSBib3R0b20uXFxuICA2NjpcXHQgKi9cXG4gIDY3OlxcdHN0cnVjdCBleHQ0X2V4dGVudF9pZHgge1xcbiAgNjg6XFx0XFx0X19sZTMyXFx0ZWlfYmxvY2s7XFx0LyogaW5kZXggY292ZXJzIGxvZ2ljYWwgYmxvY2tzIGZyb20gJ2Jsb2NrJyAqL1xcbiAgNjk6XFx0XFx0X19sZTMyXFx0ZWlfbGVhZl9sbztcXHQvKiBwb2ludGVyIHRvIHRoZSBwaHlzaWNhbCBibG9jayBvZiB0aGUgbmV4dCAqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjIwOjE4LjU3MDUzOTY5MVoiLCJTZXEiOjIzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0NTQyMTg3NDcwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgRXh0ZW50IFN0cnVjdHVyZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgYHN0cnVjdCBleHQ0X2V4dGVudGAsIGFuZCBpdCdzIGdvdCBmb3VyIGtleSBmaWVsZHM6IGBlZV9ibG9ja2AgKDMyLWJpdCwgSSByZW1lbWJlciB0aGF0KSwgYGVlX2xlbmAgKDE2LWJpdCwgdGhhdCdzIGV4cGVjdGVkKSwgYW5kIHRoZW4gd2UgaGF2ZSBgZWVfc3RhcnRfaGlgIGFuZCBgZWVfc3RhcnRfbG9gIHdoaWNoIGFyZSBlYWNoIDE2IGFuZCAzMiBiaXRzIHJlc3BlY3RpdmVseS4gR290IGl0LiBOb3csIGluIHRoaXMgcGF0Y2gsIEkgc2VlIHRoZXkncmUgY3JlYXRpbmcgYSBuZXcgYHN0cnVjdCBleHQ0X2V4dGVudGAgbmFtZWQgYG5ld2V4YC4gVGhleSdyZSBpbml0aWFsaXppbmcgYGVlX2Jsb2NrYCB0byAwLCB3aGljaCBpcyBhbHdheXMgYSBzdGFydGluZyBwb2ludCwgYW5kIGBlZV9sZW5gIHRvIDEsIG9rYXksIG1ha2VzIHNlbnNlLiBCdXQgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhpcyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBjYWxsLiBJIG5lZWQgdG8gZGl2ZSBpbnRvIHdoYXQgdGhpcyBmdW5jdGlvbiAqYWN0dWFsbHkqIGRvZXMuIExldCdzIHNlZSB3aGF0J3MgZ29pbmcgb24gdW5kZXIgdGhlIGhvb2Qgd2l0aCB0aGlzIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjE0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjE6MDMuOTkyNDE2MjFaIiwiU2VxIjoyNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MjczMzQ2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZXh0X3N0b3JlX3BibG9ja1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2V4dDRfZXh0ZW50cy5oPTIzMj1zdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2lkeF9wYmxvY2soc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqaXgpXFxuLS1cXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0MS0vKlxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjQyOiAqIGV4dDRfZXh0X3N0b3JlX3BibG9jazpcXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI0My0gKiBzdG9yZXMgYSBsYXJnZSBwaHlzaWNhbCBibG9jayBudW1iZXIgaW50byBhbiBleHRlbnQgc3RydWN0LFxcbi0tXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaC0yNDUtICovXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNDY6c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjQ3LVxcdFxcdFxcdFxcdFxcdCBleHQ0X2ZzYmxrX3QgcGIpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jPTIyNz1zdGF0aWMgaW50IGV4dGVudHNfa3VuaXRfaW5pdChzdHJ1Y3Qga3VuaXQgKnRlc3QpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jLTMxOS1cXHRFWFRfRklSU1RfRVhURU5UKGVoKS1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoRVhUX0RBVEFfTEVOKTtcXG5mcy9leHQ0L2V4dGVudHMtdGVzdC5jOjMyMDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soRVhUX0ZJUlNUX0VYVEVOVChlaCksIEVYVF9EQVRBX1BCTEspO1xcbmZzL2V4dDQvZXh0ZW50cy10ZXN0LmMtMzIxLVxcdGlmICghcGFyYW0gfHwgcGFyYW0tXFx1MDAzZWlzX3Vud3JpdF9hdF9zdGFydClcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTE5OTI9ZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjA4NS1cXHRcXHRcXHRleC1cXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXFx1MDAzZWVlX2Jsb2NrO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIwODY6XFx0XFx0XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKGV4LCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMjA4Ny1cXHRcXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYoZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0yMTk2LVxcdG5lYXJleC1cXHUwMDNlZWVfYmxvY2sgPSBuZXdleHQtXFx1MDAzZWVlX2Jsb2NrO1xcbmZzL2V4dDQvZXh0ZW50cy5jOjIxOTc6XFx0ZXh0NF9leHRfc3RvcmVfcGJsb2NrKG5lYXJleCwgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTIxOTgtXFx0bmVhcmV4LVxcdTAwM2VlZV9sZW4gPSBuZXdleHQtXFx1MDAzZWVlX2xlbjtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTI2MTQ9ZXh0NF9leHRfcm1fbGVhZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMjczOS1cXHRcXHRcXHQvKiB0aGlzIGV4dGVudCBpcyByZW1vdmVkOyBtYXJrIHNsb3QgZW50aXJlbHkgdW51c2VkICovXFxuZnMvZXh0NC9leHRlbnRzLmM6Mjc0MDpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIDApO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTI3NDEtXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz0zMTkxPXN0YXRpYyBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqZXh0NF9zcGxpdF9leHRlbnRfYXQoaGFuZGxlX3QgKmhhbmRsZSxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTMyNDYtXFx0ZXgyLVxcdTAwM2VlZV9sZW4gICA9IGNwdV90b19sZTE2KGVlX2xlbiAtIChzcGxpdCAtIGVlX2Jsb2NrKSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzI0NzpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBuZXdibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmMtMzI0OC1cXHRpZiAoaXNfdW53cml0KVxcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9MzU1Nz1leHQ0X2V4dF9jb252ZXJ0X3RvX2luaXRpYWxpemVkKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ1LVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9ibG9jayA9IGNwdV90b19sZTMyKGVlX2Jsb2NrICsgbWFwX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6MzY0NjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIGVlX3BibGsgKyBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNjQ3LVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM2OTEtXFx0XFx0XFx0YWJ1dF9leC1cXHUwMDNlZWVfYmxvY2sgPSBjcHVfdG9fbGUzMihuZXh0X2xibGsgLSBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYzozNjkyOlxcdFxcdFxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhhYnV0X2V4LCBuZXh0X3BibGsgLSBtYXBfbGVuKTtcXG5mcy9leHQ0L2V4dGVudHMuYy0zNjkzLVxcdFxcdFxcdGV4LVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlZV9sZW4gLSBtYXBfbGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDUtXFx0XFx0XFx0XFx0Y3B1X3RvX2xlMTYoKmFsbG9jYXRlZCAtIHNwbGl0X21hcC5tX2xlbik7XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzc0NjpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNnplcm9fZXgxLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NDctXFx0XFx0XFx0XFx0ZXh0NF9leHRfcGJsb2NrKGV4KSArIHNwbGl0X21hcC5tX2xibGsgK1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmMtMzc2MC1cXHRcXHRcXHRcXHRcXHRcXHRcXHRlZV9ibG9jayk7XFxuZnMvZXh0NC9leHRlbnRzLmM6Mzc2MTpcXHRcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNnplcm9fZXgyLFxcbmZzL2V4dDQvZXh0ZW50cy5jLTM3NjItXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgZXh0NF9leHRfcGJsb2NrKGV4KSk7XFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYz00MjY5PWludCBleHQ0X2V4dF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy00NDczLVxcdHBibGsgPSBuZXdibG9jayArIG9mZnNldDtcXG5mcy9leHQ0L2V4dGVudHMuYzo0NDc0OlxcdGV4dDRfZXh0X3N0b3JlX3BibG9jayhcXHUwMDI2bmV3ZXgsIHBibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTQ0NzUtXFx0bmV3ZXguZWVfbGVuID0gY3B1X3RvX2xlMTYoYXIubGVuKTtcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jPTU3NjM9ZXh0NF9zd2FwX2V4dGVudHMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZTEsXFxuLS1cXG5mcy9leHQ0L2V4dGVudHMuYy01ODk3LVxcdFxcdHRtcF9leCA9ICpleDE7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTg5ODpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgxLCBleHQ0X2V4dF9wYmxvY2soZXgyKSk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NTg5OTpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgyLCBleHQ0X2V4dF9wYmxvY2soXFx1MDAyNnRtcF9leCkpO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTU5MDAtXFx0XFx0ZXgxLVxcdTAwM2VlZV9sZW4gPSBjcHVfdG9fbGUxNihlMl9sZW4pO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjAyNz1pbnQgZXh0NF9leHRfcmVwbGF5X3VwZGF0ZV9leChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBzdGFydCxcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYwODAtXFx0XFx0ZXh0NF9leHRfbWFya19pbml0aWFsaXplZChleCk7XFxuZnMvZXh0NC9leHRlbnRzLmM6NjA4MTpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHBibGspO1xcbmZzL2V4dDQvZXh0ZW50cy5jLTYwODItXFx0ZG93bl93cml0ZShcXHUwMDI2RVhUNF9JKGlub2RlKS1cXHUwMDNlaV9kYXRhX3NlbSk7XFxuLS1cXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM9OTMxPXN0YXRpYyBpbnQgZXh0NF9mY193cml0ZV9pbm9kZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiAqY3JjKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTk2MS1cXHRcXHRleC1cXHUwMDNlZWVfbGVuID0gY3B1X3RvX2xlMTYocmFuZ2UtXFx1MDAzZWxlbik7XFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjk2MjpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soZXgsIHJhbmdlLVxcdTAwM2VwYmxrKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmMtOTYzLVxcdFxcdGlmIChyYW5nZS1cXHUwMDNldW53cml0dGVuKVxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTIxNDg9c3RhdGljIGludCBleHQ0X2ZjX3JlcGxheV9hZGRfcmFuZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTggKnZhbClcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yMjAyLVxcdFxcdFxcdG5ld2V4LmVlX2Jsb2NrID0gY3B1X3RvX2xlMzIoY3VyKTtcXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjIwMzpcXHRcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTIyMDQtXFx0XFx0XFx0XFx0XFx1MDAyNm5ld2V4LCBzdGFydF9wYmxrICsgY3VyIC0gc3RhcnQpO1xcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz0xMDc0PXN0YXRpYyBpbnQgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9mc2Jsa190IGJsb2NrLFxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM1LVxcdFxcdG5ld2V4LmVlX2xlbiA9IGNwdV90b19sZTE2KDEpO1xcbmZzL2V4dDQvaW5saW5lLmM6MTEzNjpcXHRcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4LCBibG9jayk7XFxuZnMvZXh0NC9pbmxpbmUuYy0xMTM3LVxcdFxcdHBhdGggPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsIFxcdTAwMjZuZXdleCwgMCk7XFxuLS1cXG5mcy9leHQ0L21pZ3JhdGUuYz0yMT1zdGF0aWMgaW50IGZpbmlzaF9yYW5nZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9taWdyYXRlLmMtMzMtXFx0bmV3ZXh0LmVlX2xlbiAgID0gY3B1X3RvX2xlMTYobGItXFx1MDAzZWxhc3RfYmxvY2sgLSBsYi1cXHUwMDNlZmlyc3RfYmxvY2sgKyAxKTtcXG5mcy9leHQ0L21pZ3JhdGUuYzozNDpcXHRleHQ0X2V4dF9zdG9yZV9wYmxvY2soXFx1MDAyNm5ld2V4dCwgbGItXFx1MDAzZWZpcnN0X3BibG9jayk7XFxuZnMvZXh0NC9taWdyYXRlLmMtMzUtXFx0LyogTG9ja2luZyBvbmx5IGZvciBjb252ZW5pZW5jZSBzaW5jZSB3ZSBhcmUgb3BlcmF0aW5nIG9uIHRlbXAgaW5vZGUgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6MjE6MDQuMDM3NjkyNTk2WiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQyNjk2MDY2MDcxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSB3ZSBnby4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqUGVla2luZyBpbnRvIGV4dDRfZXh0X3N0b3JlX3BibG9jayoqXG5cblJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhpcyBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBmdW5jdGlvbi4gSXQncyBpbiBgZnMvZXh0NC9leHQ0X2V4dGVudHMuaGAsIHNvIGl0J3MgY2xlYXJseSByZWxhdGVkIHRvIHRoZSBleHRlbnRzIGNvZGUgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIE15IGltbWVkaWF0ZSBleHBlY3RhdGlvbiBpcyB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZvbHZlZCBpbiAqc3RvcmluZyogdGhlIHBoeXNpY2FsIGJsb2NrIChwYmxvY2spIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gZXh0ZW50IG1hcHBpbmdzLiBHaXZlbiBpdHMgbmFtZSwgaXQgc291bmRzIGxpa2UgYSBjb3JlIGJ1aWxkaW5nIGJsb2NrIGZvciBtYW5hZ2luZyB0aG9zZSBleHRlbnQgc3RydWN0dXJlcy4gSSdsbCBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgcmVsYXRlcyB0byB0aGUgb3ZlcmFsbCBleHRlbnQgdHJlZSBzdHJ1Y3R1cmUgYW5kIGhvdyBpdCBoYW5kbGVzIHRoaW5ncyBsaWtlIGJsb2NrIGFsbG9jYXRpb24sIG1ldGFkYXRhIHVwZGF0ZXMsIGFuZCBwb3RlbnRpYWwgZXJyb3IgaGFuZGxpbmcuIEkgd29uZGVyIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBibG9jayBkZXZpY2UgaW50ZXJmYWNlLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIGhvdyB0aGlzIHNwZWNpZmljIHBpZWNlIGZpdHMgaW50byB0aGUgbGFyZ2VyIGV4dDQgZXh0ZW50IGppZ3Nhdy5cblxuXG4iLCJJbnB1dFRva2VucyI6MTE0MjksIk91dHB1dFRva2VucyI6NDAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoyODoxMC45OTgzNTYzNjZaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Njg1NzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvZXh0NC9leHQ0X2V4dGVudHMuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAyNDAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAyNDA6XFx0XFxuIDI0MTpcXHQvKlxcbiAyNDI6XFx0ICogZXh0NF9leHRfc3RvcmVfcGJsb2NrOlxcbiAyNDM6XFx0ICogc3RvcmVzIGEgbGFyZ2UgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIGludG8gYW4gZXh0ZW50IHN0cnVjdCxcXG4gMjQ0OlxcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcXG4gMjQ1OlxcdCAqL1xcbiAyNDY6XFx0c3RhdGljIGlubGluZSB2b2lkIGV4dDRfZXh0X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4LFxcbiAyNDc6XFx0XFx0XFx0XFx0XFx0XFx0IGV4dDRfZnNibGtfdCBwYilcXG4gMjQ4OlxcdHtcXG4gMjQ5OlxcdFxcdGV4LVxcdTAwM2VlZV9zdGFydF9sbyA9IGNwdV90b19sZTMyKCh1bnNpZ25lZCBsb25nKSAocGIgXFx1MDAyNiAweGZmZmZmZmZmKSk7XFxuIDI1MDpcXHRcXHRleC1cXHUwMDNlZWVfc3RhcnRfaGkgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgbG9uZykgKChwYiBcXHUwMDNlXFx1MDAzZSAzMSkgXFx1MDAzZVxcdTAwM2UgMSkgXFx1MDAyNlxcbiAyNTE6XFx0XFx0XFx0XFx0XFx0ICAgICAgMHhmZmZmKTtcXG4gMjUyOlxcdH1cXG4gMjUzOlxcdFxcbiAyNTQ6XFx0LypcXG4gMjU1OlxcdCAqIGV4dDRfaWR4X3N0b3JlX3BibG9jazpcXG4gMjU2OlxcdCAqIHN0b3JlcyBhIGxhcmdlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBpbnRvIGFuIGluZGV4IHN0cnVjdCxcXG4gMjU3OlxcdCAqIGJyZWFraW5nIGl0IGludG8gcGFydHNcXG4gMjU4OlxcdCAqL1xcbiAyNTk6XFx0c3RhdGljIGlubGluZSB2b2lkIGV4dDRfaWR4X3N0b3JlX3BibG9jayhzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICppeCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjJUMTc6Mjg6MTAuOTk4NDI3MDc1WiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjkxNDI2MDU4ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIE1lbW9yeSBJbml0aWFsaXphdGlvbiBpbiBleHQ0IEZpbGUgU3lzdGVtIE9wZXJhdGlvbnMqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGNvZGUgYW5kIHRyeWluZyB0byBlbnN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIHByb3Blcmx5IGluaXRpYWxpemVkLiBGaXJzdCwgSSBzZWUgdGhhdCBgZXh0NF9leHRfc3RvcmVfcGJsb2NrYCBzZXRzIGJvdGggYGVlX3N0YXJ0X2xvYCBhbmQgYGVlX3N0YXJ0X2hpYCB3aXRoaW4gdGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgLiBHb29kLCBgbmV3ZXhgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGFmdGVyIHRoYXQgY2FsbCwgd2hpY2ggaXMgd2hhdCBJIGV4cGVjdC5cblxuVGhlbiwgSSBzaGlmdGVkIG15IGZvY3VzIHRvIGBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrYC4gSSBzZWUgYGJ1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGFuZCB0aGVuIGZpbGxlZCBieSBgZXh0NF9yZWFkX2lubGluZV9kYXRhYC4gTXkgcXVlc3Rpb24gdGhlbiBpczogRG9lcyBgZXh0NF9yZWFkX2lubGluZV9kYXRhYCBmdWxseSBpbml0aWFsaXplIGl0PyBZZXMsIGl0IHJlYWRzIGluIHRoZSBpbmxpbmUgZGF0YSBmcm9tIHRoZSByZWxldmFudCBzb3VyY2UsIHNvIGl0IHNob3VsZCBiZSBmdWxseSBpbml0aWFsaXplZCBhZnRlciB0aGF0IGNhbGwuIEkgY2FuIG1vdmUgb24gdG8gdGhlIG5leHQgc2VjdGlvbi5cblxuTmV4dCB1cCwgSSBzZWUgYG1lbXNldChcdTAwMjZhciwgMCwgc2l6ZW9mKGFyKSlgIHdoaWNoIGVuc3VyZXMgdGhhdCBgYXJgIGlzIGZ1bGx5IHplcm9lZCBvdXQsIHdoaWNoIGlzIGdvb2QuXG5cbkFmdGVyIHRoYXQsIHRoZSBjb2RlIGdyYWJzIGEgbmV3IGJsb2NrLCBhbmQgdGhlbiBnZXRzIGEgYnVmZmVyIGhlYWQuIGBkYXRhX2JoLVx1MDAzZWJfZGF0YWAgaXMgZXhwbGljaXRseSB6ZXJvZWQgb3V0LCBzbyB0aGF0J3MgdGFrZW4gY2FyZSBvZi5cblxuRmluYWxseSwgaW4gdGhlIHN1YnNlcXVlbnQgY29uZGl0aW9uYWwsIEkgc2VlIHRoYXQgaWYgaXQncyBub3QgYSBkaXJlY3RvcnksIGEgYG1lbWNweWAgY29waWVzIGZyb20gYGJ1ZmAgdG8gYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCDigJMgd2hpY2ggaXMgZmluZSBzaW5jZSBgYnVmYCBoYXMgYmVlbiBpbml0aWFsaXplZCDigJMgYWZ0ZXIgYGRhdGFfYmgtXHUwMDNlYl9kYXRhYCB3YXMgemVyb2VkLiBPdGhlcndpc2UsIGBleHQ0X2luaXRfZGlyYmxvY2tgIGlzIGNhbGxlZC4gU28sIEkgbmVlZCB0byBjaGVjayBgZXh0NF9pbml0X2RpcmJsb2NrYCBuZXh0IHRvIG1ha2Ugc3VyZSB0aGF0IGJyYW5jaCBpcyBoYW5kbGVkIGNvcnJlY3RseSBhcyB3ZWxsLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjAyNSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg3MSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjI4OjIwLjE0MTAzNTkwMVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDMyODI2NDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZXh0NF9pbml0X2RpcmJsb2NrXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTM3OTc9ZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmV4dDRfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7XFxuZnMvZXh0NC9leHQ0Lmg6Mzc5ODpleHRlcm4gaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvZXh0NC5oLTM3OTktXFx0XFx0XFx0ICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2ssXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jPTExODU9c3RhdGljIGludCBleHQ0X2NvbnZlcnRfaW5saW5lX2RhdGFfbm9sb2NrKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTEyNTYtXFx0XFx0dW5sb2NrX2J1ZmZlcihkYXRhX2JoKTtcXG5mcy9leHQ0L2lubGluZS5jOjEyNTc6XFx0XFx0ZXJyb3IgPSBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgZGF0YV9iaCxcXG5mcy9leHQ0L2lubGluZS5jLTEyNTgtXFx0XFx0XFx0ICBsZTMyX3RvX2NwdSgoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYnVmKS1cXHUwMDNlaW5vZGUpLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTI4ODI9c3RhdGljIGludCBleHQ0X3RtcGZpbGUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTI5MjItXFxuZnMvZXh0NC9uYW1laS5jOjI5MjM6aW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvbmFtZWkuYy0yOTI0LVxcdFxcdCAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBpbnQgcGFyZW50X2lubyxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz0yOTY5PWludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yOTg4LVxcdFxcdHJldHVybiBQVFJfRVJSKGRpcl9ibG9jayk7XFxuZnMvZXh0NC9uYW1laS5jOjI5ODk6XFx0ZXJyID0gZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGRpcl9ibG9jaywgZGlyLVxcdTAwM2VpX2lubywgTlVMTCwgMCk7XFxuZnMvZXh0NC9uYW1laS5jLTI5OTAtb3V0OlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yMlQxNzoyODoyMC4xODQzMjI2MzZaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTkyMTcxMjkxNzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgTWVtb3J5IEluaXRpYWxpemF0aW9uIGluIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgYGV4dDRfc2V0X2lubGluZV9kYXRhX2Jsb2NrYCBmdW5jdGlvbi4gTXkgaW5pdGlhbCBjb25jZXJuIHdhcyBhYm91dCBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnksIGJ1dCBhZnRlciBjYXJlZnVsIGluc3BlY3Rpb24sIEknbSBmYWlybHkgY29uZmlkZW50IHRoZXJlIGFyZW4ndCBhbnkgaXNzdWVzLlxuXG5GaXJzdCwgSSBzZWUgdGhlIGFsbG9jYXRpb24gb2YgYGlub2RlX2J1ZmAgdXNpbmcgYGttYWxsb2NgLiBUaGVuLCB0aGUgZGF0YSBpcyBjb3BpZWQgZnJvbSBkaXNrIHVzaW5nIGBtZW1jcHlgIGludG8gYGlub2RlX2J1ZmAuICBUaGUgY3JpdGljYWwgcG9pbnQgaGVyZSBpcyB0aGF0IGBleHQ0X2dldF9pbm9kZV9sb2NgIGVuc3VyZXMgYHJhd19pbm9kZWAgcG9pbnRzIHRvIHZhbGlkIGlub2RlIGRhdGEgcmVhZCBmcm9tIHRoZSBkaXNrLiBUaGUgc2l6ZSBvZiB0aGUgY29weSwgYGlub2RlX3NpemVgLCBpcyBkZXRlcm1pbmVkIGJ5IGBFWFQ0X0lOT0RFX1NJWkVgIHdoaWNoIGlzIHRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSBpbm9kZSBvbiBkaXNrLiBTaW5jZSB0aGlzIGRhdGEgY29tZXMgZGlyZWN0bHkgZnJvbSBkaXNrLCBpdCdzIGZ1bGx5IGluaXRpYWxpemVkLiBFdmVuIGlmIGBpbm9kZV9zaXplYCBoYXBwZW5zIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBsb2dpY2FsbHkgXCJ1c2VkXCIgcGFydCBvZiB0aGUgZGF0YSBvbiBkaXNrLCBgbWVtY3B5YCB3aWxsIHN0aWxsIHJlYWQgYSBjb2hlcmVudCBibG9jayBmcm9tIGRpc2sgdG8gdGhlIGJ1ZmZlci5cblxuVGhlIGZvbGxvd2luZyBgbWVtc2V0YCBjYWxscyB6ZXJvIG91dCB0aGUgaW5saW5lIGRhdGEgYXJlYSBhZnRlciB0aGUgZGlzayBkYXRhIGlzIHNhZmVseSBjb3BpZWQuIEltcG9ydGFudGx5LCB0aGVyZSdzIGEgc2FmZWd1YXJkIHVzaW5nIGBtZW1jcHlgIHRoYXQgcmVzdG9yZXMgdGhlIGlub2RlIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZSBpZiBhbiBlcnJvciBvY2N1cnMuICBUaGlzIG1lYW5zIHdl4oCZcmUgZWl0aGVyIHVzaW5nIGluaXRpYWxpemVkIGRpc2sgZGF0YSwgb3IgcmVzdG9yaW5nIGl0IHRvIHRoZSBvcmlnaW5hbCwga25vd24gZ29vZCBzdGF0ZS4gU28sIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaCBoZXJlIGlzIGNsZWFuLlxuXG5UaGUgY2hhbmdlcyBwcmltYXJpbHkgZGVhbCB3aXRoIGJsb2NrIGFsbG9jYXRpb24gYW5kIGlub2RlIHVwZGF0ZXMuIFRoZSBwcmV2aW91cyBjb2RlIHdhcyB1c2luZyBvdGhlciBmdW5jdGlvbnMgdGhhdCB3ZXJlIHByb2JhYmx5IGNhdXNpbmcgaXNzdWVzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG1hbnVhbC4gSSdtIHNhdGlzZmllZCB0aGF0IHRoaXMgcGF0Y2ggZml4ZXMgYSBidWcgd2l0aCBpbmxpbmUgZGF0YSBjb252ZXJzaW9uLiBUaGVyZSdzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlciBzcGFjZSwgbm9yIGlzIGl0IHVzZWQgaW4gYW55IGNvbnRyb2wgZmxvdyBkZWNpc2lvbnMuIFRoZSBzdHJ1Y3R1cmVzIGludm9sdmVkIGFyZSAqZnVsbHkqIGluaXRpYWxpemVkLlxuXG5JIGFsc28gY2hlY2tlZCBmb3IgcGFkZGluZy4gVGhlIGBzdHJ1Y3QgZXh0NF9leHRlbnRgIChhbmQgdGhlIHN0cnVjdHMgdXNlZCBpbiB4YXR0cnMgYW5kIGFsbG9jYXRpb25zKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCwgZWl0aGVyIHRocm91Z2ggemVyb2luZyBvciBieSBzcGVjaWZ5aW5nIHRoZWlyIGluaXRpYWwgdmFsdWVzLiBObyBpc3N1ZXMgdGhlcmUuIEkgZW5zdXJlZCB0aGUgc3RydWN0dXJlIHNpemVzIGFyZSBjb3JyZWN0IGFuZCB0aGF0IHZhbHVlcyBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEluIHNob3J0LCBhbGwgdGhlc2Ugc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBhbnkgbWVtb3J5IGJlaW5nIHVzZWQgaXMgZmlsbGVkIGZyb20gYSBrbm93biBzb3VyY2UuXG5cblRoZSBgYnVmYCB2YXJpYWJsZSBhbGxvY2F0ZWQgZm9yIGlubGluZSBkYXRhIGFsc28gZm9sbG93cyBhIHNpbWlsYXIgcGF0dGVybi4gSXQgaXMgZWl0aGVyIHplcm8taW5pdGlhbGl6ZWQgb3IgZmlsbGVkIHdpdGggdmFsaWQgZGF0YSByZWFkIGZyb20gdGhlIGRpc2suIEZ1cnRoZXJtb3JlLCBgZGF0YV9iaC1cdTAwM2ViX2RhdGFgIGlzIGJlaW5nIHplcm9lZCBvdXQuIFNvIHdlIGhhdmUgdmFsaWQgYW5kIGluaXRpYWxpemVkIGRhdGEuXG5cbioqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGluLWRlcHRoIHJldmlldywgSSBhbSB2ZXJ5IGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gIFRoZSBwYXRjaCBwcm9wZXJseSBpbml0aWFsaXplcyBhbGwgbmV3bHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlcnMgdXNpbmcgYG1lbXNldGAsIHN0cnVjdCBpbml0aWFsaXplciBzeW50YXgsIG9yIGBtZW1jcHlgIGZyb20ga25vd24gYW5kIHZhbGlkIGRhdGEgc291cmNlcyAobGlrZSBkaXNrIGRhdGEpLiAgU3RhbmRhcmQgZGVidWdnaW5nIGFuZCB2YWxpZGF0aW9uIHRvb2xzIChLQVNBTiwgTE9DS0RFUCwgZXRjLikgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiwgbG9ja2luZywgb3Igb3V0LW9mLWJvdW5kcyBhY2Nlc3MgaXNzdWVzLiBUaGVyZWZvcmUsIGEgc3BlY2lhbGl6ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGlzIHBhdGNoLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzgwNCwiT3V0cHV0VG9rZW5zIjo0MTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTgyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTIyVDE3OjI4OjM5LjQwMTQ1Mzg0M1oiLCJTZXEiOjMwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzOTAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIGV4dDQgaW5saW5lIGRhdGEgY29udmVyc2lvbiBsb2dpYyBieSByZXBsYWNpbmcgYGV4dDRfcmVzdG9yZV9pbmxpbmVfZGF0YWAgYW5kIGBleHQ0X2Rlc3Ryb3lfaW5saW5lX2RhdGFfbm9sb2NrYCB3aXRoIGEgbmV3IGZ1bmN0aW9uIGBleHQ0X3NldF9pbmxpbmVfZGF0YV9ibG9ja2AsIGFuZCBtYW51YWxseSBhbGxvY2F0aW5nIGJsb2NrcyB1c2luZyBgZXh0NF9tYl9uZXdfYmxvY2tzYC5cXG5cXG5BbGwgbmV3bHkgaW50cm9kdWNlZCBzdHJ1Y3R1cmVzIGFuZCBidWZmZXJzIGFyZSBmdWxseSBpbml0aWFsaXplZDpcXG4xLiBgaW5vZGVfYnVmYCBpcyBhbGxvY2F0ZWQgd2l0aCBga21hbGxvY2AgYnV0IGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIHdpdGggYSBmdWxsIGNvcHkgb2YgdGhlIHZhbGlkIG9uLWRpc2sgYHJhd19pbm9kZWAgdmlhIGBtZW1jcHlgLlxcbjIuIGBzdHJ1Y3QgZXh0NF9leHRlbnQgbmV3ZXhgIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIGJ1dCBhbGwgb2YgaXRzIGZpZWxkcyAoYGVlX2Jsb2NrYCwgYGVlX2xlbmAsIGBlZV9zdGFydF9oaWAsIGBlZV9zdGFydF9sb2ApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkICh0aGUgbGF0dGVyIHR3byB2aWEgYGV4dDRfZXh0X3N0b3JlX3BibG9ja2ApLCBhbmQgdGhlIHN0cnVjdCBjb250YWlucyBubyBwYWRkaW5nLlxcbjMuIGBzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kIGlzYCBhbmQgYHN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaWAgYXJlIGluaXRpYWxpemVkIHVzaW5nIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCB3aGljaCBndWFyYW50ZWVzIHplcm8taW5pdGlhbGl6YXRpb24gb2YgYWxsIHVubWVudGlvbmVkIGZpZWxkcyBhbmQgcGFkZGluZy5cXG40LiBgc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyYCBpcyBmdWxseSB6ZXJvZWQgdXNpbmcgYG1lbXNldGAuXFxuNS4gVGhlIG5ldyBibG9jayBidWZmZXIgYGRhdGFfYmgtXFx1MDAzZWJfZGF0YWAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgIGJlZm9yZSBpbmxpbmUgZGF0YSBpcyBjb3BpZWQgaW50byBpdC5cXG5cXG5UaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIHJlYWQsIHVzZWQgaW4gY29udHJvbCBmbG93LCBvciBsZWFrZWQgdG8gdXNlciBzcGFjZS4gVGhlIHBhdGNoIHByaW1hcmlseSBhZGRyZXNzZXMgZXh0NCBpbnRlcm5hbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24gKGxpa2VseSB0byBmaXggYSBkZWFkbG9jaywgdHJhbnNhY3Rpb24gaXNzdWUsIG9yIHVzZS1hZnRlci1mcmVlKS4gU3RhbmRhcmQgS0FTQU4sIExPQ0tERVAsIGFuZCBvdGhlciBidWcgZGV0ZWN0b3JzIGFyZSBmdWxseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBwb3RlbnRpYWwgaXNzdWVzIChzdWNoIGFzIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbG9ja2luZyBidWdzKSBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2guIEEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3QgbmVjZXNzYXJ5LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBleHQ0IGlubGluZSBkYXRhIGNvbnZlcnNpb24gbG9naWMgYnkgcmVwbGFjaW5nIGBleHQ0X3Jlc3RvcmVfaW5saW5lX2RhdGFgIGFuZCBgZXh0NF9kZXN0cm95X2lubGluZV9kYXRhX25vbG9ja2Agd2l0aCBhIG5ldyBmdW5jdGlvbiBgZXh0NF9zZXRfaW5saW5lX2RhdGFfYmxvY2tgLCBhbmQgbWFudWFsbHkgYWxsb2NhdGluZyBibG9ja3MgdXNpbmcgYGV4dDRfbWJfbmV3X2Jsb2Nrc2AuXFxuXFxuQWxsIG5ld2x5IGludHJvZHVjZWQgc3RydWN0dXJlcyBhbmQgYnVmZmVycyBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQ6XFxuMS4gYGlub2RlX2J1ZmAgaXMgYWxsb2NhdGVkIHdpdGggYGttYWxsb2NgIGJ1dCBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiB3aXRoIGEgZnVsbCBjb3B5IG9mIHRoZSB2YWxpZCBvbi1kaXNrIGByYXdfaW5vZGVgIHZpYSBgbWVtY3B5YC5cXG4yLiBgc3RydWN0IGV4dDRfZXh0ZW50IG5ld2V4YCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrLCBidXQgYWxsIG9mIGl0cyBmaWVsZHMgKGBlZV9ibG9ja2AsIGBlZV9sZW5gLCBgZWVfc3RhcnRfaGlgLCBgZWVfc3RhcnRfbG9gKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCAodGhlIGxhdHRlciB0d28gdmlhIGBleHQ0X2V4dF9zdG9yZV9wYmxvY2tgKSwgYW5kIHRoZSBzdHJ1Y3QgY29udGFpbnMgbm8gcGFkZGluZy5cXG4zLiBgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfZmluZCBpc2AgYW5kIGBzdHJ1Y3QgZXh0NF94YXR0cl9pbmZvIGlgIGFyZSBpbml0aWFsaXplZCB1c2luZyBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgd2hpY2ggZ3VhcmFudGVlcyB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGFsbCB1bm1lbnRpb25lZCBmaWVsZHMgYW5kIHBhZGRpbmcuXFxuNC4gYHN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcmAgaXMgZnVsbHkgemVyb2VkIHVzaW5nIGBtZW1zZXRgLlxcbjUuIFRoZSBuZXcgYmxvY2sgYnVmZmVyIGBkYXRhX2JoLVxcdTAwM2ViX2RhdGFgIGlzIGZ1bGx5IHplcm9lZCB1c2luZyBgbWVtc2V0YCBiZWZvcmUgaW5saW5lIGRhdGEgaXMgY29waWVkIGludG8gaXQuXFxuXFxuVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSBiZWluZyByZWFkLCB1c2VkIGluIGNvbnRyb2wgZmxvdywgb3IgbGVha2VkIHRvIHVzZXIgc3BhY2UuIFRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGV4dDQgaW50ZXJuYWwgbWV0YWRhdGEgbWFuaXB1bGF0aW9uIChsaWtlbHkgdG8gZml4IGEgZGVhZGxvY2ssIHRyYW5zYWN0aW9uIGlzc3VlLCBvciB1c2UtYWZ0ZXItZnJlZSkuIFN0YW5kYXJkIEtBU0FOLCBMT0NLREVQLCBhbmQgb3RoZXIgYnVnIGRldGVjdG9ycyBhcmUgZnVsbHkgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIGlzc3VlcyAoc3VjaCBhcyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIGxvY2tpbmcgYnVncykgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLiBBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IG5lY2Vzc2FyeS5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowq58bq[1] Phase: Succeeded StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 17:28:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 17:28:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2] Phase: Succeeded StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 17:29:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-22 17:28:51 +0000 UTC FinishedAt: 2026-08-22 17:28:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowq58bq/series-workflowq58bq-convert-artifact-634297935/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-22 17:29:11 +0000 UTC FinishedAt: 2026-08-22 17:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-22 17:29:11 +0000 UTC FinishedAt: 2026-08-22 17:45:20 +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:*8f0f9c56-3bc9-487b-a237-a2100d4b8135,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-workflowq58bq/series-workflowq58bq-convert-artifact-634297935/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": "55a74682-bde0-4791-8534-6729c0f8c2e8", "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-workflowq58bq/series-workflowq58bq-build-action-3880873365/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-22 17:29:11 +0000 UTC FinishedAt: 2026-08-22 17:45:10 +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:*8f0f9c56-3bc9-487b-a237-a2100d4b8135,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-workflowq58bq/series-workflowq58bq-convert-artifact-634297935/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": "55a74682-bde0-4791-8534-6729c0f8c2e8", "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-workflowq58bq/series-workflowq58bq-build-action-3880873365/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-22 17:45:20 +0000 UTC FinishedAt: 2026-08-22 17:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-22 17:45:20 +0000 UTC FinishedAt: 2026-08-22 17:45:20 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-22 17:45:20 +0000 UTC FinishedAt: 2026-08-22 17:45:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-22 17:45:20 +0000 UTC FinishedAt: 2026-08-22 17:45:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},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-workflowq58bq/series-workflowq58bq-convert-artifact-661809566/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-22 17:45:30 +0000 UTC FinishedAt: 2026-08-22 17:47:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-22 17:45:30 +0000 UTC FinishedAt: 2026-08-22 17:47:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*55a74682-bde0-4791-8534-6729c0f8c2e8,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-workflowq58bq/series-workflowq58bq-build-action-3880873365/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-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-22 17:47:29 +0000 UTC FinishedAt: 2026-08-22 17:47:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-22 17:47:29 +0000 UTC FinishedAt: 2026-08-22 17:47:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-22 17:47:29 +0000 UTC FinishedAt: 2026-08-22 18:08:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-22 17:47:29 +0000 UTC FinishedAt: 2026-08-22 18:08:01 +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:*8f0f9c56-3bc9-487b-a237-a2100d4b8135,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-workflowq58bq/series-workflowq58bq-convert-artifact-661809566/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": "9a48b001-c5b1-4afc-b84b-9f2fc18404ce", "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-workflowq58bq/series-workflowq58bq-build-action-795613042/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-22 17:47:29 +0000 UTC FinishedAt: 2026-08-22 18:07:39 +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:*8f0f9c56-3bc9-487b-a237-a2100d4b8135,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-workflowq58bq/series-workflowq58bq-convert-artifact-661809566/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": "9a48b001-c5b1-4afc-b84b-9f2fc18404ce", "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-workflowq58bq/series-workflowq58bq-build-action-795613042/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-22 18:08:01 +0000 UTC FinishedAt: 2026-08-22 18:08:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-22 18:08:01 +0000 UTC FinishedAt: 2026-08-22 18:08:01 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-22 18:08:01 +0000 UTC FinishedAt: 2026-08-22 18:09:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-22 18:08:01 +0000 UTC FinishedAt: 2026-08-22 18:09:46 +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:*9a48b001-c5b1-4afc-b84b-9f2fc18404ce,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-workflowq58bq/series-workflowq58bq-build-action-795613042/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-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +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":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"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:*55a74682-bde0-4791-8534-6729c0f8c2e8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9a48b001-c5b1-4afc-b84b-9f2fc18404ce,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-workflowq58bq/series-workflowq58bq-build-action-3880873365/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-workflowq58bq/series-workflowq58bq-build-action-795613042/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 18:10:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 18:10:01 +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":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"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-workflowq58bq/series-workflowq58bq-convert-artifact-3541719203/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 18:09:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-22 18:09:56 +0000 UTC FinishedAt: 2026-08-22 18:09:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-22 18:09:57 +0000 UTC FinishedAt: 2026-08-22 18:09:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-22 18:10:07 +0000 UTC FinishedAt: 2026-08-22 21:12:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflowq58bq[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["ext4_convert_inline_data","ext4_try_add_inline_entry"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"934753d26f1ed7fadeedf1b9e7df6fe75de303e8","config_name":"upstream-apparmor-kasan.config","enable_configs":["EXT4_FS"],"series_id":"fc23472c-255a-43de-8cfe-7e5a1ccb95dd","tree_name":"torvalds","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-22 18:10:07 +0000 UTC FinishedAt: 2026-08-22 21:12:20 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*55a74682-bde0-4791-8534-6729c0f8c2e8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*9a48b001-c5b1-4afc-b84b-9f2fc18404ce,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-workflowq58bq/series-workflowq58bq-build-action-3880873365/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-workflowq58bq/series-workflowq58bq-build-action-795613042/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-workflowq58bq/series-workflowq58bq-convert-artifact-3541719203/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}