Name: series-workflowhtxjw Phase: Succeeded StartedAt: 2026-09-10 08:18:11 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[0] Phase: Succeeded StartedAt: 2026-09-10 08:18:11 +0000 UTC FinishedAt: 2026-09-10 09:21:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[0].run-triage Phase: Succeeded StartedAt: 2026-09-10 08:18:11 +0000 UTC FinishedAt: 2026-09-10 09:21:57 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "a8bbe92e29262da9d108b5b1e62f26b8aafc4daf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "CFG80211" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "a8bbe92e29262da9d108b5b1e62f26b8aafc4daf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "CFG80211" ], "series_id": "4e2274f5-8093-44d1-856d-1774513c6368" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "nl80211_new_station" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjE5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NGRzgwMjExJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmw4MDIxMV9uZXdfc3RhdGlvbiYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCkuXG5cbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0XG4tLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG5AQCAtOTMyOCw3ICYjNDM7OTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMF07XG4tXHRpbnQgZXJyO1xuJiM0MztcdGludCBlcnIsIGxpbmtfaWQ7XG4gXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbiBcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuQEAgLTkzNzYsNiAmIzQzOzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuIFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbiBcbiYjNDM7XHRpZiAod2Rldi1cdTAwM2V2YWxpZF9saW5rcykge1xuJiM0MztcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRpZiAoISh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzIFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTElOSztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7XG4gXHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTtcbiBcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7XG5AQCAtOTU1Niw4ICYjNDM7OTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcbiBcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbiBcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG4tXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbiYjNDM7XHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbiYjNDM7XHRcdGxpbmtfaWQgPSB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzID8gcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIDogMDtcbiYjNDM7XHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5FVERPV047XG4mIzQzO1xuIFx0XHQvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovXG4gXHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmxhZ3MgXHUwMDI2IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8XG4gXHRcdCAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSlcbkBAIC05NjAyLDYgJiM0Mzs5NjE2LDE5IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxuJiM0MztcdFx0ICogbGliZXJ0YXMgZG9lc24mIzM5O3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuJiM0MztcdFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xuJiM0MztcdFx0ICogdXNlIHRoYXQgYXMgdGhlIHN0YXJ0ZWQgaW5kaWNhdGlvbiBpbnN0ZWFkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xuJiM0MztcdFx0XHRpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuJiM0MztcdFx0fSBlbHNlIGlmICghd2Rldi1cdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5FVERPV047XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xuIFx0XHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XG4gXG5AQCAtOTY0OSwyNyAmIzQzOzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHQvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqL1xuIFxuLVx0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbi1cdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7XG4tXHRcdFx0ZXJyID0gLUVOT0xJTks7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKSB7XG4tXHRcdFx0ZXJyID0gLUVJTlZBTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0fVxuLVxuIFx0cGFyYW1zLmVwcF9wZWVyID1cbiBcdFx0bmxhX2dldF9mbGFnKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XG4gXG4gXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcdTAwMjZwYXJhbXMpO1xuLW91dDpcbiBcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7Q0ZHODAyMTEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtubDgwMjExX25ld19zdGF0aW9uJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIgbmw4MDIxMV9uZXdfc3RhdGlvbigpIGluIHRoZSBjZmc4MDIxMSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIHN1YnN5c3RlbS4gSXQgbW92ZXMgbGluayBJRCB2YWxpZGF0aW9uIGVhcmxpZXIgYW5kIGludHJvZHVjZXMgbmV3IGludGVyZmFjZSBzdGF0ZSB2YWxpZGF0aW9ucyAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGZvciBBUC9QMlBfR08gYW5kIG1lc2ggaW50ZXJmYWNlcykgYmVmb3JlIGFsbG93aW5nIGEgbmV3IHN0YXRpb24gdG8gYmUgcmVnaXN0ZXJlZC4gVGhpcyBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBubDgwMjExIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY5OGQ0NDhlY2FlNjFmZDg5NzEzY2FhZThjNzdiZTYwODdkYWZmZTMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAxMCAwOToxOTo1MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtOTMyOCw3ICYjNDM7OTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0mZ3Q7dXNlcl9wdHJbMF07Ci0JaW50IGVycjsKJiM0MzsJaW50IGVyciwgbGlua19pZDsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0mZ3Q7dXNlcl9wdHJbMV07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtJmd0O25ldGRldjsKIAlzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtczsKQEAgLTkzNzYsNiAmIzQzOzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAJcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkID0KIAkJbmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby0mZ3Q7YXR0cnMpOwogCiYjNDM7CWlmICh3ZGV2LSZndDt2YWxpZF9saW5rcykgewomIzQzOwkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoISh3ZGV2LSZndDt2YWxpZF9saW5rcyAmYW1wOyBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpCiYjNDM7CQkJcmV0dXJuIC1FTk9MSU5LOwomIzQzOwl9IGVsc2UgewomIzQzOwkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmZ3Q7PSAwKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiAJaWYgKGluZm8tJmd0O2F0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHsKIAkJbWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLSZndDthdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTsKIAkJcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7CkBAIC05NTU2LDggJiM0Mzs5NTY2LDEyIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCiAJc3dpdGNoICh3ZGV2LSZndDtpZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKJiM0MzsJCS8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi8KJiM0MzsJCWxpbmtfaWQgPSB3ZGV2LSZndDt2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7CiYjNDM7CQlpZiAoIXdkZXYtJmd0O2xpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbCkKJiM0MzsJCQlyZXR1cm4gLUVORVRET1dOOwomIzQzOwogCQkvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovCiAJCWlmICghKHJkZXYtJmd0O3dpcGh5LmZsYWdzICZhbXA7IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8CiAJCSAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICZhbXA7IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKQpAQCAtOTYwMiw2ICYjNDM7OTYxNiwxOSBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJCXJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgomIzQzOwkJLyoKJiM0MzsJCSAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC4KJiM0MzsJCSAqIGxpYmVydGFzIGRvZXNuJiMzOTt0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGUKJiM0MzsJCSAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc28KJiM0MzsJCSAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHJkZXYtJmd0O29wcy0mZ3Q7bGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkgewomIzQzOwkJCWlmICghd2Rldi0mZ3Q7dS5tZXNoLmNoYW5kZWYuY2hhbikKJiM0MzsJCQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsJCX0gZWxzZSBpZiAoIXdkZXYtJmd0O3UubWVzaC5iZWFjb25faW50ZXJ2YWwpIHsKJiM0MzsJCQlyZXR1cm4gLUVORVRET1dOOwomIzQzOwkJfQomIzQzOwogCQkvKiBpZ25vcmUgdUFQU0QgZGF0YSAqLwogCQlwYXJhbXMuc3RhX21vZGlmeV9tYXNrICZhbXA7PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDsKIApAQCAtOTY0OSwyNyAmIzQzOzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAKIAkvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqLwogCi0JaWYgKHdkZXYtJmd0O3ZhbGlkX2xpbmtzKSB7Ci0JCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmx0OyAwKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKCEod2Rldi0mZ3Q7dmFsaWRfbGlua3MgJmFtcDsgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7Ci0JCQllcnIgPSAtRU5PTElOSzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmZ3Q7PSAwKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAlwYXJhbXMuZXBwX3BlZXIgPQogCQlubGFfZ2V0X2ZsYWcoaW5mby0mZ3Q7YXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7CiAKIAllcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCAmYW1wO3BhcmFtcyk7Ci1vdXQ6CiAJZGV2X3B1dChwYXJhbXMudmxhbik7CiAJcmV0dXJuIGVycjsKIH0KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA0MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIEV2YWx1YXRpb246IFdpcmVsZXNzIE5ldHdvcmsgSW50ZXJmYWNlIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBzZXJpZXMsIGZvY3VzaW5nIG9uIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYCwgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IHBhcmFtZXRlcnMg4oCTIHRoZSBgRm9jdXNTeW1ib2xzYCwgYEVuYWJsZUNvbmZpZ3NgLCBgV29ydGhGdXp6aW5nYCBhc3Nlc3NtZW50LCBhbmQgdGhlIHJlYXNvbmluZyBiZWhpbmQgaXQgYWxsLgoKRmlyc3QsIGxldCYjMzk7cyBsb29rIGF0IHdoYXQgdGhlIHBhdGNoIGFjdHVhbGx5ICpkb2VzKi4gSXQmIzM5O3MgbWVzc2luZyB3aXRoIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2hpY2ggaGFuZGxlcyBuZXcgc3RhdGlvbiBjb25uZWN0aW9ucyBpbiB0aGUgd2lyZWxlc3MgbmV0d29ya2luZyBzdGFjay4gU3BlY2lmaWNhbGx5OgoKMS4gIEl0IHNodWZmbGVzIGFyb3VuZCB0aGUgYGxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhbmQgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBjaGVjayBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHB1dHRpbmcgaXQgaGlnaGVyIHVwLiBUaGF0JiMzOTtzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIHBvdGVudGlhbGx5IG1ha2luZyB0aGUgY29kZSBmbG93IGRpZmZlcmVudGx5LgoyLiAgSXQgcmV3b3JrcyBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0aGF0IGRlYWxzIHdpdGggZGlmZmVyZW50IGludGVyZmFjZSB0eXBlcyAoYE5MODAyMTFfSUZUWVBFX0FQYCwgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gLCBgTkw4MDIxMV9JRlRZUEVfUDJQX0dPYCwgYE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlRgKS4gVGhlIHBhdGNoIHJlbW92ZXMgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGZyb20gb25lIG9mIHRoZSBjYXNlcy4gSXQgYWxzbyBhZGRzIG5ldyBjaGVja3MgaW5zaWRlIHRoZXNlIGNhc2VzOgogICAgKiAgIEZvciBBUCBhbmQgUDJQX0dPLCBpdCBub3cgY2hlY2tzIGB3ZGV2LSZndDtsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWxgIGJlZm9yZSBhZGRpbmcgdGhlIHN0YXRpb24uCiAgICAqICAgRm9yIE1FU0hfUE9JTlQsIGl0IGNoZWNrcyBgd2Rldi0mZ3Q7dS5tZXNoLmNoYW5kZWYuY2hhbmAgKExpYmVydGFzKSBvciBgd2Rldi0mZ3Q7dS5tZXNoLmJlYWNvbl9pbnRlcnZhbGAuCjMuICBGaW5hbGx5LCBpdCByZW1vdmVzIGEgcmVkdW5kYW50IGxpbmsgY2hlY2sgYW5kIGFuIGBvdXRgIGxhYmVsIGF0IHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uLgoKVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBub3QganVzdCBhIGNsZWFudXAuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlc2UgbmV3IGNoZWNrcywgcGFydGljdWxhcmx5IHJlbGF0ZWQgdG8gYGJlYWNvbl9pbnRlcnZhbGAgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbnMsIGxvb2tzIGxpa2UgaXQmIzM5O3MgYWRkcmVzc2luZyBzb21lIHNwZWNpZmljIHdpcmVsZXNzIGludGVyZmFjZSBiZWhhdmlvci4gIEkgbmVlZCB0byBkaWcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgS2NvbmZpZyBvcHRpb25zIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBNeSBpbW1lZGlhdGUgaHVuY2ggaXMgdGhhdCB0aGlzIGlzIGxpa2VseSByZWxhdGVkIHRvIHJvYnVzdG5lc3MgYW5kIHNlY3VyaXR5LCBsaWtlbHkgaW4gaGFuZGxpbmcgb2YgYmVhY29uIGZyYW1lcyBvciBvdGhlciB3aXJlbGVzcyBjb250cm9sIGRhdGEuIEkmIzM5O2xsIHVzZSBteSB0b29scyB0byBpbnNwZWN0IHRoZSBjb2RlIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbnMgYW5kIHdvcmsgb3V0IHRoZSBkZXRhaWxzIGZvciBnZW5lcmF0aW5nIHN5emthbGxlciBwYXJhbWV0ZXJzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL25sODAyMTEuYz05MTU2PXN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTMyNy1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTMyODpzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTMyOS17XG4tLVxubmV0L3dpcmVsZXNzL25sODAyMTEuYz0xOTc0MD1zdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfc21hbGxfb3BzIG5sODAyMTFfc21hbGxfb3BzW10gPSB7XG4tLVxubmV0L3dpcmVsZXNzL25sODAyMTEuYy0xOTg0Ni1cdFx0LnZhbGlkYXRlID0gR0VOTF9ET05UX1ZBTElEQVRFX1NUUklDVCB8IEdFTkxfRE9OVF9WQUxJREFURV9EVU1QLFxubmV0L3dpcmVsZXNzL25sODAyMTEuYzoxOTg0NzpcdFx0LmRvaXQgPSBubDgwMjExX25ld19zdGF0aW9uLFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy0xOTg0OC1cdFx0LmZsYWdzID0gR0VOTF9VTlNfQURNSU5fUEVSTSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1Mjc3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBkaXZpbmcgaW50byB0aGUgY29kZToKCioqRGl2aW5nIGludG8gdGhlIFdpcmVsZXNzIEtlcm5lbCBNb2R1bGVzKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9ucyBmb3IgdGhlc2Ugd2lyZWxlc3MgbW9kdWxlcywgYG5sODAyMTEuY2AgYW5kIGBjZmc4MDIxMWAuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB0aGUgc3RhbmRhcmQgbG9jYXRpb25zIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uIEkmIzM5O2xsIHN0YXJ0IHdpdGggYG5ldC93aXJlbGVzcy9LY29uZmlnYCBhbmQgYG5ldC93aXJlbGVzcy9NYWtlZmlsZWAuIFRob3NlIGZpbGVzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMuIEtjb25maWcgd2lsbCBvdXRsaW5lIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhZmZlY3QgY29tcGlsYXRpb24sIGFuZCB0aGUgTWFrZWZpbGUgc2hvdWxkIHRlbGwgbWUgaG93IHRoZXNlIHNvdXJjZSBmaWxlcyBmaXQgaW50byB0aGUgYnVpbGQgcHJvY2VzcywgaW5jbHVkaW5nIGFueSBvdGhlciBkZXBlbmRlbmNpZXMgbGlrZSBvdGhlciBrZXJuZWwgbW9kdWxlcyBhbmQgbGlicmFyaWVzLiBIb3BlZnVsbHksIEkmIzM5O2xsIGZpbmQgd2hhdCBJIG5lZWQgdGhlcmUgcHJldHR5IHF1aWNrbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmw4MDIxMVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL01ha2VmaWxlPTc9b2JqLSQoQ09ORklHX1dFWFRfUFJJVikgJiM0Mzs9IHdleHQtcHJpdi5vXG5uZXQvd2lyZWxlc3MvTWFrZWZpbGUtOC1cbm5ldC93aXJlbGVzcy9NYWtlZmlsZTo5OmNmZzgwMjExLXkgJiM0Mzs9IGNvcmUubyBzeXNmcy5vIHJhZGlvdGFwLm8gdXRpbC5vIHJlZy5vIHNjYW4ubyBubDgwMjExLm9cbm5ldC93aXJlbGVzcy9NYWtlZmlsZS0xMC1jZmc4MDIxMS15ICYjNDM7PSBtbG1lLm8gaWJzcy5vIHNtZS5vIGNoYW4ubyBldGh0b29sLm8gbWVzaC5vIGFwLm8gdHJhY2UubyBvY2Iub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU2NjIKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipOYXZpZ2F0aW5nIHRoZSBXaXJlbGVzcyBDb25maWd1cmF0aW9uIExhbmRzY2FwZSoqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7dmUgZ290IHRoZSB3aXJlbGVzcyBiaXRzIGNvdmVyZWQuIE15IGZpcnN0IHN0b3Agd2lsbCBiZSBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNvcmUgd2lyZWxlc3Mgc3RhY2sgY29tcG9uZW50cy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYENGRzgwMjExYCBhbmQgYE5MODAyMTFgLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXkmIzM5O3JlIGJvdGggZW5hYmxlZCAob3IgYXQgbGVhc3QsIGFwcHJvcHJpYXRlbHkgY29uZmlndXJlZCksIGFuZCB1bmRlcnN0YW5kIGFueSBkZXBlbmRlbmNpZXMgb3IgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgYmFzaWMsIGJ1dCBmb3VuZGF0aW9uYWw7IGdvdHRhIGNvbmZpcm0gdGhhdCB0aGUgY29yZSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZSBpcyBwcm9wZXJseSBlbmFibGVkIGJlZm9yZSBJIGdvIGZ1cnRoZXIuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyByZXZlYWwgYWJvdXQgdGhlc2UgdHdvLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDRkc4MDIxMSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC93aXJlbGVzcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MvS2NvbmZpZz0xND1jb25maWcgV0VYVF9QUklWXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTYtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNzpjb25maWcgQ0ZHODAyMTFcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE4LVx0dHJpc3RhdGUgXCYjMzQ7Y2ZnODAyMTEgLSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIEFQSVwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnPTM4PWNvbmZpZyBOTDgwMjExX1RFU1RNT0RFXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctNTEtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo1Mjpjb25maWcgQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy01My1cdGJvb2wgXCYjMzQ7ZW5hYmxlIGRldmVsb3BlciB3YXJuaW5nc1wmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTY3LVxubmV0L3dpcmVsZXNzL0tjb25maWc6Njg6Y29uZmlnIENGRzgwMjExX0NFUlRJRklDQVRJT05fT05VU1xubmV0L3dpcmVsZXNzL0tjb25maWctNjktXHRib29sIFwmIzM0O2NmZzgwMjExIGNlcnRpZmljYXRpb24gb251c1wmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTg4LVxubmV0L3dpcmVsZXNzL0tjb25maWc6ODk6Y29uZmlnIENGRzgwMjExX1JFUVVJUkVfU0lHTkVEX1JFR0RCXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05MC1cdGJvb2wgXCYjMzQ7cmVxdWlyZSByZWdkYiBzaWduYXR1cmVcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctOTgtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo5OTpjb25maWcgQ0ZHODAyMTFfVVNFX0tFUk5FTF9SRUdEQl9LRVlTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMDAtXHRib29sIFwmIzM0O2FsbG93IHJlZ2RiIGtleXMgc2hpcHBlZCB3aXRoIHRoZSBrZXJuZWxcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTEwLVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTExOmNvbmZpZyBDRkc4MDIxMV9FWFRSQV9SRUdEQl9LRVlESVJcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMi1cdHN0cmluZyBcJiMzNDthZGRpdGlvbmFsIHJlZ2RiIGtleSBkaXJlY3RvcnlcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTIxLVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTIyOmNvbmZpZyBDRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFNcbm5ldC93aXJlbGVzcy9LY29uZmlnLTEyMy1cdGJvb2wgXCYjMzQ7Y2ZnODAyMTEgcmVndWxhdG9yeSBzdXBwb3J0IGZvciBjZWxsdWxhciBiYXNlIHN0YXRpb24gaGludHNcJiMzNDtcbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzQtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxMzU6Y29uZmlnIENGRzgwMjExX1JFR19SRUxBWF9OT19JUlxubmV0L3dpcmVsZXNzL0tjb25maWctMTM2LVx0Ym9vbCBcJiMzNDtjZmc4MDIxMSBzdXBwb3J0IGZvciBOT19JUiByZWxheGF0aW9uXCYjMzQ7XG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTU4LVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTU5OmNvbmZpZyBDRkc4MDIxMV9ERUZBVUxUX1BTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNjAtXHRib29sIFwmIzM0O2VuYWJsZSBwb3dlcnNhdmUgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTE2OC1cbm5ldC93aXJlbGVzcy9LY29uZmlnOjE2OTpjb25maWcgQ0ZHODAyMTFfREVCVUdGU1xubmV0L3dpcmVsZXNzL0tjb25maWctMTcwLVx0Ym9vbCBcJiMzNDtjZmc4MDIxMSBEZWJ1Z0ZTIGVudHJpZXNcJiMzNDtcbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzYtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNzc6Y29uZmlnIENGRzgwMjExX0NSREFfU1VQUE9SVFxubmV0L3dpcmVsZXNzL0tjb25maWctMTc4LVx0Ym9vbCBcJiMzNDtzdXBwb3J0IENSREFcJiMzNDsgaWYgRVhQRVJUXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTg2LVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTg3OmNvbmZpZyBDRkc4MDIxMV9XRVhUXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xODgtXHRib29sIFwmIzM0O2NmZzgwMjExIHdpcmVsZXNzIGV4dGVuc2lvbnMgY29tcGF0aWJpbGl0eVwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTE5My1cbm5ldC93aXJlbGVzcy9LY29uZmlnOjE5NDpjb25maWcgQ0ZHODAyMTFfS1VOSVRfVEVTVFxubmV0L3dpcmVsZXNzL0tjb25maWctMTk1LVx0dHJpc3RhdGUgXCYjMzQ7S1VuaXQgdGVzdHMgZm9yIGNmZzgwMjExXCYjMzQ7IGlmICFLVU5JVF9BTExfVEVTVFNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODA3CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLY29uZmlnIERlcGVuZGVuY3kgRGVlcCBEaXZlKioKCk9rYXksIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55IENGRzgwMjExIGRlcGVuZGVuY2llcyBsdXJraW5nIHdpdGhpbiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBJIG5lZWQgdG8gc3RhcnQgY29tYmluZyB0aHJvdWdoIHRob3NlIGZpbGVzLCBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55IGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIG9yIGNvbmRpdGlvbmFsIGluY2x1c2lvbnMgdGhhdCByZWxhdGUgdG8gQ0ZHODAyMTEuIEl0JiMzOTtzIGEgc3RhbmRhcmQgc3RlcCwgcmVhbGx5IC0gZ290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyB0byBlbnN1cmUgdGhlIG1vZHVsZSBvciBmZWF0dXJlIEkmIzM5O20gd29ya2luZyBvbiBpcyBjb3JyZWN0bHkgaG9va2VkIGludG8gdGhlIGV4aXN0aW5nIHdpcmVsZXNzIGluZnJhc3RydWN0dXJlLiBHb3R0YSBiZSBtZXRpY3Vsb3VzIGhlcmUuIEkmIzM5O20gdGhpbmtpbmcgSSYjMzk7bGwgc3RhcnQgd2l0aCB0aGUgbW9zdCByZWxldmFudCBLY29uZmlnIGZpbGVzIGZpcnN0LCBwcm9iYWJseSB0aG9zZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBhcmVhIEkmIzM5O20gbW9kaWZ5aW5nLiBUaGVuLCBJJiMzOTtsbCBicm9hZGVuIHRoZSBzZWFyY2gsIG1heWJlIHVzaW5nIGBncmVwYCBvciBhIHNpbWlsYXIgdG9vbCB0byBsb29rIGZvciBhbnl0aGluZyBzdXNwaWNpb3VzLiBUaGlzIGlzIHJvdXRpbmUsIGJ1dCB0aG9yb3VnaG5lc3MgaXMga2V5IGZvciBhdm9pZGluZyBidWlsZCBlcnJvcnMgb3IgcnVudGltZSBzdXJwcmlzZXMgbGF0ZXIgb24uIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgV0lSRUxFU1NfRVhUXG4gICAzOlx0XHRib29sXG4gICA0Olx0XG4gICA1Olx0Y29uZmlnIFdFWFRfQ09SRVxuICAgNjpcdFx0ZGVmX2Jvb2wgeVxuICAgNzpcdFx0ZGVwZW5kcyBvbiBDRkc4MDIxMV9XRVhUIHx8IFdJUkVMRVNTX0VYVFxuICAgODpcdFxuICAgOTpcdGNvbmZpZyBXRVhUX1BST0NcbiAgMTA6XHRcdGRlZl9ib29sIHlcbiAgMTE6XHRcdGRlcGVuZHMgb24gUFJPQ19GU1xuICAxMjpcdFx0ZGVwZW5kcyBvbiBXRVhUX0NPUkVcbiAgMTM6XHRcbiAgMTQ6XHRjb25maWcgV0VYVF9QUklWXG4gIDE1Olx0XHRib29sXG4gIDE2Olx0XG4gIDE3Olx0Y29uZmlnIENGRzgwMjExXG4gIDE4Olx0XHR0cmlzdGF0ZSBcJiMzNDtjZmc4MDIxMSAtIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gQVBJXCYjMzQ7XG4gIDE5Olx0XHRkZXBlbmRzIG9uIFJGS0lMTCB8fCAhUkZLSUxMXG4gIDIwOlx0XHRzZWxlY3QgRldfTE9BREVSXG4gIDIxOlx0XHRzZWxlY3QgQ1JDMzJcbiAgMjI6XHRcdCMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoaXMgd2hlbiBjZXJ0aWZpY2F0ZXMgYXJlIGNoYW5nZWQgYW5kIGFyZVxuICAyMzpcdFx0IyB1c2luZyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIHRob3VnaCByaWdodCBub3cgdGhleSBzaG91bGRuJiMzOTt0XG4gIDI0Olx0XHQjICh0aGlzIGlzIGhlcmUgcmF0aGVyIHRoYW4gYmVsb3cgdG8gYWxsb3cgaXQgdG8gYmUgYSBtb2R1bGUpXG4gIDI1Olx0XHRzZWxlY3QgQ1JZUFRPX1NIQTI1NiBpZiBDRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVNcbiAgMjY6XHRcdGhlbHBcbiAgMjc6XHRcdCAgY2ZnODAyMTEgaXMgdGhlIExpbnV4IHdpcmVsZXNzIExBTiAoODAyLjExKSBjb25maWd1cmF0aW9uIEFQSS5cbiAgMjg6XHRcdCAgRW5hYmxlIHRoaXMgaWYgeW91IGhhdmUgYSB3aXJlbGVzcyBkZXZpY2UuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIGRvY3VtZW50YXRpb24gb24gdGhlIHdpcmVsZXNzIHdpa2k6XG4gIDMxOlx0XG4gIDMyOlx0XHQgIGh0dHBzOi8vd2lyZWxlc3Mud2lraS5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvRG9jdW1lbnRhdGlvbi9jZmc4MDIxMVxuICAzMzpcdFxuICAzNDpcdFx0ICBXaGVuIGJ1aWx0IGFzIGEgbW9kdWxlIGl0IHdpbGwgYmUgY2FsbGVkIGNmZzgwMjExLlxuICAzNTpcdFxuICAzNjpcdGlmIENGRzgwMjExXG4gIDM3Olx0XG4gIDM4Olx0Y29uZmlnIE5MODAyMTFfVEVTVE1PREVcbiAgMzk6XHRcdGJvb2wgXCYjMzQ7bmw4MDIxMSB0ZXN0bW9kZSBjb21tYW5kXCYjMzQ7XG4gIDQwOlx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2MDIKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAxODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBhbmQgUmVhY2hhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSBJJiMzOTttIHRoaW5raW5nIGFib3V0IGl0cyBpbXBsaWNhdGlvbnMgZm9yIGZ1enppbmcsIHNwZWNpZmljYWxseSB3aXRoIHN5emthbGxlci4gVGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2Ugc2VlbXMgdG8gYmUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gIHdpdGhpbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AuIFJpZ2h0LCB0aGlzIGlzIHdoZXJlIHRoZSBgTkw4MDIxMV9DTURfTkVXX1NUQVRJT05gIGNvbW1hbmQgaXMgaGFuZGxlZCwgYWxsIHRocm91Z2ggR2VuZXJpYyBOZXRsaW5rJiMzOTtzIGBubDgwMjExYCBpbnRlcmZhY2UuIEEgcXVpY2sgbWVudGFsIGNoZWNrOiBpcyBgbmw4MDIxMWAgYWNjZXNzaWJsZSB3aXRoaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgc2V0dXAsIGVzcGVjaWFsbHkgaW4gdGhvc2UgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBBYnNvbHV0ZWx5LiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIGBtYWM4MDIxMV9od3NpbWAgYW5kIGBjZmc4MDIxMWAgaGVyZSwgd2hpY2ggYXJlIHByZXR0eSBtdWNoIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIHN5emthbGxlciBmdXp6aW5nIGluIHRoaXMgYXJlYS4gR2VuZXJpYyBOZXRsaW5rIHNvY2tldHMsIGBubDgwMjExYCBpbmNsdWRlZCwgYXJlIHJlYWRpbHkgY3JlYXRhYmxlIGFuZCBxdWVyeWFibGUsIG5vIHBoeXNpY2FsIGhhcmR3YXJlIG5lY2Vzc2FyeS4gR29vZC4gTm93LCBJIHNob3VsZCBkaXZlIGludG8gdGhlIGFjdHVhbCBmdW5jdGlvbiBpdHNlbGYsIGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIGdldCBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiBpdHMgd29ya2luZ3MuIEkgbmVlZCB0byB0cmFjZSB0aHJvdWdoIHRoZSBjb2RlLCBtYXAgb3V0IGNhbGxlcnMsIGFuZCBwaW5wb2ludCBhbnkgcG90ZW50aWFsbHkgaW50ZXJlc3Rpbmcgc3ltYm9scy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTMyOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5MzI4Olx0c3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG45MzI5Olx0e1xuOTMzMDpcdFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbjkzMzE6XHRcdGludCBlcnIsIGxpbmtfaWQ7XG45MzMyOlx0XHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbjkzMzM6XHRcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbjkzMzQ6XHRcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuOTMzNTpcdFx0dTggKm1hY19hZGRyID0gTlVMTDtcbjkzMzY6XHRcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxuOTMzNzpcdFx0XHRcdCBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKTtcbjkzMzg6XHRcbjkzMzk6XHRcdG1lbXNldChcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcbjkzNDA6XHRcbjkzNDE6XHRcdGlmICghZGV2IFx1MDAyNlx1MDAyNiB3ZGV2LVx1MDAzZWlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pXG45MzQyOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM0MzpcdFxuOTM0NDpcdFx0aWYgKCFyZGV2LVx1MDAzZW9wcy1cdTAwM2VhZGRfc3RhdGlvbilcbjkzNDU6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTM0NjpcdFxuOTM0NzpcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NQUNdKVxuOTM0ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNDk6XHRcbjkzNTA6XHRcdGlmICh3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4gfHxcbjkzNTE6XHRcdCAgICB3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xuOTM1MjpcdFx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXG45MzUzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzU0Olx0XHRcdGlmICh3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xuOTM1NTpcdFx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxuOTM1NjpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzU3Olx0XG45MzU4Olx0XHRcdFx0LyogT25seSBOTUkgc3RhdGlvbnMgcmVjZWl2ZSB0aGUgSFQvVkhUL0hFIGNhcGFiaWxpdGllcyAqL1xuOTM1OTpcdFx0XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSB8fFxuOTM2MDpcdFx0XHRcdCAgICBpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WSFRfQ0FQQUJJTElUWV0gfHxcbjkzNjE6XHRcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSEVfQ0FQQUJJTElUWV0pXG45MzYyOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNjM6XHRcdFx0fVxuOTM2NDpcdFx0fSBlbHNlIHtcbjkzNjU6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMXSlcbjkzNjY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNjc6XHRcbjkzNjg6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcbjkzNjk6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNzA6XHRcbjkzNzE6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfQUlEXSBcdTAwMjZcdTAwMjZcbjkzNzI6XHRcdFx0ICAgICFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXG45MzczOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzc0Olx0XHR9XG45Mzc1Olx0XG45Mzc2Olx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuOTM3NzpcdFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbjkzNzg6XHRcbjkzNzk6XHRcdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG45MzgwOlx0XHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApXG45MzgxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzgyOlx0XHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcbjkzODM6XHRcdFx0XHRyZXR1cm4gLUVOT0xJTks7XG45Mzg0Olx0XHR9IGVsc2Uge1xuOTM4NTpcdFx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMClcbjkzODY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzODc6XHRcdH1cbjkzODg6XHRcbjkzODk6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcbjkzOTA6XHRcdFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xuOTM5MTpcdFx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcbjkzOTI6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX21hYyA9XG45MzkzOlx0XHRcdFx0bmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XG45Mzk0Olx0XHRcdGlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfbWFjKSlcbjkzOTU6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzOTY6XHRcdH0gZWxzZSB7XG45Mzk3Olx0XHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XG45Mzk4Olx0XHR9XG45Mzk5Olx0XG45NDAwOlx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcbjk0MDE6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5zdXBwb3J0ZWRfcmF0ZXMgPVxuOTQwMjpcdFx0XHRcdG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKTtcbjk0MDM6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5zdXBwb3J0ZWRfcmF0ZXNfbGVuID1cbjk0MDQ6XHRcdFx0XHRubGFfbGVuKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKTtcbjk0MDU6XHRcdH1cbjk0MDY6XHRcbjk0MDc6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMXSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTU5NQoJCQkJCQkJb3V0cHV0OiA0MgoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd24sIGFzc3VtaW5nIEkmIzM5O20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6CgoqKkFuYWx5emluZyB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIEZ1bmN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIHJlc3Qgb2YgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBmdW5jdGlvbi4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBtZW50YWwgbW9kZWwgb2YgdGhlIGdlbmVyYWwgZmxvdywgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIG51YW5jZXMgaXMgY3J1Y2lhbC4gSSYjMzk7bSBmb2N1c2luZyBub3cgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHJvdXRpbmUuIEkmIzM5O20gbG9va2luZyBmb3Igd2hlcmUgaXQgaGFuZGxlcyB0aGUgYWN0dWFsIHN0YXRpb24gY3JlYXRpb24sIHdoYXQgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQsIGFuZCBob3cgdGhlIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gSSBuZWVkIHRvIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGxvY2tpbmcgaXNzdWVzLCBvZiBjb3Vyc2UsIHRoYXQgY291bGQgcG9wIHVwIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBiZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJzIHRoYXQgb3BlcmF0ZSBvbiB0aGlzIGRhdGEuCgpJJiMzOTttIGNoZWNraW5nIGlmIHRoZXJlIGlzIGFueSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gY2hlY2tzLiBGb3IgZXhhbXBsZSwgaXMgdGhlcmUgYSBtYXhpbXVtIG51bWJlciBvZiBzdGF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXI/IFRoYXQmIzM5O3MgYSBnb29kIG9uZSB0byBsb29rIGZvci4gQW5kIGlmIHNvLCBob3cgaXMgdGhlIGxpbWl0IGVuZm9yY2VkPyBBcmUgdGhlcmUgYW55IHNhbml0eSBjaGVja3Mgb24gdGhlIGlucHV0IHBhcmFtZXRlcnM/IEkgZXhwZWN0IHRvIHNlZSBjaGVja3Mgb24gdGhlIE1BQyBhZGRyZXNzLCB0aGUgaW50ZXJmYWNlIGluZGV4LCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0JiMzOTtzIHBhc3NlZCBpbiBmcm9tIHRoZSBuZXRsaW5rIG1lc3NhZ2UuCgpJJiMzOTttIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCBkYXRhIHN0cnVjdHVyZXMuIEFyZSBuZXcgc3RhdGlvbiBlbnRyaWVzIGFkZGVkIHRvIGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBlbXBsb3llZCB0byBwcm90ZWN0IHRoZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzPyBJJiMzOTttIGhvcGluZyB0byBzZWUgYSB3ZWxsLWRlZmluZWQgbG9ja2luZyBzY2hlbWUgdXNpbmcgcmVhZC13cml0ZSBsb2NrcyBvciBtdXRleGVzIHRvIHByb3ZpZGUgc2FmZSBvcGVyYXRpb25zLgoKSSYjMzk7bSBhbHNvIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgYSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxzIChlLmcuLCBtZW1vcnkgYWxsb2NhdGlvbik/IEhvdyBhcmUgZXJyb3JzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlciBzcGFjZT8gQXJlIHRoZXJlIHByb3BlciBlcnJvciBjb2RlcyB1c2VkPyBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBoYW5kbGluZyBpcyByb2J1c3QuCgpGaW5hbGx5LCBJJiMzOTttIGV4YW1pbmluZyBhbnkgaG9va3Mgb3IgY2FsbGJhY2tzIHRoYXQgYXJlIHRyaWdnZXJlZCBkdXJpbmcgc3RhdGlvbiBjcmVhdGlvbi4gQXJlIHRoZXJlIGFueSBub3RpZmljYXRpb25zIHNlbnQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIHdpcmVsZXNzIHN0YWNrLCBsaWtlIHRoZSBtYWM4MDIxMSBsYXllciwgb3IgbWF5YmUgdG8gdXNlciBzcGFjZSB2aWEgbmV0bGluaz8gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgc3lzdGVtIGltcGFjdCBvZiB0aGlzIGZ1bmN0aW9uLiBJIGFtIGFsd2F5cyB0cnlpbmcgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJhY3Qgd2l0aCB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTU1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7OTU1MDpcdFx0ICAgIHdkZXYtXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTl9EQVRBKSB7XG45NTUxOlx0XHRcdGlmIChwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNiBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEKVxuOTU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU1MzpcdFx0XHQvKiBOQU4gTk1JIHN0YXRpb24gbXVzdCBiZSBhZGRlZCBpbiBhc3NvY2lhdGVkIG9yIGF1dGhvcml6ZWQgc3RhdGUgKi9cbjk1NTQ6XHRcdFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IChCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSB8XG45NTU1Olx0XHRcdFx0XHRcdCAgICAgIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSkpXG45NTU2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTU3Olx0XHR9XG45NTU4Olx0XG45NTU5Olx0XHQvKiBFbnN1cmUgdGhhdCBIVC9WSFQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0IGZvciA2IEdIeiBIRSBTVEEgKi9cbjk1NjA6XHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmhlXzZnaHpfY2FwYSBcdTAwMjZcdTAwMjZcbjk1NjE6XHRcdCAgICAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5odF9jYXBhIHx8IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMudmh0X2NhcGEpKVxuOTU2MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1NjM6XHRcbjk1NjQ6XHRcdC8qIFdoZW4geW91IHJ1biBpbnRvIHRoaXMsIGFkanVzdCB0aGUgY29kZSBiZWxvdyBmb3IgdGhlIG5ldyBmbGFnICovXG45NTY1Olx0XHRCVUlMRF9CVUdfT04oTkw4MDIxMV9TVEFfRkxBR19NQVggIT0gOCk7XG45NTY2Olx0XG45NTY3Olx0XHRzd2l0Y2ggKHdkZXYtXHUwMDNlaWZ0eXBlKSB7XG45NTY4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxuOTU2OTpcdFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XG45NTcwOlx0XHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbjk1NzE6XHRcdFx0bGlua19pZCA9IHdkZXYtXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xuOTU3MjpcdFx0XHRpZiAoIXdkZXYtXHUwMDNlbGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsKVxuOTU3MzpcdFx0XHRcdHJldHVybiAtRU5FVERPV047XG45NTc0Olx0XG45NTc1Olx0XHRcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cbjk1NzY6XHRcdFx0aWYgKCEocmRldi1cdTAwM2V3aXBoeS5mbGFncyBcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcbjk1Nzc6XHRcdFx0ICAgICEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxuOTU3ODpcdFx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk1Nzk6XHRcbjk1ODA6XHRcdFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cbjk1ODE6XHRcdFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcbjk1ODI6XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcbjk1ODM6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1ODQ6XHRcdFx0LyogYnV0IGRvbiYjMzk7dCBib3RoZXIgdGhlIGRyaXZlciB3aXRoIGl0ICovXG45NTg1Olx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpO1xuOTU4NjpcdFxuOTU4NzpcdFx0XHQvKiBhbGxvdyBhdXRoZW50aWNhdGVkL2Fzc29jaWF0ZWQgb25seSBpZiBkcml2ZXIgaGFuZGxlcyBpdCAqL1xuOTU4ODpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZlYXR1cmVzIFx1MDAyNlxuOTU4OTpcdFx0XHRcdFx0Tkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFKSBcdTAwMjZcdTAwMjZcbjk1OTA6XHRcdFx0ICAgIHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjYgYXV0aF9hc3NvYylcbjk1OTE6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1OTI6XHRcbjk1OTM6XHRcdFx0aWYgKCF3aXBoeV9leHRfZmVhdHVyZV9pc3NldChcdTAwMjZyZGV2LVx1MDAzZXdpcGh5LFxuOTU5NDpcdFx0XHRcdFx0XHQgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfU1BQX0FNU0RVX1NVUFBPUlQpIFx1MDAyNlx1MDAyNlxuOTU5NTpcdFx0XHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19TUFBfQU1TRFUpKVxuOTU5NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU5NzpcdFxuOTU5ODpcdFx0XHQvKiBPbGRlciB1c2Vyc3BhY2UsIG9yIHVzZXJzcGFjZSB3YW50aW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aFxuOTU5OTpcdFx0XHQgKiAhTkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFLCB3aWxsIG5vdCBzZXQgdGhlIGF1dGhcbjk2MDA6XHRcdFx0ICogYW5kIGFzc29jIGZsYWdzIGluIHRoZSBtYXNrLCBidXQgYXNzdW1lcyB0aGUgc3RhdGlvbiB3aWxsIGJlXG45NjAxOlx0XHRcdCAqIGFkZGVkIGFzIGFzc29jaWF0ZWQgYW55d2F5IHNpbmNlIHRoaXMgd2FzIHRoZSByZXF1aXJlZCBkcml2ZXJcbjk2MDI6XHRcdFx0ICogYmVoYXZpb3VyIGJlZm9yZSBOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUgd2FzXG45NjAzOlx0XHRcdCAqIGludHJvZHVjZWQuXG45NjA0Olx0XHRcdCAqIEluIG9yZGVyIHRvIG5vdCBib3RoZXIgZHJpdmVycyB3aXRoIHRoaXMgcXVpcmsgaW4gdGhlIEFQSVxuOTYwNTpcdFx0XHQgKiBzZXQgdGhlIGZsYWdzIGluIGJvdGggdGhlIG1hc2sgYW5kIHNldCBmb3IgbmV3IHN0YXRpb25zIGluXG45NjA2Olx0XHRcdCAqIHRoaXMgY2FzZS5cbjk2MDc6XHRcdFx0ICovXG45NjA4Olx0XHRcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjYgYXV0aF9hc3NvYykpIHtcbjk2MDk6XHRcdFx0XHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgfD0gYXV0aF9hc3NvYztcbjk2MTA6XHRcdFx0XHRwYXJhbXMuc3RhX2ZsYWdzX3NldCB8PSBhdXRoX2Fzc29jO1xuOTYxMTpcdFx0XHR9XG45NjEyOlx0XG45NjEzOlx0XHRcdC8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqL1xuOTYxNDpcdFx0XHRwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpO1xuOTYxNTpcdFx0XHRpZiAoSVNfRVJSKHBhcmFtcy52bGFuKSlcbjk2MTY6XHRcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XG45NjE3Olx0XHRcdGJyZWFrO1xuOTYxODpcdFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOlxuOTYxOTpcdFx0XHQvKlxuOTYyMDpcdFx0XHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXG45NjIxOlx0XHRcdCAqIGxpYmVydGFzIGRvZXNuJiMzOTt0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcbjk2MjI6XHRcdFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xuOTYyMzpcdFx0XHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXG45NjI0Olx0XHRcdCAqL1xuOTYyNTpcdFx0XHRpZiAocmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xuOTYyNjpcdFx0XHRcdGlmICghd2Rldi1cdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuKVxuOTYyNzpcdFx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk2Mjg6XHRcdFx0fSBlbHNlIGlmICghd2Rldi1cdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XG45NjI5Olx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk2MzA6XHRcdFx0fVxuOTYzMTpcdFxuOTYzMjpcdFx0XHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xuOTYzMzpcdFx0XHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XG45NjM0Olx0XG45NjM1Olx0XHRcdC8qIGFzc29jaWF0ZWQgaXMgZGlzYWxsb3dlZCAqL1xuOTYzNjpcdFx0XHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSlcbjk2Mzc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2Mzg6XHRcdFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cbjk2Mzk6XHRcdFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcbjk2NDA6XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcbjk2NDE6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2NDI6XHRcdFx0YnJlYWs7XG45NjQzOlx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046XG45NjQ0Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6XG45NjQ1Olx0XHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG45NjQ2Olx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk2NDc6XHRcbjk2NDg6XHRcdFx0LyogdGhlc2UgYXJlIGRpc2FsbG93ZWQgKi9cbjk2NDk6XHRcdFx0aWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwMTgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIHRoZSBubDgwMjExLmMgQ29kZSoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB3aXJlbGVzcyBuZXR3b3JraW5nLCBhbmQgc29tZXRoaW5nIGlzbiYjMzk7dCBxdWl0ZSByaWdodC4gVG8gZ2V0IGEgYmV0dGVyIGdyYXNwIG9uIHRoZSBpc3N1ZSwgSSBzaG91bGQgY3Jvc3MtcmVmZXJlbmNlIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUga2VybmVsIGNvZGUuIExldCYjMzk7cyBtYWtlIHN1cmUgd2UgZXhhbWluZSB0aGUgcG90ZW50aWFsIGltcGFjdCB3aXRoaW4gdGhlIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYCBmaWxlLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGluIG9uIGxpbmVzIDk2NTAtOTY5MC4gVGhpcyByYW5nZSB0eXBpY2FsbHkgY29udGFpbnMgY3JpdGljYWwgbG9naWMgcmVsYXRlZCB0byBjZXJ0YWluIHdpcmVsZXNzIG5ldHdvcmsgb3BlcmF0aW9ucywgYW5kIGl0JiMzOTtzIGxpa2VseSB0byBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGlzc3VlIGF0IGhhbmQuIEJ5IGV4YW1pbmluZyB0aGlzIHNwZWNpZmljIGNvZGUgYmxvY2ssIEkgY2FuIGRldmVsb3AgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxzLCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB0aGUgZmxvdyBvZiB0aGUgcHJvZ3JhbSBsb2dpYy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTY1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5NjUwOlx0XHRcdFx0XHQoQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgfFxuOTY1MTpcdFx0XHRcdFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSlcbjk2NTI6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2NTM6XHRcdFx0LyogT25seSBURExTIHBlZXJzIGNhbiBiZSBhZGRlZCAqL1xuOTY1NDpcdFx0XHRpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpXG45NjU1Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NjU2Olx0XHRcdC8qIENhbiBvbmx5IGFkZCBpZiBURExTIC4uLiAqL1xuOTY1NzpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpKVxuOTY1ODpcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjk2NTk6XHRcdFx0LyogLi4uIHdpdGggZXh0ZXJuYWwgc2V0dXAgaXMgc3VwcG9ydGVkICovXG45NjYwOlx0XHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmxhZ3MgXHUwMDI2IFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpXG45NjYxOlx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTY2MjpcdFx0XHQvKlxuOTY2MzpcdFx0XHQgKiBPbGRlciB3cGFfc3VwcGxpY2FudCB2ZXJzaW9ucyBhbHdheXMgbWFyayB0aGUgVERMUyBwZWVyXG45NjY0Olx0XHRcdCAqIGFzIGF1dGhvcml6ZWQsIGJ1dCBpdCBzaG91bGRuJiMzOTt0IHlldCBiZS5cbjk2NjU6XHRcdFx0ICovXG45NjY2Olx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKTtcbjk2Njc6XHRcdFx0YnJlYWs7XG45NjY4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTjpcbjk2Njk6XHRcdFx0YnJlYWs7XG45NjcwOlx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTl9EQVRBOlxuOTY3MTpcdFx0XHRwYXJhbXMubm1pX21hYyA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX05BTl9OTUlfTUFDXSk7XG45NjcyOlx0XHRcdGJyZWFrO1xuOTY3MzpcdFx0ZGVmYXVsdDpcbjk2NzQ6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTY3NTpcdFx0fVxuOTY3NjpcdFxuOTY3NzpcdFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cbjk2Nzg6XHRcbjk2Nzk6XHRcdHBhcmFtcy5lcHBfcGVlciA9XG45NjgwOlx0XHRcdG5sYV9nZXRfZmxhZyhpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pO1xuOTY4MTpcdFxuOTY4MjpcdFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXHUwMDI2cGFyYW1zKTtcbjk2ODM6XHRcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuOTY4NDpcdFx0cmV0dXJuIGVycjtcbjk2ODU6XHR9XG45Njg2Olx0XG45Njg3Olx0c3RhdGljIGludCBubDgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG45Njg4Olx0e1xuOTY4OTpcdFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5ODkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDaGFuZ2VzIGFuZCBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaXMgZm9jdXNlZCBvbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdoaWNoIGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdCBhcyBhIGtub3duIGVudHJ5cG9pbnQgZm9yIHdpcmVsZXNzIG5ldGxpbmsgY29tbWFuZHMuIFNwZWNpZmljYWxseSwgdGhlIGNoYW5nZXMgaW52b2x2ZTogaW5wdXQgdmFsaWRhdGlvbiBvZiBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhZ2FpbnN0IGB3ZGV2LSZndDt2YWxpZF9saW5rc2AsIHN0YXRlIGNoZWNrcyByZWxhdGVkIHRvIEFQL1AyUF9HTyBhbmQgTUVTSF9QT0lOVCBiZWFjb24gaW50ZXJ2YWxzLCByZW1vdmFsIG9mIGBOTDgwMjExX0lGVFlQRV9BUF9WTEFOYCBmcm9tIHRoZSBBUCBzd2l0Y2ggY2FzZSAobWVhbmluZyBBUF9WTEFOIGludGVyZmFjZXMgd2lsbCBub3cgcmV0dXJuIC1FT1BOT1RTVVBQKSwgYW5kIHJlbW92YWwgb2Ygc29tZSByZWR1bmRhbnQgbGluayBjaGVja3MuCgpUaGUga2V5IHF1ZXN0aW9uIGlzIGFsd2F5czogY2FuIHdlIGdldCB0byB0aGlzIGNvZGU/IEFic29sdXRlbHkuIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBhbiBlbnRyeSBwb2ludCBjYWxsZWQgdmlhIHRoZSBgTkw4MDIxMV9DTURfTkVXX1NUQVRJT05gIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlLiBHZW5lcmljIE5ldGxpbmsgaXMgYSBzdGFuZGFyZCBhdHRhY2sgc3VyZmFjZSBpbiBMaW51eCBhbmQgaXMgZGVmaW5pdGVseSByZWFjaGFibGUgdGhyb3VnaCBzdGFuZGFyZCB0ZXN0aW5nLCBsaWtlIHN5emthbGxlci4gVGhpcyBpcyBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIHdpdGhpbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AuCgpGcm9tIGEgJiMzNDtXb3J0aEZ1enppbmcmIzM0OyBwZXJzcGVjdGl2ZSwgdGhpcyBpcyBhIGNsZWFyIHllcy4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgYSBjb3JlIHN1YnN5c3RlbSwgdGhlIG5ldGxpbmsvY2ZnODAyMTEgd2lyZWxlc3MgbmV0bGluayBoYW5kbGVyLiBUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgZXJyb3IgcmV0dXJuIHBhdGhzIGZvciBuZXRsaW5rIGNvbW1hbmRzLiBSZWFjaGFiaWxpdHkgaXMgZ3VhcmFudGVlZCB2aWEgdXNlcnNwYWNlIHRocm91Z2ggQUZfTkVUTElOSywgTkVUTElOS19HRU5FUklDLiBObyBxdWVzdGlvbiwgdGhpcyBpcyBmdXp6YWJsZS4KClJlZ2FyZGluZyAmIzM0O0ZvY3VzU3ltYm9scywmIzM0OyBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgdGhlIG1vZGlmaWVkIHN5bWJvbC4gSSBzaG91bGQgYWxzbyBjaGVjayBpdHMgZGlyZWN0IGNhbGxlZXMuIGByZGV2X2FkZF9zdGF0aW9uYCBpcyBjYWxsZWQgZnJvbSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAuIEkmIzM5O2xsIHdhbnQgdG8gY2hlY2sgdGhlIGRlZmluaXRpb24gb2YgYHJkZXZfYWRkX3N0YXRpb25gIHRvIGhhdmUgYSBmdWxsIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JkZXZfYWRkX3N0YXRpb24mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL25sODAyMTEuYz05MzI4PXN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTY4MS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTY4MjpcdGVyciA9IHJkZXZfYWRkX3N0YXRpb24ocmRldiwgd2RldiwgbWFjX2FkZHIsIFx1MDAyNnBhcmFtcyk7XG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTk2ODMtXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcbi0tXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaD0xODU9c3RhdGljIGlubGluZSBpbnQgcmRldl9zdG9wX2FwKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldixcbi0tXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTQtXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoxOTU6c3RhdGljIGlubGluZSBpbnQgcmRldl9hZGRfc3RhdGlvbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTYtXHRcdFx0XHQgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1OCAqbWFjLFxuLS1cbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTE5OS1cdGludCByZXQ7XG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoyMDA6XHR0cmFjZV9yZGV2X2FkZF9zdGF0aW9uKFx1MDAyNnJkZXYtXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTIwMS1cdHJldCA9IHJkZXYtXHUwMDNlb3BzLVx1MDAzZWFkZF9zdGF0aW9uKFx1MDAyNnJkZXYtXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcbi0tXG5uZXQvd2lyZWxlc3MvdHJhY2UuaD04Njg9REVDTEFSRV9FVkVOVF9DTEFTUyhzdGF0aW9uX2FkZF9jaGFuZ2UsXG4tLVxubmV0L3dpcmVsZXNzL3RyYWNlLmgtOTU5LVxubmV0L3dpcmVsZXNzL3RyYWNlLmg6OTYwOkRFRklORV9FVkVOVChzdGF0aW9uX2FkZF9jaGFuZ2UsIHJkZXZfYWRkX3N0YXRpb24sXG5uZXQvd2lyZWxlc3MvdHJhY2UuaC05NjEtXHRUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1OCAqbWFjLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDM5MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDMxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU3RhdGlvbiBIYW5kbGluZyBpbiB0aGUgbmw4MDIxMSBTdWJzeXN0ZW0qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBzdGF0aW9ucyBhcmUgaGFuZGxlZCB3aXRoaW4gdGhlIGBubDgwMjExYCBmcmFtZXdvcmsuIE15IGluaXRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCBgcmRldl9hZGRfc3RhdGlvbmAgaXMgYW4gaW5saW5lIGZ1bmN0aW9uIGRlZmluZWQgaW4gYHJkZXYtb3BzLmhgLCB3aGVyZWFzIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBpbiBgbmw4MDIxMS5jYCwgYnV0IGl0JiMzOTtzICpleHRlcm5hbGx5KiByZWZlcmVuY2VkIChzcGVjaWZpY2FsbHksIGluIGBubDgwMjExX3NtYWxsX29wc2ApLiBNeSBuZXh0IHRob3VnaHQgaXMgdG8gaW52ZXN0aWdhdGUgZnVydGhlciB3aXRoaW4gYG5sODAyMTEuY2AgaXRzZWxmLgoKSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHN0YXRpb24gY3JlYXRpb24sIG9yIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlLiBJJiMzOTtsbCB0YWtlIGEgbG9vayBhdCBmdW5jdGlvbnMgbGlrZSBgbmw4MDIxMV9zZXRfc3RhdGlvbmAgYW5kIGFueSBvdGhlcnMgdGhhdCBkZWFsIHdpdGggc3RhdGlvbnMgdG8gc2VlIGlmIHRoZXkmIzM5O3ZlIGJlZW4gcmVjZW50bHkgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgKm9ubHkqIGBubDgwMjExX25ld19zdGF0aW9uYCB3YXMgY2hhbmdlZC4KCk5vdywgbGV0JiMzOTtzIGNvbnNpZGVyIHRoZSBjb25maWd1cmF0aW9uIGFzcGVjdHMuIFRoZSBjb2RlIGluIHF1ZXN0aW9uLCBpbmNsdWRpbmcgYG5sODAyMTEuY2AsIGlzIG9ubHkgYnVpbHQgd2hlbiBgQ09ORklHX0NGRzgwMjExYCBpcyBlbmFibGVkLiBJdCYjMzk7cyBidWlsdCBiZWNhdXNlIGBjZmc4MDIxMS15ICYjNDM7PSAuLi4gbmw4MDIxMS5vYCBpbiB0aGUgcmVsZXZhbnQgYE1ha2VmaWxlYC4gU28sIHdoYXQgZW5hYmxlcyBgQ0ZHODAyMTFgIGl0c2VsZj8gSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMuCgpMZXQmIzM5O3MgbG9vayBhdCBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBgY29uZmlnIENGRzgwMjExYCBkZXBlbmRzIG9uIGBSRktJTEwgfHwgIVJGS0lMTGAuIFRoYXQmIzM5O3MgYSBiaXQgb2RkLCB0aG91Z2ggaXQgc2VlbXMgaGFybWxlc3MuIExldCYjMzk7cyBzZWUgaWYgdGhhdCBtb2R1bGUgZGVwZW5kcyBvbiBhbnl0aGluZywgYnkgbG9va2luZyBhdCBgbmV0L0tjb25maWdgLCB3aGljaCBgc291cmNlYHMgYG5ldC93aXJlbGVzcy9LY29uZmlnYC4gSSYjMzk7bGwgYWxzbyBnbGFuY2UgYXQgdGhlIGBuZXQvd2lyZWxlc3MvTWFrZWZpbGVgIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnl0aGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MvTWFrZWZpbGUmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gICAyOlx0b2JqLSQoQ09ORklHX0NGRzgwMjExKSAmIzQzOz0gY2ZnODAyMTEub1xuICAgMzpcdG9iai15ICYjNDM7PSB0ZXN0cy9cbiAgIDQ6XHRcbiAgIDU6XHRvYmotJChDT05GSUdfV0VYVF9DT1JFKSAmIzQzOz0gd2V4dC1jb3JlLm9cbiAgIDY6XHRvYmotJChDT05GSUdfV0VYVF9QUk9DKSAmIzQzOz0gd2V4dC1wcm9jLm9cbiAgIDc6XHRvYmotJChDT05GSUdfV0VYVF9QUklWKSAmIzQzOz0gd2V4dC1wcml2Lm9cbiAgIDg6XHRcbiAgIDk6XHRjZmc4MDIxMS15ICYjNDM7PSBjb3JlLm8gc3lzZnMubyByYWRpb3RhcC5vIHV0aWwubyByZWcubyBzY2FuLm8gbmw4MDIxMS5vXG4gIDEwOlx0Y2ZnODAyMTEteSAmIzQzOz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cbiAgMTE6XHRjZmc4MDIxMS15ICYjNDM7PSBtaWNoYWVsLW1pYy5vIHBtc3Iub1xuICAxMjpcdGNmZzgwMjExLSQoQ09ORklHX09GKSAmIzQzOz0gb2Yub1xuICAxMzpcdGNmZzgwMjExLSQoQ09ORklHX0NGRzgwMjExX0RFQlVHRlMpICYjNDM7PSBkZWJ1Z2ZzLm9cbiAgMTQ6XHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9XRVhUKSAmIzQzOz0gd2V4dC1jb21wYXQubyB3ZXh0LXNtZS5vXG4gIDE1Olx0XG4gIDE2Olx0Q0ZMQUdTX3RyYWNlLm8gOj0gLUkkKHNyYylcbiAgMTc6XHRcbiAgMTg6XHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVMpICYjNDM7PSBzaGlwcGVkLWNlcnRzLm9cbiAgMTk6XHRpZm5lcSAoJChDT05GSUdfQ0ZHODAyMTFfRVhUUkFfUkVHREJfS0VZRElSKSwpXG4gIDIwOlx0Y2ZnODAyMTEteSAmIzQzOz0gZXh0cmEtY2VydHMub1xuICAyMTpcdGVuZGlmXG4gIDIyOlx0XG4gIDIzOlx0JChvYmopL3NoaXBwZWQtY2VydHMuYzogJChzb3J0ICQod2lsZGNhcmQgJChzcmMpL2NlcnRzLyouaGV4KSlcbiAgMjQ6XHRcdEAkKGtlY2hvKSBcJiMzNDsgIEdFTiAgICAgJEBcJiMzNDtcbiAgMjU6XHRcdCQoUSkoZWNobyAmIzM5OyNpbmNsdWRlIFwmIzM0O3JlZy5oXCYjMzQ7JiMzOTs7IFxcXG4gIDI2Olx0XHQgIGVjaG8gJiMzOTtjb25zdCB1OCBzaGlwcGVkX3JlZ2RiX2NlcnRzW10gPSB7JiMzOTs7IFxcXG4gIDI3Olx0XHQgIGVjaG8gfCBjYXQgLSAkXiA7IFxcXG4gIDI4Olx0XHQgIGVjaG8gJiMzOTt9OyYjMzk7OyBcXFxuICAyOTpcdFx0ICBlY2hvICYjMzk7dW5zaWduZWQgaW50IHNoaXBwZWRfcmVnZGJfY2VydHNfbGVuID0gc2l6ZW9mKHNoaXBwZWRfcmVnZGJfY2VydHMpOyYjMzk7OyBcXFxuICAzMDpcdFx0ICkgXHUwMDNlICRAXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1ODE5CgkJCQkJCQlvdXRwdXQ6IDEzOQoJCQkJCQkJdGhvdWdodHM6IDI1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQ29kZSBNb2RpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIEkgc2VlIHRoYXQgYG9iai0kKENPTkZJR19DRkc4MDIxMSkgJiM0Mzs9IGNmZzgwMjExLm9gIGFuZCBgY2ZnODAyMTEteSAmIzQzOz0gLi4uIG5sODAyMTEub2AsIHdoaWNoIGlzIHByZXR0eSBzdGFuZGFyZC4gQW5kLCBjcnVjaWFsbHksIGBDT05GSUdfTkw4MDIxMV9URVNUTU9ERWAgaXNuJiMzOTt0IGEgZ2F0aW5nIGZhY3RvciBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBUaGF0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBoZXJlIGlzIGBDRkc4MDIxMWAuCgpMZXQgbWUganVzdCBxdWlja2x5IGNvbmZpcm0gdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgc3VidGxlIGNvbmZpZyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGludm9sdmVkIGhlcmUuCgpBbHJpZ2h0LCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlIGluZGVlZCBqdXN0IGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIHRoZSBgRW5hYmxlQ29uZmlnc2AgYXJlIGNvcnJlY3RseSBwb2ludGluZyB0byBgQ0ZHODAyMTFgLCBhcyBleHBlY3RlZC4gR29vZC4KClRoZSByZWFzb25pbmcgcHJvdmlkZWQgY2xhcmlmaWVzIHRoYXQgdGhpcyBwYXRjaCBpcyB0b3VjaGluZyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyLCBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdpdGhpbiB0aGUgYGNmZzgwMjExYCB3aXJlbGVzcyBjb25maWcgbmV0bGluayBBUEkuIEl0IGxvb2tzIGxpa2UgdGhleSYjMzk7cmUgdGlnaHRlbmluZyB1cCB2YWxpZGF0aW9uIG9uIHRoZSBsaW5rIElEIGFuZCBhZGRpbmcgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgQVAgb3IgbWVzaCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgYWxsb3dpbmcgYSBzdGF0aW9uIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGEgcG90ZW50aWFsIGF0dGFjayBzdXJmYWNlIGJlY2F1c2UgaXQmIzM5O3MgaGFuZGxpbmcgdW50cnVzdGVkIHVzZXItc3BhY2UgaW5wdXQgdmlhIEdlbmVyaWMgTmV0bGluayAoTkw4MDIxMSkuCgpFeGNlbGxlbnQuIE15IGFuYWx5c2lzIGNvbmZpcm1zIGV2ZXJ5dGhpbmcuIEkmIzM5O20gc2F0aXNmaWVkLiBMZXQmIzM5O3MgbW92ZSBvbiB0byB0aGUgbmV4dCBzdGVwIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDRkc4MDIxMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDRkc4MDIxMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgKS5cblxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCA4OTliNjM3NGM1NTA2Li5mY2ExOWUxZDBjOWFiIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTkzMjgsNyAmIzQzOzkzMjgsNyBAQCBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tJmd0O3VzZXJfcHRyWzBdOwotCWludCBlcnI7CiYjNDM7CWludCBlcnIsIGxpbmtfaWQ7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tJmd0O3VzZXJfcHRyWzFdOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LSZndDtuZXRkZXY7CiAJc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyBwYXJhbXM7CkBAIC05Mzc2LDYgJiM0Mzs5Mzc2LDE2IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA9CiAJCW5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkKGluZm8tJmd0O2F0dHJzKTsKIAomIzQzOwlpZiAod2Rldi0mZ3Q7dmFsaWRfbGlua3MpIHsKJiM0MzsJCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmx0OyAwKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJaWYgKCEod2Rldi0mZ3Q7dmFsaWRfbGlua3MgJmFtcDsgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKQomIzQzOwkJCXJldHVybiAtRU5PTElOSzsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmd0Oz0gMCkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwogCWlmIChpbmZvLSZndDthdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7CiAJCW1hY19hZGRyID0gbmxhX2RhdGEoaW5mby0mZ3Q7YXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7CiAJCXBhcmFtcy5saW5rX3N0YV9wYXJhbXMubWxkX21hYyA9IG1hY19hZGRyOwpAQCAtOTU1Niw4ICYjNDM7OTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAogCXN3aXRjaCAod2Rldi0mZ3Q7aWZ0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiYjNDM7CQkvKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBBUCBhbmQgbGluayBoYXMgYmVlbiBzdGFydGVkICovCiYjNDM7CQlsaW5rX2lkID0gd2Rldi0mZ3Q7dmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwOwomIzQzOwkJaWYgKCF3ZGV2LSZndDtsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpCiYjNDM7CQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsKIAkJLyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqLwogCQlpZiAoIShyZGV2LSZndDt3aXBoeS5mbGFncyAmYW1wOyBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fAogCQkgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCAmYW1wOyBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSkKQEAgLTk2MDIsNiAmIzQzOzk2MTYsMTkgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAJCQlyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKJiM0MzsJCS8qCiYjNDM7CQkgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuCiYjNDM7CQkgKiBsaWJlcnRhcyBkb2VzbiYjMzk7dCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlCiYjNDM7CQkgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvCiYjNDM7CQkgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZGV2LSZndDtvcHMtJmd0O2xpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHsKJiM0MzsJCQlpZiAoIXdkZXYtJmd0O3UubWVzaC5jaGFuZGVmLmNoYW4pCiYjNDM7CQkJCXJldHVybiAtRU5FVERPV047CiYjNDM7CQl9IGVsc2UgaWYgKCF3ZGV2LSZndDt1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7CiYjNDM7CQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsJCX0KJiM0MzsKIAkJLyogaWdub3JlIHVBUFNEIGRhdGEgKi8KIAkJcGFyYW1zLnN0YV9tb2RpZnlfbWFzayAmYW1wOz0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7CiAKQEAgLTk2NDksMjcgJiM0Mzs5Njc2LDEwIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCiAJLyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi8KIAotCWlmICh3ZGV2LSZndDt2YWxpZF9saW5rcykgewotCQlpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkICZsdDsgMCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmICghKHdkZXYtJmd0O3ZhbGlkX2xpbmtzICZhbXA7IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSkgewotCQkJZXJyID0gLUVOT0xJTks7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmd0Oz0gMCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJcGFyYW1zLmVwcF9wZWVyID0KIAkJbmxhX2dldF9mbGFnKGluZm8tJmd0O2F0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pOwogCiAJZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgJmFtcDtwYXJhbXMpOwotb3V0OgogCWRldl9wdXQocGFyYW1zLnZsYW4pOwogCXJldHVybiBlcnI7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjU0CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogNTI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEtNU0FOIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIGFuZCBkZWNpZGUgaWYgaXQmIzM5O3Mgd29ydGggdGhyb3dpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24gYXQgaXQuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIG9uIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgZnVuY3Rpb24gd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC4KCkl0IGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZm9jdXMgaGVyZSBpcyB0aWdodGVuaW5nIHVwIHNvbWUgY2hlY2tzIHJlbGF0ZWQgdG8gdmFsaWQgbGlua3MgYW5kIG1lc2ggY2hhbm5lbCBjb25maWd1cmF0aW9ucy4gU3BlY2lmaWNhbGx5OgoKMS4gIFdlJiMzOTt2ZSBnb3QgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBjaGVja3MgYmVpbmcgcGVyZm9ybWVkIGVhcmxpZXIgaW4gdGhlIGZ1bmN0aW9uIG5vdy4gSXQmIzM5O3MgZXNzZW50aWFsbHkgbW92aW5nIHRoZSBsaW5rIElEIHZhbGlkaXR5IGNoZWNrIHVwLCByaWdodCBhZnRlciB0aGUgcGFyc2luZyBvZiBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYC4gU21hcnQsIGNvdWxkIGhhdmUgYmVlbiBhbiBlZGdlIGNhc2UgYmVmb3JlLgoKMi4gIFdpdGhpbiB0aGUgYE5MODAyMTFfSUZUWVBFX0FQYCBhbmQgYE5MODAyMTFfSUZUWVBFX1AyUF9HT2AgYmxvY2tzLCBpdCBhcHBlYXJzIHRoYXQgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZmFsbHRocm91Z2gsIGFuZCB3ZSYjMzk7dmUgYWRkZWQgYSBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgYmVhY29uIGludGVydmFsIGlzIHNldCBmb3IgdmFsaWQgbGlua3MuIEl0JiMzOTtzIHdvcnRoIGRpZ2dpbmcgaW50byB3aGVyZSBBUF9WTEFOIGlzIGN1cnJlbnRseSBoYW5kbGVkLCBqdXN0IHRvIGJlIHN1cmUgbm90aGluZyYjMzk7cyBiZWVuIGJyb2tlbiwgb3IgdGhhdCBpdCB3YXNuJiMzOTt0IHByZXZpb3VzbHkgaGFuZGxlZC4KCjMuICBGb3IgYE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlRgLCB0aGVyZSBhcmUgbmV3IGNoZWNrcyByZWxhdGVkIHRvIHRoZSBtZXNoIGNoYW5uZWwgYmVpbmcgc2V0IGJhc2VkIG9uIGByZGV2LSZndDtvcHMtJmd0O2xpYmVydGFzX3NldF9tZXNoX2NoYW5uZWxgIGV4aXN0ZW5jZS4gSWYgdGhhdCYjMzk7cyBhdmFpbGFibGUsIGFuZCBhIGNoYW5uZWwgaXNuJiMzOTt0IGRlZmluZWQsIHJldHVybiBgRU5FVERPV05gLiBPdGhlcndpc2UsIGlmIHRoYXQgZG9lc24mIzM5O3QgZXhpc3QsIHdlIG11c3QgY2hlY2sgdGhhdCBgd2Rldi0mZ3Q7dS5tZXNoLmJlYWNvbl9pbnRlcnZhbGAgaXMgdmFsaWQsIGFsc28gcmV0dXJuaW5nIGBFTkVURE9XTmAgaWYgdGhhdCYjMzk7cyBub3QgdGhlIGNhc2UuIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbGx5IGdvb2Qgc3BvdCBmb3Igc29tZSBmdXp6aW5nLgoKNC4gIFRoZXJlJiMzOTtzIGFsc28gYSBjbGVhbnVwIG9mIHNvbWUgZHVwbGljYXRlIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AgY2hlY2tzIGFuZCBgZ290byBvdXQ7YCBsYWJlbHMsIHdoaWNoIHN1Z2dlc3RzIHNvbWUgY29kZSB3YXMgbWFkZSBjbGVhbmVyLiBJdCBtZW50aW9ucyB0aGVyZSYjMzk7cyBhIGd1YXJkIGVhcmx5IHJldHVybiBkdWUgdG8gdGhlIGBwYXJhbXMudmxhbmAgbm90IGJlaW5nIGFjcXVpcmVkIGF0IHRoYXQgcG9pbnQsIGVuc3VyaW5nIHRoYXQgd2UgZG9uJiMzOTt0IG5lZWQgYSBgZGV2X3B1dGAgY2FsbC4gTGF0ZXIsIHRoZSBjYWxsIHRvIGByZGV2X2FkZF9zdGF0aW9uYCB0YWtlcyBjYXJlIG9mIHRoZSBjbGVhbnVwLiBUaGlzIG1ha2VzIGl0IGxvb2sgbGlrZSB0aGVyZSB3ZXJlIHNvbWUgZmxvdyBpbXByb3ZlbWVudHMsIHRoYXQgbWF5IGhhdmUgYmVlbiBkdWUgdG8gZXJyb3IgbWFuYWdlbWVudCBjaGFuZ2VzLgoKQmVmb3JlIEkgY29tbWl0IHRvIGZ1enppbmcsIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIGBubDgwMjExX25ld19zdGF0aW9uYC4gSSYjMzk7bGwgYHJlYWQtZmlsZWAgdGhhdCBmdW5jdGlvbiBhZ2FpbiBvciB1c2UgYSBxdWljayBgZ3JlcHBlcmAgc2VhcmNoIHRvIHJlZnJlc2guIFRoZSBuZXcgY2hlY2tzIGNvdWxkIGludHJvZHVjZSBzdWJ0bGUgaXNzdWVzIGlmIHRoZXkmIzM5O3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgc28gSSYjMzk7bGwgd2FudCB0byBtYWtlIHN1cmUgSSYjMzk7dmUgZ290IGEgZ29vZCBtZW50YWwgbWFwIG9mIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNeSBndXQgc2F5cyB0aGlzIGlzIHdvcnRoIGEgY2xvc2VyIGxvb2sgd2l0aCBLTVNBTi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTMyOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7OTMyODpcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuOTMyOTpcdHtcbjkzMzA6XHRcdHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMF07XG45MzMxOlx0XHRpbnQgZXJyLCBsaW5rX2lkO1xuOTMzMjpcdFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMV07XG45MzMzOlx0XHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cdTAwM2VuZXRkZXY7XG45MzM0Olx0XHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcbjkzMzU6XHRcdHU4ICptYWNfYWRkciA9IE5VTEw7XG45MzM2Olx0XHR1MzIgYXV0aF9hc3NvYyA9IEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpIHxcbjkzMzc6XHRcdFx0XHQgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCk7XG45MzM4Olx0XG45MzM5Olx0XHRtZW1zZXQoXHUwMDI2cGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7XG45MzQwOlx0XG45MzQxOlx0XHRpZiAoIWRldiBcdTAwMjZcdTAwMjYgd2Rldi1cdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxuOTM0MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNDM6XHRcbjkzNDQ6XHRcdGlmICghcmRldi1cdTAwM2VvcHMtXHUwMDNlYWRkX3N0YXRpb24pXG45MzQ1Olx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjkzNDY6XHRcbjkzNDc6XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcbjkzNDg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzQ5Olx0XG45MzUwOlx0XHRpZiAod2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8XG45MzUxOlx0XHQgICAgd2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjkzNTI6XHRcdFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKVxuOTM1MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM1NDpcdFx0XHRpZiAod2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjkzNTU6XHRcdFx0XHRpZiAoIWluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX05BTl9OTUlfTUFDXSlcbjkzNTY6XHRcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM1NzpcdFxuOTM1ODpcdFx0XHRcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cbjkzNTk6XHRcdFx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcbjkzNjA6XHRcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XG45MzYxOlx0XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxuOTM2MjpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzYzOlx0XHRcdH1cbjkzNjQ6XHRcdH0gZWxzZSB7XG45MzY1Olx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXG45MzY2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzY3Olx0XG45MzY4Olx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXG45MzY5Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzcwOlx0XG45MzcxOlx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXHUwMDI2XHUwMDI2XG45MzcyOlx0XHRcdCAgICAhaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTM3MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM3NDpcdFx0fVxuOTM3NTpcdFxuOTM3NjpcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkID1cbjkzNzc6XHRcdFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cdTAwM2VhdHRycyk7XG45Mzc4Olx0XG45Mzc5Olx0XHRpZiAod2Rldi1cdTAwM2V2YWxpZF9saW5rcykge1xuOTM4MDpcdFx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzYyAwKVxuOTM4MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM4MjpcdFx0XHRpZiAoISh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzIFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpXG45MzgzOlx0XHRcdFx0cmV0dXJuIC1FTk9MSU5LO1xuOTM4NDpcdFx0fSBlbHNlIHtcbjkzODU6XHRcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2U9IDApXG45Mzg2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzg3Olx0XHR9XG45Mzg4Olx0XG45Mzg5Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7XG45MzkwOlx0XHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTtcbjkzOTE6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7XG45MzkyOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxuOTM5MzpcdFx0XHRcdG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xuOTM5NDpcdFx0XHRpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX21hYykpXG45Mzk1Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzk2Olx0XHR9IGVsc2Uge1xuOTM5NzpcdFx0XHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xuOTM5ODpcdFx0fVxuOTM5OTpcdFxuOTQwMDpcdFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKSB7XG45NDAxOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cbjk0MDI6XHRcdFx0XHRubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XG45NDAzOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzX2xlbiA9XG45NDA0Olx0XHRcdFx0bmxhX2xlbihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XG45NDA1Olx0XHR9XG45NDA2Olx0XG45NDA3Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXG45NDA4Olx0XHRcdHBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPVxuOTQwOTpcdFx0XHRcdG5sYV9nZXRfdTE2KGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKTtcbjk0MTA6XHRcbjk0MTE6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WTEFOX0lEXSlcbjk0MTI6XHRcdFx0cGFyYW1zLnZsYW5faWQgPSBubGFfZ2V0X3UxNihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WTEFOX0lEXSk7XG45NDEzOlx0XG45NDE0Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRfUDJQX1BTXSkge1xuOTQxNTpcdFx0XHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxuOTQxNjpcdFx0XHRcdG5sYV9nZXRfdTgoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRfUDJQX1BTXSk7XG45NDE3Olx0XHR9IGVsc2Uge1xuOTQxODpcdFx0XHQvKlxuOTQxOTpcdFx0XHQgKiBpZiBub3Qgc3BlY2lmaWVkLCBhc3N1bWUgaXQmIzM5O3Mgc3VwcG9ydGVkIGZvciBQMlAgR08gaW50ZXJmYWNlLFxuOTQyMDpcdFx0XHQgKiBhbmQgaXMgTk9UIHN1cHBvcnRlZCBmb3IgQVAgaW50ZXJmYWNlXG45NDIxOlx0XHRcdCAqL1xuOTQyMjpcdFx0XHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxuOTQyMzpcdFx0XHRcdHdkZXYtXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTztcbjk0MjQ6XHRcdH1cbjk0MjU6XHRcbjk0MjY6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXG45NDI3Olx0XHRcdHBhcmFtcy5haWQgPSBubGFfZ2V0X3UxNihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzU4CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93biwgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDoKCioqQW5hbHl6aW5nIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIGZ1bmN0aW9uLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgZ2VuZXJhbCBmbG93LCBidXQgdW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlcyBpcyBjcnVjaWFsLiBJJiMzOTttIGZvY3VzaW5nIG5vdyBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgcm91dGluZS4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSBpdCBoYW5kbGVzIHRoZSBhY3R1YWwgc3RhdGlvbiBjcmVhdGlvbiwgd2hhdCByZXNvdXJjZXMgYXJlIGFsbG9jYXRlZCwgYW5kIGhvdyB0aGUgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBJIG5lZWQgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgbG9ja2luZyBpc3N1ZXMsIG9mIGNvdXJzZSwgdGhhdCBjb3VsZCBwb3AgdXAgd2hlbiBtdWx0aXBsZSB0aHJlYWRzIG1pZ2h0IGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvciBvdGhlcnMgdGhhdCBvcGVyYXRlIG9uIHRoaXMgZGF0YS4KCkkmIzM5O20gY2hlY2tpbmcgaWYgdGhlcmUgaXMgYW55IGluaXRpYWwgY29uZmlndXJhdGlvbiBjaGVja3MuIEZvciBleGFtcGxlLCBpcyB0aGVyZSBhIG1heGltdW0gbnVtYmVyIG9mIHN0YXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcj8gVGhhdCYjMzk7cyBhIGdvb2Qgb25lIHRvIGxvb2sgZm9yLiBBbmQgaWYgc28sIGhvdyBpcyB0aGUgbGltaXQgZW5mb3JjZWQ/IEFyZSB0aGVyZSBhbnkgc2FuaXR5IGNoZWNrcyBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBvbiB0aGUgTUFDIGFkZHJlc3MsIHRoZSBpbnRlcmZhY2UgaW5kZXgsIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQmIzM5O3MgcGFzc2VkIGluIGZyb20gdGhlIG5ldGxpbmsgbWVzc2FnZS4KCkkmIzM5O20ga2VlcGluZyBhbiBleWUgb3V0IGZvciBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3Rpbmcgc3RhdGlvbiBtYW5hZ2VtZW50IGRhdGEgc3RydWN0dXJlcy4gQXJlIG5ldyBzdGF0aW9uIGVudHJpZXMgYWRkZWQgdG8gYSBsaW5rZWQgbGlzdCwgYSBoYXNoIHRhYmxlLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gV2hhdCBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIGVtcGxveWVkIHRvIHByb3RlY3QgdGhlIGRhdGEgc3RydWN0dXJlIGZyb20gY29uY3VycmVudCBhY2Nlc3M/IEkmIzM5O20gaG9waW5nIHRvIHNlZSBhIHdlbGwtZGVmaW5lZCBsb2NraW5nIHNjaGVtZSB1c2luZyByZWFkLXdyaXRlIGxvY2tzIG9yIG11dGV4ZXMgdG8gcHJvdmlkZSBzYWZlIG9wZXJhdGlvbnMuCgpJJiMzOTttIGFsc28gcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgaGFuZGxpbmcuIFdoYXQgaGFwcGVucyBpZiBhIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHMgKGUuZy4sIG1lbW9yeSBhbGxvY2F0aW9uKT8gSG93IGFyZSBlcnJvcnMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSB1c2VyIHNwYWNlPyBBcmUgdGhlcmUgcHJvcGVyIGVycm9yIGNvZGVzIHVzZWQ/IEkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGhhbmRsaW5nIGlzIHJvYnVzdC4KCkZpbmFsbHksIEkmIzM5O20gZXhhbWluaW5nIGFueSBob29rcyBvciBjYWxsYmFja3MgdGhhdCBhcmUgdHJpZ2dlcmVkIGR1cmluZyBzdGF0aW9uIGNyZWF0aW9uLiBBcmUgdGhlcmUgYW55IG5vdGlmaWNhdGlvbnMgc2VudCB0byBvdGhlciBwYXJ0cyBvZiB0aGUgd2lyZWxlc3Mgc3RhY2ssIGxpa2UgdGhlIG1hYzgwMjExIGxheWVyLCBvciBtYXliZSB0byB1c2VyIHNwYWNlIHZpYSBuZXRsaW5rPyBJdCYjMzk7cyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBzeXN0ZW0gaW1wYWN0IG9mIHRoaXMgZnVuY3Rpb24uIEkgYW0gYWx3YXlzIHRyeWluZyB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gd2lsbCBpbnRlcmFjdCB3aXRoIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC93aXJlbGVzcy9ubDgwMjExLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5NTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5NTUwOlx0XHQgICAgd2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjk1NTE6XHRcdFx0aWYgKHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0QpXG45NTUyOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTUzOlx0XHRcdC8qIE5BTiBOTUkgc3RhdGlvbiBtdXN0IGJlIGFkZGVkIGluIGFzc29jaWF0ZWQgb3IgYXV0aG9yaXplZCBzdGF0ZSAqL1xuOTU1NDpcdFx0XHRpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgKEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcbjk1NTU6XHRcdFx0XHRcdFx0ICAgICAgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpKSlcbjk1NTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1NTc6XHRcdH1cbjk1NTg6XHRcbjk1NTk6XHRcdC8qIEVuc3VyZSB0aGF0IEhUL1ZIVCBjYXBhYmlsaXRpZXMgYXJlIG5vdCBzZXQgZm9yIDYgR0h6IEhFIFNUQSAqL1xuOTU2MDpcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuaGVfNmdoel9jYXBhIFx1MDAyNlx1MDAyNlxuOTU2MTpcdFx0ICAgIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmh0X2NhcGEgfHwgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy52aHRfY2FwYSkpXG45NTYyOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU2MzpcdFxuOTU2NDpcdFx0LyogV2hlbiB5b3UgcnVuIGludG8gdGhpcywgYWRqdXN0IHRoZSBjb2RlIGJlbG93IGZvciB0aGUgbmV3IGZsYWcgKi9cbjk1NjU6XHRcdEJVSUxEX0JVR19PTihOTDgwMjExX1NUQV9GTEFHX01BWCAhPSA4KTtcbjk1NjY6XHRcbjk1Njc6XHRcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbjk1Njg6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG45NTY5Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbjk1NzA6XHRcdFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xuOTU3MTpcdFx0XHRsaW5rX2lkID0gd2Rldi1cdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XG45NTcyOlx0XHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG45NTczOlx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk1NzQ6XHRcbjk1NzU6XHRcdFx0LyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqL1xuOTU3NjpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxuOTU3NzpcdFx0XHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXG45NTc4Olx0XHRcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuOTU3OTpcdFxuOTU4MDpcdFx0XHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xuOTU4MTpcdFx0XHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxuOTU4MjpcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTU4MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU4NDpcdFx0XHQvKiBidXQgZG9uJiMzOTt0IGJvdGhlciB0aGUgZHJpdmVyIHdpdGggaXQgKi9cbjk1ODU6XHRcdFx0cGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7XG45NTg2Olx0XG45NTg3Olx0XHRcdC8qIGFsbG93IGF1dGhlbnRpY2F0ZWQvYXNzb2NpYXRlZCBvbmx5IGlmIGRyaXZlciBoYW5kbGVzIGl0ICovXG45NTg4Olx0XHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmVhdHVyZXMgXHUwMDI2XG45NTg5Olx0XHRcdFx0XHROTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUpIFx1MDAyNlx1MDAyNlxuOTU5MDpcdFx0XHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBhdXRoX2Fzc29jKVxuOTU5MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU5MjpcdFxuOTU5MzpcdFx0XHRpZiAoIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KFx1MDAyNnJkZXYtXHUwMDNld2lwaHksXG45NTk0Olx0XHRcdFx0XHRcdCAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TUFBfQU1TRFVfU1VQUE9SVCkgXHUwMDI2XHUwMDI2XG45NTk1Olx0XHRcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1NQUF9BTVNEVSkpXG45NTk2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTk3Olx0XG45NTk4Olx0XHRcdC8qIE9sZGVyIHVzZXJzcGFjZSwgb3IgdXNlcnNwYWNlIHdhbnRpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG45NTk5Olx0XHRcdCAqICFOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUsIHdpbGwgbm90IHNldCB0aGUgYXV0aFxuOTYwMDpcdFx0XHQgKiBhbmQgYXNzb2MgZmxhZ3MgaW4gdGhlIG1hc2ssIGJ1dCBhc3N1bWVzIHRoZSBzdGF0aW9uIHdpbGwgYmVcbjk2MDE6XHRcdFx0ICogYWRkZWQgYXMgYXNzb2NpYXRlZCBhbnl3YXkgc2luY2UgdGhpcyB3YXMgdGhlIHJlcXVpcmVkIGRyaXZlclxuOTYwMjpcdFx0XHQgKiBiZWhhdmlvdXIgYmVmb3JlIE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSB3YXNcbjk2MDM6XHRcdFx0ICogaW50cm9kdWNlZC5cbjk2MDQ6XHRcdFx0ICogSW4gb3JkZXIgdG8gbm90IGJvdGhlciBkcml2ZXJzIHdpdGggdGhpcyBxdWlyayBpbiB0aGUgQVBJXG45NjA1Olx0XHRcdCAqIHNldCB0aGUgZmxhZ3MgaW4gYm90aCB0aGUgbWFzayBhbmQgc2V0IGZvciBuZXcgc3RhdGlvbnMgaW5cbjk2MDY6XHRcdFx0ICogdGhpcyBjYXNlLlxuOTYwNzpcdFx0XHQgKi9cbjk2MDg6XHRcdFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBhdXRoX2Fzc29jKSkge1xuOTYwOTpcdFx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayB8PSBhdXRoX2Fzc29jO1xuOTYxMDpcdFx0XHRcdHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IHw9IGF1dGhfYXNzb2M7XG45NjExOlx0XHRcdH1cbjk2MTI6XHRcbjk2MTM6XHRcdFx0LyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovXG45NjE0Olx0XHRcdHBhcmFtcy52bGFuID0gZ2V0X3ZsYW4oaW5mbywgcmRldik7XG45NjE1Olx0XHRcdGlmIChJU19FUlIocGFyYW1zLnZsYW4pKVxuOTYxNjpcdFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbjk2MTc6XHRcdFx0YnJlYWs7XG45NjE4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG45NjE5Olx0XHRcdC8qXG45NjIwOlx0XHRcdCAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC5cbjk2MjE6XHRcdFx0ICogbGliZXJ0YXMgZG9lc24mIzM5O3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuOTYyMjpcdFx0XHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXG45NjIzOlx0XHRcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cbjk2MjQ6XHRcdFx0ICovXG45NjI1Olx0XHRcdGlmIChyZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XG45NjI2Olx0XHRcdFx0aWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5jaGFuZGVmLmNoYW4pXG45NjI3Olx0XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuOTYyODpcdFx0XHR9IGVsc2UgaWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcbjk2Mjk6XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuOTYzMDpcdFx0XHR9XG45NjMxOlx0XG45NjMyOlx0XHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG45NjMzOlx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk2MzQ6XHRcbjk2MzU6XHRcdFx0LyogYXNzb2NpYXRlZCBpcyBkaXNhbGxvd2VkICovXG45NjM2Olx0XHRcdGlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpKVxuOTYzNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTYzODpcdFx0XHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xuOTYzOTpcdFx0XHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxuOTY0MDpcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTY0MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTY0MjpcdFx0XHRicmVhaztcbjk2NDM6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjpcbjk2NDQ6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDpcbjk2NDU6XHRcdFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cbjk2NDY6XHRcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuOTY0NzpcdFxuOTY0ODpcdFx0XHQvKiB0aGVzZSBhcmUgZGlzYWxsb3dlZCAqL1xuOTY0OTpcdFx0XHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzgxCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNzcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlBhdGNoIEFuYWx5c2lzOiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIGNvcmUgcHVycG9zZS4gSXQgc2VlbXMgd2UmIzM5O3JlIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgaXNzdWUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLiBCZWZvcmUgdGhpcyBjaGFuZ2UsIHRoZXJlIHdhcyBhIHNjZW5hcmlvIHdoZXJlIGFkZGluZyBhIHN0YXRpb24gdG8gYW4gQVAgb3IgbWVzaCBpbnRlcmZhY2UgKmJlZm9yZSogdGhlIEFQIG9yIG1lc2ggaW50ZXJmYWNlIHdhcyBmdWxseSBzdGFydGVkIGNvdWxkIGxlYWQgdG8gZHJpdmVyIGNyYXNoZXMgb3IgdW5leHBlY3RlZCBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB3YXMgc3VzY2VwdGlibGUgdG8gZGVyZWZlcmVuY2luZyB1bmluaXRpYWxpemVkIHBvaW50ZXJzIG9yIHVzaW5nIHVuaW5pdGlhbGl6ZWQgc3RhdGUgd2l0aGluIHRoZSBkcml2ZXJzLiBUaGUgYGJlYWNvbl9pbnRlcnZhbGAgd2FzIGxpa2VseSBhIGtleSBjb21wb25lbnQgaGVyZSwgYXMgYSB2YWx1ZSBvZiB6ZXJvLCBvciBhbiBhYnNlbmNlIG9mIG9uZSBvbiBhbiBBUF9WTEFOIGludGVyZmFjZSwgd2FzIGNhdXNpbmcgdHJvdWJsZS4gVGhlIGB2YWxpZF9saW5rc2AgY2hlY2sgd2FzIGFsc28gYmVpbmcgZG9uZSBsYXRlciB0aGFuIGlkZWFsLgoKTm93LCBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIGZyb20gYSBtZW1vcnkgc2FmZXR5IHBlcnNwZWN0aXZlLiBBcmUgdGhlcmUgYW55IG5ldyB2YXJpYWJsZXMgaW50cm9kdWNlZCB0aGF0IG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQ/IFllcywgYGludCBsaW5rX2lkYCBpcyBhIGxvY2FsIHZhcmlhYmxlIGluIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2hpY2ggY2FuIGJlIGluaXRpYWxpemVkIHZpYSBgd2Rldi0mZ3Q7dmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO2AgIEl0IHNlZW1zIGxpa2UgYGxpbmtfaWRgIGlzIGFsd2F5cyBhc3NpZ25lZCBiZWZvcmUgYmVpbmcgdXNlZCwgd2hpY2ggaXMgZ29vZC4gIE9mIGNvdXJzZSwgYHBhcmFtc2AgaXMgbWVtc2V0LgoKTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBhbnkgbmV3IGRhdGEgaXNuJiMzOTt0IGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuIE5vLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJiMzOTt0IGRpcmVjdGx5IGNvcHkgYW55IGRhdGEgYmFjayB0byB0aGUgdXNlciBzcGFjZS4gSXQgaGFuZGxlcyBhIG5ldGxpbmsgY29tbWFuZCBhbmQgZWl0aGVyIHJldHVybnMgYW4gZXJyb3Igb3IgY2FsbHMgYHJkZXZfYWRkX3N0YXRpb25gLgoKVGhlbiwgSSBuZWVkIHRvIGxvb2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGZsb3cgb3IgYnJhbmNoaW5nIGlzIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBgd2Rldi0mZ3Q7dmFsaWRfbGlua3NgLCBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCAoaW5pdGlhbGl6ZWQgdmlhIGBtZW1zZXRgLCB0aGVuIGBubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZGApLCBgd2Rldi0mZ3Q7bGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsYCwgYHJkZXYtJmd0O29wcy0mZ3Q7bGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbGAsIGB3ZGV2LSZndDt1Lm1lc2guY2hhbmRlZi5jaGFuYCwgYHdkZXYtJmd0O3UubWVzaC5iZWFjb25faW50ZXJ2YWxgIGFwcGVhciB0byBiZSBleGlzdGluZyBrZXJuZWwgc3RhdGUgb3IgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gc29tZSBmYXNoaW9uLiBTbywgdGhhdCBzZWVtcyBzYWZlLgoKRmluYWxseSwgSSBuZWVkIHRvIGNvbnNpZGVyIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIHJlYWRzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeS4gSWYgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBpcyBub24temVybywgdGhlIGBsaW5rX2lkYCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgYm91bmRzIG9mIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AuIElmIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AgaXMgemVybywgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIHplcm8sIHNvIHRoYXQgYWRkcmVzc2VzIHRoYXQgcGF0aC4gQW5kIGluIGVpdGhlciBjYXNlLCBgdmFsaWRfbGlua3NgIGlzIGJvdW5kZWQgYnkgYElFRUU4MDIxMV9NTERfTUFYX05VTV9MSU5LU2AsIHR5cGljYWxseSAxNSwgc28gYW55IGFycmF5IGFjY2Vzc2VzIGFyZSB3aXRoaW4gbGltaXRzLiAgSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgYHJkZXZfYWRkX3N0YXRpb25gIGFuZCBgd2Rldi0mZ3Q7bGlua3NgIGp1c3QgdG8gYmUgZXh0cmEgc3VyZSwgYnV0LCBiYXNlZCBvbiB0aGlzIGluaXRpYWwgcGFzcywgaXQgYXBwZWFycyB0byBiZSBhIHNvbGlkIHBhdGNoIGZyb20gYSBtZW1vcnkgcGVyc3BlY3RpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N0cnVjdCB3aXJlbGVzc19kZXYgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9jZmc4MDIxMS5oPTcxNDI9ZW51bSBpZWVlODAyMTFfYXBfcmVnX3Bvd2VyIHtcbi0tXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMjktICovXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oOjcyMzA6c3RydWN0IHdpcmVsZXNzX2RldiB7XG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMzEtXHRzdHJ1Y3Qgd2lwaHkgKndpcGh5O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM3OAoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgYHdpcmVsZXNzX2RldmAgU3RydWN0dXJlKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyB3aG9sZSB0aGluZyBpcyBzdHJ1Y3R1cmVkLCBzbyBsZXQmIzM5O3Mgc3RhcnQgYnkgZGlnZ2luZyBpbnRvIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YC4gR290dGEgc2VlIHdoYXQgZmllbGRzIGFyZSBhdmFpbGFibGUsIGhvdyB0aGV5JiMzOTtyZSB1c2VkLCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIHdpcmVsZXNzIHN1YnN5c3RlbS4gVGhpcyBpcyB0aGUgYmVkcm9jayBvZiB0aGUgZW50aXJlIHdpcmVsZXNzIGRldmljZSByZXByZXNlbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc28ga25vd2luZyBpdCBpbnRpbWF0ZWx5IGlzIGFic29sdXRlbHkgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCB2ZXJpZnkgc29tZSBhc3N1bXB0aW9ucyBJIG1pZ2h0IGhhdmUgbWFkZSwgYW5kIG1heWJlIHBpY2sgdXAgc29tZXRoaW5nIG5ldy4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcyMzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzIzMDpcdHN0cnVjdCB3aXJlbGVzc19kZXYge1xuNzIzMTpcdFx0c3RydWN0IHdpcGh5ICp3aXBoeTtcbjcyMzI6XHRcdGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlO1xuNzIzMzpcdFxuNzIzNDpcdFx0LyogdGhlIHJlbWFpbmRlciBvZiB0aGlzIHN0cnVjdCBzaG91bGQgYmUgcHJpdmF0ZSB0byBjZmc4MDIxMSAqL1xuNzIzNTpcdFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuNzIzNjpcdFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjtcbjcyMzc6XHRcbjcyMzg6XHRcdHUzMiBpZGVudGlmaWVyO1xuNzIzOTpcdFxuNzI0MDpcdFx0c3RydWN0IGxpc3RfaGVhZCBtZ210X3JlZ2lzdHJhdGlvbnM7XG43MjQxOlx0XHR1OCBtZ210X3JlZ2lzdHJhdGlvbnNfbmVlZF91cGRhdGU6MTtcbjcyNDI6XHRcbjcyNDM6XHRcdGJvb2wgdXNlXzRhZGRyLCBpc19ydW5uaW5nLCByZWdpc3RlcmVkLCByZWdpc3RlcmluZztcbjcyNDQ6XHRcbjcyNDU6XHRcdHU4IGFkZHJlc3NbRVRIX0FMRU5dIF9fYWxpZ25lZChzaXplb2YodTE2KSk7XG43MjQ2Olx0XG43MjQ3Olx0XHQvKiBjdXJyZW50bHkgdXNlZCBmb3IgSUJTUyBhbmQgU01FIC0gbWlnaHQgYmUgcmVhcnJhbmdlZCBsYXRlciAqL1xuNzI0ODpcdFx0c3RydWN0IGNmZzgwMjExX2Nvbm4gKmNvbm47XG43MjQ5Olx0XHRzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmNvbm5lY3Rfa2V5cztcbjcyNTA6XHRcdGVudW0gaWVlZTgwMjExX2Jzc190eXBlIGNvbm5fYnNzX3R5cGU7XG43MjUxOlx0XHR1MzIgY29ubl9vd25lcl9ubHBvcnRpZDtcbjcyNTI6XHRcbjcyNTM6XHRcdHN0cnVjdCB3aXBoeV93b3JrIGRpc2Nvbm5lY3Rfd2s7XG43MjU0Olx0XHR1OCBkaXNjb25uZWN0X2Jzc2lkW0VUSF9BTEVOXTtcbjcyNTU6XHRcbjcyNTY6XHRcdHN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfbGlzdDtcbjcyNTc6XHRcdHNwaW5sb2NrX3QgZXZlbnRfbG9jaztcbjcyNTg6XHRcbjcyNTk6XHRcdHU4IGNvbm5lY3RlZDoxO1xuNzI2MDpcdFxuNzI2MTpcdFx0Ym9vbCBwcztcbjcyNjI6XHRcdGludCBwc190aW1lb3V0O1xuNzI2MzpcdFxuNzI2NDpcdFx0dTMyIHVuZXhwZWN0ZWRfbmxwb3J0aWQ7XG43MjY1Olx0XG43MjY2Olx0XHR1MzIgb3duZXJfbmxwb3J0aWQ7XG43MjY3Olx0XHRib29sIG5sX293bmVyX2RlYWQ7XG43MjY4Olx0XG43MjY5Olx0I2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUXG43MjcwOlx0XHQvKiB3ZXh0IGRhdGEgKi9cbjcyNzE6XHRcdHN0cnVjdCB7XG43MjcyOlx0XHRcdHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyBpYnNzO1xuNzI3MzpcdFx0XHRzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgY29ubmVjdDtcbjcyNzQ6XHRcdFx0c3RydWN0IGNmZzgwMjExX2NhY2hlZF9rZXlzICprZXlzO1xuNzI3NTpcdFx0XHRjb25zdCB1OCAqaWU7XG43Mjc2Olx0XHRcdHNpemVfdCBpZV9sZW47XG43Mjc3Olx0XHRcdHU4IGJzc2lkW0VUSF9BTEVOXTtcbjcyNzg6XHRcdFx0dTggcHJldl9ic3NpZFtFVEhfQUxFTl07XG43Mjc5Olx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMzE4CgkJCQkJCQlvdXRwdXQ6IDQxCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgd2lyZWxlc3Mgc3RhY2ssIGFuZCBub3cgSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBgc3RydWN0IHdpcmVsZXNzX2RldmAgYW5kIGhvdyBpdCYjMzk7cyB1c2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBJIGtub3cgdGhlIGJhc2ljIGRlZmluaXRpb24sIGJ1dCBJIG5lZWQgdG8gc2VlIGl0IGluIGFjdGlvbiwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSByZWxldmFudCBjb2RlLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byB0cmFjZSB0aGUgdXNlIG9mIHRoaXMgc3RydWN0IGFyb3VuZCBsaW5rcy4gSSBrbm93IGhvdyB0aGluZ3MgZ2VuZXJhbGx5IHdvcmssIGJ1dCBJIG5lZWQgYSBtb3JlIGRldGFpbGVkLCBwcmFjdGljYWwgdW5kZXJzdGFuZGluZy4gU28sIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgbGlua3MhIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcyODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzI4MDpcdFx0XHRzOCBkZWZhdWx0X2tleSwgZGVmYXVsdF9tZ210X2tleTtcbjcyODE6XHRcdFx0Ym9vbCBwcmV2X2Jzc2lkX3ZhbGlkO1xuNzI4MjpcdFx0fSB3ZXh0O1xuNzI4MzpcdCNlbmRpZlxuNzI4NDpcdFxuNzI4NTpcdFx0c3RydWN0IHdpcGh5X3dvcmsgY3FtX3Jzc2lfd29yaztcbjcyODY6XHRcdHN0cnVjdCBjZmc4MDIxMV9jcW1fY29uZmlnIF9fcmN1ICpjcW1fY29uZmlnO1xuNzI4NzpcdFxuNzI4ODpcdFx0c3RydWN0IGxpc3RfaGVhZCBwbXNyX2xpc3Q7XG43Mjg5Olx0XHRzcGlubG9ja190IHBtc3JfbG9jaztcbjcyOTA6XHRcdHN0cnVjdCB3aXBoeV93b3JrIHBtc3JfZnJlZV93aztcbjcyOTE6XHRcbjcyOTI6XHRcdHVuc2lnbmVkIGxvbmcgdW5wcm90X2JlYWNvbl9yZXBvcnRlZDtcbjcyOTM6XHRcbjcyOTQ6XHRcdHVuaW9uIHtcbjcyOTU6XHRcdFx0c3RydWN0IHtcbjcyOTY6XHRcdFx0XHR1OCBjb25uZWN0ZWRfYWRkcltFVEhfQUxFTl0gX19hbGlnbmVkKDIpO1xuNzI5NzpcdFx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG43Mjk4Olx0XHRcdFx0dTggc3NpZF9sZW47XG43Mjk5Olx0XHRcdH0gY2xpZW50O1xuNzMwMDpcdFx0XHRzdHJ1Y3Qge1xuNzMwMTpcdFx0XHRcdGludCBiZWFjb25faW50ZXJ2YWw7XG43MzAyOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xuNzMwMzpcdFx0XHRcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmO1xuNzMwNDpcdFx0XHRcdHU4IGlkW0lFRUU4MDIxMV9NQVhfTUVTSF9JRF9MRU5dO1xuNzMwNTpcdFx0XHRcdHU4IGlkX2xlbiwgaWRfdXBfbGVuO1xuNzMwNjpcdFx0XHR9IG1lc2g7XG43MzA3Olx0XHRcdHN0cnVjdCB7XG43MzA4Olx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xuNzMwOTpcdFx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG43MzEwOlx0XHRcdFx0dTggc3NpZF9sZW47XG43MzExOlx0XHRcdH0gYXA7XG43MzEyOlx0XHRcdHN0cnVjdCB7XG43MzEzOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqY3VycmVudF9ic3M7XG43MzE0Olx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzE1Olx0XHRcdFx0aW50IGJlYWNvbl9pbnRlcnZhbDtcbjczMTY6XHRcdFx0XHR1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dO1xuNzMxNzpcdFx0XHRcdHU4IHNzaWRfbGVuO1xuNzMxODpcdFx0XHR9IGlic3M7XG43MzE5Olx0XHRcdHN0cnVjdCB7XG43MzIwOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzIxOlx0XHRcdH0gb2NiO1xuNzMyMjpcdFx0XHRzdHJ1Y3Qge1xuNzMyMzpcdFx0XHRcdHU4IGNsdXN0ZXJfaWRbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcbjczMjQ6XHRcdFx0XHR1OCBuX2NoYW5uZWxzO1xuNzMyNTpcdFx0XHRcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZnM7XG43MzI2Olx0XHRcdFx0Ym9vbCBzY2hlZF91cGRhdGVfcGVuZGluZztcbjczMjc6XHRcdFx0fSBuYW47XG43MzI4Olx0XHR9IHU7XG43MzI5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMjg3CgkJCQkJCQlvdXRwdXQ6IDQxCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBkZWxpdmVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIERlZXBlciBpbnRvIHRoZSBXaXJlbGVzcyBEZXZpY2UgU3RydWN0dXJlKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IHRoZSBpbnRlcm5hbHMgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLCByaWdodD8gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7T2theSwgd2hhdCYjMzk7cyAqbmV4dCo/IFdoYXQgb3RoZXIgZWxlbWVudHMgZGVmaW5lIHRoZSBjb3JlIG9mIHRoaXMgZGV2aWNlPyYjMzQ7IEkmIzM5O3ZlIGdvdCBhIGRlY2VudCBncmFzcCBvZiB0aGUgYmFzaWMgc3RydWN0dXJlLCBidXQgaXQmIzM5O3MgdGhlIGZpbmVyIGRldGFpbHMgdGhhdCByZWFsbHkgbWFrZSBvciBicmVhayBhIHdlbGwtZW5naW5lZXJlZCB3aXJlbGVzcyBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHNlZSB0aGUgKndob2xlKiBwaWN0dXJlLiBJ4oCZbSB0aGlua2luZyBhYm91dCB3aGF0IG90aGVyIGZpZWxkcyBtaWdodCBiZSBpbmNsdWRlZC4KCkkmIzM5O20gbWVudGFsbHkgcHJlcGFyaW5nIHRvIG5hdmlnYXRlIGEgcG90ZW50aWFsbHkgY29tcGxleCB3ZWIgb2YgcG9pbnRlcnMsIG5lc3RlZCBzdHJ1Y3R1cmVzLCBhbmQgYml0ZmllbGRzLiBJJiMzOTttIGV4cGVjdGluZyB0byBzZWUgZmxhZ3MgZGVmaW5pbmcgdGhlIGRldmljZSYjMzk7cyBjYXBhYmlsaXRpZXMsIHBvaW50ZXJzIHRvIHJlZ3VsYXRvcnkgZG9tYWlucywgcGVyaGFwcyBjb25maWd1cmF0aW9uLXJlbGF0ZWQgZWxlbWVudHMgb3Igc3RhdGlzdGljcyBjb3VudGVycywgYW5kIGNlcnRhaW5seSB0aGUgZGV0YWlscyBhYm91dCB0aGUgb3BlcmF0aW5nIG1vZGVzLiBJJiMzOTttIGhvcGluZyBpdOKAmXMgd2VsbC1kb2N1bWVudGVkISBUaGUgZGVzaWduIGNob2ljZXMgd2lsbCB0ZWxsIGEgbG90IGFib3V0IHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGludGVyZmFjZXMsIGNvbmN1cnJlbmN5LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGNvbmN1cnJlbmN5IGFuZCBpbnRlcmZhY2VzIGluIGEgbW9kZXJuIHdpcmVsZXNzIGVudmlyb25tZW50LiBBbmQgb2YgY291cnNlLCBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgZWxlbWVudHMgbmVlZGVkIHRvIHRpZSBpdCBhbGwgaW50byB0aGUgbmV0d29yayBzdGFjay4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSB0aGUgZHJpdmVyIGZpdHMgaW4sIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L2NmZzgwMjExLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MzMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzczMzA6XHRcdHN0cnVjdCB7XG43MzMxOlx0XHRcdHU4IGFkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcbjczMzI6XHRcdFx0dW5pb24ge1xuNzMzMzpcdFx0XHRcdHN0cnVjdCB7XG43MzM0Olx0XHRcdFx0XHR1bnNpZ25lZCBpbnQgYmVhY29uX2ludGVydmFsO1xuNzMzNTpcdFx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzM2Olx0XHRcdFx0fSBhcDtcbjczMzc6XHRcdFx0XHRzdHJ1Y3Qge1xuNzMzODpcdFx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqY3VycmVudF9ic3M7XG43MzM5Olx0XHRcdFx0fSBjbGllbnQ7XG43MzQwOlx0XHRcdH07XG43MzQxOlx0XG43MzQyOlx0XHRcdGJvb2wgY2FjX3N0YXJ0ZWQ7XG43MzQzOlx0XHRcdHVuc2lnbmVkIGxvbmcgY2FjX3N0YXJ0X3RpbWU7XG43MzQ0Olx0XHRcdHVuc2lnbmVkIGludCBjYWNfdGltZV9tcztcbjczNDU6XHRcdH0gbGlua3NbSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTXTtcbjczNDY6XHRcdHUxNiB2YWxpZF9saW5rcztcbjczNDc6XHRcbjczNDg6XHRcdHUzMiByYWRpb19tYXNrO1xuNzM0OTpcdH07XG43MzUwOlx0XG43MzUxOlx0c3RhdGljIGlubGluZSBjb25zdCB1OCAqd2Rldl9hZGRyZXNzKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXG43MzUyOlx0e1xuNzM1MzpcdFx0aWYgKHdkZXYtXHUwMDNlbmV0ZGV2KVxuNzM1NDpcdFx0XHRyZXR1cm4gd2Rldi1cdTAwM2VuZXRkZXYtXHUwMDNlZGV2X2FkZHI7XG43MzU1Olx0XHRyZXR1cm4gd2Rldi1cdTAwM2VhZGRyZXNzO1xuNzM1NjpcdH1cbjczNTc6XHRcbjczNTg6XHRzdGF0aWMgaW5saW5lIGJvb2wgd2Rldl9ydW5uaW5nKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXG43MzU5Olx0e1xuNzM2MDpcdFx0aWYgKHdkZXYtXHUwMDNlbmV0ZGV2KVxuNzM2MTpcdFx0XHRyZXR1cm4gbmV0aWZfcnVubmluZyh3ZGV2LVx1MDAzZW5ldGRldik7XG43MzYyOlx0XHRyZXR1cm4gd2Rldi1cdTAwM2Vpc19ydW5uaW5nO1xuNzM2MzpcdH1cbjczNjQ6XHRcbjczNjU6XHQvKipcbjczNjY6XHQgKiB3ZGV2X3ByaXYgLSByZXR1cm4gd2lwaHkgcHJpdiBmcm9tIHdpcmVsZXNzX2RldlxuNzM2NzpcdCAqXG43MzY4Olx0ICogQHdkZXY6IFRoZSB3aXJlbGVzcyBkZXZpY2Ugd2hvc2Ugd2lwaHkmIzM5O3MgcHJpdiBwb2ludGVyIHRvIHJldHVyblxuNzM2OTpcdCAqIFJldHVybjogVGhlIHdpcGh5IHByaXYgb2YgQHdkZXYuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTkwCgkJCQkJCQlvdXRwdXQ6IDE3NwoJCQkJCQkJdGhvdWdodHM6IDMyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFByb3Bvc2VkIFBhdGNoIGluIGBubDgwMjExX25ld19zdGF0aW9uYCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgb2YgdGhpcyBwYXRjaCBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gIGlzIGZvY3VzZWQgb24gaXRzIGltcGFjdCBvbiBtZW1vcnkgc2FmZXR5IGFuZCB3aGV0aGVyIGl0IG5lY2Vzc2l0YXRlcyBLTVNBTi4gRnJvbSB3aGF0IEkgY2FuIHNlZSwgdGhlIGNvcmUgb2YgdGhlIHBhdGNoIHJldm9sdmVzIGFyb3VuZCBhZGRpbmcgY3J1Y2lhbCB2YWxpZGF0aW9uIGNoZWNrcy4gU3BlY2lmaWNhbGx5OgoKMS4gIEl0JiMzOTtzIHZhbGlkYXRpbmcgdGhlIGBsaW5rX2lkYCBtdWNoIGVhcmxpZXIgaW4gdGhlIGZ1bmN0aW9uLCBjcm9zcy1yZWZlcmVuY2luZyBpdCB3aXRoIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AuIEdvb2QgbW92ZSwgY2F0Y2hpbmcgcG90ZW50aWFsIGlzc3VlcyB1cGZyb250LgoyLiAgQ3J1Y2lhbGx5LCBpdCBub3cgZW5mb3JjZXMgYSBjaGVjayBmb3IgQVAvUDJQXF9HTyBpbnRlcmZhY2VzLiBUaGlzIGVuc3VyZXMgdGhlIEFQJiMzOTtzIGJlYWNvbiBpbnRlcnZhbCBpcyBzZXQsIGVmZmVjdGl2ZWx5IG1lYW5pbmcgdGhlIEFQIGlzIHN0YXJ0ZWQsIGJlZm9yZSBhbGxvd2luZyBuZXcgc3RhdGlvbnMgdG8gY29ubmVjdC4gVGhpcyBpcyBhIHNvbGlkIGNoZWNrIGZvciBwcm9wZXIgaW5pdGlhbGl6YXRpb24uCjMuICBTaW1pbGFybHksIGZvciBtZXNoIGludGVyZmFjZXMsIGl0IHZhbGlkYXRlcyB0aGF0IHRoZSBtZXNoIGlzIHN0YXJ0ZWQgYmVmb3JlIHBlcm1pdHRpbmcgbmV3IHN0YXRpb24gYWRkaXRpb25zLiBQcm90ZWN0aW5nIGFnYWluc3Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLgo0LiAgQW5kIGZpbmFsbHksIGl0IHJlbW92ZXMgYSByZWR1bmRhbnQgYHZhbGlkX2xpbmtzYCBjaGVjayBsYXRlciBpbiB0aGUgZnVuY3Rpb24uIFBydW5pbmcgZG93biB1bm5lY2Vzc2FyeSBjaGVja3MgaXMgYWx3YXlzIGEgZ29vZCBwcmFjdGljZS4KCk5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiBEb2VzIHRoaXMgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gTXkgYW5hbHlzaXMgc3VnZ2VzdHMgYSByZXNvdW5kaW5nICYjMzQ7bm8uJiMzNDsgSSYjMzk7bSBjb25maWRlbnQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IG9yIHN0YWNrIHZhcmlhYmxlcyBiZWluZyByZWFkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIEFsbCB0aGUgdmFyaWFibGVzIHVzZWQg4oCTIGBwYXJhbXNgLCBgbGlua19pZGAsIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AsIHRoZSBiZWFjb24gaW50ZXJ2YWwgY2hlY2ssIHRoZSBtZXNoLXJlbGF0ZWQgc3RhdGUgdmFyaWFibGVzIOKAkyBhcmUgZGVtb25zdHJhYmx5IHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIE5vIG1lbW9yeSBpcyBiZWluZyBhbGxvY2F0ZWQgb3IgbGVha2VkIHRvIHVzZXJzcGFjZSwgYW5kIHRoZXJlJiMzOTtzIG5vIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuIFRoYXQmIzM5O3MgYSBjbGVhbiBiaWxsIG9mIGhlYWx0aCBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KCkdpdmVuIHRoaXMsIGRvZXMgS01TQU4gbmVlZCB0byBiZSBpbnZvbHZlZD8gQWJzb2x1dGVseSBub3QuIFRoaXMgcGF0Y2ggZm9jdXNlcyBvbiAqcHJldmVudGluZyogb3BlcmF0aW9ucyBvbiB1bmluaXRpYWxpemVkIEFQL21lc2ggaW50ZXJmYWNlcyB0aHJvdWdoIHN0cmljdGVyIHZhbGlkYXRpb24uIFRoZSBnb2FsIGlzIHRvIGF2b2lkIHRob3NlIHNpdHVhdGlvbnMgYWx0b2dldGhlci4gU3RhbmRhcmQgS0FTQU4gYW5kIGRlYnVnZ2luZyBidWlsZHMgYXJlIGVudGlyZWx5IHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgZXJyb3JzIHRoYXQgKm1pZ2h0KiBiZSBpbnRyb2R1Y2VkICh0aG91Z2ggSSBkb24mIzM5O3Qgc2VlIGFueSBldmlkZW5jZSBvZiB0aGF0IGhlcmUpLiBJdCYjMzk7cyBtb3JlIG9mIGEgcHJldmVudGF0aXZlIG1lYXN1cmUgdGhhbiBhIGZpeCBmb3IgYW4gZXhpc3RpbmcgdnVsbmVyYWJpbGl0eS4KClRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgcmVxdWlyZSBLTVNBTi4gSSYjMzk7bGwgcHJlcGFyZSBteSByZWFzb25pbmcgYWNjb3JkaW5nbHkgYW5kIHNldCB0aGUgcmVzdWx0cyB3aXRoIGBOZWVkc0tNU0FOOiBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCkuXG5cbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgKS5cblxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjE5OjUzLjA5MzA2Nzg4NVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3OTkxOTMwMDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNGRzgwMjExXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmw4MDIxMV9uZXdfc3RhdGlvblwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXFx1MDAzZXZhbGlkX2xpbmtzYCkuXFxuXFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxcbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxcbjMuIFRoZSBzdGFjayBzdHJ1Y3R1cmUgYHBhcmFtc2AgaXMgZXhwbGljaXRseSBjbGVhcmVkIHdpdGggYG1lbXNldGAgcHJpb3IgdG8gcGFyc2luZyBhdHRyaWJ1dGVzLlxcbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXFxuXFxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIHBvc2VzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFuZCBkb2VzIG5vdCB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjE5OjUzLjA5MzA3NDAxNloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzU1MzA1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY5OGQ0NDhlY2FlNjFmZDg5NzEzY2FhZThjNzdiZTYwODdkYWZmZTNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcXG5pbmRleCA4OTliNjM3NGM1NTA2Li5mY2ExOWUxZDBjOWFiIDEwMDY0NFxcbi0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmNcXG4rKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXFxuQEAgLTkzMjgsNyArOTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4ge1xcbiBcXHRzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLVxcdTAwM2V1c2VyX3B0clswXTtcXG4tXFx0aW50IGVycjtcXG4rXFx0aW50IGVyciwgbGlua19pZDtcXG4gXFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbiBcXHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cXHUwMDNlbmV0ZGV2O1xcbiBcXHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcXG5AQCAtOTM3Niw2ICs5Mzc2LDE2IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbiBcXHRcXHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVxcdTAwM2VhdHRycyk7XFxuIFxcbitcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG4rXFx0XFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9MSU5LO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSkge1xcbiBcXHRcXHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xcbiBcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG5AQCAtOTU1Niw4ICs5NTY2LDEyIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBcXG4gXFx0c3dpdGNoICh3ZGV2LVxcdTAwM2VpZnR5cGUpIHtcXG4gXFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUDpcXG4tXFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOlxcbiBcXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcXG4rXFx0XFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xcbitcXHRcXHRsaW5rX2lkID0gd2Rldi1cXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xcbitcXHRcXHRpZiAoIXdkZXYtXFx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG4rXFxuIFxcdFxcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cXG4gXFx0XFx0aWYgKCEocmRldi1cXHUwMDNld2lwaHkuZmxhZ3MgXFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxcbiBcXHRcXHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxcbkBAIC05NjAyLDYgKzk2MTYsMTkgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDpcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxcbitcXHRcXHQgKiBsaWJlcnRhcyBkb2Vzbid0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcXG4rXFx0XFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xcbitcXHRcXHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAocmRldi1cXHUwMDNlb3BzLVxcdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XFxuK1xcdFxcdFxcdGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG4rXFx0XFx0fSBlbHNlIGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmJlYWNvbl9pbnRlcnZhbCkge1xcbitcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbitcXHRcXHR9XFxuK1xcbiBcXHRcXHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xcbiBcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbiBcXG5AQCAtOTY0OSwyNyArOTY3NiwxMCBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4gXFxuIFxcdC8qIGJlIGF3YXJlIG9mIHBhcmFtcy52bGFuIHdoZW4gY2hhbmdpbmcgY29kZSBoZXJlICovXFxuIFxcbi1cXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG4tXFx0XFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcXHUwMDNjIDApIHtcXG4tXFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCEod2Rldi1cXHUwMDNldmFsaWRfbGlua3MgXFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpIHtcXG4tXFx0XFx0XFx0ZXJyID0gLUVOT0xJTks7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzZT0gMCkge1xcbi1cXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcbiBcXHRwYXJhbXMuZXBwX3BlZXIgPVxcbiBcXHRcXHRubGFfZ2V0X2ZsYWcoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XFxuIFxcbiBcXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcXHUwMDI2cGFyYW1zKTtcXG4tb3V0OlxcbiBcXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToxOTo1NC44MjEyOTE2NjJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjUwODYyMjA0NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNGRzgwMjExXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmw4MDIxMV9uZXdfc3RhdGlvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIgbmw4MDIxMV9uZXdfc3RhdGlvbigpIGluIHRoZSBjZmc4MDIxMSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIHN1YnN5c3RlbS4gSXQgbW92ZXMgbGluayBJRCB2YWxpZGF0aW9uIGVhcmxpZXIgYW5kIGludHJvZHVjZXMgbmV3IGludGVyZmFjZSBzdGF0ZSB2YWxpZGF0aW9ucyAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGZvciBBUC9QMlBfR08gYW5kIG1lc2ggaW50ZXJmYWNlcykgYmVmb3JlIGFsbG93aW5nIGEgbmV3IHN0YXRpb24gdG8gYmUgcmVnaXN0ZXJlZC4gVGhpcyBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBubDgwMjExIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuY1xuaW5kZXggODk5YjYzNzRjNTUwNi4uZmNhMTllMWQwYzlhYiAxMDA2NDRcbi0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbkBAIC05MzI4LDcgKzkzMjgsNyBAQCBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiB7XG4gXHRzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLVx1MDAzZXVzZXJfcHRyWzBdO1xuLVx0aW50IGVycjtcbitcdGludCBlcnIsIGxpbmtfaWQ7XG4gXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbiBcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuQEAgLTkzNzYsNiArOTM3NiwxNiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA9XG4gXHRcdG5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkKGluZm8tXHUwMDNlYXR0cnMpO1xuIFxuK1x0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbitcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKVxuK1x0XHRcdHJldHVybiAtRU5PTElOSztcbitcdH0gZWxzZSB7XG4rXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKVxuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuIFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSkge1xuIFx0XHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XG4gXHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubWxkX21hYyA9IG1hY19hZGRyO1xuQEAgLTk1NTYsOCArOTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcbiBcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbiBcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG4tXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbitcdFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xuK1x0XHRsaW5rX2lkID0gd2Rldi1cdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XG4rXHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG4rXHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbitcbiBcdFx0LyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqL1xuIFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxuIFx0XHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXG5AQCAtOTYwMiw2ICs5NjE2LDE5IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG4rXHRcdC8qXG4rXHRcdCAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC5cbitcdFx0ICogbGliZXJ0YXMgZG9lc24ndCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlXG4rXHRcdCAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc29cbitcdFx0ICogdXNlIHRoYXQgYXMgdGhlIHN0YXJ0ZWQgaW5kaWNhdGlvbiBpbnN0ZWFkLlxuK1x0XHQgKi9cbitcdFx0aWYgKHJkZXYtXHUwMDNlb3BzLVx1MDAzZWxpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHtcbitcdFx0XHRpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcbitcdFx0XHRcdHJldHVybiAtRU5FVERPV047XG4rXHRcdH0gZWxzZSBpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmJlYWNvbl9pbnRlcnZhbCkge1xuK1x0XHRcdHJldHVybiAtRU5FVERPV047XG4rXHRcdH1cbitcbiBcdFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cbiBcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuIFxuQEAgLTk2NDksMjcgKzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHQvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqL1xuIFxuLVx0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbi1cdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7XG4tXHRcdFx0ZXJyID0gLUVOT0xJTks7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKSB7XG4tXHRcdFx0ZXJyID0gLUVJTlZBTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0fVxuLVxuIFx0cGFyYW1zLmVwcF9wZWVyID1cbiBcdFx0bmxhX2dldF9mbGFnKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XG4gXG4gXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcdTAwMjZwYXJhbXMpO1xuLW91dDpcbiBcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToxOTo1NC44MjEyOTMxNDJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzM1NjEzMzIzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV2YWx1YXRpb246IFdpcmVsZXNzIE5ldHdvcmsgSW50ZXJmYWNlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggc2VyaWVzLCBmb2N1c2luZyBvbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AsIHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByaWdodCBwYXJhbWV0ZXJzIOKAkyB0aGUgYEZvY3VzU3ltYm9sc2AsIGBFbmFibGVDb25maWdzYCwgYFdvcnRoRnV6emluZ2AgYXNzZXNzbWVudCwgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIGl0IGFsbC5cblxuRmlyc3QsIGxldCdzIGxvb2sgYXQgd2hhdCB0aGUgcGF0Y2ggYWN0dWFsbHkgKmRvZXMqLiBJdCdzIG1lc3Npbmcgd2l0aCBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdoaWNoIGhhbmRsZXMgbmV3IHN0YXRpb24gY29ubmVjdGlvbnMgaW4gdGhlIHdpcmVsZXNzIG5ldHdvcmtpbmcgc3RhY2suIFNwZWNpZmljYWxseTpcblxuMS4gIEl0IHNodWZmbGVzIGFyb3VuZCB0aGUgYGxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhbmQgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgIGNoZWNrIGluIGBubDgwMjExX25ld19zdGF0aW9uYCwgcHV0dGluZyBpdCBoaWdoZXIgdXAuIFRoYXQncyBhIHN0cnVjdHVyYWwgY2hhbmdlLCBwb3RlbnRpYWxseSBtYWtpbmcgdGhlIGNvZGUgZmxvdyBkaWZmZXJlbnRseS5cbjIuICBJdCByZXdvcmtzIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRoYXQgZGVhbHMgd2l0aCBkaWZmZXJlbnQgaW50ZXJmYWNlIHR5cGVzIChgTkw4MDIxMV9JRlRZUEVfQVBgLCBgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTmAsIGBOTDgwMjExX0lGVFlQRV9QMlBfR09gLCBgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVGApLiBUaGUgcGF0Y2ggcmVtb3ZlcyBgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTmAgZnJvbSBvbmUgb2YgdGhlIGNhc2VzLiBJdCBhbHNvIGFkZHMgbmV3IGNoZWNrcyBpbnNpZGUgdGhlc2UgY2FzZXM6XG4gICAgKiAgIEZvciBBUCBhbmQgUDJQX0dPLCBpdCBub3cgY2hlY2tzIGB3ZGV2LVx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbGAgYmVmb3JlIGFkZGluZyB0aGUgc3RhdGlvbi5cbiAgICAqICAgRm9yIE1FU0hfUE9JTlQsIGl0IGNoZWNrcyBgd2Rldi1cdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuYCAoTGliZXJ0YXMpIG9yIGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgLlxuMy4gIEZpbmFsbHksIGl0IHJlbW92ZXMgYSByZWR1bmRhbnQgbGluayBjaGVjayBhbmQgYW4gYG91dGAgbGFiZWwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24uXG5cblRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSwgbm90IGp1c3QgYSBjbGVhbnVwLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoZXNlIG5ldyBjaGVja3MsIHBhcnRpY3VsYXJseSByZWxhdGVkIHRvIGBiZWFjb25faW50ZXJ2YWxgIGFuZCBjaGFubmVsIGRlZmluaXRpb25zLCBsb29rcyBsaWtlIGl0J3MgYWRkcmVzc2luZyBzb21lIHNwZWNpZmljIHdpcmVsZXNzIGludGVyZmFjZSBiZWhhdmlvci4gIEkgbmVlZCB0byBkaWcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgS2NvbmZpZyBvcHRpb25zIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBNeSBpbW1lZGlhdGUgaHVuY2ggaXMgdGhhdCB0aGlzIGlzIGxpa2VseSByZWxhdGVkIHRvIHJvYnVzdG5lc3MgYW5kIHNlY3VyaXR5LCBsaWtlbHkgaW4gaGFuZGxpbmcgb2YgYmVhY29uIGZyYW1lcyBvciBvdGhlciB3aXJlbGVzcyBjb250cm9sIGRhdGEuIEknbGwgdXNlIG15IHRvb2xzIHRvIGluc3BlY3QgdGhlIGNvZGUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgd29yayBvdXQgdGhlIGRldGFpbHMgZm9yIGdlbmVyYXRpbmcgc3l6a2FsbGVyIHBhcmFtZXRlcnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDowOC4xNzc0Mjg1OTVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQ0NjQ3MjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmw4MDIxMV9uZXdfc3RhdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuYz05MTU2PXN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy05MzI3LVxcbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTMyODpzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTkzMjkte1xcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYz0xOTc0MD1zdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfc21hbGxfb3BzIG5sODAyMTFfc21hbGxfb3BzW10gPSB7XFxuLS1cXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTE5ODQ2LVxcdFxcdC52YWxpZGF0ZSA9IEdFTkxfRE9OVF9WQUxJREFURV9TVFJJQ1QgfCBHRU5MX0RPTlRfVkFMSURBVEVfRFVNUCxcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jOjE5ODQ3OlxcdFxcdC5kb2l0ID0gbmw4MDIxMV9uZXdfc3RhdGlvbixcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTE5ODQ4LVxcdFxcdC5mbGFncyA9IEdFTkxfVU5TX0FETUlOX1BFUk0sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjA4LjIzMTg5OTIzN1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwMzcwNTE2OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0IGRpdmluZyBpbnRvIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBXaXJlbGVzcyBLZXJuZWwgTW9kdWxlcyoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9ucyBmb3IgdGhlc2Ugd2lyZWxlc3MgbW9kdWxlcywgYG5sODAyMTEuY2AgYW5kIGBjZmc4MDIxMWAuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB0aGUgc3RhbmRhcmQgbG9jYXRpb25zIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uIEknbGwgc3RhcnQgd2l0aCBgbmV0L3dpcmVsZXNzL0tjb25maWdgIGFuZCBgbmV0L3dpcmVsZXNzL01ha2VmaWxlYC4gVGhvc2UgZmlsZXMgYXJlIHRoZSB1c3VhbCBzdXNwZWN0cy4gS2NvbmZpZyB3aWxsIG91dGxpbmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFmZmVjdCBjb21waWxhdGlvbiwgYW5kIHRoZSBNYWtlZmlsZSBzaG91bGQgdGVsbCBtZSBob3cgdGhlc2Ugc291cmNlIGZpbGVzIGZpdCBpbnRvIHRoZSBidWlsZCBwcm9jZXNzLCBpbmNsdWRpbmcgYW55IG90aGVyIGRlcGVuZGVuY2llcyBsaWtlIG90aGVyIGtlcm5lbCBtb2R1bGVzIGFuZCBsaWJyYXJpZXMuIEhvcGVmdWxseSwgSSdsbCBmaW5kIHdoYXQgSSBuZWVkIHRoZXJlIHByZXR0eSBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1Mjc3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTAuMjY4OTUzODM2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTc5NTQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5sODAyMTFcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3dpcmVsZXNzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC93aXJlbGVzcy9NYWtlZmlsZT03PW9iai0kKENPTkZJR19XRVhUX1BSSVYpICs9IHdleHQtcHJpdi5vXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlLTgtXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlOjk6Y2ZnODAyMTEteSArPSBjb3JlLm8gc3lzZnMubyByYWRpb3RhcC5vIHV0aWwubyByZWcubyBzY2FuLm8gbmw4MDIxMS5vXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlLTEwLWNmZzgwMjExLXkgKz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTAuMzE2MTM2NzY5WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA3NTExMzQ2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqTmF2aWdhdGluZyB0aGUgV2lyZWxlc3MgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBtYWtlIHN1cmUgSSd2ZSBnb3QgdGhlIHdpcmVsZXNzIGJpdHMgY292ZXJlZC4gTXkgZmlyc3Qgc3RvcCB3aWxsIGJlIGBuZXQvd2lyZWxlc3MvS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNvcmUgd2lyZWxlc3Mgc3RhY2sgY29tcG9uZW50cy4gSSdtIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBgQ0ZHODAyMTFgIGFuZCBgTkw4MDIxMWAuIEkgbmVlZCB0byBlbnN1cmUgdGhleSdyZSBib3RoIGVuYWJsZWQgKG9yIGF0IGxlYXN0LCBhcHByb3ByaWF0ZWx5IGNvbmZpZ3VyZWQpLCBhbmQgdW5kZXJzdGFuZCBhbnkgZGVwZW5kZW5jaWVzIG9yIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLiBUaGlzIGlzIGJhc2ljLCBidXQgZm91bmRhdGlvbmFsOyBnb3R0YSBjb25maXJtIHRoYXQgdGhlIGNvcmUgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUgaXMgcHJvcGVybHkgZW5hYmxlZCBiZWZvcmUgSSBnbyBmdXJ0aGVyLiBMZXQncyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyByZXZlYWwgYWJvdXQgdGhlc2UgdHdvLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NjYyLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTIuMzkxMjUyNzMyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTA2NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDRkc4MDIxMVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL0tjb25maWc9MTQ9Y29uZmlnIFdFWFRfUFJJVlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTYtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTc6Y29uZmlnIENGRzgwMjExXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTgtXFx0dHJpc3RhdGUgXFxcImNmZzgwMjExIC0gd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUElcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZz0zOD1jb25maWcgTkw4MDIxMV9URVNUTU9ERVxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctNTEtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6NTI6Y29uZmlnIENGRzgwMjExX0RFVkVMT1BFUl9XQVJOSU5HU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTUzLVxcdGJvb2wgXFxcImVuYWJsZSBkZXZlbG9wZXIgd2FybmluZ3NcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy02Ny1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo2ODpjb25maWcgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXFxubmV0L3dpcmVsZXNzL0tjb25maWctNjktXFx0Ym9vbCBcXFwiY2ZnODAyMTEgY2VydGlmaWNhdGlvbiBvbnVzXFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctODgtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6ODk6Y29uZmlnIENGRzgwMjExX1JFUVVJUkVfU0lHTkVEX1JFR0RCXFxubmV0L3dpcmVsZXNzL0tjb25maWctOTAtXFx0Ym9vbCBcXFwicmVxdWlyZSByZWdkYiBzaWduYXR1cmVcXFwiIGlmIENGRzgwMjExX0NFUlRJRklDQVRJT05fT05VU1xcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctOTgtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6OTk6Y29uZmlnIENGRzgwMjExX1VTRV9LRVJORUxfUkVHREJfS0VZU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTEwMC1cXHRib29sIFxcXCJhbGxvdyByZWdkYiBrZXlzIHNoaXBwZWQgd2l0aCB0aGUga2VybmVsXFxcIiBpZiBDRkc4MDIxMV9DRVJUSUZJQ0FUSU9OX09OVVNcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMC1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxMTE6Y29uZmlnIENGRzgwMjExX0VYVFJBX1JFR0RCX0tFWURJUlxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMi1cXHRzdHJpbmcgXFxcImFkZGl0aW9uYWwgcmVnZGIga2V5IGRpcmVjdG9yeVxcXCIgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMjEtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTIyOmNvbmZpZyBDRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFNcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMjMtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgcmVndWxhdG9yeSBzdXBwb3J0IGZvciBjZWxsdWxhciBiYXNlIHN0YXRpb24gaGludHNcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzQtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTM1OmNvbmZpZyBDRkc4MDIxMV9SRUdfUkVMQVhfTk9fSVJcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzYtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgc3VwcG9ydCBmb3IgTk9fSVIgcmVsYXhhdGlvblxcXCJcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE1OC1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNTk6Y29uZmlnIENGRzgwMjExX0RFRkFVTFRfUFNcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNjAtXFx0Ym9vbCBcXFwiZW5hYmxlIHBvd2Vyc2F2ZSBieSBkZWZhdWx0XFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTY4LVxcbm5ldC93aXJlbGVzcy9LY29uZmlnOjE2OTpjb25maWcgQ0ZHODAyMTFfREVCVUdGU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE3MC1cXHRib29sIFxcXCJjZmc4MDIxMSBEZWJ1Z0ZTIGVudHJpZXNcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzYtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTc3OmNvbmZpZyBDRkc4MDIxMV9DUkRBX1NVUFBPUlRcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzgtXFx0Ym9vbCBcXFwic3VwcG9ydCBDUkRBXFxcIiBpZiBFWFBFUlRcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE4Ni1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxODc6Y29uZmlnIENGRzgwMjExX1dFWFRcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xODgtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBjb21wYXRpYmlsaXR5XFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTkzLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnOjE5NDpjb25maWcgQ0ZHODAyMTFfS1VOSVRfVEVTVFxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE5NS1cXHR0cmlzdGF0ZSBcXFwiS1VuaXQgdGVzdHMgZm9yIGNmZzgwMjExXFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjEyLjQzNzE2MjE0NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwMjYyMDczMzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqS2NvbmZpZyBEZXBlbmRlbmN5IERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgQ0ZHODAyMTEgZGVwZW5kZW5jaWVzIGx1cmtpbmcgd2l0aGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIG1lYW5zIEkgbmVlZCB0byBzdGFydCBjb21iaW5nIHRocm91Z2ggdGhvc2UgZmlsZXMsIHNwZWNpZmljYWxseSBsb29raW5nIGZvciBhbnkgYGRlcGVuZHMgb25gIHN0YXRlbWVudHMgb3IgY29uZGl0aW9uYWwgaW5jbHVzaW9ucyB0aGF0IHJlbGF0ZSB0byBDRkc4MDIxMS4gSXQncyBhIHN0YW5kYXJkIHN0ZXAsIHJlYWxseSAtIGdvdHRhIGNvdmVyIGFsbCB0aGUgYmFzZXMgdG8gZW5zdXJlIHRoZSBtb2R1bGUgb3IgZmVhdHVyZSBJJ20gd29ya2luZyBvbiBpcyBjb3JyZWN0bHkgaG9va2VkIGludG8gdGhlIGV4aXN0aW5nIHdpcmVsZXNzIGluZnJhc3RydWN0dXJlLiBHb3R0YSBiZSBtZXRpY3Vsb3VzIGhlcmUuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IHdpdGggdGhlIG1vc3QgcmVsZXZhbnQgS2NvbmZpZyBmaWxlcyBmaXJzdCwgcHJvYmFibHkgdGhvc2UgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgYXJlYSBJJ20gbW9kaWZ5aW5nLiBUaGVuLCBJJ2xsIGJyb2FkZW4gdGhlIHNlYXJjaCwgbWF5YmUgdXNpbmcgYGdyZXBgIG9yIGEgc2ltaWxhciB0b29sIHRvIGxvb2sgZm9yIGFueXRoaW5nIHN1c3BpY2lvdXMuIFRoaXMgaXMgcm91dGluZSwgYnV0IHRob3JvdWdobmVzcyBpcyBrZXkgZm9yIGF2b2lkaW5nIGJ1aWxkIGVycm9ycyBvciBydW50aW1lIHN1cnByaXNlcyBsYXRlciBvbi4gTGV0J3MgZ2V0IHRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2ODA3LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTcuNDYzMzcyNjc5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwNTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC93aXJlbGVzcy9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgV0lSRUxFU1NfRVhUXFxuICAgMzpcXHRcXHRib29sXFxuICAgNDpcXHRcXG4gICA1OlxcdGNvbmZpZyBXRVhUX0NPUkVcXG4gICA2OlxcdFxcdGRlZl9ib29sIHlcXG4gICA3OlxcdFxcdGRlcGVuZHMgb24gQ0ZHODAyMTFfV0VYVCB8fCBXSVJFTEVTU19FWFRcXG4gICA4OlxcdFxcbiAgIDk6XFx0Y29uZmlnIFdFWFRfUFJPQ1xcbiAgMTA6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAgMTE6XFx0XFx0ZGVwZW5kcyBvbiBQUk9DX0ZTXFxuICAxMjpcXHRcXHRkZXBlbmRzIG9uIFdFWFRfQ09SRVxcbiAgMTM6XFx0XFxuICAxNDpcXHRjb25maWcgV0VYVF9QUklWXFxuICAxNTpcXHRcXHRib29sXFxuICAxNjpcXHRcXG4gIDE3OlxcdGNvbmZpZyBDRkc4MDIxMVxcbiAgMTg6XFx0XFx0dHJpc3RhdGUgXFxcImNmZzgwMjExIC0gd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUElcXFwiXFxuICAxOTpcXHRcXHRkZXBlbmRzIG9uIFJGS0lMTCB8fCAhUkZLSUxMXFxuICAyMDpcXHRcXHRzZWxlY3QgRldfTE9BREVSXFxuICAyMTpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gIDIyOlxcdFxcdCMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoaXMgd2hlbiBjZXJ0aWZpY2F0ZXMgYXJlIGNoYW5nZWQgYW5kIGFyZVxcbiAgMjM6XFx0XFx0IyB1c2luZyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIHRob3VnaCByaWdodCBub3cgdGhleSBzaG91bGRuJ3RcXG4gIDI0OlxcdFxcdCMgKHRoaXMgaXMgaGVyZSByYXRoZXIgdGhhbiBiZWxvdyB0byBhbGxvdyBpdCB0byBiZSBhIG1vZHVsZSlcXG4gIDI1OlxcdFxcdHNlbGVjdCBDUllQVE9fU0hBMjU2IGlmIENGRzgwMjExX1VTRV9LRVJORUxfUkVHREJfS0VZU1xcbiAgMjY6XFx0XFx0aGVscFxcbiAgMjc6XFx0XFx0ICBjZmc4MDIxMSBpcyB0aGUgTGludXggd2lyZWxlc3MgTEFOICg4MDIuMTEpIGNvbmZpZ3VyYXRpb24gQVBJLlxcbiAgMjg6XFx0XFx0ICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBhIHdpcmVsZXNzIGRldmljZS5cXG4gIDI5OlxcdFxcbiAgMzA6XFx0XFx0ICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBkb2N1bWVudGF0aW9uIG9uIHRoZSB3aXJlbGVzcyB3aWtpOlxcbiAgMzE6XFx0XFxuICAzMjpcXHRcXHQgIGh0dHBzOi8vd2lyZWxlc3Mud2lraS5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvRG9jdW1lbnRhdGlvbi9jZmc4MDIxMVxcbiAgMzM6XFx0XFxuICAzNDpcXHRcXHQgIFdoZW4gYnVpbHQgYXMgYSBtb2R1bGUgaXQgd2lsbCBiZSBjYWxsZWQgY2ZnODAyMTEuXFxuICAzNTpcXHRcXG4gIDM2OlxcdGlmIENGRzgwMjExXFxuICAzNzpcXHRcXG4gIDM4OlxcdGNvbmZpZyBOTDgwMjExX1RFU1RNT0RFXFxuICAzOTpcXHRcXHRib29sIFxcXCJubDgwMjExIHRlc3Rtb2RlIGNvbW1hbmRcXFwiXFxuICA0MDpcXHRcXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjE3LjQ2MzQzNjMwOVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDg1NTIxNDU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggYW5kIFJlYWNoYWJpbGl0eSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5IEknbSB0aGlua2luZyBhYm91dCBpdHMgaW1wbGljYXRpb25zIGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgd2l0aCBzeXprYWxsZXIuIFRoZSBjb3JlIG9mIHRoaXMgY2hhbmdlIHNlZW1zIHRvIGJlIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB3aXRoaW4gYG5ldC93aXJlbGVzcy9ubDgwMjExLmNgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSB0aGUgYE5MODAyMTFfQ01EX05FV19TVEFUSU9OYCBjb21tYW5kIGlzIGhhbmRsZWQsIGFsbCB0aHJvdWdoIEdlbmVyaWMgTmV0bGluaydzIGBubDgwMjExYCBpbnRlcmZhY2UuIEEgcXVpY2sgbWVudGFsIGNoZWNrOiBpcyBgbmw4MDIxMWAgYWNjZXNzaWJsZSB3aXRoaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgc2V0dXAsIGVzcGVjaWFsbHkgaW4gdGhvc2UgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBBYnNvbHV0ZWx5LiBXZSdyZSBkZWFsaW5nIHdpdGggYG1hYzgwMjExX2h3c2ltYCBhbmQgYGNmZzgwMjExYCBoZXJlLCB3aGljaCBhcmUgcHJldHR5IG11Y2ggdGhlIGJyZWFkIGFuZCBidXR0ZXIgb2Ygc3l6a2FsbGVyIGZ1enppbmcgaW4gdGhpcyBhcmVhLiBHZW5lcmljIE5ldGxpbmsgc29ja2V0cywgYG5sODAyMTFgIGluY2x1ZGVkLCBhcmUgcmVhZGlseSBjcmVhdGFibGUgYW5kIHF1ZXJ5YWJsZSwgbm8gcGh5c2ljYWwgaGFyZHdhcmUgbmVjZXNzYXJ5LiBHb29kLiBOb3csIEkgc2hvdWxkIGRpdmUgaW50byB0aGUgYWN0dWFsIGZ1bmN0aW9uIGl0c2VsZiwgYG5sODAyMTFfbmV3X3N0YXRpb25gLCBhbmQgZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyB3b3JraW5ncy4gSSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggdGhlIGNvZGUsIG1hcCBvdXQgY2FsbGVycywgYW5kIHBpbnBvaW50IGFueSBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBzeW1ib2xzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjAyLCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjEuNTQ4OTU5ODk3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwODIwNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA5MzI4LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI5MzI4OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjkzMjk6XFx0e1xcbjkzMzA6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuOTMzMTpcXHRcXHRpbnQgZXJyLCBsaW5rX2lkO1xcbjkzMzI6XFx0XFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbjkzMzM6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtXFx1MDAzZW5ldGRldjtcXG45MzM0OlxcdFxcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xcbjkzMzU6XFx0XFx0dTggKm1hY19hZGRyID0gTlVMTDtcXG45MzM2OlxcdFxcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxcbjkzMzc6XFx0XFx0XFx0XFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpO1xcbjkzMzg6XFx0XFxuOTMzOTpcXHRcXHRtZW1zZXQoXFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xcbjkzNDA6XFx0XFxuOTM0MTpcXHRcXHRpZiAoIWRldiBcXHUwMDI2XFx1MDAyNiB3ZGV2LVxcdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxcbjkzNDI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM0MzpcXHRcXG45MzQ0OlxcdFxcdGlmICghcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbilcXG45MzQ1OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45MzQ2OlxcdFxcbjkzNDc6XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcXG45MzQ4OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNDk6XFx0XFxuOTM1MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fFxcbjkzNTE6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTI6XFx0XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcXG45MzUzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNTQ6XFx0XFx0XFx0aWYgKHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTU6XFx0XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxcbjkzNTY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM1NzpcXHRcXG45MzU4OlxcdFxcdFxcdFxcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cXG45MzU5OlxcdFxcdFxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcXG45MzYwOlxcdFxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XFxuOTM2MTpcXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxcbjkzNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM2MzpcXHRcXHRcXHR9XFxuOTM2NDpcXHRcXHR9IGVsc2Uge1xcbjkzNjU6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXFxuOTM2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzY3OlxcdFxcbjkzNjg6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXFxuOTM2OTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzcwOlxcdFxcbjkzNzE6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXFx1MDAyNlxcdTAwMjZcXG45MzcyOlxcdFxcdFxcdCAgICAhaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45MzczOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNzQ6XFx0XFx0fVxcbjkzNzU6XFx0XFxuOTM3NjpcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbjkzNzc6XFx0XFx0XFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cXHUwMDNlYXR0cnMpO1xcbjkzNzg6XFx0XFxuOTM3OTpcXHRcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG45MzgwOlxcdFxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzYyAwKVxcbjkzODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM4MjpcXHRcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG45MzgzOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTElOSztcXG45Mzg0OlxcdFxcdH0gZWxzZSB7XFxuOTM4NTpcXHRcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuOTM4NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45Mzg3OlxcdFxcdH1cXG45Mzg4OlxcdFxcbjkzODk6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcXG45MzkwOlxcdFxcdFxcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XFxuOTM5MTpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG45MzkyOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxcbjkzOTM6XFx0XFx0XFx0XFx0bmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xcbjkzOTQ6XFx0XFx0XFx0aWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMpKVxcbjkzOTU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM5NjpcXHRcXHR9IGVsc2Uge1xcbjkzOTc6XFx0XFx0XFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XFxuOTM5ODpcXHRcXHR9XFxuOTM5OTpcXHRcXG45NDAwOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcXG45NDAxOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cXG45NDAyOlxcdFxcdFxcdFxcdG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XFxuOTQwMzpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4gPVxcbjk0MDQ6XFx0XFx0XFx0XFx0bmxhX2xlbihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pO1xcbjk0MDU6XFx0XFx0fVxcbjk0MDY6XFx0XFxuOTQwNzpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDoyMS41NTAwNDM4ODZaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzczNjU0NTU0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd24sIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDpcblxuKipBbmFseXppbmcgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIGZ1bmN0aW9uLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgZ2VuZXJhbCBmbG93LCBidXQgdW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlcyBpcyBjcnVjaWFsLiBJJ20gZm9jdXNpbmcgbm93IG9uIHRoZSBzcGVjaWZpY3Mgb2YgdGhpcyByb3V0aW5lLiBJJ20gbG9va2luZyBmb3Igd2hlcmUgaXQgaGFuZGxlcyB0aGUgYWN0dWFsIHN0YXRpb24gY3JlYXRpb24sIHdoYXQgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQsIGFuZCBob3cgdGhlIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gSSBuZWVkIHRvIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGxvY2tpbmcgaXNzdWVzLCBvZiBjb3Vyc2UsIHRoYXQgY291bGQgcG9wIHVwIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBiZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJzIHRoYXQgb3BlcmF0ZSBvbiB0aGlzIGRhdGEuXG5cbkknbSBjaGVja2luZyBpZiB0aGVyZSBpcyBhbnkgaW5pdGlhbCBjb25maWd1cmF0aW9uIGNoZWNrcy4gRm9yIGV4YW1wbGUsIGlzIHRoZXJlIGEgbWF4aW11bSBudW1iZXIgb2Ygc3RhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyPyBUaGF0J3MgYSBnb29kIG9uZSB0byBsb29rIGZvci4gQW5kIGlmIHNvLCBob3cgaXMgdGhlIGxpbWl0IGVuZm9yY2VkPyBBcmUgdGhlcmUgYW55IHNhbml0eSBjaGVja3Mgb24gdGhlIGlucHV0IHBhcmFtZXRlcnM/IEkgZXhwZWN0IHRvIHNlZSBjaGVja3Mgb24gdGhlIE1BQyBhZGRyZXNzLCB0aGUgaW50ZXJmYWNlIGluZGV4LCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0J3MgcGFzc2VkIGluIGZyb20gdGhlIG5ldGxpbmsgbWVzc2FnZS5cblxuSSdtIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCBkYXRhIHN0cnVjdHVyZXMuIEFyZSBuZXcgc3RhdGlvbiBlbnRyaWVzIGFkZGVkIHRvIGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBlbXBsb3llZCB0byBwcm90ZWN0IHRoZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzPyBJJ20gaG9waW5nIHRvIHNlZSBhIHdlbGwtZGVmaW5lZCBsb2NraW5nIHNjaGVtZSB1c2luZyByZWFkLXdyaXRlIGxvY2tzIG9yIG11dGV4ZXMgdG8gcHJvdmlkZSBzYWZlIG9wZXJhdGlvbnMuXG5cbkknbSBhbHNvIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgYSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxzIChlLmcuLCBtZW1vcnkgYWxsb2NhdGlvbik/IEhvdyBhcmUgZXJyb3JzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlciBzcGFjZT8gQXJlIHRoZXJlIHByb3BlciBlcnJvciBjb2RlcyB1c2VkPyBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBoYW5kbGluZyBpcyByb2J1c3QuXG5cbkZpbmFsbHksIEknbSBleGFtaW5pbmcgYW55IGhvb2tzIG9yIGNhbGxiYWNrcyB0aGF0IGFyZSB0cmlnZ2VyZWQgZHVyaW5nIHN0YXRpb24gY3JlYXRpb24uIEFyZSB0aGVyZSBhbnkgbm90aWZpY2F0aW9ucyBzZW50IHRvIG90aGVyIHBhcnRzIG9mIHRoZSB3aXJlbGVzcyBzdGFjaywgbGlrZSB0aGUgbWFjODAyMTEgbGF5ZXIsIG9yIG1heWJlIHRvIHVzZXIgc3BhY2UgdmlhIG5ldGxpbms/IEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgc3lzdGVtIGltcGFjdCBvZiB0aGlzIGZ1bmN0aW9uLiBJIGFtIGFsd2F5cyB0cnlpbmcgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJhY3Qgd2l0aCB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU5NSwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjUuMjg2NTkyMTE2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwOTEyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA5NTUwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiOTU1MDpcXHRcXHQgICAgd2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTl9EQVRBKSB7XFxuOTU1MTpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0QpXFxuOTU1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTUzOlxcdFxcdFxcdC8qIE5BTiBOTUkgc3RhdGlvbiBtdXN0IGJlIGFkZGVkIGluIGFzc29jaWF0ZWQgb3IgYXV0aG9yaXplZCBzdGF0ZSAqL1xcbjk1NTQ6XFx0XFx0XFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiAoQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgfFxcbjk1NTU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpKSlcXG45NTU2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1NTc6XFx0XFx0fVxcbjk1NTg6XFx0XFxuOTU1OTpcXHRcXHQvKiBFbnN1cmUgdGhhdCBIVC9WSFQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0IGZvciA2IEdIeiBIRSBTVEEgKi9cXG45NTYwOlxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmhlXzZnaHpfY2FwYSBcXHUwMDI2XFx1MDAyNlxcbjk1NjE6XFx0XFx0ICAgIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmh0X2NhcGEgfHwgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy52aHRfY2FwYSkpXFxuOTU2MjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTYzOlxcdFxcbjk1NjQ6XFx0XFx0LyogV2hlbiB5b3UgcnVuIGludG8gdGhpcywgYWRqdXN0IHRoZSBjb2RlIGJlbG93IGZvciB0aGUgbmV3IGZsYWcgKi9cXG45NTY1OlxcdFxcdEJVSUxEX0JVR19PTihOTDgwMjExX1NUQV9GTEFHX01BWCAhPSA4KTtcXG45NTY2OlxcdFxcbjk1Njc6XFx0XFx0c3dpdGNoICh3ZGV2LVxcdTAwM2VpZnR5cGUpIHtcXG45NTY4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XFxuOTU2OTpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcXG45NTcwOlxcdFxcdFxcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cXG45NTcxOlxcdFxcdFxcdGxpbmtfaWQgPSB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XFxuOTU3MjpcXHRcXHRcXHRpZiAoIXdkZXYtXFx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbClcXG45NTczOlxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTU3NDpcXHRcXG45NTc1OlxcdFxcdFxcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cXG45NTc2OlxcdFxcdFxcdGlmICghKHJkZXYtXFx1MDAzZXdpcGh5LmZsYWdzIFxcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcXG45NTc3OlxcdFxcdFxcdCAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXFxuOTU3ODpcXHRcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk1Nzk6XFx0XFxuOTU4MDpcXHRcXHRcXHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xcbjk1ODE6XFx0XFx0XFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpIHx8XFxuOTU4MjpcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45NTgzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1ODQ6XFx0XFx0XFx0LyogYnV0IGRvbid0IGJvdGhlciB0aGUgZHJpdmVyIHdpdGggaXQgKi9cXG45NTg1OlxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2PSB+QklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTtcXG45NTg2OlxcdFxcbjk1ODc6XFx0XFx0XFx0LyogYWxsb3cgYXV0aGVudGljYXRlZC9hc3NvY2lhdGVkIG9ubHkgaWYgZHJpdmVyIGhhbmRsZXMgaXQgKi9cXG45NTg4OlxcdFxcdFxcdGlmICghKHJkZXYtXFx1MDAzZXdpcGh5LmZlYXR1cmVzIFxcdTAwMjZcXG45NTg5OlxcdFxcdFxcdFxcdFxcdE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSkgXFx1MDAyNlxcdTAwMjZcXG45NTkwOlxcdFxcdFxcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBhdXRoX2Fzc29jKVxcbjk1OTE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU5MjpcXHRcXG45NTkzOlxcdFxcdFxcdGlmICghd2lwaHlfZXh0X2ZlYXR1cmVfaXNzZXQoXFx1MDAyNnJkZXYtXFx1MDAzZXdpcGh5LFxcbjk1OTQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX1NQUF9BTVNEVV9TVVBQT1JUKSBcXHUwMDI2XFx1MDAyNlxcbjk1OTU6XFx0XFx0XFx0ICAgIHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1NQUF9BTVNEVSkpXFxuOTU5NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTk3OlxcdFxcbjk1OTg6XFx0XFx0XFx0LyogT2xkZXIgdXNlcnNwYWNlLCBvciB1c2Vyc3BhY2Ugd2FudGluZyB0byBiZSBjb21wYXRpYmxlIHdpdGhcXG45NTk5OlxcdFxcdFxcdCAqICFOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUsIHdpbGwgbm90IHNldCB0aGUgYXV0aFxcbjk2MDA6XFx0XFx0XFx0ICogYW5kIGFzc29jIGZsYWdzIGluIHRoZSBtYXNrLCBidXQgYXNzdW1lcyB0aGUgc3RhdGlvbiB3aWxsIGJlXFxuOTYwMTpcXHRcXHRcXHQgKiBhZGRlZCBhcyBhc3NvY2lhdGVkIGFueXdheSBzaW5jZSB0aGlzIHdhcyB0aGUgcmVxdWlyZWQgZHJpdmVyXFxuOTYwMjpcXHRcXHRcXHQgKiBiZWhhdmlvdXIgYmVmb3JlIE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSB3YXNcXG45NjAzOlxcdFxcdFxcdCAqIGludHJvZHVjZWQuXFxuOTYwNDpcXHRcXHRcXHQgKiBJbiBvcmRlciB0byBub3QgYm90aGVyIGRyaXZlcnMgd2l0aCB0aGlzIHF1aXJrIGluIHRoZSBBUElcXG45NjA1OlxcdFxcdFxcdCAqIHNldCB0aGUgZmxhZ3MgaW4gYm90aCB0aGUgbWFzayBhbmQgc2V0IGZvciBuZXcgc3RhdGlvbnMgaW5cXG45NjA2OlxcdFxcdFxcdCAqIHRoaXMgY2FzZS5cXG45NjA3OlxcdFxcdFxcdCAqL1xcbjk2MDg6XFx0XFx0XFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgYXV0aF9hc3NvYykpIHtcXG45NjA5OlxcdFxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayB8PSBhdXRoX2Fzc29jO1xcbjk2MTA6XFx0XFx0XFx0XFx0cGFyYW1zLnN0YV9mbGFnc19zZXQgfD0gYXV0aF9hc3NvYztcXG45NjExOlxcdFxcdFxcdH1cXG45NjEyOlxcdFxcbjk2MTM6XFx0XFx0XFx0LyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovXFxuOTYxNDpcXHRcXHRcXHRwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpO1xcbjk2MTU6XFx0XFx0XFx0aWYgKElTX0VSUihwYXJhbXMudmxhbikpXFxuOTYxNjpcXHRcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XFxuOTYxNzpcXHRcXHRcXHRicmVhaztcXG45NjE4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDpcXG45NjE5OlxcdFxcdFxcdC8qXFxuOTYyMDpcXHRcXHRcXHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXFxuOTYyMTpcXHRcXHRcXHQgKiBsaWJlcnRhcyBkb2Vzbid0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcXG45NjIyOlxcdFxcdFxcdCAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc29cXG45NjIzOlxcdFxcdFxcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cXG45NjI0OlxcdFxcdFxcdCAqL1xcbjk2MjU6XFx0XFx0XFx0aWYgKHJkZXYtXFx1MDAzZW9wcy1cXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xcbjk2MjY6XFx0XFx0XFx0XFx0aWYgKCF3ZGV2LVxcdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuKVxcbjk2Mjc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG45NjI4OlxcdFxcdFxcdH0gZWxzZSBpZiAoIXdkZXYtXFx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcXG45NjI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTYzMDpcXHRcXHRcXHR9XFxuOTYzMTpcXHRcXG45NjMyOlxcdFxcdFxcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXFxuOTYzMzpcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk2MzQ6XFx0XFxuOTYzNTpcXHRcXHRcXHQvKiBhc3NvY2lhdGVkIGlzIGRpc2FsbG93ZWQgKi9cXG45NjM2OlxcdFxcdFxcdGlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSlcXG45NjM3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk2Mzg6XFx0XFx0XFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cXG45NjM5OlxcdFxcdFxcdGlmICgocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxcbjk2NDA6XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTY0MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjQyOlxcdFxcdFxcdGJyZWFrO1xcbjk2NDM6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOlxcbjk2NDQ6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOlxcbjk2NDU6XFx0XFx0XFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cXG45NjQ2OlxcdFxcdFxcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XFxuOTY0NzpcXHRcXG45NjQ4OlxcdFxcdFxcdC8qIHRoZXNlIGFyZSBkaXNhbGxvd2VkICovXFxuOTY0OTpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjUuMjg3Njg1Mjc2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMzM2MTAyNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gdGhlIG5sODAyMTEuYyBDb2RlKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBhYm91dCB3aXJlbGVzcyBuZXR3b3JraW5nLCBhbmQgc29tZXRoaW5nIGlzbid0IHF1aXRlIHJpZ2h0LiBUbyBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb24gdGhlIGlzc3VlLCBJIHNob3VsZCBjcm9zcy1yZWZlcmVuY2UgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBrZXJuZWwgY29kZS4gTGV0J3MgbWFrZSBzdXJlIHdlIGV4YW1pbmUgdGhlIHBvdGVudGlhbCBpbXBhY3Qgd2l0aGluIHRoZSBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AgZmlsZS4gSSdtIGdvaW5nIHRvIGZvY3VzIGluIG9uIGxpbmVzIDk2NTAtOTY5MC4gVGhpcyByYW5nZSB0eXBpY2FsbHkgY29udGFpbnMgY3JpdGljYWwgbG9naWMgcmVsYXRlZCB0byBjZXJ0YWluIHdpcmVsZXNzIG5ldHdvcmsgb3BlcmF0aW9ucywgYW5kIGl0J3MgbGlrZWx5IHRvIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgaXNzdWUgYXQgaGFuZC4gQnkgZXhhbWluaW5nIHRoaXMgc3BlY2lmaWMgY29kZSBibG9jaywgSSBjYW4gZGV2ZWxvcCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgZnVuY3Rpb24gY2FsbHMsIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBmbG93IG9mIHRoZSBwcm9ncmFtIGxvZ2ljLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjAxOCwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjcuNjIxMjk4MjhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyODcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk2NTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjk2NTA6XFx0XFx0XFx0XFx0XFx0KEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcXG45NjUxOlxcdFxcdFxcdFxcdFxcdCBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSkpXFxuOTY1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjUzOlxcdFxcdFxcdC8qIE9ubHkgVERMUyBwZWVycyBjYW4gYmUgYWRkZWQgKi9cXG45NjU0OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpXFxuOTY1NTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjU2OlxcdFxcdFxcdC8qIENhbiBvbmx5IGFkZCBpZiBURExTIC4uLiAqL1xcbjk2NTc6XFx0XFx0XFx0aWYgKCEocmRldi1cXHUwMDNld2lwaHkuZmxhZ3MgXFx1MDAyNiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpKVxcbjk2NTg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbjk2NTk6XFx0XFx0XFx0LyogLi4uIHdpdGggZXh0ZXJuYWwgc2V0dXAgaXMgc3VwcG9ydGVkICovXFxuOTY2MDpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mbGFncyBcXHUwMDI2IFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpXFxuOTY2MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuOTY2MjpcXHRcXHRcXHQvKlxcbjk2NjM6XFx0XFx0XFx0ICogT2xkZXIgd3BhX3N1cHBsaWNhbnQgdmVyc2lvbnMgYWx3YXlzIG1hcmsgdGhlIFRETFMgcGVlclxcbjk2NjQ6XFx0XFx0XFx0ICogYXMgYXV0aG9yaXplZCwgYnV0IGl0IHNob3VsZG4ndCB5ZXQgYmUuXFxuOTY2NTpcXHRcXHRcXHQgKi9cXG45NjY2OlxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2PSB+QklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCk7XFxuOTY2NzpcXHRcXHRcXHRicmVhaztcXG45NjY4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOlxcbjk2Njk6XFx0XFx0XFx0YnJlYWs7XFxuOTY3MDpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTl9EQVRBOlxcbjk2NzE6XFx0XFx0XFx0cGFyYW1zLm5taV9tYWMgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKTtcXG45NjcyOlxcdFxcdFxcdGJyZWFrO1xcbjk2NzM6XFx0XFx0ZGVmYXVsdDpcXG45Njc0OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45Njc1OlxcdFxcdH1cXG45Njc2OlxcdFxcbjk2Nzc6XFx0XFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cXG45Njc4OlxcdFxcbjk2Nzk6XFx0XFx0cGFyYW1zLmVwcF9wZWVyID1cXG45NjgwOlxcdFxcdFxcdG5sYV9nZXRfZmxhZyhpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfRVBQX1BFRVJdKTtcXG45NjgxOlxcdFxcbjk2ODI6XFx0XFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXFx1MDAyNnBhcmFtcyk7XFxuOTY4MzpcXHRcXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcXG45Njg0OlxcdFxcdHJldHVybiBlcnI7XFxuOTY4NTpcXHR9XFxuOTY4NjpcXHRcXG45Njg3OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9kZWxfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjk2ODg6XFx0e1xcbjk2ODk6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjI3LjYyMjMyODU2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjkyNTg0NTI4NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDaGFuZ2VzIGFuZCBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGlzIGZvY3VzZWQgb24gYG5sODAyMTFfbmV3X3N0YXRpb25gLCB3aGljaCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QgYXMgYSBrbm93biBlbnRyeXBvaW50IGZvciB3aXJlbGVzcyBuZXRsaW5rIGNvbW1hbmRzLiBTcGVjaWZpY2FsbHksIHRoZSBjaGFuZ2VzIGludm9sdmU6IGlucHV0IHZhbGlkYXRpb24gb2YgYHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZGAgYWdhaW5zdCBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AsIHN0YXRlIGNoZWNrcyByZWxhdGVkIHRvIEFQL1AyUF9HTyBhbmQgTUVTSF9QT0lOVCBiZWFjb24gaW50ZXJ2YWxzLCByZW1vdmFsIG9mIGBOTDgwMjExX0lGVFlQRV9BUF9WTEFOYCBmcm9tIHRoZSBBUCBzd2l0Y2ggY2FzZSAobWVhbmluZyBBUF9WTEFOIGludGVyZmFjZXMgd2lsbCBub3cgcmV0dXJuIC1FT1BOT1RTVVBQKSwgYW5kIHJlbW92YWwgb2Ygc29tZSByZWR1bmRhbnQgbGluayBjaGVja3MuXG5cblRoZSBrZXkgcXVlc3Rpb24gaXMgYWx3YXlzOiBjYW4gd2UgZ2V0IHRvIHRoaXMgY29kZT8gQWJzb2x1dGVseS4gYG5sODAyMTFfbmV3X3N0YXRpb25gIGlzIGFuIGVudHJ5IHBvaW50IGNhbGxlZCB2aWEgdGhlIGBOTDgwMjExX0NNRF9ORVdfU1RBVElPTmAgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2UuIEdlbmVyaWMgTmV0bGluayBpcyBhIHN0YW5kYXJkIGF0dGFjayBzdXJmYWNlIGluIExpbnV4IGFuZCBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSB0aHJvdWdoIHN0YW5kYXJkIHRlc3RpbmcsIGxpa2Ugc3l6a2FsbGVyLiBUaGlzIGlzIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC5cblxuRnJvbSBhIFwiV29ydGhGdXp6aW5nXCIgcGVyc3BlY3RpdmUsIHRoaXMgaXMgYSBjbGVhciB5ZXMuIFdlJ3JlIGxvb2tpbmcgYXQgYSBjb3JlIHN1YnN5c3RlbSwgdGhlIG5ldGxpbmsvY2ZnODAyMTEgd2lyZWxlc3MgbmV0bGluayBoYW5kbGVyLiBUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgZXJyb3IgcmV0dXJuIHBhdGhzIGZvciBuZXRsaW5rIGNvbW1hbmRzLiBSZWFjaGFiaWxpdHkgaXMgZ3VhcmFudGVlZCB2aWEgdXNlcnNwYWNlIHRocm91Z2ggQUZfTkVUTElOSywgTkVUTElOS19HRU5FUklDLiBObyBxdWVzdGlvbiwgdGhpcyBpcyBmdXp6YWJsZS5cblxuUmVnYXJkaW5nIFwiRm9jdXNTeW1ib2xzLFwiIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyB0aGUgbW9kaWZpZWQgc3ltYm9sLiBJIHNob3VsZCBhbHNvIGNoZWNrIGl0cyBkaXJlY3QgY2FsbGVlcy4gYHJkZXZfYWRkX3N0YXRpb25gIGlzIGNhbGxlZCBmcm9tIGBubDgwMjExX25ld19zdGF0aW9uYC4gSSdsbCB3YW50IHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGByZGV2X2FkZF9zdGF0aW9uYCB0byBoYXZlIGEgZnVsbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjk4OSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjM2Ljg4MDc4NDI0NloiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUyNTM4OTMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmRldl9hZGRfc3RhdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuYz05MzI4PXN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy05NjgxLVxcbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTY4MjpcXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcXHUwMDI2cGFyYW1zKTtcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTk2ODMtXFx0ZGV2X3B1dChwYXJhbXMudmxhbik7XFxuLS1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaD0xODU9c3RhdGljIGlubGluZSBpbnQgcmRldl9zdG9wX2FwKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldixcXG4tLVxcbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTE5NC1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoxOTU6c3RhdGljIGlubGluZSBpbnQgcmRldl9hZGRfc3RhdGlvbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsXFxubmV0L3dpcmVsZXNzL3JkZXYtb3BzLmgtMTk2LVxcdFxcdFxcdFxcdCAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU4ICptYWMsXFxuLS1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTktXFx0aW50IHJldDtcXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoyMDA6XFx0dHJhY2VfcmRldl9hZGRfc3RhdGlvbihcXHUwMDI2cmRldi1cXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0yMDEtXFx0cmV0ID0gcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbihcXHUwMDI2cmRldi1cXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcXG4tLVxcbm5ldC93aXJlbGVzcy90cmFjZS5oPTg2OD1ERUNMQVJFX0VWRU5UX0NMQVNTKHN0YXRpb25fYWRkX2NoYW5nZSxcXG4tLVxcbm5ldC93aXJlbGVzcy90cmFjZS5oLTk1OS1cXG5uZXQvd2lyZWxlc3MvdHJhY2UuaDo5NjA6REVGSU5FX0VWRU5UKHN0YXRpb25fYWRkX2NoYW5nZSwgcmRldl9hZGRfc3RhdGlvbixcXG5uZXQvd2lyZWxlc3MvdHJhY2UuaC05NjEtXFx0VFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdTggKm1hYyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MzYuOTI2MDQ3NDNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDkzMDY3MDc2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgU3RhdGlvbiBIYW5kbGluZyBpbiB0aGUgbmw4MDIxMSBTdWJzeXN0ZW0qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgc3RhdGlvbnMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBgbmw4MDIxMWAgZnJhbWV3b3JrLiBNeSBpbml0aWFsIG9ic2VydmF0aW9uIGlzIHRoYXQgYHJkZXZfYWRkX3N0YXRpb25gIGlzIGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGByZGV2LW9wcy5oYCwgd2hlcmVhcyBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgYSBzdGF0aWMgZnVuY3Rpb24gaW4gYG5sODAyMTEuY2AsIGJ1dCBpdCdzICpleHRlcm5hbGx5KiByZWZlcmVuY2VkIChzcGVjaWZpY2FsbHksIGluIGBubDgwMjExX3NtYWxsX29wc2ApLiBNeSBuZXh0IHRob3VnaHQgaXMgdG8gaW52ZXN0aWdhdGUgZnVydGhlciB3aXRoaW4gYG5sODAyMTEuY2AgaXRzZWxmLlxuXG5JIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludCBmb3Igc3RhdGlvbiBjcmVhdGlvbiwgb3IgaWYgdGhlcmUgYXJlIG90aGVyIHJlbGV2YW50IGZ1bmN0aW9ucyBpbiB0aGF0IGZpbGUuIEknbGwgdGFrZSBhIGxvb2sgYXQgZnVuY3Rpb25zIGxpa2UgYG5sODAyMTFfc2V0X3N0YXRpb25gIGFuZCBhbnkgb3RoZXJzIHRoYXQgZGVhbCB3aXRoIHN0YXRpb25zIHRvIHNlZSBpZiB0aGV5J3ZlIGJlZW4gcmVjZW50bHkgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgKm9ubHkqIGBubDgwMjExX25ld19zdGF0aW9uYCB3YXMgY2hhbmdlZC5cblxuTm93LCBsZXQncyBjb25zaWRlciB0aGUgY29uZmlndXJhdGlvbiBhc3BlY3RzLiBUaGUgY29kZSBpbiBxdWVzdGlvbiwgaW5jbHVkaW5nIGBubDgwMjExLmNgLCBpcyBvbmx5IGJ1aWx0IHdoZW4gYENPTkZJR19DRkc4MDIxMWAgaXMgZW5hYmxlZC4gSXQncyBidWlsdCBiZWNhdXNlIGBjZmc4MDIxMS15ICs9IC4uLiBubDgwMjExLm9gIGluIHRoZSByZWxldmFudCBgTWFrZWZpbGVgLiBTbywgd2hhdCBlbmFibGVzIGBDRkc4MDIxMWAgaXRzZWxmPyBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlcGVuZGVuY2llcy5cblxuTGV0J3MgbG9vayBhdCBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBgY29uZmlnIENGRzgwMjExYCBkZXBlbmRzIG9uIGBSRktJTEwgfHwgIVJGS0lMTGAuIFRoYXQncyBhIGJpdCBvZGQsIHRob3VnaCBpdCBzZWVtcyBoYXJtbGVzcy4gTGV0J3Mgc2VlIGlmIHRoYXQgbW9kdWxlIGRlcGVuZHMgb24gYW55dGhpbmcsIGJ5IGxvb2tpbmcgYXQgYG5ldC9LY29uZmlnYCwgd2hpY2ggYHNvdXJjZWBzIGBuZXQvd2lyZWxlc3MvS2NvbmZpZ2AuIEknbGwgYWxzbyBnbGFuY2UgYXQgdGhlIGBuZXQvd2lyZWxlc3MvTWFrZWZpbGVgIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM5MywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDo0MS44NTY3MjA5NjdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE0OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL01ha2VmaWxlXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0b2JqLSQoQ09ORklHX0NGRzgwMjExKSArPSBjZmc4MDIxMS5vXFxuICAgMzpcXHRvYmoteSArPSB0ZXN0cy9cXG4gICA0OlxcdFxcbiAgIDU6XFx0b2JqLSQoQ09ORklHX1dFWFRfQ09SRSkgKz0gd2V4dC1jb3JlLm9cXG4gICA2OlxcdG9iai0kKENPTkZJR19XRVhUX1BST0MpICs9IHdleHQtcHJvYy5vXFxuICAgNzpcXHRvYmotJChDT05GSUdfV0VYVF9QUklWKSArPSB3ZXh0LXByaXYub1xcbiAgIDg6XFx0XFxuICAgOTpcXHRjZmc4MDIxMS15ICs9IGNvcmUubyBzeXNmcy5vIHJhZGlvdGFwLm8gdXRpbC5vIHJlZy5vIHNjYW4ubyBubDgwMjExLm9cXG4gIDEwOlxcdGNmZzgwMjExLXkgKz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cXG4gIDExOlxcdGNmZzgwMjExLXkgKz0gbWljaGFlbC1taWMubyBwbXNyLm9cXG4gIDEyOlxcdGNmZzgwMjExLSQoQ09ORklHX09GKSArPSBvZi5vXFxuICAxMzpcXHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9ERUJVR0ZTKSArPSBkZWJ1Z2ZzLm9cXG4gIDE0OlxcdGNmZzgwMjExLSQoQ09ORklHX0NGRzgwMjExX1dFWFQpICs9IHdleHQtY29tcGF0Lm8gd2V4dC1zbWUub1xcbiAgMTU6XFx0XFxuICAxNjpcXHRDRkxBR1NfdHJhY2UubyA6PSAtSSQoc3JjKVxcbiAgMTc6XFx0XFxuICAxODpcXHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVMpICs9IHNoaXBwZWQtY2VydHMub1xcbiAgMTk6XFx0aWZuZXEgKCQoQ09ORklHX0NGRzgwMjExX0VYVFJBX1JFR0RCX0tFWURJUiksKVxcbiAgMjA6XFx0Y2ZnODAyMTEteSArPSBleHRyYS1jZXJ0cy5vXFxuICAyMTpcXHRlbmRpZlxcbiAgMjI6XFx0XFxuICAyMzpcXHQkKG9iaikvc2hpcHBlZC1jZXJ0cy5jOiAkKHNvcnQgJCh3aWxkY2FyZCAkKHNyYykvY2VydHMvKi5oZXgpKVxcbiAgMjQ6XFx0XFx0QCQoa2VjaG8pIFxcXCIgIEdFTiAgICAgJEBcXFwiXFxuICAyNTpcXHRcXHQkKFEpKGVjaG8gJyNpbmNsdWRlIFxcXCJyZWcuaFxcXCInOyBcXFxcXFxuICAyNjpcXHRcXHQgIGVjaG8gJ2NvbnN0IHU4IHNoaXBwZWRfcmVnZGJfY2VydHNbXSA9IHsnOyBcXFxcXFxuICAyNzpcXHRcXHQgIGVjaG8gfCBjYXQgLSAkXiA7IFxcXFxcXG4gIDI4OlxcdFxcdCAgZWNobyAnfTsnOyBcXFxcXFxuICAyOTpcXHRcXHQgIGVjaG8gJ3Vuc2lnbmVkIGludCBzaGlwcGVkX3JlZ2RiX2NlcnRzX2xlbiA9IHNpemVvZihzaGlwcGVkX3JlZ2RiX2NlcnRzKTsnOyBcXFxcXFxuICAzMDpcXHRcXHQgKSBcXHUwMDNlICRAXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjQxLjg1Njc4MzgzN1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNzQ2MTY3NDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBDb2RlIE1vZGlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIEkgc2VlIHRoYXQgYG9iai0kKENPTkZJR19DRkc4MDIxMSkgKz0gY2ZnODAyMTEub2AgYW5kIGBjZmc4MDIxMS15ICs9IC4uLiBubDgwMjExLm9gLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIEFuZCwgY3J1Y2lhbGx5LCBgQ09ORklHX05MODAyMTFfVEVTVE1PREVgIGlzbid0IGEgZ2F0aW5nIGZhY3RvciBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBUaGF0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBoZXJlIGlzIGBDRkc4MDIxMWAuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB0aGVyZSBhcmVuJ3QgYW55IG90aGVyIHN1YnRsZSBjb25maWcgc3ltYm9scyBvciBjb25maWd1cmF0aW9ucyBpbnZvbHZlZCBoZXJlLlxuXG5BbHJpZ2h0LCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlIGluZGVlZCBqdXN0IGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIHRoZSBgRW5hYmxlQ29uZmlnc2AgYXJlIGNvcnJlY3RseSBwb2ludGluZyB0byBgQ0ZHODAyMTFgLCBhcyBleHBlY3RlZC4gR29vZC5cblxuVGhlIHJlYXNvbmluZyBwcm92aWRlZCBjbGFyaWZpZXMgdGhhdCB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIsIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2l0aGluIHRoZSBgY2ZnODAyMTFgIHdpcmVsZXNzIGNvbmZpZyBuZXRsaW5rIEFQSS4gSXQgbG9va3MgbGlrZSB0aGV5J3JlIHRpZ2h0ZW5pbmcgdXAgdmFsaWRhdGlvbiBvbiB0aGUgbGluayBJRCBhbmQgYWRkaW5nIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIEFQIG9yIG1lc2ggaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIGFsbG93aW5nIGEgc3RhdGlvbiB0byBiZSBhZGRlZC4gVGhpcyBpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSBiZWNhdXNlIGl0J3MgaGFuZGxpbmcgdW50cnVzdGVkIHVzZXItc3BhY2UgaW5wdXQgdmlhIEdlbmVyaWMgTmV0bGluayAoTkw4MDIxMSkuXG5cbkV4Y2VsbGVudC4gTXkgYW5hbHlzaXMgY29uZmlybXMgZXZlcnl0aGluZy4gSSdtIHNhdGlzZmllZC4gTGV0J3MgbW92ZSBvbiB0byB0aGUgbmV4dCBzdGVwIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1ODE5LCJPdXRwdXRUb2tlbnMiOjEzOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjQ1LjYwMjk1MzQwNVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwNTQwNDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDRkc4MDIxMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5sODAyMTFfbmV3X3N0YXRpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ0ZHODAyMTFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJubDgwMjExX25ld19zdGF0aW9uXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDo0NS42ODM1MDAwNzNaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NDAxNDg5MDcyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6NDUuNjgzOTcxNDEzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDU0MDEwMTMyNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rc2ApLlxcblxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cXG4yLiBUaGUgbmV3bHkgaW50cm9kdWNlZCBsb2NhbCB2YXJpYWJsZSBgbGlua19pZGAgaXMgYXNzaWduZWQgYmVmb3JlIHVzZS5cXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxcblxcblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjk4ZDQ0OGVjYWU2MWZkODk3MTNjYWFlOGM3N2JlNjA4N2RhZmZlM1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDEwIDA5OjE5OjUwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0XG4tLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG4rKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG5AQCAtOTMyOCw3ICs5MzI4LDcgQEAgc3RhdGljIGludCBubDgwMjExX3NldF9zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4ge1xuIFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbi1cdGludCBlcnI7XG4rXHRpbnQgZXJyLCBsaW5rX2lkO1xuIFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMV07XG4gXHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cdTAwM2VuZXRkZXY7XG4gXHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcbkBAIC05Mzc2LDYgKzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuIFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbiBcbitcdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG4rXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcbitcdFx0XHRyZXR1cm4gLUVOT0xJTks7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMClcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbiBcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcbiBcdFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xuIFx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcbkBAIC05NTU2LDggKzk1NjYsMTIgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHRzd2l0Y2ggKHdkZXYtXHUwMDNlaWZ0eXBlKSB7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxuLVx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOlxuIFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XG4rXHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbitcdFx0bGlua19pZCA9IHdkZXYtXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xuK1x0XHRpZiAoIXdkZXYtXHUwMDNlbGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsKVxuK1x0XHRcdHJldHVybiAtRU5FVERPV047XG4rXG4gXHRcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cbiBcdFx0aWYgKCEocmRldi1cdTAwM2V3aXBoeS5mbGFncyBcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcbiBcdFx0ICAgICEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxuQEAgLTk2MDIsNiArOTYxNiwxOSBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOlxuK1x0XHQvKlxuK1x0XHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXG4rXHRcdCAqIGxpYmVydGFzIGRvZXNuJ3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuK1x0XHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXG4rXHRcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cbitcdFx0ICovXG4rXHRcdGlmIChyZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XG4rXHRcdFx0aWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5jaGFuZGVmLmNoYW4pXG4rXHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuK1x0XHR9IGVsc2UgaWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcbitcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuK1x0XHR9XG4rXG4gXHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG4gXHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbiBcbkBAIC05NjQ5LDI3ICs5Njc2LDEwIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFxuIFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cbiBcbi1cdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApIHtcbi1cdFx0XHRlcnIgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSkge1xuLVx0XHRcdGVyciA9IC1FTk9MSU5LO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH1cbi1cbiBcdHBhcmFtcy5lcHBfcGVlciA9XG4gXHRcdG5sYV9nZXRfZmxhZyhpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pO1xuIFxuIFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXHUwMDI2cGFyYW1zKTtcbi1vdXQ6XG4gXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6NDUuNjgzOTcyNDYyWiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0NDI1ODc5NzE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEtNU0FOIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQgZGVjaWRlIGlmIGl0J3Mgd29ydGggdGhyb3dpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24gYXQgaXQuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIG9uIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgZnVuY3Rpb24gd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC5cblxuSXQgbG9va3MgbGlrZSB0aGUgcHJpbWFyeSBmb2N1cyBoZXJlIGlzIHRpZ2h0ZW5pbmcgdXAgc29tZSBjaGVja3MgcmVsYXRlZCB0byB2YWxpZCBsaW5rcyBhbmQgbWVzaCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLiBTcGVjaWZpY2FsbHk6XG5cbjEuICBXZSd2ZSBnb3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgIGNoZWNrcyBiZWluZyBwZXJmb3JtZWQgZWFybGllciBpbiB0aGUgZnVuY3Rpb24gbm93LiBJdCdzIGVzc2VudGlhbGx5IG1vdmluZyB0aGUgbGluayBJRCB2YWxpZGl0eSBjaGVjayB1cCwgcmlnaHQgYWZ0ZXIgdGhlIHBhcnNpbmcgb2YgYHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZGAuIFNtYXJ0LCBjb3VsZCBoYXZlIGJlZW4gYW4gZWRnZSBjYXNlIGJlZm9yZS5cblxuMi4gIFdpdGhpbiB0aGUgYE5MODAyMTFfSUZUWVBFX0FQYCBhbmQgYE5MODAyMTFfSUZUWVBFX1AyUF9HT2AgYmxvY2tzLCBpdCBhcHBlYXJzIHRoYXQgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZmFsbHRocm91Z2gsIGFuZCB3ZSd2ZSBhZGRlZCBhIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBiZWFjb24gaW50ZXJ2YWwgaXMgc2V0IGZvciB2YWxpZCBsaW5rcy4gSXQncyB3b3J0aCBkaWdnaW5nIGludG8gd2hlcmUgQVBfVkxBTiBpcyBjdXJyZW50bHkgaGFuZGxlZCwganVzdCB0byBiZSBzdXJlIG5vdGhpbmcncyBiZWVuIGJyb2tlbiwgb3IgdGhhdCBpdCB3YXNuJ3QgcHJldmlvdXNseSBoYW5kbGVkLlxuXG4zLiAgRm9yIGBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UYCwgdGhlcmUgYXJlIG5ldyBjaGVja3MgcmVsYXRlZCB0byB0aGUgbWVzaCBjaGFubmVsIGJlaW5nIHNldCBiYXNlZCBvbiBgcmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbGAgZXhpc3RlbmNlLiBJZiB0aGF0J3MgYXZhaWxhYmxlLCBhbmQgYSBjaGFubmVsIGlzbid0IGRlZmluZWQsIHJldHVybiBgRU5FVERPV05gLiBPdGhlcndpc2UsIGlmIHRoYXQgZG9lc24ndCBleGlzdCwgd2UgbXVzdCBjaGVjayB0aGF0IGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgIGlzIHZhbGlkLCBhbHNvIHJldHVybmluZyBgRU5FVERPV05gIGlmIHRoYXQncyBub3QgdGhlIGNhc2UuIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbGx5IGdvb2Qgc3BvdCBmb3Igc29tZSBmdXp6aW5nLlxuXG40LiAgVGhlcmUncyBhbHNvIGEgY2xlYW51cCBvZiBzb21lIGR1cGxpY2F0ZSBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AgY2hlY2tzIGFuZCBgZ290byBvdXQ7YCBsYWJlbHMsIHdoaWNoIHN1Z2dlc3RzIHNvbWUgY29kZSB3YXMgbWFkZSBjbGVhbmVyLiBJdCBtZW50aW9ucyB0aGVyZSdzIGEgZ3VhcmQgZWFybHkgcmV0dXJuIGR1ZSB0byB0aGUgYHBhcmFtcy52bGFuYCBub3QgYmVpbmcgYWNxdWlyZWQgYXQgdGhhdCBwb2ludCwgZW5zdXJpbmcgdGhhdCB3ZSBkb24ndCBuZWVkIGEgYGRldl9wdXRgIGNhbGwuIExhdGVyLCB0aGUgY2FsbCB0byBgcmRldl9hZGRfc3RhdGlvbmAgdGFrZXMgY2FyZSBvZiB0aGUgY2xlYW51cC4gVGhpcyBtYWtlcyBpdCBsb29rIGxpa2UgdGhlcmUgd2VyZSBzb21lIGZsb3cgaW1wcm92ZW1lbnRzLCB0aGF0IG1heSBoYXZlIGJlZW4gZHVlIHRvIGVycm9yIG1hbmFnZW1lbnQgY2hhbmdlcy5cblxuQmVmb3JlIEkgY29tbWl0IHRvIGZ1enppbmcsIEknbSBnb2luZyB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBJJ2xsIGByZWFkLWZpbGVgIHRoYXQgZnVuY3Rpb24gYWdhaW4gb3IgdXNlIGEgcXVpY2sgYGdyZXBwZXJgIHNlYXJjaCB0byByZWZyZXNoLiBUaGUgbmV3IGNoZWNrcyBjb3VsZCBpbnRyb2R1Y2Ugc3VidGxlIGlzc3VlcyBpZiB0aGV5J3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgc28gSSdsbCB3YW50IHRvIG1ha2Ugc3VyZSBJJ3ZlIGdvdCBhIGdvb2QgbWVudGFsIG1hcCBvZiB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgZ3V0IHNheXMgdGhpcyBpcyB3b3J0aCBhIGNsb3NlciBsb29rIHdpdGggS01TQU4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyNTQsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMTowMC4xMDk4NTU3MzFaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEzNTc5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDkzMjgsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI5MzI4OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjkzMjk6XFx0e1xcbjkzMzA6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuOTMzMTpcXHRcXHRpbnQgZXJyLCBsaW5rX2lkO1xcbjkzMzI6XFx0XFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbjkzMzM6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtXFx1MDAzZW5ldGRldjtcXG45MzM0OlxcdFxcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xcbjkzMzU6XFx0XFx0dTggKm1hY19hZGRyID0gTlVMTDtcXG45MzM2OlxcdFxcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxcbjkzMzc6XFx0XFx0XFx0XFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpO1xcbjkzMzg6XFx0XFxuOTMzOTpcXHRcXHRtZW1zZXQoXFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xcbjkzNDA6XFx0XFxuOTM0MTpcXHRcXHRpZiAoIWRldiBcXHUwMDI2XFx1MDAyNiB3ZGV2LVxcdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxcbjkzNDI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM0MzpcXHRcXG45MzQ0OlxcdFxcdGlmICghcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbilcXG45MzQ1OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45MzQ2OlxcdFxcbjkzNDc6XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcXG45MzQ4OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNDk6XFx0XFxuOTM1MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fFxcbjkzNTE6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTI6XFx0XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcXG45MzUzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNTQ6XFx0XFx0XFx0aWYgKHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTU6XFx0XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxcbjkzNTY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM1NzpcXHRcXG45MzU4OlxcdFxcdFxcdFxcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cXG45MzU5OlxcdFxcdFxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcXG45MzYwOlxcdFxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XFxuOTM2MTpcXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxcbjkzNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM2MzpcXHRcXHRcXHR9XFxuOTM2NDpcXHRcXHR9IGVsc2Uge1xcbjkzNjU6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXFxuOTM2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzY3OlxcdFxcbjkzNjg6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXFxuOTM2OTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzcwOlxcdFxcbjkzNzE6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXFx1MDAyNlxcdTAwMjZcXG45MzcyOlxcdFxcdFxcdCAgICAhaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45MzczOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNzQ6XFx0XFx0fVxcbjkzNzU6XFx0XFxuOTM3NjpcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbjkzNzc6XFx0XFx0XFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cXHUwMDNlYXR0cnMpO1xcbjkzNzg6XFx0XFxuOTM3OTpcXHRcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG45MzgwOlxcdFxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzYyAwKVxcbjkzODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM4MjpcXHRcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG45MzgzOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTElOSztcXG45Mzg0OlxcdFxcdH0gZWxzZSB7XFxuOTM4NTpcXHRcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuOTM4NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45Mzg3OlxcdFxcdH1cXG45Mzg4OlxcdFxcbjkzODk6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcXG45MzkwOlxcdFxcdFxcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XFxuOTM5MTpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG45MzkyOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxcbjkzOTM6XFx0XFx0XFx0XFx0bmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xcbjkzOTQ6XFx0XFx0XFx0aWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMpKVxcbjkzOTU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM5NjpcXHRcXHR9IGVsc2Uge1xcbjkzOTc6XFx0XFx0XFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XFxuOTM5ODpcXHRcXHR9XFxuOTM5OTpcXHRcXG45NDAwOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcXG45NDAxOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cXG45NDAyOlxcdFxcdFxcdFxcdG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XFxuOTQwMzpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4gPVxcbjk0MDQ6XFx0XFx0XFx0XFx0bmxhX2xlbihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pO1xcbjk0MDU6XFx0XFx0fVxcbjk0MDY6XFx0XFxuOTQwNzpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKVxcbjk0MDg6XFx0XFx0XFx0cGFyYW1zLmxpc3Rlbl9pbnRlcnZhbCA9XFxuOTQwOTpcXHRcXHRcXHRcXHRubGFfZ2V0X3UxNihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pO1xcbjk0MTA6XFx0XFxuOTQxMTpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1ZMQU5fSURdKVxcbjk0MTI6XFx0XFx0XFx0cGFyYW1zLnZsYW5faWQgPSBubGFfZ2V0X3UxNihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkxBTl9JRF0pO1xcbjk0MTM6XFx0XFxuOTQxNDpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JUX1AyUF9QU10pIHtcXG45NDE1OlxcdFxcdFxcdHBhcmFtcy5zdXBwb3J0X3AycF9wcyA9XFxuOTQxNjpcXHRcXHRcXHRcXHRubGFfZ2V0X3U4KGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVF9QMlBfUFNdKTtcXG45NDE3OlxcdFxcdH0gZWxzZSB7XFxuOTQxODpcXHRcXHRcXHQvKlxcbjk0MTk6XFx0XFx0XFx0ICogaWYgbm90IHNwZWNpZmllZCwgYXNzdW1lIGl0J3Mgc3VwcG9ydGVkIGZvciBQMlAgR08gaW50ZXJmYWNlLFxcbjk0MjA6XFx0XFx0XFx0ICogYW5kIGlzIE5PVCBzdXBwb3J0ZWQgZm9yIEFQIGludGVyZmFjZVxcbjk0MjE6XFx0XFx0XFx0ICovXFxuOTQyMjpcXHRcXHRcXHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxcbjk0MjM6XFx0XFx0XFx0XFx0d2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTztcXG45NDI0OlxcdFxcdH1cXG45NDI1OlxcdFxcbjk0MjY6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTQyNzpcXHRcXHRcXHRwYXJhbXMuYWlkID0gbmxhX2dldF91MTYoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAwLjExMDk5NDIzWiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM2ODMyMzg5NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBhc3N1bWluZyBJJ20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6XG5cbioqQW5hbHl6aW5nIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhlIHJlc3Qgb2YgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBmdW5jdGlvbi4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBtZW50YWwgbW9kZWwgb2YgdGhlIGdlbmVyYWwgZmxvdywgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIG51YW5jZXMgaXMgY3J1Y2lhbC4gSSdtIGZvY3VzaW5nIG5vdyBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgcm91dGluZS4gSSdtIGxvb2tpbmcgZm9yIHdoZXJlIGl0IGhhbmRsZXMgdGhlIGFjdHVhbCBzdGF0aW9uIGNyZWF0aW9uLCB3aGF0IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQuIEkgbmVlZCB0byBpZGVudGlmeSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBsb2NraW5nIGlzc3Vlcywgb2YgY291cnNlLCB0aGF0IGNvdWxkIHBvcCB1cCB3aGVuIG11bHRpcGxlIHRocmVhZHMgbWlnaHQgYmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9yIG90aGVycyB0aGF0IG9wZXJhdGUgb24gdGhpcyBkYXRhLlxuXG5JJ20gY2hlY2tpbmcgaWYgdGhlcmUgaXMgYW55IGluaXRpYWwgY29uZmlndXJhdGlvbiBjaGVja3MuIEZvciBleGFtcGxlLCBpcyB0aGVyZSBhIG1heGltdW0gbnVtYmVyIG9mIHN0YXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcj8gVGhhdCdzIGEgZ29vZCBvbmUgdG8gbG9vayBmb3IuIEFuZCBpZiBzbywgaG93IGlzIHRoZSBsaW1pdCBlbmZvcmNlZD8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBpbnB1dCBwYXJhbWV0ZXJzPyBJIGV4cGVjdCB0byBzZWUgY2hlY2tzIG9uIHRoZSBNQUMgYWRkcmVzcywgdGhlIGludGVyZmFjZSBpbmRleCwgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCdzIHBhc3NlZCBpbiBmcm9tIHRoZSBuZXRsaW5rIG1lc3NhZ2UuXG5cbkknbSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGhvdyB0aGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBleGlzdGluZyBzdGF0aW9uIG1hbmFnZW1lbnQgZGF0YSBzdHJ1Y3R1cmVzLiBBcmUgbmV3IHN0YXRpb24gZW50cmllcyBhZGRlZCB0byBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBXaGF0IGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgZW1wbG95ZWQgdG8gcHJvdGVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBjb25jdXJyZW50IGFjY2Vzcz8gSSdtIGhvcGluZyB0byBzZWUgYSB3ZWxsLWRlZmluZWQgbG9ja2luZyBzY2hlbWUgdXNpbmcgcmVhZC13cml0ZSBsb2NrcyBvciBtdXRleGVzIHRvIHByb3ZpZGUgc2FmZSBvcGVyYXRpb25zLlxuXG5JJ20gYWxzbyBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlscyAoZS5nLiwgbWVtb3J5IGFsbG9jYXRpb24pPyBIb3cgYXJlIGVycm9ycyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2U/IEFyZSB0aGVyZSBwcm9wZXIgZXJyb3IgY29kZXMgdXNlZD8gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgcm9idXN0LlxuXG5GaW5hbGx5LCBJJ20gZXhhbWluaW5nIGFueSBob29rcyBvciBjYWxsYmFja3MgdGhhdCBhcmUgdHJpZ2dlcmVkIGR1cmluZyBzdGF0aW9uIGNyZWF0aW9uLiBBcmUgdGhlcmUgYW55IG5vdGlmaWNhdGlvbnMgc2VudCB0byBvdGhlciBwYXJ0cyBvZiB0aGUgd2lyZWxlc3Mgc3RhY2ssIGxpa2UgdGhlIG1hYzgwMjExIGxheWVyLCBvciBtYXliZSB0byB1c2VyIHNwYWNlIHZpYSBuZXRsaW5rPyBJdCdzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN5c3RlbSBpbXBhY3Qgb2YgdGhpcyBmdW5jdGlvbi4gSSBhbSBhbHdheXMgdHJ5aW5nIHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiB3aWxsIGludGVyYWN0IHdpdGggdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNTgsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAzLjc5NDIzNzI5OFoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjc4NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC93aXJlbGVzcy9ubDgwMjExLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTU1MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjk1NTA6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjk1NTE6XFx0XFx0XFx0aWYgKHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXFx1MDAyNiBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEKVxcbjk1NTI6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU1MzpcXHRcXHRcXHQvKiBOQU4gTk1JIHN0YXRpb24gbXVzdCBiZSBhZGRlZCBpbiBhc3NvY2lhdGVkIG9yIGF1dGhvcml6ZWQgc3RhdGUgKi9cXG45NTU0OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgKEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcXG45NTU1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSkpXFxuOTU1NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTU3OlxcdFxcdH1cXG45NTU4OlxcdFxcbjk1NTk6XFx0XFx0LyogRW5zdXJlIHRoYXQgSFQvVkhUIGNhcGFiaWxpdGllcyBhcmUgbm90IHNldCBmb3IgNiBHSHogSEUgU1RBICovXFxuOTU2MDpcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5oZV82Z2h6X2NhcGEgXFx1MDAyNlxcdTAwMjZcXG45NTYxOlxcdFxcdCAgICAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5odF9jYXBhIHx8IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMudmh0X2NhcGEpKVxcbjk1NjI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU2MzpcXHRcXG45NTY0OlxcdFxcdC8qIFdoZW4geW91IHJ1biBpbnRvIHRoaXMsIGFkanVzdCB0aGUgY29kZSBiZWxvdyBmb3IgdGhlIG5ldyBmbGFnICovXFxuOTU2NTpcXHRcXHRCVUlMRF9CVUdfT04oTkw4MDIxMV9TVEFfRkxBR19NQVggIT0gOCk7XFxuOTU2NjpcXHRcXG45NTY3OlxcdFxcdHN3aXRjaCAod2Rldi1cXHUwMDNlaWZ0eXBlKSB7XFxuOTU2ODpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxcbjk1Njk6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XFxuOTU3MDpcXHRcXHRcXHQvKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBBUCBhbmQgbGluayBoYXMgYmVlbiBzdGFydGVkICovXFxuOTU3MTpcXHRcXHRcXHRsaW5rX2lkID0gd2Rldi1cXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xcbjk1NzI6XFx0XFx0XFx0aWYgKCF3ZGV2LVxcdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXFxuOTU3MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbjk1NzQ6XFx0XFxuOTU3NTpcXHRcXHRcXHQvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovXFxuOTU3NjpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mbGFncyBcXHUwMDI2IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8XFxuOTU3NzpcXHRcXHRcXHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxcbjk1Nzg6XFx0XFx0XFx0XFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcXG45NTc5OlxcdFxcbjk1ODA6XFx0XFx0XFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cXG45NTgxOlxcdFxcdFxcdGlmICgocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxcbjk1ODI6XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTU4MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTg0OlxcdFxcdFxcdC8qIGJ1dCBkb24ndCBib3RoZXIgdGhlIGRyaXZlciB3aXRoIGl0ICovXFxuOTU4NTpcXHRcXHRcXHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7XFxuOTU4NjpcXHRcXG45NTg3OlxcdFxcdFxcdC8qIGFsbG93IGF1dGhlbnRpY2F0ZWQvYXNzb2NpYXRlZCBvbmx5IGlmIGRyaXZlciBoYW5kbGVzIGl0ICovXFxuOTU4ODpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mZWF0dXJlcyBcXHUwMDI2XFxuOTU4OTpcXHRcXHRcXHRcXHRcXHROTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUpIFxcdTAwMjZcXHUwMDI2XFxuOTU5MDpcXHRcXHRcXHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgYXV0aF9hc3NvYylcXG45NTkxOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1OTI6XFx0XFxuOTU5MzpcXHRcXHRcXHRpZiAoIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KFxcdTAwMjZyZGV2LVxcdTAwM2V3aXBoeSxcXG45NTk0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TUFBfQU1TRFVfU1VQUE9SVCkgXFx1MDAyNlxcdTAwMjZcXG45NTk1OlxcdFxcdFxcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19TUFBfQU1TRFUpKVxcbjk1OTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU5NzpcXHRcXG45NTk4OlxcdFxcdFxcdC8qIE9sZGVyIHVzZXJzcGFjZSwgb3IgdXNlcnNwYWNlIHdhbnRpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoXFxuOTU5OTpcXHRcXHRcXHQgKiAhTkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFLCB3aWxsIG5vdCBzZXQgdGhlIGF1dGhcXG45NjAwOlxcdFxcdFxcdCAqIGFuZCBhc3NvYyBmbGFncyBpbiB0aGUgbWFzaywgYnV0IGFzc3VtZXMgdGhlIHN0YXRpb24gd2lsbCBiZVxcbjk2MDE6XFx0XFx0XFx0ICogYWRkZWQgYXMgYXNzb2NpYXRlZCBhbnl3YXkgc2luY2UgdGhpcyB3YXMgdGhlIHJlcXVpcmVkIGRyaXZlclxcbjk2MDI6XFx0XFx0XFx0ICogYmVoYXZpb3VyIGJlZm9yZSBOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUgd2FzXFxuOTYwMzpcXHRcXHRcXHQgKiBpbnRyb2R1Y2VkLlxcbjk2MDQ6XFx0XFx0XFx0ICogSW4gb3JkZXIgdG8gbm90IGJvdGhlciBkcml2ZXJzIHdpdGggdGhpcyBxdWlyayBpbiB0aGUgQVBJXFxuOTYwNTpcXHRcXHRcXHQgKiBzZXQgdGhlIGZsYWdzIGluIGJvdGggdGhlIG1hc2sgYW5kIHNldCBmb3IgbmV3IHN0YXRpb25zIGluXFxuOTYwNjpcXHRcXHRcXHQgKiB0aGlzIGNhc2UuXFxuOTYwNzpcXHRcXHRcXHQgKi9cXG45NjA4OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2IGF1dGhfYXNzb2MpKSB7XFxuOTYwOTpcXHRcXHRcXHRcXHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgfD0gYXV0aF9hc3NvYztcXG45NjEwOlxcdFxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IHw9IGF1dGhfYXNzb2M7XFxuOTYxMTpcXHRcXHRcXHR9XFxuOTYxMjpcXHRcXG45NjEzOlxcdFxcdFxcdC8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqL1xcbjk2MTQ6XFx0XFx0XFx0cGFyYW1zLnZsYW4gPSBnZXRfdmxhbihpbmZvLCByZGV2KTtcXG45NjE1OlxcdFxcdFxcdGlmIChJU19FUlIocGFyYW1zLnZsYW4pKVxcbjk2MTY6XFx0XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocGFyYW1zLnZsYW4pO1xcbjk2MTc6XFx0XFx0XFx0YnJlYWs7XFxuOTYxODpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XFxuOTYxOTpcXHRcXHRcXHQvKlxcbjk2MjA6XFx0XFx0XFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxcbjk2MjE6XFx0XFx0XFx0ICogbGliZXJ0YXMgZG9lc24ndCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlXFxuOTYyMjpcXHRcXHRcXHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXFxuOTYyMzpcXHRcXHRcXHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXFxuOTYyNDpcXHRcXHRcXHQgKi9cXG45NjI1OlxcdFxcdFxcdGlmIChyZGV2LVxcdTAwM2VvcHMtXFx1MDAzZWxpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHtcXG45NjI2OlxcdFxcdFxcdFxcdGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcXG45NjI3OlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTYyODpcXHRcXHRcXHR9IGVsc2UgaWYgKCF3ZGV2LVxcdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XFxuOTYyOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbjk2MzA6XFx0XFx0XFx0fVxcbjk2MzE6XFx0XFxuOTYzMjpcXHRcXHRcXHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xcbjk2MzM6XFx0XFx0XFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcXG45NjM0OlxcdFxcbjk2MzU6XFx0XFx0XFx0LyogYXNzb2NpYXRlZCBpcyBkaXNhbGxvd2VkICovXFxuOTYzNjpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkpXFxuOTYzNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjM4OlxcdFxcdFxcdC8qIFRETFMgcGVlcnMgY2Fubm90IGJlIGFkZGVkICovXFxuOTYzOTpcXHRcXHRcXHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcXG45NjQwOlxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxcbjk2NDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTY0MjpcXHRcXHRcXHRicmVhaztcXG45NjQzOlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjpcXG45NjQ0OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDpcXG45NjQ1OlxcdFxcdFxcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXFxuOTY0NjpcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk2NDc6XFx0XFxuOTY0ODpcXHRcXHRcXHQvKiB0aGVzZSBhcmUgZGlzYWxsb3dlZCAqL1xcbjk2NDk6XFx0XFx0XFx0aWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAzLjc5NTkyMjEyOFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MDk5MTI0ODY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyBjb3JlIHB1cnBvc2UuIEl0IHNlZW1zIHdlJ3JlIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgaXNzdWUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLiBCZWZvcmUgdGhpcyBjaGFuZ2UsIHRoZXJlIHdhcyBhIHNjZW5hcmlvIHdoZXJlIGFkZGluZyBhIHN0YXRpb24gdG8gYW4gQVAgb3IgbWVzaCBpbnRlcmZhY2UgKmJlZm9yZSogdGhlIEFQIG9yIG1lc2ggaW50ZXJmYWNlIHdhcyBmdWxseSBzdGFydGVkIGNvdWxkIGxlYWQgdG8gZHJpdmVyIGNyYXNoZXMgb3IgdW5leHBlY3RlZCBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB3YXMgc3VzY2VwdGlibGUgdG8gZGVyZWZlcmVuY2luZyB1bmluaXRpYWxpemVkIHBvaW50ZXJzIG9yIHVzaW5nIHVuaW5pdGlhbGl6ZWQgc3RhdGUgd2l0aGluIHRoZSBkcml2ZXJzLiBUaGUgYGJlYWNvbl9pbnRlcnZhbGAgd2FzIGxpa2VseSBhIGtleSBjb21wb25lbnQgaGVyZSwgYXMgYSB2YWx1ZSBvZiB6ZXJvLCBvciBhbiBhYnNlbmNlIG9mIG9uZSBvbiBhbiBBUF9WTEFOIGludGVyZmFjZSwgd2FzIGNhdXNpbmcgdHJvdWJsZS4gVGhlIGB2YWxpZF9saW5rc2AgY2hlY2sgd2FzIGFsc28gYmVpbmcgZG9uZSBsYXRlciB0aGFuIGlkZWFsLlxuXG5Ob3csIEkgbmVlZCB0byBhbmFseXplIHRoaXMgZnJvbSBhIG1lbW9yeSBzYWZldHkgcGVyc3BlY3RpdmUuIEFyZSB0aGVyZSBhbnkgbmV3IHZhcmlhYmxlcyBpbnRyb2R1Y2VkIHRoYXQgbWlnaHQgYmUgdW5pbml0aWFsaXplZD8gWWVzLCBgaW50IGxpbmtfaWRgIGlzIGEgbG9jYWwgdmFyaWFibGUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLCB3aGljaCBjYW4gYmUgaW5pdGlhbGl6ZWQgdmlhIGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzID8gcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIDogMDtgICBJdCBzZWVtcyBsaWtlIGBsaW5rX2lkYCBpcyBhbHdheXMgYXNzaWduZWQgYmVmb3JlIGJlaW5nIHVzZWQsIHdoaWNoIGlzIGdvb2QuICBPZiBjb3Vyc2UsIGBwYXJhbXNgIGlzIG1lbXNldC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBhbnkgbmV3IGRhdGEgaXNuJ3QgYmVpbmcgZXhwb3NlZCB0byB1c2Vyc3BhY2UgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS4gTm8sIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBkaXJlY3RseSBjb3B5IGFueSBkYXRhIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2UuIEl0IGhhbmRsZXMgYSBuZXRsaW5rIGNvbW1hbmQgYW5kIGVpdGhlciByZXR1cm5zIGFuIGVycm9yIG9yIGNhbGxzIGByZGV2X2FkZF9zdGF0aW9uYC5cblxuVGhlbiwgSSBuZWVkIHRvIGxvb2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGZsb3cgb3IgYnJhbmNoaW5nIGlzIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AsIGBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWRgIChpbml0aWFsaXplZCB2aWEgYG1lbXNldGAsIHRoZW4gYG5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkYCksIGB3ZGV2LVx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbGAsIGByZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsYCwgYHdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbmAsIGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgIGFwcGVhciB0byBiZSBleGlzdGluZyBrZXJuZWwgc3RhdGUgb3IgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gc29tZSBmYXNoaW9uLiBTbywgdGhhdCBzZWVtcyBzYWZlLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgcmVhZHMgb3IgYnVmZmVyIG92ZXJmbG93cyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AgaXMgbm9uLXplcm8sIHRoZSBgbGlua19pZGAgaXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGJvdW5kcyBvZiBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AuIElmIGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCBpcyB6ZXJvLCBgbGlua19pZGAgaXMgYXNzaWduZWQgemVybywgc28gdGhhdCBhZGRyZXNzZXMgdGhhdCBwYXRoLiBBbmQgaW4gZWl0aGVyIGNhc2UsIGB2YWxpZF9saW5rc2AgaXMgYm91bmRlZCBieSBgSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTYCwgdHlwaWNhbGx5IDE1LCBzbyBhbnkgYXJyYXkgYWNjZXNzZXMgYXJlIHdpdGhpbiBsaW1pdHMuICBJIHNob3VsZCBhbHNvIGRvdWJsZS1jaGVjayBgcmRldl9hZGRfc3RhdGlvbmAgYW5kIGB3ZGV2LVx1MDAzZWxpbmtzYCBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCwgYmFzZWQgb24gdGhpcyBpbml0aWFsIHBhc3MsIGl0IGFwcGVhcnMgdG8gYmUgYSBzb2xpZCBwYXRjaCBmcm9tIGEgbWVtb3J5IHBlcnNwZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzgxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzcxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MTAuODk1MDQ5MTc1WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzAwNjY0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3Qgd2lyZWxlc3NfZGV2IFxcXFx7XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbmV0L2NmZzgwMjExLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvY2ZnODAyMTEuaD03MTQyPWVudW0gaWVlZTgwMjExX2FwX3JlZ19wb3dlciB7XFxuLS1cXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMjktICovXFxuaW5jbHVkZS9uZXQvY2ZnODAyMTEuaDo3MjMwOnN0cnVjdCB3aXJlbGVzc19kZXYge1xcbmluY2x1ZGUvbmV0L2NmZzgwMjExLmgtNzIzMS1cXHRzdHJ1Y3Qgd2lwaHkgKndpcGh5O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxMC45NDIwNjE4ODdaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mzk0MjI3NTUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIGB3aXJlbGVzc19kZXZgIFN0cnVjdHVyZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyB3aG9sZSB0aGluZyBpcyBzdHJ1Y3R1cmVkLCBzbyBsZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLiBHb3R0YSBzZWUgd2hhdCBmaWVsZHMgYXJlIGF2YWlsYWJsZSwgaG93IHRoZXkncmUgdXNlZCwgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCB3aXJlbGVzcyBzdWJzeXN0ZW0uIFRoaXMgaXMgdGhlIGJlZHJvY2sgb2YgdGhlIGVudGlyZSB3aXJlbGVzcyBkZXZpY2UgcmVwcmVzZW50YXRpb24gd2l0aGluIHRoZSBrZXJuZWwsIHNvIGtub3dpbmcgaXQgaW50aW1hdGVseSBpcyBhYnNvbHV0ZWx5IGNydWNpYWwuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgdmVyaWZ5IHNvbWUgYXNzdW1wdGlvbnMgSSBtaWdodCBoYXZlIG1hZGUsIGFuZCBtYXliZSBwaWNrIHVwIHNvbWV0aGluZyBuZXcuIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNzgsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxNC44ODQzMzk5NDlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk0NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbmV0L2NmZzgwMjExLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNzIzMCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNzIzMDpcXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2IHtcXG43MjMxOlxcdFxcdHN0cnVjdCB3aXBoeSAqd2lwaHk7XFxuNzIzMjpcXHRcXHRlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZTtcXG43MjMzOlxcdFxcbjcyMzQ6XFx0XFx0LyogdGhlIHJlbWFpbmRlciBvZiB0aGlzIHN0cnVjdCBzaG91bGQgYmUgcHJpdmF0ZSB0byBjZmc4MDIxMSAqL1xcbjcyMzU6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbjcyMzY6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjtcXG43MjM3OlxcdFxcbjcyMzg6XFx0XFx0dTMyIGlkZW50aWZpZXI7XFxuNzIzOTpcXHRcXG43MjQwOlxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgbWdtdF9yZWdpc3RyYXRpb25zO1xcbjcyNDE6XFx0XFx0dTggbWdtdF9yZWdpc3RyYXRpb25zX25lZWRfdXBkYXRlOjE7XFxuNzI0MjpcXHRcXG43MjQzOlxcdFxcdGJvb2wgdXNlXzRhZGRyLCBpc19ydW5uaW5nLCByZWdpc3RlcmVkLCByZWdpc3RlcmluZztcXG43MjQ0OlxcdFxcbjcyNDU6XFx0XFx0dTggYWRkcmVzc1tFVEhfQUxFTl0gX19hbGlnbmVkKHNpemVvZih1MTYpKTtcXG43MjQ2OlxcdFxcbjcyNDc6XFx0XFx0LyogY3VycmVudGx5IHVzZWQgZm9yIElCU1MgYW5kIFNNRSAtIG1pZ2h0IGJlIHJlYXJyYW5nZWQgbGF0ZXIgKi9cXG43MjQ4OlxcdFxcdHN0cnVjdCBjZmc4MDIxMV9jb25uICpjb25uO1xcbjcyNDk6XFx0XFx0c3RydWN0IGNmZzgwMjExX2NhY2hlZF9rZXlzICpjb25uZWN0X2tleXM7XFxuNzI1MDpcXHRcXHRlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBjb25uX2Jzc190eXBlO1xcbjcyNTE6XFx0XFx0dTMyIGNvbm5fb3duZXJfbmxwb3J0aWQ7XFxuNzI1MjpcXHRcXG43MjUzOlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIGRpc2Nvbm5lY3Rfd2s7XFxuNzI1NDpcXHRcXHR1OCBkaXNjb25uZWN0X2Jzc2lkW0VUSF9BTEVOXTtcXG43MjU1OlxcdFxcbjcyNTY6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBldmVudF9saXN0O1xcbjcyNTc6XFx0XFx0c3BpbmxvY2tfdCBldmVudF9sb2NrO1xcbjcyNTg6XFx0XFxuNzI1OTpcXHRcXHR1OCBjb25uZWN0ZWQ6MTtcXG43MjYwOlxcdFxcbjcyNjE6XFx0XFx0Ym9vbCBwcztcXG43MjYyOlxcdFxcdGludCBwc190aW1lb3V0O1xcbjcyNjM6XFx0XFxuNzI2NDpcXHRcXHR1MzIgdW5leHBlY3RlZF9ubHBvcnRpZDtcXG43MjY1OlxcdFxcbjcyNjY6XFx0XFx0dTMyIG93bmVyX25scG9ydGlkO1xcbjcyNjc6XFx0XFx0Ym9vbCBubF9vd25lcl9kZWFkO1xcbjcyNjg6XFx0XFxuNzI2OTpcXHQjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFRcXG43MjcwOlxcdFxcdC8qIHdleHQgZGF0YSAqL1xcbjcyNzE6XFx0XFx0c3RydWN0IHtcXG43MjcyOlxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyBpYnNzO1xcbjcyNzM6XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zIGNvbm5lY3Q7XFxuNzI3NDpcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmtleXM7XFxuNzI3NTpcXHRcXHRcXHRjb25zdCB1OCAqaWU7XFxuNzI3NjpcXHRcXHRcXHRzaXplX3QgaWVfbGVuO1xcbjcyNzc6XFx0XFx0XFx0dTggYnNzaWRbRVRIX0FMRU5dO1xcbjcyNzg6XFx0XFx0XFx0dTggcHJldl9ic3NpZFtFVEhfQUxFTl07XFxuNzI3OTpcXHRcXHRcXHR1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxNC44ODQ3Mzg1MjlaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQwMTgyODQwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIERlZXBlciBpbnRvIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiB3b3JraW5nIHdpdGggdGhlIHdpcmVsZXNzIHN0YWNrLCBhbmQgbm93IEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgIGFuZCBob3cgaXQncyB1c2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBJIGtub3cgdGhlIGJhc2ljIGRlZmluaXRpb24sIGJ1dCBJIG5lZWQgdG8gc2VlIGl0IGluIGFjdGlvbiwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSByZWxldmFudCBjb2RlLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byB0cmFjZSB0aGUgdXNlIG9mIHRoaXMgc3RydWN0IGFyb3VuZCBsaW5rcy4gSSBrbm93IGhvdyB0aGluZ3MgZ2VuZXJhbGx5IHdvcmssIGJ1dCBJIG5lZWQgYSBtb3JlIGRldGFpbGVkLCBwcmFjdGljYWwgdW5kZXJzdGFuZGluZy4gU28sIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgbGlua3MhIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEzMTgsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjE3LjI4NjU2OTU5MVoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjk4ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9uZXQvY2ZnODAyMTEuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA3MjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI3MjgwOlxcdFxcdFxcdHM4IGRlZmF1bHRfa2V5LCBkZWZhdWx0X21nbXRfa2V5O1xcbjcyODE6XFx0XFx0XFx0Ym9vbCBwcmV2X2Jzc2lkX3ZhbGlkO1xcbjcyODI6XFx0XFx0fSB3ZXh0O1xcbjcyODM6XFx0I2VuZGlmXFxuNzI4NDpcXHRcXG43Mjg1OlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIGNxbV9yc3NpX3dvcms7XFxuNzI4NjpcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY3FtX2NvbmZpZyBfX3JjdSAqY3FtX2NvbmZpZztcXG43Mjg3OlxcdFxcbjcyODg6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBwbXNyX2xpc3Q7XFxuNzI4OTpcXHRcXHRzcGlubG9ja190IHBtc3JfbG9jaztcXG43MjkwOlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIHBtc3JfZnJlZV93aztcXG43MjkxOlxcdFxcbjcyOTI6XFx0XFx0dW5zaWduZWQgbG9uZyB1bnByb3RfYmVhY29uX3JlcG9ydGVkO1xcbjcyOTM6XFx0XFxuNzI5NDpcXHRcXHR1bmlvbiB7XFxuNzI5NTpcXHRcXHRcXHRzdHJ1Y3Qge1xcbjcyOTY6XFx0XFx0XFx0XFx0dTggY29ubmVjdGVkX2FkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43Mjk3OlxcdFxcdFxcdFxcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XFxuNzI5ODpcXHRcXHRcXHRcXHR1OCBzc2lkX2xlbjtcXG43Mjk5OlxcdFxcdFxcdH0gY2xpZW50O1xcbjczMDA6XFx0XFx0XFx0c3RydWN0IHtcXG43MzAxOlxcdFxcdFxcdFxcdGludCBiZWFjb25faW50ZXJ2YWw7XFxuNzMwMjpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgcHJlc2V0X2NoYW5kZWY7XFxuNzMwMzpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjtcXG43MzA0OlxcdFxcdFxcdFxcdHU4IGlkW0lFRUU4MDIxMV9NQVhfTUVTSF9JRF9MRU5dO1xcbjczMDU6XFx0XFx0XFx0XFx0dTggaWRfbGVuLCBpZF91cF9sZW47XFxuNzMwNjpcXHRcXHRcXHR9IG1lc2g7XFxuNzMwNzpcXHRcXHRcXHRzdHJ1Y3Qge1xcbjczMDg6XFx0XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xcbjczMDk6XFx0XFx0XFx0XFx0dTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOXTtcXG43MzEwOlxcdFxcdFxcdFxcdHU4IHNzaWRfbGVuO1xcbjczMTE6XFx0XFx0XFx0fSBhcDtcXG43MzEyOlxcdFxcdFxcdHN0cnVjdCB7XFxuNzMxMzpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpjdXJyZW50X2JzcztcXG43MzE0OlxcdFxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmO1xcbjczMTU6XFx0XFx0XFx0XFx0aW50IGJlYWNvbl9pbnRlcnZhbDtcXG43MzE2OlxcdFxcdFxcdFxcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XFxuNzMxNzpcXHRcXHRcXHRcXHR1OCBzc2lkX2xlbjtcXG43MzE4OlxcdFxcdFxcdH0gaWJzcztcXG43MzE5OlxcdFxcdFxcdHN0cnVjdCB7XFxuNzMyMDpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjtcXG43MzIxOlxcdFxcdFxcdH0gb2NiO1xcbjczMjI6XFx0XFx0XFx0c3RydWN0IHtcXG43MzIzOlxcdFxcdFxcdFxcdHU4IGNsdXN0ZXJfaWRbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43MzI0OlxcdFxcdFxcdFxcdHU4IG5fY2hhbm5lbHM7XFxuNzMyNTpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWZzO1xcbjczMjY6XFx0XFx0XFx0XFx0Ym9vbCBzY2hlZF91cGRhdGVfcGVuZGluZztcXG43MzI3OlxcdFxcdFxcdH0gbmFuO1xcbjczMjg6XFx0XFx0fSB1O1xcbjczMjk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjE3LjI4Njk0MDk3MVoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1ODk4NDY4MDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBkZWxpdmVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gdGhlIFdpcmVsZXNzIERldmljZSBTdHJ1Y3R1cmUqKlxuXG5BbHJpZ2h0LCBzbyB3ZSdyZSBsb29raW5nIGF0IHRoZSBpbnRlcm5hbHMgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLCByaWdodD8gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiT2theSwgd2hhdCdzICpuZXh0Kj8gV2hhdCBvdGhlciBlbGVtZW50cyBkZWZpbmUgdGhlIGNvcmUgb2YgdGhpcyBkZXZpY2U/XCIgSSd2ZSBnb3QgYSBkZWNlbnQgZ3Jhc3Agb2YgdGhlIGJhc2ljIHN0cnVjdHVyZSwgYnV0IGl0J3MgdGhlIGZpbmVyIGRldGFpbHMgdGhhdCByZWFsbHkgbWFrZSBvciBicmVhayBhIHdlbGwtZW5naW5lZXJlZCB3aXJlbGVzcyBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHNlZSB0aGUgKndob2xlKiBwaWN0dXJlLiBJ4oCZbSB0aGlua2luZyBhYm91dCB3aGF0IG90aGVyIGZpZWxkcyBtaWdodCBiZSBpbmNsdWRlZC5cblxuSSdtIG1lbnRhbGx5IHByZXBhcmluZyB0byBuYXZpZ2F0ZSBhIHBvdGVudGlhbGx5IGNvbXBsZXggd2ViIG9mIHBvaW50ZXJzLCBuZXN0ZWQgc3RydWN0dXJlcywgYW5kIGJpdGZpZWxkcy4gSSdtIGV4cGVjdGluZyB0byBzZWUgZmxhZ3MgZGVmaW5pbmcgdGhlIGRldmljZSdzIGNhcGFiaWxpdGllcywgcG9pbnRlcnMgdG8gcmVndWxhdG9yeSBkb21haW5zLCBwZXJoYXBzIGNvbmZpZ3VyYXRpb24tcmVsYXRlZCBlbGVtZW50cyBvciBzdGF0aXN0aWNzIGNvdW50ZXJzLCBhbmQgY2VydGFpbmx5IHRoZSBkZXRhaWxzIGFib3V0IHRoZSBvcGVyYXRpbmcgbW9kZXMuIEknbSBob3BpbmcgaXTigJlzIHdlbGwtZG9jdW1lbnRlZCEgVGhlIGRlc2lnbiBjaG9pY2VzIHdpbGwgdGVsbCBhIGxvdCBhYm91dCB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZS4gTGV0J3Mgc2VlIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGludGVyZmFjZXMsIGNvbmN1cnJlbmN5LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEknbSBlc3BlY2lhbGx5IGtlZW4gb24gaG93IHRoZXkgaGFuZGxlZCB0aGUgY29uY3VycmVuY3kgYW5kIGludGVyZmFjZXMgaW4gYSBtb2Rlcm4gd2lyZWxlc3MgZW52aXJvbm1lbnQuIEFuZCBvZiBjb3Vyc2UsIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGVsZW1lbnRzIG5lZWRlZCB0byB0aWUgaXQgYWxsIGludG8gdGhlIG5ldHdvcmsgc3RhY2suIEknbSBsb29raW5nIGZvciB3aGVyZSB0aGUgZHJpdmVyIGZpdHMgaW4sIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjI4NywiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MjMuMTg1NDExNzgxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM5MTYzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC9jZmc4MDIxMS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDczMzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjczMzA6XFx0XFx0c3RydWN0IHtcXG43MzMxOlxcdFxcdFxcdHU4IGFkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43MzMyOlxcdFxcdFxcdHVuaW9uIHtcXG43MzMzOlxcdFxcdFxcdFxcdHN0cnVjdCB7XFxuNzMzNDpcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgYmVhY29uX2ludGVydmFsO1xcbjczMzU6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XFxuNzMzNjpcXHRcXHRcXHRcXHR9IGFwO1xcbjczMzc6XFx0XFx0XFx0XFx0c3RydWN0IHtcXG43MzM4OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmN1cnJlbnRfYnNzO1xcbjczMzk6XFx0XFx0XFx0XFx0fSBjbGllbnQ7XFxuNzM0MDpcXHRcXHRcXHR9O1xcbjczNDE6XFx0XFxuNzM0MjpcXHRcXHRcXHRib29sIGNhY19zdGFydGVkO1xcbjczNDM6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBjYWNfc3RhcnRfdGltZTtcXG43MzQ0OlxcdFxcdFxcdHVuc2lnbmVkIGludCBjYWNfdGltZV9tcztcXG43MzQ1OlxcdFxcdH0gbGlua3NbSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTXTtcXG43MzQ2OlxcdFxcdHUxNiB2YWxpZF9saW5rcztcXG43MzQ3OlxcdFxcbjczNDg6XFx0XFx0dTMyIHJhZGlvX21hc2s7XFxuNzM0OTpcXHR9O1xcbjczNTA6XFx0XFxuNzM1MTpcXHRzdGF0aWMgaW5saW5lIGNvbnN0IHU4ICp3ZGV2X2FkZHJlc3Moc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldilcXG43MzUyOlxcdHtcXG43MzUzOlxcdFxcdGlmICh3ZGV2LVxcdTAwM2VuZXRkZXYpXFxuNzM1NDpcXHRcXHRcXHRyZXR1cm4gd2Rldi1cXHUwMDNlbmV0ZGV2LVxcdTAwM2VkZXZfYWRkcjtcXG43MzU1OlxcdFxcdHJldHVybiB3ZGV2LVxcdTAwM2VhZGRyZXNzO1xcbjczNTY6XFx0fVxcbjczNTc6XFx0XFxuNzM1ODpcXHRzdGF0aWMgaW5saW5lIGJvb2wgd2Rldl9ydW5uaW5nKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXFxuNzM1OTpcXHR7XFxuNzM2MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlbmV0ZGV2KVxcbjczNjE6XFx0XFx0XFx0cmV0dXJuIG5ldGlmX3J1bm5pbmcod2Rldi1cXHUwMDNlbmV0ZGV2KTtcXG43MzYyOlxcdFxcdHJldHVybiB3ZGV2LVxcdTAwM2Vpc19ydW5uaW5nO1xcbjczNjM6XFx0fVxcbjczNjQ6XFx0XFxuNzM2NTpcXHQvKipcXG43MzY2OlxcdCAqIHdkZXZfcHJpdiAtIHJldHVybiB3aXBoeSBwcml2IGZyb20gd2lyZWxlc3NfZGV2XFxuNzM2NzpcXHQgKlxcbjczNjg6XFx0ICogQHdkZXY6IFRoZSB3aXJlbGVzcyBkZXZpY2Ugd2hvc2Ugd2lwaHkncyBwcml2IHBvaW50ZXIgdG8gcmV0dXJuXFxuNzM2OTpcXHQgKiBSZXR1cm46IFRoZSB3aXBoeSBwcml2IG9mIEB3ZGV2LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToyMy4xODU4MDU0NzFaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzg5OTE2MTYyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFByb3Bvc2VkIFBhdGNoIGluIGBubDgwMjExX25ld19zdGF0aW9uYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IG9mIHRoaXMgcGF0Y2ggZm9yIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBmb2N1c2VkIG9uIGl0cyBpbXBhY3Qgb24gbWVtb3J5IHNhZmV0eSBhbmQgd2hldGhlciBpdCBuZWNlc3NpdGF0ZXMgS01TQU4uIEZyb20gd2hhdCBJIGNhbiBzZWUsIHRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgYWRkaW5nIGNydWNpYWwgdmFsaWRhdGlvbiBjaGVja3MuIFNwZWNpZmljYWxseTpcblxuMS4gIEl0J3MgdmFsaWRhdGluZyB0aGUgYGxpbmtfaWRgIG11Y2ggZWFybGllciBpbiB0aGUgZnVuY3Rpb24sIGNyb3NzLXJlZmVyZW5jaW5nIGl0IHdpdGggYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgLiBHb29kIG1vdmUsIGNhdGNoaW5nIHBvdGVudGlhbCBpc3N1ZXMgdXBmcm9udC5cbjIuICBDcnVjaWFsbHksIGl0IG5vdyBlbmZvcmNlcyBhIGNoZWNrIGZvciBBUC9QMlBcXF9HTyBpbnRlcmZhY2VzLiBUaGlzIGVuc3VyZXMgdGhlIEFQJ3MgYmVhY29uIGludGVydmFsIGlzIHNldCwgZWZmZWN0aXZlbHkgbWVhbmluZyB0aGUgQVAgaXMgc3RhcnRlZCwgYmVmb3JlIGFsbG93aW5nIG5ldyBzdGF0aW9ucyB0byBjb25uZWN0LiBUaGlzIGlzIGEgc29saWQgY2hlY2sgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbi5cbjMuICBTaW1pbGFybHksIGZvciBtZXNoIGludGVyZmFjZXMsIGl0IHZhbGlkYXRlcyB0aGF0IHRoZSBtZXNoIGlzIHN0YXJ0ZWQgYmVmb3JlIHBlcm1pdHRpbmcgbmV3IHN0YXRpb24gYWRkaXRpb25zLiBQcm90ZWN0aW5nIGFnYWluc3Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLlxuNC4gIEFuZCBmaW5hbGx5LCBpdCByZW1vdmVzIGEgcmVkdW5kYW50IGB2YWxpZF9saW5rc2AgY2hlY2sgbGF0ZXIgaW4gdGhlIGZ1bmN0aW9uLiBQcnVuaW5nIGRvd24gdW5uZWNlc3NhcnkgY2hlY2tzIGlzIGFsd2F5cyBhIGdvb2QgcHJhY3RpY2UuXG5cbk5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiBEb2VzIHRoaXMgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gTXkgYW5hbHlzaXMgc3VnZ2VzdHMgYSByZXNvdW5kaW5nIFwibm8uXCIgSSdtIGNvbmZpZGVudCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3Qgb3Igc3RhY2sgdmFyaWFibGVzIGJlaW5nIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gQWxsIHRoZSB2YXJpYWJsZXMgdXNlZCDigJMgYHBhcmFtc2AsIGBsaW5rX2lkYCwgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgLCB0aGUgYmVhY29uIGludGVydmFsIGNoZWNrLCB0aGUgbWVzaC1yZWxhdGVkIHN0YXRlIHZhcmlhYmxlcyDigJMgYXJlIGRlbW9uc3RyYWJseSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBObyBtZW1vcnkgaXMgYmVpbmcgYWxsb2NhdGVkIG9yIGxlYWtlZCB0byB1c2Vyc3BhY2UsIGFuZCB0aGVyZSdzIG5vIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuIFRoYXQncyBhIGNsZWFuIGJpbGwgb2YgaGVhbHRoIGFzIGZhciBhcyBJIGNhbiB0ZWxsLlxuXG5HaXZlbiB0aGlzLCBkb2VzIEtNU0FOIG5lZWQgdG8gYmUgaW52b2x2ZWQ/IEFic29sdXRlbHkgbm90LiBUaGlzIHBhdGNoIGZvY3VzZXMgb24gKnByZXZlbnRpbmcqIG9wZXJhdGlvbnMgb24gdW5pbml0aWFsaXplZCBBUC9tZXNoIGludGVyZmFjZXMgdGhyb3VnaCBzdHJpY3RlciB2YWxpZGF0aW9uLiBUaGUgZ29hbCBpcyB0byBhdm9pZCB0aG9zZSBzaXR1YXRpb25zIGFsdG9nZXRoZXIuIFN0YW5kYXJkIEtBU0FOIGFuZCBkZWJ1Z2dpbmcgYnVpbGRzIGFyZSBlbnRpcmVseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiBvciBvdXQtb2YtYm91bmRzIGVycm9ycyB0aGF0ICptaWdodCogYmUgaW50cm9kdWNlZCAodGhvdWdoIEkgZG9uJ3Qgc2VlIGFueSBldmlkZW5jZSBvZiB0aGF0IGhlcmUpLiBJdCdzIG1vcmUgb2YgYSBwcmV2ZW50YXRpdmUgbWVhc3VyZSB0aGFuIGEgZml4IGZvciBhbiBleGlzdGluZyB2dWxuZXJhYmlsaXR5LlxuXG5UaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgdGhhdCB0aGlzIHBhdGNoIGRvZXNuJ3QgcmVxdWlyZSBLTVNBTi4gSSdsbCBwcmVwYXJlIG15IHJlYXNvbmluZyBhY2NvcmRpbmdseSBhbmQgc2V0IHRoZSByZXN1bHRzIHdpdGggYE5lZWRzS01TQU46IGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMxOTAsIk91dHB1dFRva2VucyI6MTc3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MzEuMDg0OTY5MzQ1WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIHNhbml0eSBjaGVja3MgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gIHRvIHZlcmlmeSB0aGF0IHRoZSBsaW5rL2ludGVyZmFjZSBoYXMgYmVlbiBzdGFydGVkIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbiBmb3IgQVAgYW5kIE1lc2ggaW50ZXJmYWNlcywgYW5kIHZhbGlkYXRpbmcgYGxpbmtfaWRgIGVhcmxpZXIgYWdhaW5zdCBgd2Rldi1cXHUwMDNldmFsaWRfbGlua3NgKS5cXG5cXG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIHJlYWQsIG9yIGV4cG9zZWQuXFxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXFxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXFxuNC4gTm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBpbiB0aGlzIGNvZGUgcGF0aC5cXG5cXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rc2ApLlxcblxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cXG4yLiBUaGUgbmV3bHkgaW50cm9kdWNlZCBsb2NhbCB2YXJpYWJsZSBgbGlua19pZGAgaXMgYXNzaWduZWQgYmVmb3JlIHVzZS5cXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxcblxcblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-10 08:18:11 +0000 UTC FinishedAt: 2026-09-10 09:21:32 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "a8bbe92e29262da9d108b5b1e62f26b8aafc4daf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "CFG80211" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "linux-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next", "commit_hash": "a8bbe92e29262da9d108b5b1e62f26b8aafc4daf", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "CFG80211" ], "series_id": "4e2274f5-8093-44d1-856d-1774513c6368" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "nl80211_new_station" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjE5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0NGRzgwMjExJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmw4MDIxMV9uZXdfc3RhdGlvbiYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCkuXG5cbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0XG4tLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG5AQCAtOTMyOCw3ICYjNDM7OTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIHtcbiBcdHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMF07XG4tXHRpbnQgZXJyO1xuJiM0MztcdGludCBlcnIsIGxpbmtfaWQ7XG4gXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbiBcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuQEAgLTkzNzYsNiAmIzQzOzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuIFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbiBcbiYjNDM7XHRpZiAod2Rldi1cdTAwM2V2YWxpZF9saW5rcykge1xuJiM0MztcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRpZiAoISh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzIFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5PTElOSztcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7XG4gXHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTtcbiBcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7XG5AQCAtOTU1Niw4ICYjNDM7OTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcbiBcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbiBcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG4tXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbiYjNDM7XHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbiYjNDM7XHRcdGxpbmtfaWQgPSB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzID8gcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIDogMDtcbiYjNDM7XHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG4mIzQzO1x0XHRcdHJldHVybiAtRU5FVERPV047XG4mIzQzO1xuIFx0XHQvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovXG4gXHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmxhZ3MgXHUwMDI2IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8XG4gXHRcdCAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSlcbkBAIC05NjAyLDYgJiM0Mzs5NjE2LDE5IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxuJiM0MztcdFx0ICogbGliZXJ0YXMgZG9lc24mIzM5O3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuJiM0MztcdFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xuJiM0MztcdFx0ICogdXNlIHRoYXQgYXMgdGhlIHN0YXJ0ZWQgaW5kaWNhdGlvbiBpbnN0ZWFkLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAocmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xuJiM0MztcdFx0XHRpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcbiYjNDM7XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuJiM0MztcdFx0fSBlbHNlIGlmICghd2Rldi1cdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XG4mIzQzO1x0XHRcdHJldHVybiAtRU5FVERPV047XG4mIzQzO1x0XHR9XG4mIzQzO1xuIFx0XHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xuIFx0XHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XG4gXG5AQCAtOTY0OSwyNyAmIzQzOzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHQvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqL1xuIFxuLVx0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbi1cdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7XG4tXHRcdFx0ZXJyID0gLUVOT0xJTks7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKSB7XG4tXHRcdFx0ZXJyID0gLUVJTlZBTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0fVxuLVxuIFx0cGFyYW1zLmVwcF9wZWVyID1cbiBcdFx0bmxhX2dldF9mbGFnKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XG4gXG4gXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcdTAwMjZwYXJhbXMpO1xuLW91dDpcbiBcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7Q0ZHODAyMTEmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtubDgwMjExX25ld19zdGF0aW9uJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIgbmw4MDIxMV9uZXdfc3RhdGlvbigpIGluIHRoZSBjZmc4MDIxMSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIHN1YnN5c3RlbS4gSXQgbW92ZXMgbGluayBJRCB2YWxpZGF0aW9uIGVhcmxpZXIgYW5kIGludHJvZHVjZXMgbmV3IGludGVyZmFjZSBzdGF0ZSB2YWxpZGF0aW9ucyAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGZvciBBUC9QMlBfR08gYW5kIG1lc2ggaW50ZXJmYWNlcykgYmVmb3JlIGFsbG93aW5nIGEgbmV3IHN0YXRpb24gdG8gYmUgcmVnaXN0ZXJlZC4gVGhpcyBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBubDgwMjExIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDY5OGQ0NDhlY2FlNjFmZDg5NzEzY2FhZThjNzdiZTYwODdkYWZmZTMKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAxMCAwOToxOTo1MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtOTMyOCw3ICYjNDM7OTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0mZ3Q7dXNlcl9wdHJbMF07Ci0JaW50IGVycjsKJiM0MzsJaW50IGVyciwgbGlua19pZDsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0mZ3Q7dXNlcl9wdHJbMV07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtJmd0O25ldGRldjsKIAlzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtczsKQEAgLTkzNzYsNiAmIzQzOzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAJcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkID0KIAkJbmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby0mZ3Q7YXR0cnMpOwogCiYjNDM7CWlmICh3ZGV2LSZndDt2YWxpZF9saW5rcykgewomIzQzOwkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoISh3ZGV2LSZndDt2YWxpZF9saW5rcyAmYW1wOyBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpCiYjNDM7CQkJcmV0dXJuIC1FTk9MSU5LOwomIzQzOwl9IGVsc2UgewomIzQzOwkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmZ3Q7PSAwKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwl9CiYjNDM7CiAJaWYgKGluZm8tJmd0O2F0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHsKIAkJbWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLSZndDthdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTsKIAkJcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7CkBAIC05NTU2LDggJiM0Mzs5NTY2LDEyIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCiAJc3dpdGNoICh3ZGV2LSZndDtpZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKJiM0MzsJCS8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi8KJiM0MzsJCWxpbmtfaWQgPSB3ZGV2LSZndDt2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7CiYjNDM7CQlpZiAoIXdkZXYtJmd0O2xpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbCkKJiM0MzsJCQlyZXR1cm4gLUVORVRET1dOOwomIzQzOwogCQkvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovCiAJCWlmICghKHJkZXYtJmd0O3dpcGh5LmZsYWdzICZhbXA7IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8CiAJCSAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICZhbXA7IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKQpAQCAtOTYwMiw2ICYjNDM7OTYxNiwxOSBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAkJCXJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgomIzQzOwkJLyoKJiM0MzsJCSAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC4KJiM0MzsJCSAqIGxpYmVydGFzIGRvZXNuJiMzOTt0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGUKJiM0MzsJCSAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc28KJiM0MzsJCSAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC4KJiM0MzsJCSAqLwomIzQzOwkJaWYgKHJkZXYtJmd0O29wcy0mZ3Q7bGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkgewomIzQzOwkJCWlmICghd2Rldi0mZ3Q7dS5tZXNoLmNoYW5kZWYuY2hhbikKJiM0MzsJCQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsJCX0gZWxzZSBpZiAoIXdkZXYtJmd0O3UubWVzaC5iZWFjb25faW50ZXJ2YWwpIHsKJiM0MzsJCQlyZXR1cm4gLUVORVRET1dOOwomIzQzOwkJfQomIzQzOwogCQkvKiBpZ25vcmUgdUFQU0QgZGF0YSAqLwogCQlwYXJhbXMuc3RhX21vZGlmeV9tYXNrICZhbXA7PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDsKIApAQCAtOTY0OSwyNyAmIzQzOzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAKIAkvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqLwogCi0JaWYgKHdkZXYtJmd0O3ZhbGlkX2xpbmtzKSB7Ci0JCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmx0OyAwKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKCEod2Rldi0mZ3Q7dmFsaWRfbGlua3MgJmFtcDsgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7Ci0JCQllcnIgPSAtRU5PTElOSzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCAmZ3Q7PSAwKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAlwYXJhbXMuZXBwX3BlZXIgPQogCQlubGFfZ2V0X2ZsYWcoaW5mby0mZ3Q7YXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7CiAKIAllcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCAmYW1wO3BhcmFtcyk7Ci1vdXQ6CiAJZGV2X3B1dChwYXJhbXMudmxhbik7CiAJcmV0dXJuIGVycjsKIH0KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MTk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA0MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDM2MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIEV2YWx1YXRpb246IFdpcmVsZXNzIE5ldHdvcmsgSW50ZXJmYWNlIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBzZXJpZXMsIGZvY3VzaW5nIG9uIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYCwgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IHBhcmFtZXRlcnMg4oCTIHRoZSBgRm9jdXNTeW1ib2xzYCwgYEVuYWJsZUNvbmZpZ3NgLCBgV29ydGhGdXp6aW5nYCBhc3Nlc3NtZW50LCBhbmQgdGhlIHJlYXNvbmluZyBiZWhpbmQgaXQgYWxsLgoKRmlyc3QsIGxldCYjMzk7cyBsb29rIGF0IHdoYXQgdGhlIHBhdGNoIGFjdHVhbGx5ICpkb2VzKi4gSXQmIzM5O3MgbWVzc2luZyB3aXRoIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2hpY2ggaGFuZGxlcyBuZXcgc3RhdGlvbiBjb25uZWN0aW9ucyBpbiB0aGUgd2lyZWxlc3MgbmV0d29ya2luZyBzdGFjay4gU3BlY2lmaWNhbGx5OgoKMS4gIEl0IHNodWZmbGVzIGFyb3VuZCB0aGUgYGxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhbmQgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBjaGVjayBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHB1dHRpbmcgaXQgaGlnaGVyIHVwLiBUaGF0JiMzOTtzIGEgc3RydWN0dXJhbCBjaGFuZ2UsIHBvdGVudGlhbGx5IG1ha2luZyB0aGUgY29kZSBmbG93IGRpZmZlcmVudGx5LgoyLiAgSXQgcmV3b3JrcyBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0aGF0IGRlYWxzIHdpdGggZGlmZmVyZW50IGludGVyZmFjZSB0eXBlcyAoYE5MODAyMTFfSUZUWVBFX0FQYCwgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gLCBgTkw4MDIxMV9JRlRZUEVfUDJQX0dPYCwgYE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlRgKS4gVGhlIHBhdGNoIHJlbW92ZXMgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGZyb20gb25lIG9mIHRoZSBjYXNlcy4gSXQgYWxzbyBhZGRzIG5ldyBjaGVja3MgaW5zaWRlIHRoZXNlIGNhc2VzOgogICAgKiAgIEZvciBBUCBhbmQgUDJQX0dPLCBpdCBub3cgY2hlY2tzIGB3ZGV2LSZndDtsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWxgIGJlZm9yZSBhZGRpbmcgdGhlIHN0YXRpb24uCiAgICAqICAgRm9yIE1FU0hfUE9JTlQsIGl0IGNoZWNrcyBgd2Rldi0mZ3Q7dS5tZXNoLmNoYW5kZWYuY2hhbmAgKExpYmVydGFzKSBvciBgd2Rldi0mZ3Q7dS5tZXNoLmJlYWNvbl9pbnRlcnZhbGAuCjMuICBGaW5hbGx5LCBpdCByZW1vdmVzIGEgcmVkdW5kYW50IGxpbmsgY2hlY2sgYW5kIGFuIGBvdXRgIGxhYmVsIGF0IHRoZSBib3R0b20gb2YgdGhlIGZ1bmN0aW9uLgoKVGhpcyBpcyBhIGZ1bmN0aW9uYWwgY2hhbmdlLCBub3QganVzdCBhIGNsZWFudXAuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlc2UgbmV3IGNoZWNrcywgcGFydGljdWxhcmx5IHJlbGF0ZWQgdG8gYGJlYWNvbl9pbnRlcnZhbGAgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbnMsIGxvb2tzIGxpa2UgaXQmIzM5O3MgYWRkcmVzc2luZyBzb21lIHNwZWNpZmljIHdpcmVsZXNzIGludGVyZmFjZSBiZWhhdmlvci4gIEkgbmVlZCB0byBkaWcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgS2NvbmZpZyBvcHRpb25zIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBNeSBpbW1lZGlhdGUgaHVuY2ggaXMgdGhhdCB0aGlzIGlzIGxpa2VseSByZWxhdGVkIHRvIHJvYnVzdG5lc3MgYW5kIHNlY3VyaXR5LCBsaWtlbHkgaW4gaGFuZGxpbmcgb2YgYmVhY29uIGZyYW1lcyBvciBvdGhlciB3aXJlbGVzcyBjb250cm9sIGRhdGEuIEkmIzM5O2xsIHVzZSBteSB0b29scyB0byBpbnNwZWN0IHRoZSBjb2RlIHRvIGNvbmZpcm0gbXkgYXNzdW1wdGlvbnMgYW5kIHdvcmsgb3V0IHRoZSBkZXRhaWxzIGZvciBnZW5lcmF0aW5nIHN5emthbGxlciBwYXJhbWV0ZXJzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL25sODAyMTEuYz05MTU2PXN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTMyNy1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTMyODpzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTMyOS17XG4tLVxubmV0L3dpcmVsZXNzL25sODAyMTEuYz0xOTc0MD1zdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfc21hbGxfb3BzIG5sODAyMTFfc21hbGxfb3BzW10gPSB7XG4tLVxubmV0L3dpcmVsZXNzL25sODAyMTEuYy0xOTg0Ni1cdFx0LnZhbGlkYXRlID0gR0VOTF9ET05UX1ZBTElEQVRFX1NUUklDVCB8IEdFTkxfRE9OVF9WQUxJREFURV9EVU1QLFxubmV0L3dpcmVsZXNzL25sODAyMTEuYzoxOTg0NzpcdFx0LmRvaXQgPSBubDgwMjExX25ld19zdGF0aW9uLFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy0xOTg0OC1cdFx0LmZsYWdzID0gR0VOTF9VTlNfQURNSU5fUEVSTSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1Mjc3CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNDcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCBkaXZpbmcgaW50byB0aGUgY29kZToKCioqRGl2aW5nIGludG8gdGhlIFdpcmVsZXNzIEtlcm5lbCBNb2R1bGVzKioKClJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9ucyBmb3IgdGhlc2Ugd2lyZWxlc3MgbW9kdWxlcywgYG5sODAyMTEuY2AgYW5kIGBjZmc4MDIxMWAuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB0aGUgc3RhbmRhcmQgbG9jYXRpb25zIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uIEkmIzM5O2xsIHN0YXJ0IHdpdGggYG5ldC93aXJlbGVzcy9LY29uZmlnYCBhbmQgYG5ldC93aXJlbGVzcy9NYWtlZmlsZWAuIFRob3NlIGZpbGVzIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMuIEtjb25maWcgd2lsbCBvdXRsaW5lIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBhZmZlY3QgY29tcGlsYXRpb24sIGFuZCB0aGUgTWFrZWZpbGUgc2hvdWxkIHRlbGwgbWUgaG93IHRoZXNlIHNvdXJjZSBmaWxlcyBmaXQgaW50byB0aGUgYnVpbGQgcHJvY2VzcywgaW5jbHVkaW5nIGFueSBvdGhlciBkZXBlbmRlbmNpZXMgbGlrZSBvdGhlciBrZXJuZWwgbW9kdWxlcyBhbmQgbGlicmFyaWVzLiBIb3BlZnVsbHksIEkmIzM5O2xsIGZpbmQgd2hhdCBJIG5lZWQgdGhlcmUgcHJldHR5IHF1aWNrbHkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmw4MDIxMVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL01ha2VmaWxlPTc9b2JqLSQoQ09ORklHX1dFWFRfUFJJVikgJiM0Mzs9IHdleHQtcHJpdi5vXG5uZXQvd2lyZWxlc3MvTWFrZWZpbGUtOC1cbm5ldC93aXJlbGVzcy9NYWtlZmlsZTo5OmNmZzgwMjExLXkgJiM0Mzs9IGNvcmUubyBzeXNmcy5vIHJhZGlvdGFwLm8gdXRpbC5vIHJlZy5vIHNjYW4ubyBubDgwMjExLm9cbm5ldC93aXJlbGVzcy9NYWtlZmlsZS0xMC1jZmc4MDIxMS15ICYjNDM7PSBtbG1lLm8gaWJzcy5vIHNtZS5vIGNoYW4ubyBldGh0b29sLm8gbWVzaC5vIGFwLm8gdHJhY2UubyBvY2Iub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU2NjIKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipOYXZpZ2F0aW5nIHRoZSBXaXJlbGVzcyBDb25maWd1cmF0aW9uIExhbmRzY2FwZSoqCgpPa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7dmUgZ290IHRoZSB3aXJlbGVzcyBiaXRzIGNvdmVyZWQuIE15IGZpcnN0IHN0b3Agd2lsbCBiZSBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNvcmUgd2lyZWxlc3Mgc3RhY2sgY29tcG9uZW50cy4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYENGRzgwMjExYCBhbmQgYE5MODAyMTFgLiBJIG5lZWQgdG8gZW5zdXJlIHRoZXkmIzM5O3JlIGJvdGggZW5hYmxlZCAob3IgYXQgbGVhc3QsIGFwcHJvcHJpYXRlbHkgY29uZmlndXJlZCksIGFuZCB1bmRlcnN0YW5kIGFueSBkZXBlbmRlbmNpZXMgb3IgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgYmFzaWMsIGJ1dCBmb3VuZGF0aW9uYWw7IGdvdHRhIGNvbmZpcm0gdGhhdCB0aGUgY29yZSB3aXJlbGVzcyBpbmZyYXN0cnVjdHVyZSBpcyBwcm9wZXJseSBlbmFibGVkIGJlZm9yZSBJIGdvIGZ1cnRoZXIuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyByZXZlYWwgYWJvdXQgdGhlc2UgdHdvLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBDRkc4MDIxMSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC93aXJlbGVzcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MvS2NvbmZpZz0xND1jb25maWcgV0VYVF9QUklWXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTYtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNzpjb25maWcgQ0ZHODAyMTFcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE4LVx0dHJpc3RhdGUgXCYjMzQ7Y2ZnODAyMTEgLSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIEFQSVwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnPTM4PWNvbmZpZyBOTDgwMjExX1RFU1RNT0RFXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctNTEtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo1Mjpjb25maWcgQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy01My1cdGJvb2wgXCYjMzQ7ZW5hYmxlIGRldmVsb3BlciB3YXJuaW5nc1wmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTY3LVxubmV0L3dpcmVsZXNzL0tjb25maWc6Njg6Y29uZmlnIENGRzgwMjExX0NFUlRJRklDQVRJT05fT05VU1xubmV0L3dpcmVsZXNzL0tjb25maWctNjktXHRib29sIFwmIzM0O2NmZzgwMjExIGNlcnRpZmljYXRpb24gb251c1wmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTg4LVxubmV0L3dpcmVsZXNzL0tjb25maWc6ODk6Y29uZmlnIENGRzgwMjExX1JFUVVJUkVfU0lHTkVEX1JFR0RCXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05MC1cdGJvb2wgXCYjMzQ7cmVxdWlyZSByZWdkYiBzaWduYXR1cmVcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctOTgtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo5OTpjb25maWcgQ0ZHODAyMTFfVVNFX0tFUk5FTF9SRUdEQl9LRVlTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMDAtXHRib29sIFwmIzM0O2FsbG93IHJlZ2RiIGtleXMgc2hpcHBlZCB3aXRoIHRoZSBrZXJuZWxcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTEwLVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTExOmNvbmZpZyBDRkc4MDIxMV9FWFRSQV9SRUdEQl9LRVlESVJcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMi1cdHN0cmluZyBcJiMzNDthZGRpdGlvbmFsIHJlZ2RiIGtleSBkaXJlY3RvcnlcJiMzNDsgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTIxLVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTIyOmNvbmZpZyBDRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFNcbm5ldC93aXJlbGVzcy9LY29uZmlnLTEyMy1cdGJvb2wgXCYjMzQ7Y2ZnODAyMTEgcmVndWxhdG9yeSBzdXBwb3J0IGZvciBjZWxsdWxhciBiYXNlIHN0YXRpb24gaGludHNcJiMzNDtcbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzQtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxMzU6Y29uZmlnIENGRzgwMjExX1JFR19SRUxBWF9OT19JUlxubmV0L3dpcmVsZXNzL0tjb25maWctMTM2LVx0Ym9vbCBcJiMzNDtjZmc4MDIxMSBzdXBwb3J0IGZvciBOT19JUiByZWxheGF0aW9uXCYjMzQ7XG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTU4LVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTU5OmNvbmZpZyBDRkc4MDIxMV9ERUZBVUxUX1BTXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNjAtXHRib29sIFwmIzM0O2VuYWJsZSBwb3dlcnNhdmUgYnkgZGVmYXVsdFwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTE2OC1cbm5ldC93aXJlbGVzcy9LY29uZmlnOjE2OTpjb25maWcgQ0ZHODAyMTFfREVCVUdGU1xubmV0L3dpcmVsZXNzL0tjb25maWctMTcwLVx0Ym9vbCBcJiMzNDtjZmc4MDIxMSBEZWJ1Z0ZTIGVudHJpZXNcJiMzNDtcbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzYtXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNzc6Y29uZmlnIENGRzgwMjExX0NSREFfU1VQUE9SVFxubmV0L3dpcmVsZXNzL0tjb25maWctMTc4LVx0Ym9vbCBcJiMzNDtzdXBwb3J0IENSREFcJiMzNDsgaWYgRVhQRVJUXG4tLVxubmV0L3dpcmVsZXNzL0tjb25maWctMTg2LVxubmV0L3dpcmVsZXNzL0tjb25maWc6MTg3OmNvbmZpZyBDRkc4MDIxMV9XRVhUXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xODgtXHRib29sIFwmIzM0O2NmZzgwMjExIHdpcmVsZXNzIGV4dGVuc2lvbnMgY29tcGF0aWJpbGl0eVwmIzM0O1xuLS1cbm5ldC93aXJlbGVzcy9LY29uZmlnLTE5My1cbm5ldC93aXJlbGVzcy9LY29uZmlnOjE5NDpjb25maWcgQ0ZHODAyMTFfS1VOSVRfVEVTVFxubmV0L3dpcmVsZXNzL0tjb25maWctMTk1LVx0dHJpc3RhdGUgXCYjMzQ7S1VuaXQgdGVzdHMgZm9yIGNmZzgwMjExXCYjMzQ7IGlmICFLVU5JVF9BTExfVEVTVFNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2ODA3CgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipLY29uZmlnIERlcGVuZGVuY3kgRGVlcCBEaXZlKioKCk9rYXksIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55IENGRzgwMjExIGRlcGVuZGVuY2llcyBsdXJraW5nIHdpdGhpbiB0aGUgS2NvbmZpZyBmaWxlcy4gVGhpcyBtZWFucyBJIG5lZWQgdG8gc3RhcnQgY29tYmluZyB0aHJvdWdoIHRob3NlIGZpbGVzLCBzcGVjaWZpY2FsbHkgbG9va2luZyBmb3IgYW55IGBkZXBlbmRzIG9uYCBzdGF0ZW1lbnRzIG9yIGNvbmRpdGlvbmFsIGluY2x1c2lvbnMgdGhhdCByZWxhdGUgdG8gQ0ZHODAyMTEuIEl0JiMzOTtzIGEgc3RhbmRhcmQgc3RlcCwgcmVhbGx5IC0gZ290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyB0byBlbnN1cmUgdGhlIG1vZHVsZSBvciBmZWF0dXJlIEkmIzM5O20gd29ya2luZyBvbiBpcyBjb3JyZWN0bHkgaG9va2VkIGludG8gdGhlIGV4aXN0aW5nIHdpcmVsZXNzIGluZnJhc3RydWN0dXJlLiBHb3R0YSBiZSBtZXRpY3Vsb3VzIGhlcmUuIEkmIzM5O20gdGhpbmtpbmcgSSYjMzk7bGwgc3RhcnQgd2l0aCB0aGUgbW9zdCByZWxldmFudCBLY29uZmlnIGZpbGVzIGZpcnN0LCBwcm9iYWJseSB0aG9zZSBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBhcmVhIEkmIzM5O20gbW9kaWZ5aW5nLiBUaGVuLCBJJiMzOTtsbCBicm9hZGVuIHRoZSBzZWFyY2gsIG1heWJlIHVzaW5nIGBncmVwYCBvciBhIHNpbWlsYXIgdG9vbCB0byBsb29rIGZvciBhbnl0aGluZyBzdXNwaWNpb3VzLiBUaGlzIGlzIHJvdXRpbmUsIGJ1dCB0aG9yb3VnaG5lc3MgaXMga2V5IGZvciBhdm9pZGluZyBidWlsZCBlcnJvcnMgb3IgcnVudGltZSBzdXJwcmlzZXMgbGF0ZXIgb24uIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHRjb25maWcgV0lSRUxFU1NfRVhUXG4gICAzOlx0XHRib29sXG4gICA0Olx0XG4gICA1Olx0Y29uZmlnIFdFWFRfQ09SRVxuICAgNjpcdFx0ZGVmX2Jvb2wgeVxuICAgNzpcdFx0ZGVwZW5kcyBvbiBDRkc4MDIxMV9XRVhUIHx8IFdJUkVMRVNTX0VYVFxuICAgODpcdFxuICAgOTpcdGNvbmZpZyBXRVhUX1BST0NcbiAgMTA6XHRcdGRlZl9ib29sIHlcbiAgMTE6XHRcdGRlcGVuZHMgb24gUFJPQ19GU1xuICAxMjpcdFx0ZGVwZW5kcyBvbiBXRVhUX0NPUkVcbiAgMTM6XHRcbiAgMTQ6XHRjb25maWcgV0VYVF9QUklWXG4gIDE1Olx0XHRib29sXG4gIDE2Olx0XG4gIDE3Olx0Y29uZmlnIENGRzgwMjExXG4gIDE4Olx0XHR0cmlzdGF0ZSBcJiMzNDtjZmc4MDIxMSAtIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gQVBJXCYjMzQ7XG4gIDE5Olx0XHRkZXBlbmRzIG9uIFJGS0lMTCB8fCAhUkZLSUxMXG4gIDIwOlx0XHRzZWxlY3QgRldfTE9BREVSXG4gIDIxOlx0XHRzZWxlY3QgQ1JDMzJcbiAgMjI6XHRcdCMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoaXMgd2hlbiBjZXJ0aWZpY2F0ZXMgYXJlIGNoYW5nZWQgYW5kIGFyZVxuICAyMzpcdFx0IyB1c2luZyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIHRob3VnaCByaWdodCBub3cgdGhleSBzaG91bGRuJiMzOTt0XG4gIDI0Olx0XHQjICh0aGlzIGlzIGhlcmUgcmF0aGVyIHRoYW4gYmVsb3cgdG8gYWxsb3cgaXQgdG8gYmUgYSBtb2R1bGUpXG4gIDI1Olx0XHRzZWxlY3QgQ1JZUFRPX1NIQTI1NiBpZiBDRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVNcbiAgMjY6XHRcdGhlbHBcbiAgMjc6XHRcdCAgY2ZnODAyMTEgaXMgdGhlIExpbnV4IHdpcmVsZXNzIExBTiAoODAyLjExKSBjb25maWd1cmF0aW9uIEFQSS5cbiAgMjg6XHRcdCAgRW5hYmxlIHRoaXMgaWYgeW91IGhhdmUgYSB3aXJlbGVzcyBkZXZpY2UuXG4gIDI5Olx0XG4gIDMwOlx0XHQgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIGRvY3VtZW50YXRpb24gb24gdGhlIHdpcmVsZXNzIHdpa2k6XG4gIDMxOlx0XG4gIDMyOlx0XHQgIGh0dHBzOi8vd2lyZWxlc3Mud2lraS5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvRG9jdW1lbnRhdGlvbi9jZmc4MDIxMVxuICAzMzpcdFxuICAzNDpcdFx0ICBXaGVuIGJ1aWx0IGFzIGEgbW9kdWxlIGl0IHdpbGwgYmUgY2FsbGVkIGNmZzgwMjExLlxuICAzNTpcdFxuICAzNjpcdGlmIENGRzgwMjExXG4gIDM3Olx0XG4gIDM4Olx0Y29uZmlnIE5MODAyMTFfVEVTVE1PREVcbiAgMzk6XHRcdGJvb2wgXCYjMzQ7bmw4MDIxMSB0ZXN0bW9kZSBjb21tYW5kXCYjMzQ7XG4gIDQwOlx0XHRoZWxwXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDc2MDIKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAxODEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQYXRjaCBhbmQgUmVhY2hhYmlsaXR5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBpbW1lZGlhdGVseSBJJiMzOTttIHRoaW5raW5nIGFib3V0IGl0cyBpbXBsaWNhdGlvbnMgZm9yIGZ1enppbmcsIHNwZWNpZmljYWxseSB3aXRoIHN5emthbGxlci4gVGhlIGNvcmUgb2YgdGhpcyBjaGFuZ2Ugc2VlbXMgdG8gYmUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gIHdpdGhpbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AuIFJpZ2h0LCB0aGlzIGlzIHdoZXJlIHRoZSBgTkw4MDIxMV9DTURfTkVXX1NUQVRJT05gIGNvbW1hbmQgaXMgaGFuZGxlZCwgYWxsIHRocm91Z2ggR2VuZXJpYyBOZXRsaW5rJiMzOTtzIGBubDgwMjExYCBpbnRlcmZhY2UuIEEgcXVpY2sgbWVudGFsIGNoZWNrOiBpcyBgbmw4MDIxMWAgYWNjZXNzaWJsZSB3aXRoaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgc2V0dXAsIGVzcGVjaWFsbHkgaW4gdGhvc2UgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBBYnNvbHV0ZWx5LiBXZSYjMzk7cmUgZGVhbGluZyB3aXRoIGBtYWM4MDIxMV9od3NpbWAgYW5kIGBjZmc4MDIxMWAgaGVyZSwgd2hpY2ggYXJlIHByZXR0eSBtdWNoIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIHN5emthbGxlciBmdXp6aW5nIGluIHRoaXMgYXJlYS4gR2VuZXJpYyBOZXRsaW5rIHNvY2tldHMsIGBubDgwMjExYCBpbmNsdWRlZCwgYXJlIHJlYWRpbHkgY3JlYXRhYmxlIGFuZCBxdWVyeWFibGUsIG5vIHBoeXNpY2FsIGhhcmR3YXJlIG5lY2Vzc2FyeS4gR29vZC4gTm93LCBJIHNob3VsZCBkaXZlIGludG8gdGhlIGFjdHVhbCBmdW5jdGlvbiBpdHNlbGYsIGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIGdldCBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiBpdHMgd29ya2luZ3MuIEkgbmVlZCB0byB0cmFjZSB0aHJvdWdoIHRoZSBjb2RlLCBtYXAgb3V0IGNhbGxlcnMsIGFuZCBwaW5wb2ludCBhbnkgcG90ZW50aWFsbHkgaW50ZXJlc3Rpbmcgc3ltYm9scy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTMyOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5MzI4Olx0c3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG45MzI5Olx0e1xuOTMzMDpcdFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbjkzMzE6XHRcdGludCBlcnIsIGxpbmtfaWQ7XG45MzMyOlx0XHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbjkzMzM6XHRcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbjkzMzQ6XHRcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuOTMzNTpcdFx0dTggKm1hY19hZGRyID0gTlVMTDtcbjkzMzY6XHRcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxuOTMzNzpcdFx0XHRcdCBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKTtcbjkzMzg6XHRcbjkzMzk6XHRcdG1lbXNldChcdTAwMjZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTtcbjkzNDA6XHRcbjkzNDE6XHRcdGlmICghZGV2IFx1MDAyNlx1MDAyNiB3ZGV2LVx1MDAzZWlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pXG45MzQyOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM0MzpcdFxuOTM0NDpcdFx0aWYgKCFyZGV2LVx1MDAzZW9wcy1cdTAwM2VhZGRfc3RhdGlvbilcbjkzNDU6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTM0NjpcdFxuOTM0NzpcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NQUNdKVxuOTM0ODpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNDk6XHRcbjkzNTA6XHRcdGlmICh3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU4gfHxcbjkzNTE6XHRcdCAgICB3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xuOTM1MjpcdFx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXG45MzUzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzU0Olx0XHRcdGlmICh3ZGV2LVx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xuOTM1NTpcdFx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxuOTM1NjpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzU3Olx0XG45MzU4Olx0XHRcdFx0LyogT25seSBOTUkgc3RhdGlvbnMgcmVjZWl2ZSB0aGUgSFQvVkhUL0hFIGNhcGFiaWxpdGllcyAqL1xuOTM1OTpcdFx0XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSB8fFxuOTM2MDpcdFx0XHRcdCAgICBpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WSFRfQ0FQQUJJTElUWV0gfHxcbjkzNjE6XHRcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSEVfQ0FQQUJJTElUWV0pXG45MzYyOlx0XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNjM6XHRcdFx0fVxuOTM2NDpcdFx0fSBlbHNlIHtcbjkzNjU6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMXSlcbjkzNjY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNjc6XHRcbjkzNjg6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcbjkzNjk6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNzA6XHRcbjkzNzE6XHRcdFx0aWYgKCFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfQUlEXSBcdTAwMjZcdTAwMjZcbjkzNzI6XHRcdFx0ICAgICFpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXG45MzczOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzc0Olx0XHR9XG45Mzc1Olx0XG45Mzc2Olx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuOTM3NzpcdFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbjkzNzg6XHRcbjkzNzk6XHRcdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG45MzgwOlx0XHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApXG45MzgxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzgyOlx0XHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcbjkzODM6XHRcdFx0XHRyZXR1cm4gLUVOT0xJTks7XG45Mzg0Olx0XHR9IGVsc2Uge1xuOTM4NTpcdFx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMClcbjkzODY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzODc6XHRcdH1cbjkzODg6XHRcbjkzODk6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcbjkzOTA6XHRcdFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xuOTM5MTpcdFx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcbjkzOTI6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX21hYyA9XG45MzkzOlx0XHRcdFx0bmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XG45Mzk0Olx0XHRcdGlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfbWFjKSlcbjkzOTU6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzOTY6XHRcdH0gZWxzZSB7XG45Mzk3Olx0XHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XG45Mzk4Olx0XHR9XG45Mzk5Olx0XG45NDAwOlx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcbjk0MDE6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5zdXBwb3J0ZWRfcmF0ZXMgPVxuOTQwMjpcdFx0XHRcdG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKTtcbjk0MDM6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5zdXBwb3J0ZWRfcmF0ZXNfbGVuID1cbjk0MDQ6XHRcdFx0XHRubGFfbGVuKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKTtcbjk0MDU6XHRcdH1cbjk0MDY6XHRcbjk0MDc6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfTElTVEVOX0lOVEVSVkFMXSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTU5NQoJCQkJCQkJb3V0cHV0OiA0MgoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd24sIGFzc3VtaW5nIEkmIzM5O20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6CgoqKkFuYWx5emluZyB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIEZ1bmN0aW9uKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhlIHJlc3Qgb2YgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBmdW5jdGlvbi4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBtZW50YWwgbW9kZWwgb2YgdGhlIGdlbmVyYWwgZmxvdywgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIG51YW5jZXMgaXMgY3J1Y2lhbC4gSSYjMzk7bSBmb2N1c2luZyBub3cgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHJvdXRpbmUuIEkmIzM5O20gbG9va2luZyBmb3Igd2hlcmUgaXQgaGFuZGxlcyB0aGUgYWN0dWFsIHN0YXRpb24gY3JlYXRpb24sIHdoYXQgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQsIGFuZCBob3cgdGhlIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gSSBuZWVkIHRvIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGxvY2tpbmcgaXNzdWVzLCBvZiBjb3Vyc2UsIHRoYXQgY291bGQgcG9wIHVwIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBiZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJzIHRoYXQgb3BlcmF0ZSBvbiB0aGlzIGRhdGEuCgpJJiMzOTttIGNoZWNraW5nIGlmIHRoZXJlIGlzIGFueSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gY2hlY2tzLiBGb3IgZXhhbXBsZSwgaXMgdGhlcmUgYSBtYXhpbXVtIG51bWJlciBvZiBzdGF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXI/IFRoYXQmIzM5O3MgYSBnb29kIG9uZSB0byBsb29rIGZvci4gQW5kIGlmIHNvLCBob3cgaXMgdGhlIGxpbWl0IGVuZm9yY2VkPyBBcmUgdGhlcmUgYW55IHNhbml0eSBjaGVja3Mgb24gdGhlIGlucHV0IHBhcmFtZXRlcnM/IEkgZXhwZWN0IHRvIHNlZSBjaGVja3Mgb24gdGhlIE1BQyBhZGRyZXNzLCB0aGUgaW50ZXJmYWNlIGluZGV4LCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0JiMzOTtzIHBhc3NlZCBpbiBmcm9tIHRoZSBuZXRsaW5rIG1lc3NhZ2UuCgpJJiMzOTttIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCBkYXRhIHN0cnVjdHVyZXMuIEFyZSBuZXcgc3RhdGlvbiBlbnRyaWVzIGFkZGVkIHRvIGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBlbXBsb3llZCB0byBwcm90ZWN0IHRoZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzPyBJJiMzOTttIGhvcGluZyB0byBzZWUgYSB3ZWxsLWRlZmluZWQgbG9ja2luZyBzY2hlbWUgdXNpbmcgcmVhZC13cml0ZSBsb2NrcyBvciBtdXRleGVzIHRvIHByb3ZpZGUgc2FmZSBvcGVyYXRpb25zLgoKSSYjMzk7bSBhbHNvIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgYSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxzIChlLmcuLCBtZW1vcnkgYWxsb2NhdGlvbik/IEhvdyBhcmUgZXJyb3JzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlciBzcGFjZT8gQXJlIHRoZXJlIHByb3BlciBlcnJvciBjb2RlcyB1c2VkPyBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBoYW5kbGluZyBpcyByb2J1c3QuCgpGaW5hbGx5LCBJJiMzOTttIGV4YW1pbmluZyBhbnkgaG9va3Mgb3IgY2FsbGJhY2tzIHRoYXQgYXJlIHRyaWdnZXJlZCBkdXJpbmcgc3RhdGlvbiBjcmVhdGlvbi4gQXJlIHRoZXJlIGFueSBub3RpZmljYXRpb25zIHNlbnQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIHdpcmVsZXNzIHN0YWNrLCBsaWtlIHRoZSBtYWM4MDIxMSBsYXllciwgb3IgbWF5YmUgdG8gdXNlciBzcGFjZSB2aWEgbmV0bGluaz8gSXQmIzM5O3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgc3lzdGVtIGltcGFjdCBvZiB0aGlzIGZ1bmN0aW9uLiBJIGFtIGFsd2F5cyB0cnlpbmcgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJhY3Qgd2l0aCB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTU1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7OTU1MDpcdFx0ICAgIHdkZXYtXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTl9EQVRBKSB7XG45NTUxOlx0XHRcdGlmIChwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNiBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEKVxuOTU1MjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU1MzpcdFx0XHQvKiBOQU4gTk1JIHN0YXRpb24gbXVzdCBiZSBhZGRlZCBpbiBhc3NvY2lhdGVkIG9yIGF1dGhvcml6ZWQgc3RhdGUgKi9cbjk1NTQ6XHRcdFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IChCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSB8XG45NTU1Olx0XHRcdFx0XHRcdCAgICAgIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSkpXG45NTU2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTU3Olx0XHR9XG45NTU4Olx0XG45NTU5Olx0XHQvKiBFbnN1cmUgdGhhdCBIVC9WSFQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0IGZvciA2IEdIeiBIRSBTVEEgKi9cbjk1NjA6XHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmhlXzZnaHpfY2FwYSBcdTAwMjZcdTAwMjZcbjk1NjE6XHRcdCAgICAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5odF9jYXBhIHx8IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMudmh0X2NhcGEpKVxuOTU2MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1NjM6XHRcbjk1NjQ6XHRcdC8qIFdoZW4geW91IHJ1biBpbnRvIHRoaXMsIGFkanVzdCB0aGUgY29kZSBiZWxvdyBmb3IgdGhlIG5ldyBmbGFnICovXG45NTY1Olx0XHRCVUlMRF9CVUdfT04oTkw4MDIxMV9TVEFfRkxBR19NQVggIT0gOCk7XG45NTY2Olx0XG45NTY3Olx0XHRzd2l0Y2ggKHdkZXYtXHUwMDNlaWZ0eXBlKSB7XG45NTY4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxuOTU2OTpcdFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XG45NTcwOlx0XHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbjk1NzE6XHRcdFx0bGlua19pZCA9IHdkZXYtXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xuOTU3MjpcdFx0XHRpZiAoIXdkZXYtXHUwMDNlbGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsKVxuOTU3MzpcdFx0XHRcdHJldHVybiAtRU5FVERPV047XG45NTc0Olx0XG45NTc1Olx0XHRcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cbjk1NzY6XHRcdFx0aWYgKCEocmRldi1cdTAwM2V3aXBoeS5mbGFncyBcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcbjk1Nzc6XHRcdFx0ICAgICEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxuOTU3ODpcdFx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk1Nzk6XHRcbjk1ODA6XHRcdFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cbjk1ODE6XHRcdFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcbjk1ODI6XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcbjk1ODM6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1ODQ6XHRcdFx0LyogYnV0IGRvbiYjMzk7dCBib3RoZXIgdGhlIGRyaXZlciB3aXRoIGl0ICovXG45NTg1Olx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpO1xuOTU4NjpcdFxuOTU4NzpcdFx0XHQvKiBhbGxvdyBhdXRoZW50aWNhdGVkL2Fzc29jaWF0ZWQgb25seSBpZiBkcml2ZXIgaGFuZGxlcyBpdCAqL1xuOTU4ODpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZlYXR1cmVzIFx1MDAyNlxuOTU4OTpcdFx0XHRcdFx0Tkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFKSBcdTAwMjZcdTAwMjZcbjk1OTA6XHRcdFx0ICAgIHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjYgYXV0aF9hc3NvYylcbjk1OTE6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1OTI6XHRcbjk1OTM6XHRcdFx0aWYgKCF3aXBoeV9leHRfZmVhdHVyZV9pc3NldChcdTAwMjZyZGV2LVx1MDAzZXdpcGh5LFxuOTU5NDpcdFx0XHRcdFx0XHQgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfU1BQX0FNU0RVX1NVUFBPUlQpIFx1MDAyNlx1MDAyNlxuOTU5NTpcdFx0XHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19TUFBfQU1TRFUpKVxuOTU5NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU5NzpcdFxuOTU5ODpcdFx0XHQvKiBPbGRlciB1c2Vyc3BhY2UsIG9yIHVzZXJzcGFjZSB3YW50aW5nIHRvIGJlIGNvbXBhdGlibGUgd2l0aFxuOTU5OTpcdFx0XHQgKiAhTkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFLCB3aWxsIG5vdCBzZXQgdGhlIGF1dGhcbjk2MDA6XHRcdFx0ICogYW5kIGFzc29jIGZsYWdzIGluIHRoZSBtYXNrLCBidXQgYXNzdW1lcyB0aGUgc3RhdGlvbiB3aWxsIGJlXG45NjAxOlx0XHRcdCAqIGFkZGVkIGFzIGFzc29jaWF0ZWQgYW55d2F5IHNpbmNlIHRoaXMgd2FzIHRoZSByZXF1aXJlZCBkcml2ZXJcbjk2MDI6XHRcdFx0ICogYmVoYXZpb3VyIGJlZm9yZSBOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUgd2FzXG45NjAzOlx0XHRcdCAqIGludHJvZHVjZWQuXG45NjA0Olx0XHRcdCAqIEluIG9yZGVyIHRvIG5vdCBib3RoZXIgZHJpdmVycyB3aXRoIHRoaXMgcXVpcmsgaW4gdGhlIEFQSVxuOTYwNTpcdFx0XHQgKiBzZXQgdGhlIGZsYWdzIGluIGJvdGggdGhlIG1hc2sgYW5kIHNldCBmb3IgbmV3IHN0YXRpb25zIGluXG45NjA2Olx0XHRcdCAqIHRoaXMgY2FzZS5cbjk2MDc6XHRcdFx0ICovXG45NjA4Olx0XHRcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjYgYXV0aF9hc3NvYykpIHtcbjk2MDk6XHRcdFx0XHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgfD0gYXV0aF9hc3NvYztcbjk2MTA6XHRcdFx0XHRwYXJhbXMuc3RhX2ZsYWdzX3NldCB8PSBhdXRoX2Fzc29jO1xuOTYxMTpcdFx0XHR9XG45NjEyOlx0XG45NjEzOlx0XHRcdC8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqL1xuOTYxNDpcdFx0XHRwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpO1xuOTYxNTpcdFx0XHRpZiAoSVNfRVJSKHBhcmFtcy52bGFuKSlcbjk2MTY6XHRcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XG45NjE3Olx0XHRcdGJyZWFrO1xuOTYxODpcdFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOlxuOTYxOTpcdFx0XHQvKlxuOTYyMDpcdFx0XHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXG45NjIxOlx0XHRcdCAqIGxpYmVydGFzIGRvZXNuJiMzOTt0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcbjk2MjI6XHRcdFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xuOTYyMzpcdFx0XHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXG45NjI0Olx0XHRcdCAqL1xuOTYyNTpcdFx0XHRpZiAocmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xuOTYyNjpcdFx0XHRcdGlmICghd2Rldi1cdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuKVxuOTYyNzpcdFx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk2Mjg6XHRcdFx0fSBlbHNlIGlmICghd2Rldi1cdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XG45NjI5Olx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk2MzA6XHRcdFx0fVxuOTYzMTpcdFxuOTYzMjpcdFx0XHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xuOTYzMzpcdFx0XHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XG45NjM0Olx0XG45NjM1Olx0XHRcdC8qIGFzc29jaWF0ZWQgaXMgZGlzYWxsb3dlZCAqL1xuOTYzNjpcdFx0XHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSlcbjk2Mzc6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2Mzg6XHRcdFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cbjk2Mzk6XHRcdFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcbjk2NDA6XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcbjk2NDE6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2NDI6XHRcdFx0YnJlYWs7XG45NjQzOlx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046XG45NjQ0Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6XG45NjQ1Olx0XHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG45NjQ2Olx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk2NDc6XHRcbjk2NDg6XHRcdFx0LyogdGhlc2UgYXJlIGRpc2FsbG93ZWQgKi9cbjk2NDk6XHRcdFx0aWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjZcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTIwMTgKCQkJCQkJCW91dHB1dDogNDEKCQkJCQkJCXRob3VnaHRzOiAzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGlnZ2luZyBpbnRvIHRoZSBubDgwMjExLmMgQ29kZSoqCgpPa2F5LCBzbyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCB3aXJlbGVzcyBuZXR3b3JraW5nLCBhbmQgc29tZXRoaW5nIGlzbiYjMzk7dCBxdWl0ZSByaWdodC4gVG8gZ2V0IGEgYmV0dGVyIGdyYXNwIG9uIHRoZSBpc3N1ZSwgSSBzaG91bGQgY3Jvc3MtcmVmZXJlbmNlIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUga2VybmVsIGNvZGUuIExldCYjMzk7cyBtYWtlIHN1cmUgd2UgZXhhbWluZSB0aGUgcG90ZW50aWFsIGltcGFjdCB3aXRoaW4gdGhlIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYCBmaWxlLiBJJiMzOTttIGdvaW5nIHRvIGZvY3VzIGluIG9uIGxpbmVzIDk2NTAtOTY5MC4gVGhpcyByYW5nZSB0eXBpY2FsbHkgY29udGFpbnMgY3JpdGljYWwgbG9naWMgcmVsYXRlZCB0byBjZXJ0YWluIHdpcmVsZXNzIG5ldHdvcmsgb3BlcmF0aW9ucywgYW5kIGl0JiMzOTtzIGxpa2VseSB0byBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGlzc3VlIGF0IGhhbmQuIEJ5IGV4YW1pbmluZyB0aGlzIHNwZWNpZmljIGNvZGUgYmxvY2ssIEkgY2FuIGRldmVsb3AgYSBjbGVhcmVyIHBpY3R1cmUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxzLCBkYXRhIHN0cnVjdHVyZXMsIGFuZCB0aGUgZmxvdyBvZiB0aGUgcHJvZ3JhbSBsb2dpYy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTY1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5NjUwOlx0XHRcdFx0XHQoQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgfFxuOTY1MTpcdFx0XHRcdFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSlcbjk2NTI6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk2NTM6XHRcdFx0LyogT25seSBURExTIHBlZXJzIGNhbiBiZSBhZGRlZCAqL1xuOTY1NDpcdFx0XHRpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpXG45NjU1Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NjU2Olx0XHRcdC8qIENhbiBvbmx5IGFkZCBpZiBURExTIC4uLiAqL1xuOTY1NzpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpKVxuOTY1ODpcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjk2NTk6XHRcdFx0LyogLi4uIHdpdGggZXh0ZXJuYWwgc2V0dXAgaXMgc3VwcG9ydGVkICovXG45NjYwOlx0XHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmxhZ3MgXHUwMDI2IFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpXG45NjYxOlx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTY2MjpcdFx0XHQvKlxuOTY2MzpcdFx0XHQgKiBPbGRlciB3cGFfc3VwcGxpY2FudCB2ZXJzaW9ucyBhbHdheXMgbWFyayB0aGUgVERMUyBwZWVyXG45NjY0Olx0XHRcdCAqIGFzIGF1dGhvcml6ZWQsIGJ1dCBpdCBzaG91bGRuJiMzOTt0IHlldCBiZS5cbjk2NjU6XHRcdFx0ICovXG45NjY2Olx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcdTAwMjY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKTtcbjk2Njc6XHRcdFx0YnJlYWs7XG45NjY4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTjpcbjk2Njk6XHRcdFx0YnJlYWs7XG45NjcwOlx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTl9EQVRBOlxuOTY3MTpcdFx0XHRwYXJhbXMubm1pX21hYyA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX05BTl9OTUlfTUFDXSk7XG45NjcyOlx0XHRcdGJyZWFrO1xuOTY3MzpcdFx0ZGVmYXVsdDpcbjk2NzQ6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuOTY3NTpcdFx0fVxuOTY3NjpcdFxuOTY3NzpcdFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cbjk2Nzg6XHRcbjk2Nzk6XHRcdHBhcmFtcy5lcHBfcGVlciA9XG45NjgwOlx0XHRcdG5sYV9nZXRfZmxhZyhpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pO1xuOTY4MTpcdFxuOTY4MjpcdFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXHUwMDI2cGFyYW1zKTtcbjk2ODM6XHRcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuOTY4NDpcdFx0cmV0dXJuIGVycjtcbjk2ODU6XHR9XG45Njg2Olx0XG45Njg3Olx0c3RhdGljIGludCBubDgwMjExX2RlbF9zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG45Njg4Olx0e1xuOTY4OTpcdFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI5ODkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiA0NjQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBDaGFuZ2VzIGFuZCBGdXp6aW5nIFBvdGVudGlhbCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgcGF0Y2ggaXMgZm9jdXNlZCBvbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdoaWNoIGltbWVkaWF0ZWx5IHBpcXVlcyBteSBpbnRlcmVzdCBhcyBhIGtub3duIGVudHJ5cG9pbnQgZm9yIHdpcmVsZXNzIG5ldGxpbmsgY29tbWFuZHMuIFNwZWNpZmljYWxseSwgdGhlIGNoYW5nZXMgaW52b2x2ZTogaW5wdXQgdmFsaWRhdGlvbiBvZiBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhZ2FpbnN0IGB3ZGV2LSZndDt2YWxpZF9saW5rc2AsIHN0YXRlIGNoZWNrcyByZWxhdGVkIHRvIEFQL1AyUF9HTyBhbmQgTUVTSF9QT0lOVCBiZWFjb24gaW50ZXJ2YWxzLCByZW1vdmFsIG9mIGBOTDgwMjExX0lGVFlQRV9BUF9WTEFOYCBmcm9tIHRoZSBBUCBzd2l0Y2ggY2FzZSAobWVhbmluZyBBUF9WTEFOIGludGVyZmFjZXMgd2lsbCBub3cgcmV0dXJuIC1FT1BOT1RTVVBQKSwgYW5kIHJlbW92YWwgb2Ygc29tZSByZWR1bmRhbnQgbGluayBjaGVja3MuCgpUaGUga2V5IHF1ZXN0aW9uIGlzIGFsd2F5czogY2FuIHdlIGdldCB0byB0aGlzIGNvZGU/IEFic29sdXRlbHkuIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBhbiBlbnRyeSBwb2ludCBjYWxsZWQgdmlhIHRoZSBgTkw4MDIxMV9DTURfTkVXX1NUQVRJT05gIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlLiBHZW5lcmljIE5ldGxpbmsgaXMgYSBzdGFuZGFyZCBhdHRhY2sgc3VyZmFjZSBpbiBMaW51eCBhbmQgaXMgZGVmaW5pdGVseSByZWFjaGFibGUgdGhyb3VnaCBzdGFuZGFyZCB0ZXN0aW5nLCBsaWtlIHN5emthbGxlci4gVGhpcyBpcyBleGVjdXRhYmxlIGtlcm5lbCBjb2RlIHdpdGhpbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AuCgpGcm9tIGEgJiMzNDtXb3J0aEZ1enppbmcmIzM0OyBwZXJzcGVjdGl2ZSwgdGhpcyBpcyBhIGNsZWFyIHllcy4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgYSBjb3JlIHN1YnN5c3RlbSwgdGhlIG5ldGxpbmsvY2ZnODAyMTEgd2lyZWxlc3MgbmV0bGluayBoYW5kbGVyLiBUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgZXJyb3IgcmV0dXJuIHBhdGhzIGZvciBuZXRsaW5rIGNvbW1hbmRzLiBSZWFjaGFiaWxpdHkgaXMgZ3VhcmFudGVlZCB2aWEgdXNlcnNwYWNlIHRocm91Z2ggQUZfTkVUTElOSywgTkVUTElOS19HRU5FUklDLiBObyBxdWVzdGlvbiwgdGhpcyBpcyBmdXp6YWJsZS4KClJlZ2FyZGluZyAmIzM0O0ZvY3VzU3ltYm9scywmIzM0OyBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgdGhlIG1vZGlmaWVkIHN5bWJvbC4gSSBzaG91bGQgYWxzbyBjaGVjayBpdHMgZGlyZWN0IGNhbGxlZXMuIGByZGV2X2FkZF9zdGF0aW9uYCBpcyBjYWxsZWQgZnJvbSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAuIEkmIzM5O2xsIHdhbnQgdG8gY2hlY2sgdGhlIGRlZmluaXRpb24gb2YgYHJkZXZfYWRkX3N0YXRpb25gIHRvIGhhdmUgYSBmdWxsIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3JkZXZfYWRkX3N0YXRpb24mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3dpcmVsZXNzL25sODAyMTEuYz05MzI4PXN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuLS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmMtOTY4MS1cbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTY4MjpcdGVyciA9IHJkZXZfYWRkX3N0YXRpb24ocmRldiwgd2RldiwgbWFjX2FkZHIsIFx1MDAyNnBhcmFtcyk7XG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTk2ODMtXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcbi0tXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaD0xODU9c3RhdGljIGlubGluZSBpbnQgcmRldl9zdG9wX2FwKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldixcbi0tXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTQtXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoxOTU6c3RhdGljIGlubGluZSBpbnQgcmRldl9hZGRfc3RhdGlvbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTYtXHRcdFx0XHQgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1OCAqbWFjLFxuLS1cbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTE5OS1cdGludCByZXQ7XG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoyMDA6XHR0cmFjZV9yZGV2X2FkZF9zdGF0aW9uKFx1MDAyNnJkZXYtXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTIwMS1cdHJldCA9IHJkZXYtXHUwMDNlb3BzLVx1MDAzZWFkZF9zdGF0aW9uKFx1MDAyNnJkZXYtXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcbi0tXG5uZXQvd2lyZWxlc3MvdHJhY2UuaD04Njg9REVDTEFSRV9FVkVOVF9DTEFTUyhzdGF0aW9uX2FkZF9jaGFuZ2UsXG4tLVxubmV0L3dpcmVsZXNzL3RyYWNlLmgtOTU5LVxubmV0L3dpcmVsZXNzL3RyYWNlLmg6OTYwOkRFRklORV9FVkVOVChzdGF0aW9uX2FkZF9jaGFuZ2UsIHJkZXZfYWRkX3N0YXRpb24sXG5uZXQvd2lyZWxlc3MvdHJhY2UuaC05NjEtXHRUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCB1OCAqbWFjLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDM5MwoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDMxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgU3RhdGlvbiBIYW5kbGluZyBpbiB0aGUgbmw4MDIxMSBTdWJzeXN0ZW0qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IGhvdyBzdGF0aW9ucyBhcmUgaGFuZGxlZCB3aXRoaW4gdGhlIGBubDgwMjExYCBmcmFtZXdvcmsuIE15IGluaXRpYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCBgcmRldl9hZGRfc3RhdGlvbmAgaXMgYW4gaW5saW5lIGZ1bmN0aW9uIGRlZmluZWQgaW4gYHJkZXYtb3BzLmhgLCB3aGVyZWFzIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBhIHN0YXRpYyBmdW5jdGlvbiBpbiBgbmw4MDIxMS5jYCwgYnV0IGl0JiMzOTtzICpleHRlcm5hbGx5KiByZWZlcmVuY2VkIChzcGVjaWZpY2FsbHksIGluIGBubDgwMjExX3NtYWxsX29wc2ApLiBNeSBuZXh0IHRob3VnaHQgaXMgdG8gaW52ZXN0aWdhdGUgZnVydGhlciB3aXRoaW4gYG5sODAyMTEuY2AgaXRzZWxmLgoKSSBuZWVkIHRvIGNvbmZpcm0gd2hldGhlciBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZm9yIHN0YXRpb24gY3JlYXRpb24sIG9yIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlLiBJJiMzOTtsbCB0YWtlIGEgbG9vayBhdCBmdW5jdGlvbnMgbGlrZSBgbmw4MDIxMV9zZXRfc3RhdGlvbmAgYW5kIGFueSBvdGhlcnMgdGhhdCBkZWFsIHdpdGggc3RhdGlvbnMgdG8gc2VlIGlmIHRoZXkmIzM5O3ZlIGJlZW4gcmVjZW50bHkgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgKm9ubHkqIGBubDgwMjExX25ld19zdGF0aW9uYCB3YXMgY2hhbmdlZC4KCk5vdywgbGV0JiMzOTtzIGNvbnNpZGVyIHRoZSBjb25maWd1cmF0aW9uIGFzcGVjdHMuIFRoZSBjb2RlIGluIHF1ZXN0aW9uLCBpbmNsdWRpbmcgYG5sODAyMTEuY2AsIGlzIG9ubHkgYnVpbHQgd2hlbiBgQ09ORklHX0NGRzgwMjExYCBpcyBlbmFibGVkLiBJdCYjMzk7cyBidWlsdCBiZWNhdXNlIGBjZmc4MDIxMS15ICYjNDM7PSAuLi4gbmw4MDIxMS5vYCBpbiB0aGUgcmVsZXZhbnQgYE1ha2VmaWxlYC4gU28sIHdoYXQgZW5hYmxlcyBgQ0ZHODAyMTFgIGl0c2VsZj8gSSBuZWVkIHRvIGNoZWNrIHRoZSBkZXBlbmRlbmNpZXMuCgpMZXQmIzM5O3MgbG9vayBhdCBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBgY29uZmlnIENGRzgwMjExYCBkZXBlbmRzIG9uIGBSRktJTEwgfHwgIVJGS0lMTGAuIFRoYXQmIzM5O3MgYSBiaXQgb2RkLCB0aG91Z2ggaXQgc2VlbXMgaGFybWxlc3MuIExldCYjMzk7cyBzZWUgaWYgdGhhdCBtb2R1bGUgZGVwZW5kcyBvbiBhbnl0aGluZywgYnkgbG9va2luZyBhdCBgbmV0L0tjb25maWdgLCB3aGljaCBgc291cmNlYHMgYG5ldC93aXJlbGVzcy9LY29uZmlnYC4gSSYjMzk7bGwgYWxzbyBnbGFuY2UgYXQgdGhlIGBuZXQvd2lyZWxlc3MvTWFrZWZpbGVgIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJiMzOTt0IG1pc3NlZCBhbnl0aGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3MvTWFrZWZpbGUmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDMwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4gICAyOlx0b2JqLSQoQ09ORklHX0NGRzgwMjExKSAmIzQzOz0gY2ZnODAyMTEub1xuICAgMzpcdG9iai15ICYjNDM7PSB0ZXN0cy9cbiAgIDQ6XHRcbiAgIDU6XHRvYmotJChDT05GSUdfV0VYVF9DT1JFKSAmIzQzOz0gd2V4dC1jb3JlLm9cbiAgIDY6XHRvYmotJChDT05GSUdfV0VYVF9QUk9DKSAmIzQzOz0gd2V4dC1wcm9jLm9cbiAgIDc6XHRvYmotJChDT05GSUdfV0VYVF9QUklWKSAmIzQzOz0gd2V4dC1wcml2Lm9cbiAgIDg6XHRcbiAgIDk6XHRjZmc4MDIxMS15ICYjNDM7PSBjb3JlLm8gc3lzZnMubyByYWRpb3RhcC5vIHV0aWwubyByZWcubyBzY2FuLm8gbmw4MDIxMS5vXG4gIDEwOlx0Y2ZnODAyMTEteSAmIzQzOz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cbiAgMTE6XHRjZmc4MDIxMS15ICYjNDM7PSBtaWNoYWVsLW1pYy5vIHBtc3Iub1xuICAxMjpcdGNmZzgwMjExLSQoQ09ORklHX09GKSAmIzQzOz0gb2Yub1xuICAxMzpcdGNmZzgwMjExLSQoQ09ORklHX0NGRzgwMjExX0RFQlVHRlMpICYjNDM7PSBkZWJ1Z2ZzLm9cbiAgMTQ6XHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9XRVhUKSAmIzQzOz0gd2V4dC1jb21wYXQubyB3ZXh0LXNtZS5vXG4gIDE1Olx0XG4gIDE2Olx0Q0ZMQUdTX3RyYWNlLm8gOj0gLUkkKHNyYylcbiAgMTc6XHRcbiAgMTg6XHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVMpICYjNDM7PSBzaGlwcGVkLWNlcnRzLm9cbiAgMTk6XHRpZm5lcSAoJChDT05GSUdfQ0ZHODAyMTFfRVhUUkFfUkVHREJfS0VZRElSKSwpXG4gIDIwOlx0Y2ZnODAyMTEteSAmIzQzOz0gZXh0cmEtY2VydHMub1xuICAyMTpcdGVuZGlmXG4gIDIyOlx0XG4gIDIzOlx0JChvYmopL3NoaXBwZWQtY2VydHMuYzogJChzb3J0ICQod2lsZGNhcmQgJChzcmMpL2NlcnRzLyouaGV4KSlcbiAgMjQ6XHRcdEAkKGtlY2hvKSBcJiMzNDsgIEdFTiAgICAgJEBcJiMzNDtcbiAgMjU6XHRcdCQoUSkoZWNobyAmIzM5OyNpbmNsdWRlIFwmIzM0O3JlZy5oXCYjMzQ7JiMzOTs7IFxcXG4gIDI2Olx0XHQgIGVjaG8gJiMzOTtjb25zdCB1OCBzaGlwcGVkX3JlZ2RiX2NlcnRzW10gPSB7JiMzOTs7IFxcXG4gIDI3Olx0XHQgIGVjaG8gfCBjYXQgLSAkXiA7IFxcXG4gIDI4Olx0XHQgIGVjaG8gJiMzOTt9OyYjMzk7OyBcXFxuICAyOTpcdFx0ICBlY2hvICYjMzk7dW5zaWduZWQgaW50IHNoaXBwZWRfcmVnZGJfY2VydHNfbGVuID0gc2l6ZW9mKHNoaXBwZWRfcmVnZGJfY2VydHMpOyYjMzk7OyBcXFxuICAzMDpcdFx0ICkgXHUwMDNlICRAXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1ODE5CgkJCQkJCQlvdXRwdXQ6IDEzOQoJCQkJCQkJdGhvdWdodHM6IDI1NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgQ29kZSBNb2RpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIEkgc2VlIHRoYXQgYG9iai0kKENPTkZJR19DRkc4MDIxMSkgJiM0Mzs9IGNmZzgwMjExLm9gIGFuZCBgY2ZnODAyMTEteSAmIzQzOz0gLi4uIG5sODAyMTEub2AsIHdoaWNoIGlzIHByZXR0eSBzdGFuZGFyZC4gQW5kLCBjcnVjaWFsbHksIGBDT05GSUdfTkw4MDIxMV9URVNUTU9ERWAgaXNuJiMzOTt0IGEgZ2F0aW5nIGZhY3RvciBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBUaGF0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBoZXJlIGlzIGBDRkc4MDIxMWAuCgpMZXQgbWUganVzdCBxdWlja2x5IGNvbmZpcm0gdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgc3VidGxlIGNvbmZpZyBzeW1ib2xzIG9yIGNvbmZpZ3VyYXRpb25zIGludm9sdmVkIGhlcmUuCgpBbHJpZ2h0LCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlIGluZGVlZCBqdXN0IGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIHRoZSBgRW5hYmxlQ29uZmlnc2AgYXJlIGNvcnJlY3RseSBwb2ludGluZyB0byBgQ0ZHODAyMTFgLCBhcyBleHBlY3RlZC4gR29vZC4KClRoZSByZWFzb25pbmcgcHJvdmlkZWQgY2xhcmlmaWVzIHRoYXQgdGhpcyBwYXRjaCBpcyB0b3VjaGluZyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyLCBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdpdGhpbiB0aGUgYGNmZzgwMjExYCB3aXJlbGVzcyBjb25maWcgbmV0bGluayBBUEkuIEl0IGxvb2tzIGxpa2UgdGhleSYjMzk7cmUgdGlnaHRlbmluZyB1cCB2YWxpZGF0aW9uIG9uIHRoZSBsaW5rIElEIGFuZCBhZGRpbmcgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgQVAgb3IgbWVzaCBpcyB1cCBhbmQgcnVubmluZyBiZWZvcmUgYWxsb3dpbmcgYSBzdGF0aW9uIHRvIGJlIGFkZGVkLiBUaGlzIGlzIGEgcG90ZW50aWFsIGF0dGFjayBzdXJmYWNlIGJlY2F1c2UgaXQmIzM5O3MgaGFuZGxpbmcgdW50cnVzdGVkIHVzZXItc3BhY2UgaW5wdXQgdmlhIEdlbmVyaWMgTmV0bGluayAoTkw4MDIxMSkuCgpFeGNlbGxlbnQuIE15IGFuYWx5c2lzIGNvbmZpcm1zIGV2ZXJ5dGhpbmcuIEkmIzM5O20gc2F0aXNmaWVkLiBMZXQmIzM5O3MgbW92ZSBvbiB0byB0aGUgbmV4dCBzdGVwIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDRkc4MDIxMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtDRkc4MDIxMSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25sODAyMTFfbmV3X3N0YXRpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIwPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgKS5cblxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCA4OTliNjM3NGM1NTA2Li5mY2ExOWUxZDBjOWFiIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTkzMjgsNyAmIzQzOzkzMjgsNyBAQCBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogewogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tJmd0O3VzZXJfcHRyWzBdOwotCWludCBlcnI7CiYjNDM7CWludCBlcnIsIGxpbmtfaWQ7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tJmd0O3VzZXJfcHRyWzFdOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LSZndDtuZXRkZXY7CiAJc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyBwYXJhbXM7CkBAIC05Mzc2LDYgJiM0Mzs5Mzc2LDE2IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCXBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA9CiAJCW5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkKGluZm8tJmd0O2F0dHJzKTsKIAomIzQzOwlpZiAod2Rldi0mZ3Q7dmFsaWRfbGlua3MpIHsKJiM0MzsJCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmx0OyAwKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJaWYgKCEod2Rldi0mZ3Q7dmFsaWRfbGlua3MgJmFtcDsgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKQomIzQzOwkJCXJldHVybiAtRU5PTElOSzsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmd0Oz0gMCkKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwogCWlmIChpbmZvLSZndDthdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7CiAJCW1hY19hZGRyID0gbmxhX2RhdGEoaW5mby0mZ3Q7YXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7CiAJCXBhcmFtcy5saW5rX3N0YV9wYXJhbXMubWxkX21hYyA9IG1hY19hZGRyOwpAQCAtOTU1Niw4ICYjNDM7OTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIAogCXN3aXRjaCAod2Rldi0mZ3Q7aWZ0eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086CiYjNDM7CQkvKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBBUCBhbmQgbGluayBoYXMgYmVlbiBzdGFydGVkICovCiYjNDM7CQlsaW5rX2lkID0gd2Rldi0mZ3Q7dmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwOwomIzQzOwkJaWYgKCF3ZGV2LSZndDtsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpCiYjNDM7CQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsKIAkJLyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqLwogCQlpZiAoIShyZGV2LSZndDt3aXBoeS5mbGFncyAmYW1wOyBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fAogCQkgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCAmYW1wOyBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSkKQEAgLTk2MDIsNiAmIzQzOzk2MTYsMTkgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiAJCQlyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKJiM0MzsJCS8qCiYjNDM7CQkgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuCiYjNDM7CQkgKiBsaWJlcnRhcyBkb2VzbiYjMzk7dCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlCiYjNDM7CQkgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvCiYjNDM7CQkgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuCiYjNDM7CQkgKi8KJiM0MzsJCWlmIChyZGV2LSZndDtvcHMtJmd0O2xpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHsKJiM0MzsJCQlpZiAoIXdkZXYtJmd0O3UubWVzaC5jaGFuZGVmLmNoYW4pCiYjNDM7CQkJCXJldHVybiAtRU5FVERPV047CiYjNDM7CQl9IGVsc2UgaWYgKCF3ZGV2LSZndDt1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7CiYjNDM7CQkJcmV0dXJuIC1FTkVURE9XTjsKJiM0MzsJCX0KJiM0MzsKIAkJLyogaWdub3JlIHVBUFNEIGRhdGEgKi8KIAkJcGFyYW1zLnN0YV9tb2RpZnlfbWFzayAmYW1wOz0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7CiAKQEAgLTk2NDksMjcgJiM0Mzs5Njc2LDEwIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQogCiAJLyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi8KIAotCWlmICh3ZGV2LSZndDt2YWxpZF9saW5rcykgewotCQlpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkICZsdDsgMCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmICghKHdkZXYtJmd0O3ZhbGlkX2xpbmtzICZhbXA7IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSkgewotCQkJZXJyID0gLUVOT0xJTks7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgJmd0Oz0gMCkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCiAJcGFyYW1zLmVwcF9wZWVyID0KIAkJbmxhX2dldF9mbGFnKGluZm8tJmd0O2F0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pOwogCiAJZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgJmFtcDtwYXJhbXMpOwotb3V0OgogCWRldl9wdXQocGFyYW1zLnZsYW4pOwogCXJldHVybiBlcnI7CiB9CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMjU0CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogNTI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEtNU0FOIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCB0aGlzIHBhdGNoIGFuZCBkZWNpZGUgaWYgaXQmIzM5O3Mgd29ydGggdGhyb3dpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24gYXQgaXQuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIG9uIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgZnVuY3Rpb24gd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC4KCkl0IGxvb2tzIGxpa2UgdGhlIHByaW1hcnkgZm9jdXMgaGVyZSBpcyB0aWdodGVuaW5nIHVwIHNvbWUgY2hlY2tzIHJlbGF0ZWQgdG8gdmFsaWQgbGlua3MgYW5kIG1lc2ggY2hhbm5lbCBjb25maWd1cmF0aW9ucy4gU3BlY2lmaWNhbGx5OgoKMS4gIFdlJiMzOTt2ZSBnb3QgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBjaGVja3MgYmVpbmcgcGVyZm9ybWVkIGVhcmxpZXIgaW4gdGhlIGZ1bmN0aW9uIG5vdy4gSXQmIzM5O3MgZXNzZW50aWFsbHkgbW92aW5nIHRoZSBsaW5rIElEIHZhbGlkaXR5IGNoZWNrIHVwLCByaWdodCBhZnRlciB0aGUgcGFyc2luZyBvZiBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYC4gU21hcnQsIGNvdWxkIGhhdmUgYmVlbiBhbiBlZGdlIGNhc2UgYmVmb3JlLgoKMi4gIFdpdGhpbiB0aGUgYE5MODAyMTFfSUZUWVBFX0FQYCBhbmQgYE5MODAyMTFfSUZUWVBFX1AyUF9HT2AgYmxvY2tzLCBpdCBhcHBlYXJzIHRoYXQgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZmFsbHRocm91Z2gsIGFuZCB3ZSYjMzk7dmUgYWRkZWQgYSBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgYmVhY29uIGludGVydmFsIGlzIHNldCBmb3IgdmFsaWQgbGlua3MuIEl0JiMzOTtzIHdvcnRoIGRpZ2dpbmcgaW50byB3aGVyZSBBUF9WTEFOIGlzIGN1cnJlbnRseSBoYW5kbGVkLCBqdXN0IHRvIGJlIHN1cmUgbm90aGluZyYjMzk7cyBiZWVuIGJyb2tlbiwgb3IgdGhhdCBpdCB3YXNuJiMzOTt0IHByZXZpb3VzbHkgaGFuZGxlZC4KCjMuICBGb3IgYE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlRgLCB0aGVyZSBhcmUgbmV3IGNoZWNrcyByZWxhdGVkIHRvIHRoZSBtZXNoIGNoYW5uZWwgYmVpbmcgc2V0IGJhc2VkIG9uIGByZGV2LSZndDtvcHMtJmd0O2xpYmVydGFzX3NldF9tZXNoX2NoYW5uZWxgIGV4aXN0ZW5jZS4gSWYgdGhhdCYjMzk7cyBhdmFpbGFibGUsIGFuZCBhIGNoYW5uZWwgaXNuJiMzOTt0IGRlZmluZWQsIHJldHVybiBgRU5FVERPV05gLiBPdGhlcndpc2UsIGlmIHRoYXQgZG9lc24mIzM5O3QgZXhpc3QsIHdlIG11c3QgY2hlY2sgdGhhdCBgd2Rldi0mZ3Q7dS5tZXNoLmJlYWNvbl9pbnRlcnZhbGAgaXMgdmFsaWQsIGFsc28gcmV0dXJuaW5nIGBFTkVURE9XTmAgaWYgdGhhdCYjMzk7cyBub3QgdGhlIGNhc2UuIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbGx5IGdvb2Qgc3BvdCBmb3Igc29tZSBmdXp6aW5nLgoKNC4gIFRoZXJlJiMzOTtzIGFsc28gYSBjbGVhbnVwIG9mIHNvbWUgZHVwbGljYXRlIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AgY2hlY2tzIGFuZCBgZ290byBvdXQ7YCBsYWJlbHMsIHdoaWNoIHN1Z2dlc3RzIHNvbWUgY29kZSB3YXMgbWFkZSBjbGVhbmVyLiBJdCBtZW50aW9ucyB0aGVyZSYjMzk7cyBhIGd1YXJkIGVhcmx5IHJldHVybiBkdWUgdG8gdGhlIGBwYXJhbXMudmxhbmAgbm90IGJlaW5nIGFjcXVpcmVkIGF0IHRoYXQgcG9pbnQsIGVuc3VyaW5nIHRoYXQgd2UgZG9uJiMzOTt0IG5lZWQgYSBgZGV2X3B1dGAgY2FsbC4gTGF0ZXIsIHRoZSBjYWxsIHRvIGByZGV2X2FkZF9zdGF0aW9uYCB0YWtlcyBjYXJlIG9mIHRoZSBjbGVhbnVwLiBUaGlzIG1ha2VzIGl0IGxvb2sgbGlrZSB0aGVyZSB3ZXJlIHNvbWUgZmxvdyBpbXByb3ZlbWVudHMsIHRoYXQgbWF5IGhhdmUgYmVlbiBkdWUgdG8gZXJyb3IgbWFuYWdlbWVudCBjaGFuZ2VzLgoKQmVmb3JlIEkgY29tbWl0IHRvIGZ1enppbmcsIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgYnJvYWRlciBjb250ZXh0IG9mIGBubDgwMjExX25ld19zdGF0aW9uYC4gSSYjMzk7bGwgYHJlYWQtZmlsZWAgdGhhdCBmdW5jdGlvbiBhZ2FpbiBvciB1c2UgYSBxdWljayBgZ3JlcHBlcmAgc2VhcmNoIHRvIHJlZnJlc2guIFRoZSBuZXcgY2hlY2tzIGNvdWxkIGludHJvZHVjZSBzdWJ0bGUgaXNzdWVzIGlmIHRoZXkmIzM5O3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgc28gSSYjMzk7bGwgd2FudCB0byBtYWtlIHN1cmUgSSYjMzk7dmUgZ290IGEgZ29vZCBtZW50YWwgbWFwIG9mIHRoZSBzdXJyb3VuZGluZyBjb2RlLiBNeSBndXQgc2F5cyB0aGlzIGlzIHdvcnRoIGEgY2xvc2VyIGxvb2sgd2l0aCBLTVNBTi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTAgMDk6MjE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTMyOCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7OTMyODpcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuOTMyOTpcdHtcbjkzMzA6XHRcdHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMF07XG45MzMxOlx0XHRpbnQgZXJyLCBsaW5rX2lkO1xuOTMzMjpcdFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMV07XG45MzMzOlx0XHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cdTAwM2VuZXRkZXY7XG45MzM0Olx0XHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcbjkzMzU6XHRcdHU4ICptYWNfYWRkciA9IE5VTEw7XG45MzM2Olx0XHR1MzIgYXV0aF9hc3NvYyA9IEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpIHxcbjkzMzc6XHRcdFx0XHQgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCk7XG45MzM4Olx0XG45MzM5Olx0XHRtZW1zZXQoXHUwMDI2cGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7XG45MzQwOlx0XG45MzQxOlx0XHRpZiAoIWRldiBcdTAwMjZcdTAwMjYgd2Rldi1cdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxuOTM0MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjkzNDM6XHRcbjkzNDQ6XHRcdGlmICghcmRldi1cdTAwM2VvcHMtXHUwMDNlYWRkX3N0YXRpb24pXG45MzQ1Olx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjkzNDY6XHRcbjkzNDc6XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcbjkzNDg6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzQ5Olx0XG45MzUwOlx0XHRpZiAod2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8XG45MzUxOlx0XHQgICAgd2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjkzNTI6XHRcdFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKVxuOTM1MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM1NDpcdFx0XHRpZiAod2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjkzNTU6XHRcdFx0XHRpZiAoIWluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX05BTl9OTUlfTUFDXSlcbjkzNTY6XHRcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM1NzpcdFxuOTM1ODpcdFx0XHRcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cbjkzNTk6XHRcdFx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcbjkzNjA6XHRcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XG45MzYxOlx0XHRcdFx0ICAgIGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxuOTM2MjpcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzYzOlx0XHRcdH1cbjkzNjQ6XHRcdH0gZWxzZSB7XG45MzY1Olx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXG45MzY2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzY3Olx0XG45MzY4Olx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXG45MzY5Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45MzcwOlx0XG45MzcxOlx0XHRcdGlmICghaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXHUwMDI2XHUwMDI2XG45MzcyOlx0XHRcdCAgICAhaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTM3MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM3NDpcdFx0fVxuOTM3NTpcdFxuOTM3NjpcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkID1cbjkzNzc6XHRcdFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cdTAwM2VhdHRycyk7XG45Mzc4Olx0XG45Mzc5Olx0XHRpZiAod2Rldi1cdTAwM2V2YWxpZF9saW5rcykge1xuOTM4MDpcdFx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzYyAwKVxuOTM4MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTM4MjpcdFx0XHRpZiAoISh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzIFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpXG45MzgzOlx0XHRcdFx0cmV0dXJuIC1FTk9MSU5LO1xuOTM4NDpcdFx0fSBlbHNlIHtcbjkzODU6XHRcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2U9IDApXG45Mzg2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzg3Olx0XHR9XG45Mzg4Olx0XG45Mzg5Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKSB7XG45MzkwOlx0XHRcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUxEX0FERFJdKTtcbjkzOTE6XHRcdFx0cGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5tbGRfbWFjID0gbWFjX2FkZHI7XG45MzkyOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxuOTM5MzpcdFx0XHRcdG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xuOTM5NDpcdFx0XHRpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX21hYykpXG45Mzk1Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45Mzk2Olx0XHR9IGVsc2Uge1xuOTM5NzpcdFx0XHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xuOTM5ODpcdFx0fVxuOTM5OTpcdFxuOTQwMDpcdFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JURURfUkFURVNdKSB7XG45NDAxOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cbjk0MDI6XHRcdFx0XHRubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XG45NDAzOlx0XHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzX2xlbiA9XG45NDA0Olx0XHRcdFx0bmxhX2xlbihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XG45NDA1Olx0XHR9XG45NDA2Olx0XG45NDA3Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXG45NDA4Olx0XHRcdHBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPVxuOTQwOTpcdFx0XHRcdG5sYV9nZXRfdTE2KGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKTtcbjk0MTA6XHRcbjk0MTE6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WTEFOX0lEXSlcbjk0MTI6XHRcdFx0cGFyYW1zLnZsYW5faWQgPSBubGFfZ2V0X3UxNihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9WTEFOX0lEXSk7XG45NDEzOlx0XG45NDE0Olx0XHRpZiAoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRfUDJQX1BTXSkge1xuOTQxNTpcdFx0XHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxuOTQxNjpcdFx0XHRcdG5sYV9nZXRfdTgoaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRfUDJQX1BTXSk7XG45NDE3Olx0XHR9IGVsc2Uge1xuOTQxODpcdFx0XHQvKlxuOTQxOTpcdFx0XHQgKiBpZiBub3Qgc3BlY2lmaWVkLCBhc3N1bWUgaXQmIzM5O3Mgc3VwcG9ydGVkIGZvciBQMlAgR08gaW50ZXJmYWNlLFxuOTQyMDpcdFx0XHQgKiBhbmQgaXMgTk9UIHN1cHBvcnRlZCBmb3IgQVAgaW50ZXJmYWNlXG45NDIxOlx0XHRcdCAqL1xuOTQyMjpcdFx0XHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxuOTQyMzpcdFx0XHRcdHdkZXYtXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTztcbjk0MjQ6XHRcdH1cbjk0MjU6XHRcbjk0MjY6XHRcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXG45NDI3Olx0XHRcdHBhcmFtcy5haWQgPSBubGFfZ2V0X3UxNihpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MzU4CgkJCQkJCQlvdXRwdXQ6IDQyCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93biwgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDoKCioqQW5hbHl6aW5nIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgRnVuY3Rpb24qKgoKQWxyaWdodCwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIGZ1bmN0aW9uLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgZ2VuZXJhbCBmbG93LCBidXQgdW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlcyBpcyBjcnVjaWFsLiBJJiMzOTttIGZvY3VzaW5nIG5vdyBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgcm91dGluZS4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSBpdCBoYW5kbGVzIHRoZSBhY3R1YWwgc3RhdGlvbiBjcmVhdGlvbiwgd2hhdCByZXNvdXJjZXMgYXJlIGFsbG9jYXRlZCwgYW5kIGhvdyB0aGUgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLiBJIG5lZWQgdG8gaWRlbnRpZnkgYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgbG9ja2luZyBpc3N1ZXMsIG9mIGNvdXJzZSwgdGhhdCBjb3VsZCBwb3AgdXAgd2hlbiBtdWx0aXBsZSB0aHJlYWRzIG1pZ2h0IGJlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvciBvdGhlcnMgdGhhdCBvcGVyYXRlIG9uIHRoaXMgZGF0YS4KCkkmIzM5O20gY2hlY2tpbmcgaWYgdGhlcmUgaXMgYW55IGluaXRpYWwgY29uZmlndXJhdGlvbiBjaGVja3MuIEZvciBleGFtcGxlLCBpcyB0aGVyZSBhIG1heGltdW0gbnVtYmVyIG9mIHN0YXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcj8gVGhhdCYjMzk7cyBhIGdvb2Qgb25lIHRvIGxvb2sgZm9yLiBBbmQgaWYgc28sIGhvdyBpcyB0aGUgbGltaXQgZW5mb3JjZWQ/IEFyZSB0aGVyZSBhbnkgc2FuaXR5IGNoZWNrcyBvbiB0aGUgaW5wdXQgcGFyYW1ldGVycz8gSSBleHBlY3QgdG8gc2VlIGNoZWNrcyBvbiB0aGUgTUFDIGFkZHJlc3MsIHRoZSBpbnRlcmZhY2UgaW5kZXgsIGFuZCBhbnl0aGluZyBlbHNlIHRoYXQmIzM5O3MgcGFzc2VkIGluIGZyb20gdGhlIG5ldGxpbmsgbWVzc2FnZS4KCkkmIzM5O20ga2VlcGluZyBhbiBleWUgb3V0IGZvciBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUgZXhpc3Rpbmcgc3RhdGlvbiBtYW5hZ2VtZW50IGRhdGEgc3RydWN0dXJlcy4gQXJlIG5ldyBzdGF0aW9uIGVudHJpZXMgYWRkZWQgdG8gYSBsaW5rZWQgbGlzdCwgYSBoYXNoIHRhYmxlLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gV2hhdCBsb2NraW5nIG1lY2hhbmlzbXMgYXJlIGVtcGxveWVkIHRvIHByb3RlY3QgdGhlIGRhdGEgc3RydWN0dXJlIGZyb20gY29uY3VycmVudCBhY2Nlc3M/IEkmIzM5O20gaG9waW5nIHRvIHNlZSBhIHdlbGwtZGVmaW5lZCBsb2NraW5nIHNjaGVtZSB1c2luZyByZWFkLXdyaXRlIGxvY2tzIG9yIG11dGV4ZXMgdG8gcHJvdmlkZSBzYWZlIG9wZXJhdGlvbnMuCgpJJiMzOTttIGFsc28gcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBhbnkgZXJyb3IgaGFuZGxpbmcuIFdoYXQgaGFwcGVucyBpZiBhIHJlc291cmNlIGFsbG9jYXRpb24gZmFpbHMgKGUuZy4sIG1lbW9yeSBhbGxvY2F0aW9uKT8gSG93IGFyZSBlcnJvcnMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSB1c2VyIHNwYWNlPyBBcmUgdGhlcmUgcHJvcGVyIGVycm9yIGNvZGVzIHVzZWQ/IEkgd2FudCB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGhhbmRsaW5nIGlzIHJvYnVzdC4KCkZpbmFsbHksIEkmIzM5O20gZXhhbWluaW5nIGFueSBob29rcyBvciBjYWxsYmFja3MgdGhhdCBhcmUgdHJpZ2dlcmVkIGR1cmluZyBzdGF0aW9uIGNyZWF0aW9uLiBBcmUgdGhlcmUgYW55IG5vdGlmaWNhdGlvbnMgc2VudCB0byBvdGhlciBwYXJ0cyBvZiB0aGUgd2lyZWxlc3Mgc3RhY2ssIGxpa2UgdGhlIG1hYzgwMjExIGxheWVyLCBvciBtYXliZSB0byB1c2VyIHNwYWNlIHZpYSBuZXRsaW5rPyBJdCYjMzk7cyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBzeXN0ZW0gaW1wYWN0IG9mIHRoaXMgZnVuY3Rpb24uIEkgYW0gYWx3YXlzIHRyeWluZyB0byBzZWUgaG93IHRoaXMgZnVuY3Rpb24gd2lsbCBpbnRlcmFjdCB3aXRoIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC93aXJlbGVzcy9ubDgwMjExLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5NTUwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDEwMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDs5NTUwOlx0XHQgICAgd2Rldi1cdTAwM2VpZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOX0RBVEEpIHtcbjk1NTE6XHRcdFx0aWYgKHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0QpXG45NTUyOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTUzOlx0XHRcdC8qIE5BTiBOTUkgc3RhdGlvbiBtdXN0IGJlIGFkZGVkIGluIGFzc29jaWF0ZWQgb3IgYXV0aG9yaXplZCBzdGF0ZSAqL1xuOTU1NDpcdFx0XHRpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgKEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcbjk1NTU6XHRcdFx0XHRcdFx0ICAgICAgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpKSlcbjk1NTY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjk1NTc6XHRcdH1cbjk1NTg6XHRcbjk1NTk6XHRcdC8qIEVuc3VyZSB0aGF0IEhUL1ZIVCBjYXBhYmlsaXRpZXMgYXJlIG5vdCBzZXQgZm9yIDYgR0h6IEhFIFNUQSAqL1xuOTU2MDpcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuaGVfNmdoel9jYXBhIFx1MDAyNlx1MDAyNlxuOTU2MTpcdFx0ICAgIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmh0X2NhcGEgfHwgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy52aHRfY2FwYSkpXG45NTYyOlx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU2MzpcdFxuOTU2NDpcdFx0LyogV2hlbiB5b3UgcnVuIGludG8gdGhpcywgYWRqdXN0IHRoZSBjb2RlIGJlbG93IGZvciB0aGUgbmV3IGZsYWcgKi9cbjk1NjU6XHRcdEJVSUxEX0JVR19PTihOTDgwMjExX1NUQV9GTEFHX01BWCAhPSA4KTtcbjk1NjY6XHRcbjk1Njc6XHRcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbjk1Njg6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG45NTY5Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbjk1NzA6XHRcdFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xuOTU3MTpcdFx0XHRsaW5rX2lkID0gd2Rldi1cdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XG45NTcyOlx0XHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG45NTczOlx0XHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbjk1NzQ6XHRcbjk1NzU6XHRcdFx0LyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqL1xuOTU3NjpcdFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxuOTU3NzpcdFx0XHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXG45NTc4Olx0XHRcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuOTU3OTpcdFxuOTU4MDpcdFx0XHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xuOTU4MTpcdFx0XHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxuOTU4MjpcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTU4MzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU4NDpcdFx0XHQvKiBidXQgZG9uJiMzOTt0IGJvdGhlciB0aGUgZHJpdmVyIHdpdGggaXQgKi9cbjk1ODU6XHRcdFx0cGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7XG45NTg2Olx0XG45NTg3Olx0XHRcdC8qIGFsbG93IGF1dGhlbnRpY2F0ZWQvYXNzb2NpYXRlZCBvbmx5IGlmIGRyaXZlciBoYW5kbGVzIGl0ICovXG45NTg4Olx0XHRcdGlmICghKHJkZXYtXHUwMDNld2lwaHkuZmVhdHVyZXMgXHUwMDI2XG45NTg5Olx0XHRcdFx0XHROTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUpIFx1MDAyNlx1MDAyNlxuOTU5MDpcdFx0XHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBhdXRoX2Fzc29jKVxuOTU5MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTU5MjpcdFxuOTU5MzpcdFx0XHRpZiAoIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KFx1MDAyNnJkZXYtXHUwMDNld2lwaHksXG45NTk0Olx0XHRcdFx0XHRcdCAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TUFBfQU1TRFVfU1VQUE9SVCkgXHUwMDI2XHUwMDI2XG45NTk1Olx0XHRcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1NQUF9BTVNEVSkpXG45NTk2Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG45NTk3Olx0XG45NTk4Olx0XHRcdC8qIE9sZGVyIHVzZXJzcGFjZSwgb3IgdXNlcnNwYWNlIHdhbnRpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG45NTk5Olx0XHRcdCAqICFOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUsIHdpbGwgbm90IHNldCB0aGUgYXV0aFxuOTYwMDpcdFx0XHQgKiBhbmQgYXNzb2MgZmxhZ3MgaW4gdGhlIG1hc2ssIGJ1dCBhc3N1bWVzIHRoZSBzdGF0aW9uIHdpbGwgYmVcbjk2MDE6XHRcdFx0ICogYWRkZWQgYXMgYXNzb2NpYXRlZCBhbnl3YXkgc2luY2UgdGhpcyB3YXMgdGhlIHJlcXVpcmVkIGRyaXZlclxuOTYwMjpcdFx0XHQgKiBiZWhhdmlvdXIgYmVmb3JlIE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSB3YXNcbjk2MDM6XHRcdFx0ICogaW50cm9kdWNlZC5cbjk2MDQ6XHRcdFx0ICogSW4gb3JkZXIgdG8gbm90IGJvdGhlciBkcml2ZXJzIHdpdGggdGhpcyBxdWlyayBpbiB0aGUgQVBJXG45NjA1Olx0XHRcdCAqIHNldCB0aGUgZmxhZ3MgaW4gYm90aCB0aGUgbWFzayBhbmQgc2V0IGZvciBuZXcgc3RhdGlvbnMgaW5cbjk2MDY6XHRcdFx0ICogdGhpcyBjYXNlLlxuOTYwNzpcdFx0XHQgKi9cbjk2MDg6XHRcdFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNiBhdXRoX2Fzc29jKSkge1xuOTYwOTpcdFx0XHRcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayB8PSBhdXRoX2Fzc29jO1xuOTYxMDpcdFx0XHRcdHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IHw9IGF1dGhfYXNzb2M7XG45NjExOlx0XHRcdH1cbjk2MTI6XHRcbjk2MTM6XHRcdFx0LyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovXG45NjE0Olx0XHRcdHBhcmFtcy52bGFuID0gZ2V0X3ZsYW4oaW5mbywgcmRldik7XG45NjE1Olx0XHRcdGlmIChJU19FUlIocGFyYW1zLnZsYW4pKVxuOTYxNjpcdFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbjk2MTc6XHRcdFx0YnJlYWs7XG45NjE4Olx0XHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG45NjE5Olx0XHRcdC8qXG45NjIwOlx0XHRcdCAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC5cbjk2MjE6XHRcdFx0ICogbGliZXJ0YXMgZG9lc24mIzM5O3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuOTYyMjpcdFx0XHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXG45NjIzOlx0XHRcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cbjk2MjQ6XHRcdFx0ICovXG45NjI1Olx0XHRcdGlmIChyZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XG45NjI2Olx0XHRcdFx0aWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5jaGFuZGVmLmNoYW4pXG45NjI3Olx0XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuOTYyODpcdFx0XHR9IGVsc2UgaWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcbjk2Mjk6XHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuOTYzMDpcdFx0XHR9XG45NjMxOlx0XG45NjMyOlx0XHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG45NjMzOlx0XHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbjk2MzQ6XHRcbjk2MzU6XHRcdFx0LyogYXNzb2NpYXRlZCBpcyBkaXNhbGxvd2VkICovXG45NjM2Olx0XHRcdGlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpKVxuOTYzNzpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTYzODpcdFx0XHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xuOTYzOTpcdFx0XHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxuOTY0MDpcdFx0XHQgICAgaW5mby1cdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxuOTY0MTpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuOTY0MjpcdFx0XHRicmVhaztcbjk2NDM6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjpcbjk2NDQ6XHRcdGNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDpcbjk2NDU6XHRcdFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cbjk2NDY6XHRcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuOTY0NzpcdFxuOTY0ODpcdFx0XHQvKiB0aGVzZSBhcmUgZGlzYWxsb3dlZCAqL1xuOTY0OTpcdFx0XHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFx1MDAyNlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NzgxCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNzcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlBhdGNoIEFuYWx5c2lzOiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIGRvd24gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgaXRzIGNvcmUgcHVycG9zZS4gSXQgc2VlbXMgd2UmIzM5O3JlIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgaXNzdWUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLiBCZWZvcmUgdGhpcyBjaGFuZ2UsIHRoZXJlIHdhcyBhIHNjZW5hcmlvIHdoZXJlIGFkZGluZyBhIHN0YXRpb24gdG8gYW4gQVAgb3IgbWVzaCBpbnRlcmZhY2UgKmJlZm9yZSogdGhlIEFQIG9yIG1lc2ggaW50ZXJmYWNlIHdhcyBmdWxseSBzdGFydGVkIGNvdWxkIGxlYWQgdG8gZHJpdmVyIGNyYXNoZXMgb3IgdW5leHBlY3RlZCBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB3YXMgc3VzY2VwdGlibGUgdG8gZGVyZWZlcmVuY2luZyB1bmluaXRpYWxpemVkIHBvaW50ZXJzIG9yIHVzaW5nIHVuaW5pdGlhbGl6ZWQgc3RhdGUgd2l0aGluIHRoZSBkcml2ZXJzLiBUaGUgYGJlYWNvbl9pbnRlcnZhbGAgd2FzIGxpa2VseSBhIGtleSBjb21wb25lbnQgaGVyZSwgYXMgYSB2YWx1ZSBvZiB6ZXJvLCBvciBhbiBhYnNlbmNlIG9mIG9uZSBvbiBhbiBBUF9WTEFOIGludGVyZmFjZSwgd2FzIGNhdXNpbmcgdHJvdWJsZS4gVGhlIGB2YWxpZF9saW5rc2AgY2hlY2sgd2FzIGFsc28gYmVpbmcgZG9uZSBsYXRlciB0aGFuIGlkZWFsLgoKTm93LCBJIG5lZWQgdG8gYW5hbHl6ZSB0aGlzIGZyb20gYSBtZW1vcnkgc2FmZXR5IHBlcnNwZWN0aXZlLiBBcmUgdGhlcmUgYW55IG5ldyB2YXJpYWJsZXMgaW50cm9kdWNlZCB0aGF0IG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQ/IFllcywgYGludCBsaW5rX2lkYCBpcyBhIGxvY2FsIHZhcmlhYmxlIGluIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2hpY2ggY2FuIGJlIGluaXRpYWxpemVkIHZpYSBgd2Rldi0mZ3Q7dmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO2AgIEl0IHNlZW1zIGxpa2UgYGxpbmtfaWRgIGlzIGFsd2F5cyBhc3NpZ25lZCBiZWZvcmUgYmVpbmcgdXNlZCwgd2hpY2ggaXMgZ29vZC4gIE9mIGNvdXJzZSwgYHBhcmFtc2AgaXMgbWVtc2V0LgoKTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBhbnkgbmV3IGRhdGEgaXNuJiMzOTt0IGJlaW5nIGV4cG9zZWQgdG8gdXNlcnNwYWNlIGluIGFuIHVuaW5pdGlhbGl6ZWQgc3RhdGUuIE5vLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJiMzOTt0IGRpcmVjdGx5IGNvcHkgYW55IGRhdGEgYmFjayB0byB0aGUgdXNlciBzcGFjZS4gSXQgaGFuZGxlcyBhIG5ldGxpbmsgY29tbWFuZCBhbmQgZWl0aGVyIHJldHVybnMgYW4gZXJyb3Igb3IgY2FsbHMgYHJkZXZfYWRkX3N0YXRpb25gLgoKVGhlbiwgSSBuZWVkIHRvIGxvb2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGZsb3cgb3IgYnJhbmNoaW5nIGlzIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBgd2Rldi0mZ3Q7dmFsaWRfbGlua3NgLCBgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCAoaW5pdGlhbGl6ZWQgdmlhIGBtZW1zZXRgLCB0aGVuIGBubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZGApLCBgd2Rldi0mZ3Q7bGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsYCwgYHJkZXYtJmd0O29wcy0mZ3Q7bGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbGAsIGB3ZGV2LSZndDt1Lm1lc2guY2hhbmRlZi5jaGFuYCwgYHdkZXYtJmd0O3UubWVzaC5iZWFjb25faW50ZXJ2YWxgIGFwcGVhciB0byBiZSBleGlzdGluZyBrZXJuZWwgc3RhdGUgb3IgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gc29tZSBmYXNoaW9uLiBTbywgdGhhdCBzZWVtcyBzYWZlLgoKRmluYWxseSwgSSBuZWVkIHRvIGNvbnNpZGVyIHBvdGVudGlhbCBvdXQtb2YtYm91bmRzIHJlYWRzIG9yIGJ1ZmZlciBvdmVyZmxvd3MgcmVsYXRlZCB0byB1bmluaXRpYWxpemVkIG1lbW9yeS4gSWYgYHdkZXYtJmd0O3ZhbGlkX2xpbmtzYCBpcyBub24temVybywgdGhlIGBsaW5rX2lkYCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgYm91bmRzIG9mIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AuIElmIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AgaXMgemVybywgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIHplcm8sIHNvIHRoYXQgYWRkcmVzc2VzIHRoYXQgcGF0aC4gQW5kIGluIGVpdGhlciBjYXNlLCBgdmFsaWRfbGlua3NgIGlzIGJvdW5kZWQgYnkgYElFRUU4MDIxMV9NTERfTUFYX05VTV9MSU5LU2AsIHR5cGljYWxseSAxNSwgc28gYW55IGFycmF5IGFjY2Vzc2VzIGFyZSB3aXRoaW4gbGltaXRzLiAgSSBzaG91bGQgYWxzbyBkb3VibGUtY2hlY2sgYHJkZXZfYWRkX3N0YXRpb25gIGFuZCBgd2Rldi0mZ3Q7bGlua3NgIGp1c3QgdG8gYmUgZXh0cmEgc3VyZSwgYnV0LCBiYXNlZCBvbiB0aGlzIGluaXRpYWwgcGFzcywgaXQgYXBwZWFycyB0byBiZSBhIHNvbGlkIHBhdGNoIGZyb20gYSBtZW1vcnkgcGVyc3BlY3RpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N0cnVjdCB3aXJlbGVzc19kZXYgXFx7JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9jZmc4MDIxMS5oPTcxNDI9ZW51bSBpZWVlODAyMTFfYXBfcmVnX3Bvd2VyIHtcbi0tXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMjktICovXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oOjcyMzA6c3RydWN0IHdpcmVsZXNzX2RldiB7XG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMzEtXHRzdHJ1Y3Qgd2lwaHkgKndpcGh5O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDM3OAoJCQkJCQkJb3V0cHV0OiA0MQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgYHdpcmVsZXNzX2RldmAgU3RydWN0dXJlKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyB3aG9sZSB0aGluZyBpcyBzdHJ1Y3R1cmVkLCBzbyBsZXQmIzM5O3Mgc3RhcnQgYnkgZGlnZ2luZyBpbnRvIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YC4gR290dGEgc2VlIHdoYXQgZmllbGRzIGFyZSBhdmFpbGFibGUsIGhvdyB0aGV5JiMzOTtyZSB1c2VkLCBhbmQgaG93IHRoZXkgcmVsYXRlIHRvIHRoZSBvdmVyYWxsIHdpcmVsZXNzIHN1YnN5c3RlbS4gVGhpcyBpcyB0aGUgYmVkcm9jayBvZiB0aGUgZW50aXJlIHdpcmVsZXNzIGRldmljZSByZXByZXNlbnRhdGlvbiB3aXRoaW4gdGhlIGtlcm5lbCwgc28ga25vd2luZyBpdCBpbnRpbWF0ZWx5IGlzIGFic29sdXRlbHkgY3J1Y2lhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCB2ZXJpZnkgc29tZSBhc3N1bXB0aW9ucyBJIG1pZ2h0IGhhdmUgbWFkZSwgYW5kIG1heWJlIHBpY2sgdXAgc29tZXRoaW5nIG5ldy4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlJiMzOTt2ZSBnb3QhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcyMzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzIzMDpcdHN0cnVjdCB3aXJlbGVzc19kZXYge1xuNzIzMTpcdFx0c3RydWN0IHdpcGh5ICp3aXBoeTtcbjcyMzI6XHRcdGVudW0gbmw4MDIxMV9pZnR5cGUgaWZ0eXBlO1xuNzIzMzpcdFxuNzIzNDpcdFx0LyogdGhlIHJlbWFpbmRlciBvZiB0aGlzIHN0cnVjdCBzaG91bGQgYmUgcHJpdmF0ZSB0byBjZmc4MDIxMSAqL1xuNzIzNTpcdFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuNzIzNjpcdFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjtcbjcyMzc6XHRcbjcyMzg6XHRcdHUzMiBpZGVudGlmaWVyO1xuNzIzOTpcdFxuNzI0MDpcdFx0c3RydWN0IGxpc3RfaGVhZCBtZ210X3JlZ2lzdHJhdGlvbnM7XG43MjQxOlx0XHR1OCBtZ210X3JlZ2lzdHJhdGlvbnNfbmVlZF91cGRhdGU6MTtcbjcyNDI6XHRcbjcyNDM6XHRcdGJvb2wgdXNlXzRhZGRyLCBpc19ydW5uaW5nLCByZWdpc3RlcmVkLCByZWdpc3RlcmluZztcbjcyNDQ6XHRcbjcyNDU6XHRcdHU4IGFkZHJlc3NbRVRIX0FMRU5dIF9fYWxpZ25lZChzaXplb2YodTE2KSk7XG43MjQ2Olx0XG43MjQ3Olx0XHQvKiBjdXJyZW50bHkgdXNlZCBmb3IgSUJTUyBhbmQgU01FIC0gbWlnaHQgYmUgcmVhcnJhbmdlZCBsYXRlciAqL1xuNzI0ODpcdFx0c3RydWN0IGNmZzgwMjExX2Nvbm4gKmNvbm47XG43MjQ5Olx0XHRzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmNvbm5lY3Rfa2V5cztcbjcyNTA6XHRcdGVudW0gaWVlZTgwMjExX2Jzc190eXBlIGNvbm5fYnNzX3R5cGU7XG43MjUxOlx0XHR1MzIgY29ubl9vd25lcl9ubHBvcnRpZDtcbjcyNTI6XHRcbjcyNTM6XHRcdHN0cnVjdCB3aXBoeV93b3JrIGRpc2Nvbm5lY3Rfd2s7XG43MjU0Olx0XHR1OCBkaXNjb25uZWN0X2Jzc2lkW0VUSF9BTEVOXTtcbjcyNTU6XHRcbjcyNTY6XHRcdHN0cnVjdCBsaXN0X2hlYWQgZXZlbnRfbGlzdDtcbjcyNTc6XHRcdHNwaW5sb2NrX3QgZXZlbnRfbG9jaztcbjcyNTg6XHRcbjcyNTk6XHRcdHU4IGNvbm5lY3RlZDoxO1xuNzI2MDpcdFxuNzI2MTpcdFx0Ym9vbCBwcztcbjcyNjI6XHRcdGludCBwc190aW1lb3V0O1xuNzI2MzpcdFxuNzI2NDpcdFx0dTMyIHVuZXhwZWN0ZWRfbmxwb3J0aWQ7XG43MjY1Olx0XG43MjY2Olx0XHR1MzIgb3duZXJfbmxwb3J0aWQ7XG43MjY3Olx0XHRib29sIG5sX293bmVyX2RlYWQ7XG43MjY4Olx0XG43MjY5Olx0I2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUXG43MjcwOlx0XHQvKiB3ZXh0IGRhdGEgKi9cbjcyNzE6XHRcdHN0cnVjdCB7XG43MjcyOlx0XHRcdHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyBpYnNzO1xuNzI3MzpcdFx0XHRzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgY29ubmVjdDtcbjcyNzQ6XHRcdFx0c3RydWN0IGNmZzgwMjExX2NhY2hlZF9rZXlzICprZXlzO1xuNzI3NTpcdFx0XHRjb25zdCB1OCAqaWU7XG43Mjc2Olx0XHRcdHNpemVfdCBpZV9sZW47XG43Mjc3Olx0XHRcdHU4IGJzc2lkW0VUSF9BTEVOXTtcbjcyNzg6XHRcdFx0dTggcHJldl9ic3NpZFtFVEhfQUxFTl07XG43Mjc5Olx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExMzE4CgkJCQkJCQlvdXRwdXQ6IDQxCgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDoKCioqRGl2aW5nIERlZXBlciBpbnRvIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgd2lyZWxlc3Mgc3RhY2ssIGFuZCBub3cgSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBgc3RydWN0IHdpcmVsZXNzX2RldmAgYW5kIGhvdyBpdCYjMzk7cyB1c2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBJIGtub3cgdGhlIGJhc2ljIGRlZmluaXRpb24sIGJ1dCBJIG5lZWQgdG8gc2VlIGl0IGluIGFjdGlvbiwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSByZWxldmFudCBjb2RlLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byB0cmFjZSB0aGUgdXNlIG9mIHRoaXMgc3RydWN0IGFyb3VuZCBsaW5rcy4gSSBrbm93IGhvdyB0aGluZ3MgZ2VuZXJhbGx5IHdvcmssIGJ1dCBJIG5lZWQgYSBtb3JlIGRldGFpbGVkLCBwcmFjdGljYWwgdW5kZXJzdGFuZGluZy4gU28sIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgbGlua3MhIExldCYjMzk7cyBnZXQgdG8gaXQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvY2ZnODAyMTEuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDcyODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7NzI4MDpcdFx0XHRzOCBkZWZhdWx0X2tleSwgZGVmYXVsdF9tZ210X2tleTtcbjcyODE6XHRcdFx0Ym9vbCBwcmV2X2Jzc2lkX3ZhbGlkO1xuNzI4MjpcdFx0fSB3ZXh0O1xuNzI4MzpcdCNlbmRpZlxuNzI4NDpcdFxuNzI4NTpcdFx0c3RydWN0IHdpcGh5X3dvcmsgY3FtX3Jzc2lfd29yaztcbjcyODY6XHRcdHN0cnVjdCBjZmc4MDIxMV9jcW1fY29uZmlnIF9fcmN1ICpjcW1fY29uZmlnO1xuNzI4NzpcdFxuNzI4ODpcdFx0c3RydWN0IGxpc3RfaGVhZCBwbXNyX2xpc3Q7XG43Mjg5Olx0XHRzcGlubG9ja190IHBtc3JfbG9jaztcbjcyOTA6XHRcdHN0cnVjdCB3aXBoeV93b3JrIHBtc3JfZnJlZV93aztcbjcyOTE6XHRcbjcyOTI6XHRcdHVuc2lnbmVkIGxvbmcgdW5wcm90X2JlYWNvbl9yZXBvcnRlZDtcbjcyOTM6XHRcbjcyOTQ6XHRcdHVuaW9uIHtcbjcyOTU6XHRcdFx0c3RydWN0IHtcbjcyOTY6XHRcdFx0XHR1OCBjb25uZWN0ZWRfYWRkcltFVEhfQUxFTl0gX19hbGlnbmVkKDIpO1xuNzI5NzpcdFx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG43Mjk4Olx0XHRcdFx0dTggc3NpZF9sZW47XG43Mjk5Olx0XHRcdH0gY2xpZW50O1xuNzMwMDpcdFx0XHRzdHJ1Y3Qge1xuNzMwMTpcdFx0XHRcdGludCBiZWFjb25faW50ZXJ2YWw7XG43MzAyOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xuNzMwMzpcdFx0XHRcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmO1xuNzMwNDpcdFx0XHRcdHU4IGlkW0lFRUU4MDIxMV9NQVhfTUVTSF9JRF9MRU5dO1xuNzMwNTpcdFx0XHRcdHU4IGlkX2xlbiwgaWRfdXBfbGVuO1xuNzMwNjpcdFx0XHR9IG1lc2g7XG43MzA3Olx0XHRcdHN0cnVjdCB7XG43MzA4Olx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xuNzMwOTpcdFx0XHRcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XG43MzEwOlx0XHRcdFx0dTggc3NpZF9sZW47XG43MzExOlx0XHRcdH0gYXA7XG43MzEyOlx0XHRcdHN0cnVjdCB7XG43MzEzOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqY3VycmVudF9ic3M7XG43MzE0Olx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzE1Olx0XHRcdFx0aW50IGJlYWNvbl9pbnRlcnZhbDtcbjczMTY6XHRcdFx0XHR1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dO1xuNzMxNzpcdFx0XHRcdHU4IHNzaWRfbGVuO1xuNzMxODpcdFx0XHR9IGlic3M7XG43MzE5Olx0XHRcdHN0cnVjdCB7XG43MzIwOlx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzIxOlx0XHRcdH0gb2NiO1xuNzMyMjpcdFx0XHRzdHJ1Y3Qge1xuNzMyMzpcdFx0XHRcdHU4IGNsdXN0ZXJfaWRbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcbjczMjQ6XHRcdFx0XHR1OCBuX2NoYW5uZWxzO1xuNzMyNTpcdFx0XHRcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZnM7XG43MzI2Olx0XHRcdFx0Ym9vbCBzY2hlZF91cGRhdGVfcGVuZGluZztcbjczMjc6XHRcdFx0fSBuYW47XG43MzI4Olx0XHR9IHU7XG43MzI5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEyMjg3CgkJCQkJCQlvdXRwdXQ6IDQxCgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBkZWxpdmVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIERlZXBlciBpbnRvIHRoZSBXaXJlbGVzcyBEZXZpY2UgU3RydWN0dXJlKioKCkFscmlnaHQsIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IHRoZSBpbnRlcm5hbHMgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLCByaWdodD8gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsICYjMzQ7T2theSwgd2hhdCYjMzk7cyAqbmV4dCo/IFdoYXQgb3RoZXIgZWxlbWVudHMgZGVmaW5lIHRoZSBjb3JlIG9mIHRoaXMgZGV2aWNlPyYjMzQ7IEkmIzM5O3ZlIGdvdCBhIGRlY2VudCBncmFzcCBvZiB0aGUgYmFzaWMgc3RydWN0dXJlLCBidXQgaXQmIzM5O3MgdGhlIGZpbmVyIGRldGFpbHMgdGhhdCByZWFsbHkgbWFrZSBvciBicmVhayBhIHdlbGwtZW5naW5lZXJlZCB3aXJlbGVzcyBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHNlZSB0aGUgKndob2xlKiBwaWN0dXJlLiBJ4oCZbSB0aGlua2luZyBhYm91dCB3aGF0IG90aGVyIGZpZWxkcyBtaWdodCBiZSBpbmNsdWRlZC4KCkkmIzM5O20gbWVudGFsbHkgcHJlcGFyaW5nIHRvIG5hdmlnYXRlIGEgcG90ZW50aWFsbHkgY29tcGxleCB3ZWIgb2YgcG9pbnRlcnMsIG5lc3RlZCBzdHJ1Y3R1cmVzLCBhbmQgYml0ZmllbGRzLiBJJiMzOTttIGV4cGVjdGluZyB0byBzZWUgZmxhZ3MgZGVmaW5pbmcgdGhlIGRldmljZSYjMzk7cyBjYXBhYmlsaXRpZXMsIHBvaW50ZXJzIHRvIHJlZ3VsYXRvcnkgZG9tYWlucywgcGVyaGFwcyBjb25maWd1cmF0aW9uLXJlbGF0ZWQgZWxlbWVudHMgb3Igc3RhdGlzdGljcyBjb3VudGVycywgYW5kIGNlcnRhaW5seSB0aGUgZGV0YWlscyBhYm91dCB0aGUgb3BlcmF0aW5nIG1vZGVzLiBJJiMzOTttIGhvcGluZyBpdOKAmXMgd2VsbC1kb2N1bWVudGVkISBUaGUgZGVzaWduIGNob2ljZXMgd2lsbCB0ZWxsIGEgbG90IGFib3V0IHRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGludGVyZmFjZXMsIGNvbmN1cnJlbmN5LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEkmIzM5O20gZXNwZWNpYWxseSBrZWVuIG9uIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGNvbmN1cnJlbmN5IGFuZCBpbnRlcmZhY2VzIGluIGEgbW9kZXJuIHdpcmVsZXNzIGVudmlyb25tZW50LiBBbmQgb2YgY291cnNlLCBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgZWxlbWVudHMgbmVlZGVkIHRvIHRpZSBpdCBhbGwgaW50byB0aGUgbmV0d29yayBzdGFjay4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSB0aGUgZHJpdmVyIGZpdHMgaW4sIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMCAwOToyMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L2NmZzgwMjExLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MzMwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzczMzA6XHRcdHN0cnVjdCB7XG43MzMxOlx0XHRcdHU4IGFkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcbjczMzI6XHRcdFx0dW5pb24ge1xuNzMzMzpcdFx0XHRcdHN0cnVjdCB7XG43MzM0Olx0XHRcdFx0XHR1bnNpZ25lZCBpbnQgYmVhY29uX2ludGVydmFsO1xuNzMzNTpcdFx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XG43MzM2Olx0XHRcdFx0fSBhcDtcbjczMzc6XHRcdFx0XHRzdHJ1Y3Qge1xuNzMzODpcdFx0XHRcdFx0c3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqY3VycmVudF9ic3M7XG43MzM5Olx0XHRcdFx0fSBjbGllbnQ7XG43MzQwOlx0XHRcdH07XG43MzQxOlx0XG43MzQyOlx0XHRcdGJvb2wgY2FjX3N0YXJ0ZWQ7XG43MzQzOlx0XHRcdHVuc2lnbmVkIGxvbmcgY2FjX3N0YXJ0X3RpbWU7XG43MzQ0Olx0XHRcdHVuc2lnbmVkIGludCBjYWNfdGltZV9tcztcbjczNDU6XHRcdH0gbGlua3NbSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTXTtcbjczNDY6XHRcdHUxNiB2YWxpZF9saW5rcztcbjczNDc6XHRcbjczNDg6XHRcdHUzMiByYWRpb19tYXNrO1xuNzM0OTpcdH07XG43MzUwOlx0XG43MzUxOlx0c3RhdGljIGlubGluZSBjb25zdCB1OCAqd2Rldl9hZGRyZXNzKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXG43MzUyOlx0e1xuNzM1MzpcdFx0aWYgKHdkZXYtXHUwMDNlbmV0ZGV2KVxuNzM1NDpcdFx0XHRyZXR1cm4gd2Rldi1cdTAwM2VuZXRkZXYtXHUwMDNlZGV2X2FkZHI7XG43MzU1Olx0XHRyZXR1cm4gd2Rldi1cdTAwM2VhZGRyZXNzO1xuNzM1NjpcdH1cbjczNTc6XHRcbjczNTg6XHRzdGF0aWMgaW5saW5lIGJvb2wgd2Rldl9ydW5uaW5nKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXG43MzU5Olx0e1xuNzM2MDpcdFx0aWYgKHdkZXYtXHUwMDNlbmV0ZGV2KVxuNzM2MTpcdFx0XHRyZXR1cm4gbmV0aWZfcnVubmluZyh3ZGV2LVx1MDAzZW5ldGRldik7XG43MzYyOlx0XHRyZXR1cm4gd2Rldi1cdTAwM2Vpc19ydW5uaW5nO1xuNzM2MzpcdH1cbjczNjQ6XHRcbjczNjU6XHQvKipcbjczNjY6XHQgKiB3ZGV2X3ByaXYgLSByZXR1cm4gd2lwaHkgcHJpdiBmcm9tIHdpcmVsZXNzX2RldlxuNzM2NzpcdCAqXG43MzY4Olx0ICogQHdkZXY6IFRoZSB3aXJlbGVzcyBkZXZpY2Ugd2hvc2Ugd2lwaHkmIzM5O3MgcHJpdiBwb2ludGVyIHRvIHJldHVyblxuNzM2OTpcdCAqIFJldHVybjogVGhlIHdpcGh5IHByaXYgb2YgQHdkZXYuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzMTkwCgkJCQkJCQlvdXRwdXQ6IDE3NwoJCQkJCQkJdGhvdWdodHM6IDMyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFByb3Bvc2VkIFBhdGNoIGluIGBubDgwMjExX25ld19zdGF0aW9uYCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgb2YgdGhpcyBwYXRjaCBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gIGlzIGZvY3VzZWQgb24gaXRzIGltcGFjdCBvbiBtZW1vcnkgc2FmZXR5IGFuZCB3aGV0aGVyIGl0IG5lY2Vzc2l0YXRlcyBLTVNBTi4gRnJvbSB3aGF0IEkgY2FuIHNlZSwgdGhlIGNvcmUgb2YgdGhlIHBhdGNoIHJldm9sdmVzIGFyb3VuZCBhZGRpbmcgY3J1Y2lhbCB2YWxpZGF0aW9uIGNoZWNrcy4gU3BlY2lmaWNhbGx5OgoKMS4gIEl0JiMzOTtzIHZhbGlkYXRpbmcgdGhlIGBsaW5rX2lkYCBtdWNoIGVhcmxpZXIgaW4gdGhlIGZ1bmN0aW9uLCBjcm9zcy1yZWZlcmVuY2luZyBpdCB3aXRoIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AuIEdvb2QgbW92ZSwgY2F0Y2hpbmcgcG90ZW50aWFsIGlzc3VlcyB1cGZyb250LgoyLiAgQ3J1Y2lhbGx5LCBpdCBub3cgZW5mb3JjZXMgYSBjaGVjayBmb3IgQVAvUDJQXF9HTyBpbnRlcmZhY2VzLiBUaGlzIGVuc3VyZXMgdGhlIEFQJiMzOTtzIGJlYWNvbiBpbnRlcnZhbCBpcyBzZXQsIGVmZmVjdGl2ZWx5IG1lYW5pbmcgdGhlIEFQIGlzIHN0YXJ0ZWQsIGJlZm9yZSBhbGxvd2luZyBuZXcgc3RhdGlvbnMgdG8gY29ubmVjdC4gVGhpcyBpcyBhIHNvbGlkIGNoZWNrIGZvciBwcm9wZXIgaW5pdGlhbGl6YXRpb24uCjMuICBTaW1pbGFybHksIGZvciBtZXNoIGludGVyZmFjZXMsIGl0IHZhbGlkYXRlcyB0aGF0IHRoZSBtZXNoIGlzIHN0YXJ0ZWQgYmVmb3JlIHBlcm1pdHRpbmcgbmV3IHN0YXRpb24gYWRkaXRpb25zLiBQcm90ZWN0aW5nIGFnYWluc3Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLgo0LiAgQW5kIGZpbmFsbHksIGl0IHJlbW92ZXMgYSByZWR1bmRhbnQgYHZhbGlkX2xpbmtzYCBjaGVjayBsYXRlciBpbiB0aGUgZnVuY3Rpb24uIFBydW5pbmcgZG93biB1bm5lY2Vzc2FyeSBjaGVja3MgaXMgYWx3YXlzIGEgZ29vZCBwcmFjdGljZS4KCk5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiBEb2VzIHRoaXMgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gTXkgYW5hbHlzaXMgc3VnZ2VzdHMgYSByZXNvdW5kaW5nICYjMzQ7bm8uJiMzNDsgSSYjMzk7bSBjb25maWRlbnQgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IG9yIHN0YWNrIHZhcmlhYmxlcyBiZWluZyByZWFkIG9yIGNvcGllZCB0byB1c2Vyc3BhY2UuIEFsbCB0aGUgdmFyaWFibGVzIHVzZWQg4oCTIGBwYXJhbXNgLCBgbGlua19pZGAsIGB3ZGV2LSZndDt2YWxpZF9saW5rc2AsIHRoZSBiZWFjb24gaW50ZXJ2YWwgY2hlY2ssIHRoZSBtZXNoLXJlbGF0ZWQgc3RhdGUgdmFyaWFibGVzIOKAkyBhcmUgZGVtb25zdHJhYmx5IHByb3Blcmx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UuIE5vIG1lbW9yeSBpcyBiZWluZyBhbGxvY2F0ZWQgb3IgbGVha2VkIHRvIHVzZXJzcGFjZSwgYW5kIHRoZXJlJiMzOTtzIG5vIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuIFRoYXQmIzM5O3MgYSBjbGVhbiBiaWxsIG9mIGhlYWx0aCBhcyBmYXIgYXMgSSBjYW4gdGVsbC4KCkdpdmVuIHRoaXMsIGRvZXMgS01TQU4gbmVlZCB0byBiZSBpbnZvbHZlZD8gQWJzb2x1dGVseSBub3QuIFRoaXMgcGF0Y2ggZm9jdXNlcyBvbiAqcHJldmVudGluZyogb3BlcmF0aW9ucyBvbiB1bmluaXRpYWxpemVkIEFQL21lc2ggaW50ZXJmYWNlcyB0aHJvdWdoIHN0cmljdGVyIHZhbGlkYXRpb24uIFRoZSBnb2FsIGlzIHRvIGF2b2lkIHRob3NlIHNpdHVhdGlvbnMgYWx0b2dldGhlci4gU3RhbmRhcmQgS0FTQU4gYW5kIGRlYnVnZ2luZyBidWlsZHMgYXJlIGVudGlyZWx5IHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IG1lbW9yeSBjb3JydXB0aW9uIG9yIG91dC1vZi1ib3VuZHMgZXJyb3JzIHRoYXQgKm1pZ2h0KiBiZSBpbnRyb2R1Y2VkICh0aG91Z2ggSSBkb24mIzM5O3Qgc2VlIGFueSBldmlkZW5jZSBvZiB0aGF0IGhlcmUpLiBJdCYjMzk7cyBtb3JlIG9mIGEgcHJldmVudGF0aXZlIG1lYXN1cmUgdGhhbiBhIGZpeCBmb3IgYW4gZXhpc3RpbmcgdnVsbmVyYWJpbGl0eS4KClRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggZG9lc24mIzM5O3QgcmVxdWlyZSBLTVNBTi4gSSYjMzk7bGwgcHJlcGFyZSBteSByZWFzb25pbmcgYWNjb3JkaW5nbHkgYW5kIHNldCB0aGUgcmVzdWx0cyB3aXRoIGBOZWVkc0tNU0FOOiBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzEwIDA5OjIxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCkuXG5cbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxuXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgKS5cblxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjE5OjUzLjA5MzA2Nzg4NVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk3OTkxOTMwMDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNGRzgwMjExXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmw4MDIxMV9uZXdfc3RhdGlvblwiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBzYW5pdHkgY2hlY2tzIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB0byB2ZXJpZnkgdGhhdCB0aGUgbGluay9pbnRlcmZhY2UgaGFzIGJlZW4gc3RhcnRlZCAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGFuZCBjaGFubmVsIGRlZmluaXRpb24gZm9yIEFQIGFuZCBNZXNoIGludGVyZmFjZXMsIGFuZCB2YWxpZGF0aW5nIGBsaW5rX2lkYCBlYXJsaWVyIGFnYWluc3QgYHdkZXYtXFx1MDAzZXZhbGlkX2xpbmtzYCkuXFxuXFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBvciBleHBvc2VkLlxcbjIuIFRoZSBuZXdseSBpbnRyb2R1Y2VkIGxvY2FsIHZhcmlhYmxlIGBsaW5rX2lkYCBpcyBhc3NpZ25lZCBiZWZvcmUgdXNlLlxcbjMuIFRoZSBzdGFjayBzdHJ1Y3R1cmUgYHBhcmFtc2AgaXMgZXhwbGljaXRseSBjbGVhcmVkIHdpdGggYG1lbXNldGAgcHJpb3IgdG8gcGFyc2luZyBhdHRyaWJ1dGVzLlxcbjQuIE5vIGtlcm5lbCBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2UgaW4gdGhpcyBjb2RlIHBhdGguXFxuXFxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIHBvc2VzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIGFuZCBkb2VzIG5vdCB3YXJyYW50IGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjE5OjUzLjA5MzA3NDAxNloiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcyNzU1MzA1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY5OGQ0NDhlY2FlNjFmZDg5NzEzY2FhZThjNzdiZTYwODdkYWZmZTNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcXG5pbmRleCA4OTliNjM3NGM1NTA2Li5mY2ExOWUxZDBjOWFiIDEwMDY0NFxcbi0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmNcXG4rKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXFxuQEAgLTkzMjgsNyArOTMyOCw3IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4ge1xcbiBcXHRzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLVxcdTAwM2V1c2VyX3B0clswXTtcXG4tXFx0aW50IGVycjtcXG4rXFx0aW50IGVyciwgbGlua19pZDtcXG4gXFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbiBcXHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cXHUwMDNlbmV0ZGV2O1xcbiBcXHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcXG5AQCAtOTM3Niw2ICs5Mzc2LDE2IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbiBcXHRcXHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVxcdTAwM2VhdHRycyk7XFxuIFxcbitcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG4rXFx0XFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9MSU5LO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbiBcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSkge1xcbiBcXHRcXHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xcbiBcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG5AQCAtOTU1Niw4ICs5NTY2LDEyIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbiBcXG4gXFx0c3dpdGNoICh3ZGV2LVxcdTAwM2VpZnR5cGUpIHtcXG4gXFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUDpcXG4tXFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOlxcbiBcXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcXG4rXFx0XFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xcbitcXHRcXHRsaW5rX2lkID0gd2Rldi1cXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xcbitcXHRcXHRpZiAoIXdkZXYtXFx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbClcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG4rXFxuIFxcdFxcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cXG4gXFx0XFx0aWYgKCEocmRldi1cXHUwMDNld2lwaHkuZmxhZ3MgXFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxcbiBcXHRcXHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxcbkBAIC05NjAyLDYgKzk2MTYsMTkgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXFxuIFxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDpcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxcbitcXHRcXHQgKiBsaWJlcnRhcyBkb2Vzbid0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcXG4rXFx0XFx0ICogbWVzaCB2aWEgc3lzZnMgYW5kIGpvaW5zIGl0IHdoZW4gdGhlIGNoYW5uZWwgaXMgc2V0LCBzb1xcbitcXHRcXHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAocmRldi1cXHUwMDNlb3BzLVxcdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XFxuK1xcdFxcdFxcdGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG4rXFx0XFx0fSBlbHNlIGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmJlYWNvbl9pbnRlcnZhbCkge1xcbitcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbitcXHRcXHR9XFxuK1xcbiBcXHRcXHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xcbiBcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbiBcXG5AQCAtOTY0OSwyNyArOTY3NiwxMCBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4gXFxuIFxcdC8qIGJlIGF3YXJlIG9mIHBhcmFtcy52bGFuIHdoZW4gY2hhbmdpbmcgY29kZSBoZXJlICovXFxuIFxcbi1cXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG4tXFx0XFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcXHUwMDNjIDApIHtcXG4tXFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4tXFx0XFx0XFx0Z290byBvdXQ7XFxuLVxcdFxcdH1cXG4tXFx0XFx0aWYgKCEod2Rldi1cXHUwMDNldmFsaWRfbGlua3MgXFx1MDAyNiBCSVQocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkKSkpIHtcXG4tXFx0XFx0XFx0ZXJyID0gLUVOT0xJTks7XFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRcXHR9XFxuLVxcdH0gZWxzZSB7XFxuLVxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzZT0gMCkge1xcbi1cXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcbiBcXHRwYXJhbXMuZXBwX3BlZXIgPVxcbiBcXHRcXHRubGFfZ2V0X2ZsYWcoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XFxuIFxcbiBcXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcXHUwMDI2cGFyYW1zKTtcXG4tb3V0OlxcbiBcXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToxOTo1NC44MjEyOTE2NjJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjUwODYyMjA0NjQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkNGRzgwMjExXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmw4MDIxMV9uZXdfc3RhdGlvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIgbmw4MDIxMV9uZXdfc3RhdGlvbigpIGluIHRoZSBjZmc4MDIxMSB3aXJlbGVzcyBjb25maWd1cmF0aW9uIHN1YnN5c3RlbS4gSXQgbW92ZXMgbGluayBJRCB2YWxpZGF0aW9uIGVhcmxpZXIgYW5kIGludHJvZHVjZXMgbmV3IGludGVyZmFjZSBzdGF0ZSB2YWxpZGF0aW9ucyAoY2hlY2tpbmcgYmVhY29uIGludGVydmFsIGZvciBBUC9QMlBfR08gYW5kIG1lc2ggaW50ZXJmYWNlcykgYmVmb3JlIGFsbG93aW5nIGEgbmV3IHN0YXRpb24gdG8gYmUgcmVnaXN0ZXJlZC4gVGhpcyBpcyByZWFjaGFibGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIHZpYSBubDgwMjExIEdlbmVyaWMgTmV0bGluayBtZXNzYWdlcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzc1xudG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5UaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLFxuYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy5cblxuLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURTpcbiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZFxuICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLlxuICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsXG4gIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy5cblxuLSBETyBOT1QgQkxJTkRMWSBUUlVTVCBcIk5PIEZVTkNUSU9OQUwgQ0hBTkdFXCIgKE5GQ0kpIE9SIFwiUkVGQUNUT1JJTkdcIiBDTEFJTVM6XG4gIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgXCJjbGVhbnVwc1wiLCBcInJlZmFjdG9yaW5nc1wiLCBvciBzdGF0ZVxuICBcIk5vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkXCIuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLlxuICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnRcbiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuXG4gIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuXG5cbi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6XG4gIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKixcbiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuXG4gIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXJcbiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOlxuXG4tIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6XG4gICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLlxuICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKVxuICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy5cbiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50c1xuICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuXG4gICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLlxuLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6XG4gICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczpcbiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmdcbiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy5cbiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4zLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzpcbi0gQ29yZSBTdWJzeXN0ZW1zOlxuICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSxcbiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuXG4tIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczpcbiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuXG4tIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczpcbiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuXG4tIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6XG4gICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6XG5cbi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOlxuICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1c1xuICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdFxuICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS5cbiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzIFwiZm9jdXNlZFwiLFxuICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuXG5cbi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOlxuICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHNcbiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuXG5cbi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOlxuICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrXG4gIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLlxuICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXJcbiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlnc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6XG4tIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4tIENoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuXG4tIFN0cmlwIGFueSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2OThkNDQ4ZWNhZTYxZmQ4OTcxM2NhYWU4Yzc3YmU2MDg3ZGFmZmUzXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMTAgMDk6MTk6NTAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuY1xuaW5kZXggODk5YjYzNzRjNTUwNi4uZmNhMTllMWQwYzlhYiAxMDA2NDRcbi0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbkBAIC05MzI4LDcgKzkzMjgsNyBAQCBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiB7XG4gXHRzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLVx1MDAzZXVzZXJfcHRyWzBdO1xuLVx0aW50IGVycjtcbitcdGludCBlcnIsIGxpbmtfaWQ7XG4gXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clsxXTtcbiBcdHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB3ZGV2LVx1MDAzZW5ldGRldjtcbiBcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xuQEAgLTkzNzYsNiArOTM3NiwxNiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA9XG4gXHRcdG5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkKGluZm8tXHUwMDNlYXR0cnMpO1xuIFxuK1x0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbitcdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKVxuK1x0XHRcdHJldHVybiAtRU5PTElOSztcbitcdH0gZWxzZSB7XG4rXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKVxuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuIFx0aWYgKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSkge1xuIFx0XHRtYWNfYWRkciA9IG5sYV9kYXRhKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XG4gXHRcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubWxkX21hYyA9IG1hY19hZGRyO1xuQEAgLTk1NTYsOCArOTU2NiwxMiBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcbiBcdHN3aXRjaCAod2Rldi1cdTAwM2VpZnR5cGUpIHtcbiBcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XG4tXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcbitcdFx0LyogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgQVAgYW5kIGxpbmsgaGFzIGJlZW4gc3RhcnRlZCAqL1xuK1x0XHRsaW5rX2lkID0gd2Rldi1cdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XG4rXHRcdGlmICghd2Rldi1cdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXG4rXHRcdFx0cmV0dXJuIC1FTkVURE9XTjtcbitcbiBcdFx0LyogaWdub3JlIFdNRSBhdHRyaWJ1dGVzIGlmIGlmYWNlL3N0YSBpcyBub3QgY2FwYWJsZSAqL1xuIFx0XHRpZiAoIShyZGV2LVx1MDAzZXdpcGh5LmZsYWdzIFx1MDAyNiBXSVBIWV9GTEFHX0FQX1VBUFNEKSB8fFxuIFx0XHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXG5AQCAtOTYwMiw2ICs5NjE2LDE5IEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFx0XHRcdHJldHVybiBQVFJfRVJSKHBhcmFtcy52bGFuKTtcbiBcdFx0YnJlYWs7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XG4rXHRcdC8qXG4rXHRcdCAqIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIG1lc2ggaGFzIGJlZW4gc3RhcnRlZC5cbitcdFx0ICogbGliZXJ0YXMgZG9lc24ndCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlXG4rXHRcdCAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc29cbitcdFx0ICogdXNlIHRoYXQgYXMgdGhlIHN0YXJ0ZWQgaW5kaWNhdGlvbiBpbnN0ZWFkLlxuK1x0XHQgKi9cbitcdFx0aWYgKHJkZXYtXHUwMDNlb3BzLVx1MDAzZWxpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHtcbitcdFx0XHRpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcbitcdFx0XHRcdHJldHVybiAtRU5FVERPV047XG4rXHRcdH0gZWxzZSBpZiAoIXdkZXYtXHUwMDNldS5tZXNoLmJlYWNvbl9pbnRlcnZhbCkge1xuK1x0XHRcdHJldHVybiAtRU5FVERPV047XG4rXHRcdH1cbitcbiBcdFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cbiBcdFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xuIFxuQEAgLTk2NDksMjcgKzk2NzYsMTAgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHQvKiBiZSBhd2FyZSBvZiBwYXJhbXMudmxhbiB3aGVuIGNoYW5naW5nIGNvZGUgaGVyZSAqL1xuIFxuLVx0aWYgKHdkZXYtXHUwMDNldmFsaWRfbGlua3MpIHtcbi1cdFx0aWYgKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCBcdTAwM2MgMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdFx0aWYgKCEod2Rldi1cdTAwM2V2YWxpZF9saW5rcyBcdTAwMjYgQklUKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCkpKSB7XG4tXHRcdFx0ZXJyID0gLUVOT0xJTks7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNlPSAwKSB7XG4tXHRcdFx0ZXJyID0gLUVJTlZBTDtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVx0fVxuLVxuIFx0cGFyYW1zLmVwcF9wZWVyID1cbiBcdFx0bmxhX2dldF9mbGFnKGluZm8tXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0VQUF9QRUVSXSk7XG4gXG4gXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcdTAwMjZwYXJhbXMpO1xuLW91dDpcbiBcdGRldl9wdXQocGFyYW1zLnZsYW4pO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToxOTo1NC44MjEyOTMxNDJaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzM1NjEzMzIzMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIEV2YWx1YXRpb246IFdpcmVsZXNzIE5ldHdvcmsgSW50ZXJmYWNlIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2ggc2VyaWVzLCBmb2N1c2luZyBvbiBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AsIHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSByaWdodCBwYXJhbWV0ZXJzIOKAkyB0aGUgYEZvY3VzU3ltYm9sc2AsIGBFbmFibGVDb25maWdzYCwgYFdvcnRoRnV6emluZ2AgYXNzZXNzbWVudCwgYW5kIHRoZSByZWFzb25pbmcgYmVoaW5kIGl0IGFsbC5cblxuRmlyc3QsIGxldCdzIGxvb2sgYXQgd2hhdCB0aGUgcGF0Y2ggYWN0dWFsbHkgKmRvZXMqLiBJdCdzIG1lc3Npbmcgd2l0aCBgbmw4MDIxMV9uZXdfc3RhdGlvbmAsIHdoaWNoIGhhbmRsZXMgbmV3IHN0YXRpb24gY29ubmVjdGlvbnMgaW4gdGhlIHdpcmVsZXNzIG5ldHdvcmtpbmcgc3RhY2suIFNwZWNpZmljYWxseTpcblxuMS4gIEl0IHNodWZmbGVzIGFyb3VuZCB0aGUgYGxpbmtfc3RhX3BhcmFtcy5saW5rX2lkYCBhbmQgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgIGNoZWNrIGluIGBubDgwMjExX25ld19zdGF0aW9uYCwgcHV0dGluZyBpdCBoaWdoZXIgdXAuIFRoYXQncyBhIHN0cnVjdHVyYWwgY2hhbmdlLCBwb3RlbnRpYWxseSBtYWtpbmcgdGhlIGNvZGUgZmxvdyBkaWZmZXJlbnRseS5cbjIuICBJdCByZXdvcmtzIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRoYXQgZGVhbHMgd2l0aCBkaWZmZXJlbnQgaW50ZXJmYWNlIHR5cGVzIChgTkw4MDIxMV9JRlRZUEVfQVBgLCBgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTmAsIGBOTDgwMjExX0lGVFlQRV9QMlBfR09gLCBgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVGApLiBUaGUgcGF0Y2ggcmVtb3ZlcyBgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTmAgZnJvbSBvbmUgb2YgdGhlIGNhc2VzLiBJdCBhbHNvIGFkZHMgbmV3IGNoZWNrcyBpbnNpZGUgdGhlc2UgY2FzZXM6XG4gICAgKiAgIEZvciBBUCBhbmQgUDJQX0dPLCBpdCBub3cgY2hlY2tzIGB3ZGV2LVx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbGAgYmVmb3JlIGFkZGluZyB0aGUgc3RhdGlvbi5cbiAgICAqICAgRm9yIE1FU0hfUE9JTlQsIGl0IGNoZWNrcyBgd2Rldi1cdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuYCAoTGliZXJ0YXMpIG9yIGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgLlxuMy4gIEZpbmFsbHksIGl0IHJlbW92ZXMgYSByZWR1bmRhbnQgbGluayBjaGVjayBhbmQgYW4gYG91dGAgbGFiZWwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24uXG5cblRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSwgbm90IGp1c3QgYSBjbGVhbnVwLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoZXNlIG5ldyBjaGVja3MsIHBhcnRpY3VsYXJseSByZWxhdGVkIHRvIGBiZWFjb25faW50ZXJ2YWxgIGFuZCBjaGFubmVsIGRlZmluaXRpb25zLCBsb29rcyBsaWtlIGl0J3MgYWRkcmVzc2luZyBzb21lIHNwZWNpZmljIHdpcmVsZXNzIGludGVyZmFjZSBiZWhhdmlvci4gIEkgbmVlZCB0byBkaWcgaW50byB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgS2NvbmZpZyBvcHRpb25zIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLiBNeSBpbW1lZGlhdGUgaHVuY2ggaXMgdGhhdCB0aGlzIGlzIGxpa2VseSByZWxhdGVkIHRvIHJvYnVzdG5lc3MgYW5kIHNlY3VyaXR5LCBsaWtlbHkgaW4gaGFuZGxpbmcgb2YgYmVhY29uIGZyYW1lcyBvciBvdGhlciB3aXJlbGVzcyBjb250cm9sIGRhdGEuIEknbGwgdXNlIG15IHRvb2xzIHRvIGluc3BlY3QgdGhlIGNvZGUgdG8gY29uZmlybSBteSBhc3N1bXB0aW9ucyBhbmQgd29yayBvdXQgdGhlIGRldGFpbHMgZm9yIGdlbmVyYXRpbmcgc3l6a2FsbGVyIHBhcmFtZXRlcnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQwNDIsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDowOC4xNzc0Mjg1OTVaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQ0NjQ3MjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmw4MDIxMV9uZXdfc3RhdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuYz05MTU2PXN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy05MzI3LVxcbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTMyODpzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTkzMjkte1xcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYz0xOTc0MD1zdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfc21hbGxfb3BzIG5sODAyMTFfc21hbGxfb3BzW10gPSB7XFxuLS1cXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTE5ODQ2LVxcdFxcdC52YWxpZGF0ZSA9IEdFTkxfRE9OVF9WQUxJREFURV9TVFJJQ1QgfCBHRU5MX0RPTlRfVkFMSURBVEVfRFVNUCxcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jOjE5ODQ3OlxcdFxcdC5kb2l0ID0gbmw4MDIxMV9uZXdfc3RhdGlvbixcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTE5ODQ4LVxcdFxcdC5mbGFncyA9IEdFTkxfVU5TX0FETUlOX1BFUk0sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjA4LjIzMTg5OTIzN1oiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwMzcwNTE2OTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0IGRpdmluZyBpbnRvIHRoZSBjb2RlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBXaXJlbGVzcyBLZXJuZWwgTW9kdWxlcyoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBidWlsZCBjb25maWd1cmF0aW9ucyBmb3IgdGhlc2Ugd2lyZWxlc3MgbW9kdWxlcywgYG5sODAyMTEuY2AgYW5kIGBjZmc4MDIxMWAuIE15IGltbWVkaWF0ZSBpbnN0aW5jdCBpcyB0byBjaGVjayB0aGUgc3RhbmRhcmQgbG9jYXRpb25zIGZvciB0aGlzIGtpbmQgb2YgaW5mb3JtYXRpb24uIEknbGwgc3RhcnQgd2l0aCBgbmV0L3dpcmVsZXNzL0tjb25maWdgIGFuZCBgbmV0L3dpcmVsZXNzL01ha2VmaWxlYC4gVGhvc2UgZmlsZXMgYXJlIHRoZSB1c3VhbCBzdXNwZWN0cy4gS2NvbmZpZyB3aWxsIG91dGxpbmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFmZmVjdCBjb21waWxhdGlvbiwgYW5kIHRoZSBNYWtlZmlsZSBzaG91bGQgdGVsbCBtZSBob3cgdGhlc2Ugc291cmNlIGZpbGVzIGZpdCBpbnRvIHRoZSBidWlsZCBwcm9jZXNzLCBpbmNsdWRpbmcgYW55IG90aGVyIGRlcGVuZGVuY2llcyBsaWtlIG90aGVyIGtlcm5lbCBtb2R1bGVzIGFuZCBsaWJyYXJpZXMuIEhvcGVmdWxseSwgSSdsbCBmaW5kIHdoYXQgSSBuZWVkIHRoZXJlIHByZXR0eSBxdWlja2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1Mjc3LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTAuMjY4OTUzODM2WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MTc5NTQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5sODAyMTFcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3dpcmVsZXNzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC93aXJlbGVzcy9NYWtlZmlsZT03PW9iai0kKENPTkZJR19XRVhUX1BSSVYpICs9IHdleHQtcHJpdi5vXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlLTgtXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlOjk6Y2ZnODAyMTEteSArPSBjb3JlLm8gc3lzZnMubyByYWRpb3RhcC5vIHV0aWwubyByZWcubyBzY2FuLm8gbmw4MDIxMS5vXFxubmV0L3dpcmVsZXNzL01ha2VmaWxlLTEwLWNmZzgwMjExLXkgKz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTAuMzE2MTM2NzY5WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjA3NTExMzQ2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqTmF2aWdhdGluZyB0aGUgV2lyZWxlc3MgQ29uZmlndXJhdGlvbiBMYW5kc2NhcGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEkgbmVlZCB0byBtYWtlIHN1cmUgSSd2ZSBnb3QgdGhlIHdpcmVsZXNzIGJpdHMgY292ZXJlZC4gTXkgZmlyc3Qgc3RvcCB3aWxsIGJlIGBuZXQvd2lyZWxlc3MvS2NvbmZpZ2AuIFRoYXQncyB3aGVyZSBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNvcmUgd2lyZWxlc3Mgc3RhY2sgY29tcG9uZW50cy4gSSdtIHNwZWNpZmljYWxseSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBgQ0ZHODAyMTFgIGFuZCBgTkw4MDIxMWAuIEkgbmVlZCB0byBlbnN1cmUgdGhleSdyZSBib3RoIGVuYWJsZWQgKG9yIGF0IGxlYXN0LCBhcHByb3ByaWF0ZWx5IGNvbmZpZ3VyZWQpLCBhbmQgdW5kZXJzdGFuZCBhbnkgZGVwZW5kZW5jaWVzIG9yIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLiBUaGlzIGlzIGJhc2ljLCBidXQgZm91bmRhdGlvbmFsOyBnb3R0YSBjb25maXJtIHRoYXQgdGhlIGNvcmUgd2lyZWxlc3MgaW5mcmFzdHJ1Y3R1cmUgaXMgcHJvcGVybHkgZW5hYmxlZCBiZWZvcmUgSSBnbyBmdXJ0aGVyLiBMZXQncyBzZWUgd2hhdCB0aGUgS2NvbmZpZyBmaWxlcyByZXZlYWwgYWJvdXQgdGhlc2UgdHdvLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NjYyLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTIuMzkxMjUyNzMyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1OTA2NjYzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBDRkc4MDIxMVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL0tjb25maWc9MTQ9Y29uZmlnIFdFWFRfUFJJVlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTYtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTc6Y29uZmlnIENGRzgwMjExXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTgtXFx0dHJpc3RhdGUgXFxcImNmZzgwMjExIC0gd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUElcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZz0zOD1jb25maWcgTkw4MDIxMV9URVNUTU9ERVxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctNTEtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6NTI6Y29uZmlnIENGRzgwMjExX0RFVkVMT1BFUl9XQVJOSU5HU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTUzLVxcdGJvb2wgXFxcImVuYWJsZSBkZXZlbG9wZXIgd2FybmluZ3NcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy02Ny1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzo2ODpjb25maWcgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXFxubmV0L3dpcmVsZXNzL0tjb25maWctNjktXFx0Ym9vbCBcXFwiY2ZnODAyMTEgY2VydGlmaWNhdGlvbiBvbnVzXFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctODgtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6ODk6Y29uZmlnIENGRzgwMjExX1JFUVVJUkVfU0lHTkVEX1JFR0RCXFxubmV0L3dpcmVsZXNzL0tjb25maWctOTAtXFx0Ym9vbCBcXFwicmVxdWlyZSByZWdkYiBzaWduYXR1cmVcXFwiIGlmIENGRzgwMjExX0NFUlRJRklDQVRJT05fT05VU1xcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctOTgtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6OTk6Y29uZmlnIENGRzgwMjExX1VTRV9LRVJORUxfUkVHREJfS0VZU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTEwMC1cXHRib29sIFxcXCJhbGxvdyByZWdkYiBrZXlzIHNoaXBwZWQgd2l0aCB0aGUga2VybmVsXFxcIiBpZiBDRkc4MDIxMV9DRVJUSUZJQ0FUSU9OX09OVVNcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMC1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxMTE6Y29uZmlnIENGRzgwMjExX0VYVFJBX1JFR0RCX0tFWURJUlxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTExMi1cXHRzdHJpbmcgXFxcImFkZGl0aW9uYWwgcmVnZGIga2V5IGRpcmVjdG9yeVxcXCIgaWYgQ0ZHODAyMTFfQ0VSVElGSUNBVElPTl9PTlVTXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMjEtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTIyOmNvbmZpZyBDRkc4MDIxMV9SRUdfQ0VMTFVMQVJfSElOVFNcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMjMtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgcmVndWxhdG9yeSBzdXBwb3J0IGZvciBjZWxsdWxhciBiYXNlIHN0YXRpb24gaGludHNcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzQtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTM1OmNvbmZpZyBDRkc4MDIxMV9SRUdfUkVMQVhfTk9fSVJcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xMzYtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgc3VwcG9ydCBmb3IgTk9fSVIgcmVsYXhhdGlvblxcXCJcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE1OC1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxNTk6Y29uZmlnIENGRzgwMjExX0RFRkFVTFRfUFNcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNjAtXFx0Ym9vbCBcXFwiZW5hYmxlIHBvd2Vyc2F2ZSBieSBkZWZhdWx0XFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTY4LVxcbm5ldC93aXJlbGVzcy9LY29uZmlnOjE2OTpjb25maWcgQ0ZHODAyMTFfREVCVUdGU1xcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE3MC1cXHRib29sIFxcXCJjZmc4MDIxMSBEZWJ1Z0ZTIGVudHJpZXNcXFwiXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzYtXFxubmV0L3dpcmVsZXNzL0tjb25maWc6MTc3OmNvbmZpZyBDRkc4MDIxMV9DUkRBX1NVUFBPUlRcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xNzgtXFx0Ym9vbCBcXFwic3VwcG9ydCBDUkRBXFxcIiBpZiBFWFBFUlRcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE4Ni1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZzoxODc6Y29uZmlnIENGRzgwMjExX1dFWFRcXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy0xODgtXFx0Ym9vbCBcXFwiY2ZnODAyMTEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBjb21wYXRpYmlsaXR5XFxcIlxcbi0tXFxubmV0L3dpcmVsZXNzL0tjb25maWctMTkzLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnOjE5NDpjb25maWcgQ0ZHODAyMTFfS1VOSVRfVEVTVFxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTE5NS1cXHR0cmlzdGF0ZSBcXFwiS1VuaXQgdGVzdHMgZm9yIGNmZzgwMjExXFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjEyLjQzNzE2MjE0NVoiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwMjYyMDczMzQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqS2NvbmZpZyBEZXBlbmRlbmN5IERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlbid0IG1pc3NlZCBhbnkgQ0ZHODAyMTEgZGVwZW5kZW5jaWVzIGx1cmtpbmcgd2l0aGluIHRoZSBLY29uZmlnIGZpbGVzLiBUaGlzIG1lYW5zIEkgbmVlZCB0byBzdGFydCBjb21iaW5nIHRocm91Z2ggdGhvc2UgZmlsZXMsIHNwZWNpZmljYWxseSBsb29raW5nIGZvciBhbnkgYGRlcGVuZHMgb25gIHN0YXRlbWVudHMgb3IgY29uZGl0aW9uYWwgaW5jbHVzaW9ucyB0aGF0IHJlbGF0ZSB0byBDRkc4MDIxMS4gSXQncyBhIHN0YW5kYXJkIHN0ZXAsIHJlYWxseSAtIGdvdHRhIGNvdmVyIGFsbCB0aGUgYmFzZXMgdG8gZW5zdXJlIHRoZSBtb2R1bGUgb3IgZmVhdHVyZSBJJ20gd29ya2luZyBvbiBpcyBjb3JyZWN0bHkgaG9va2VkIGludG8gdGhlIGV4aXN0aW5nIHdpcmVsZXNzIGluZnJhc3RydWN0dXJlLiBHb3R0YSBiZSBtZXRpY3Vsb3VzIGhlcmUuIEknbSB0aGlua2luZyBJJ2xsIHN0YXJ0IHdpdGggdGhlIG1vc3QgcmVsZXZhbnQgS2NvbmZpZyBmaWxlcyBmaXJzdCwgcHJvYmFibHkgdGhvc2UgZGlyZWN0bHkgcmVsYXRlZCB0byB0aGUgYXJlYSBJJ20gbW9kaWZ5aW5nLiBUaGVuLCBJJ2xsIGJyb2FkZW4gdGhlIHNlYXJjaCwgbWF5YmUgdXNpbmcgYGdyZXBgIG9yIGEgc2ltaWxhciB0b29sIHRvIGxvb2sgZm9yIGFueXRoaW5nIHN1c3BpY2lvdXMuIFRoaXMgaXMgcm91dGluZSwgYnV0IHRob3JvdWdobmVzcyBpcyBrZXkgZm9yIGF2b2lkaW5nIGJ1aWxkIGVycm9ycyBvciBydW50aW1lIHN1cnByaXNlcyBsYXRlciBvbi4gTGV0J3MgZ2V0IHRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo2ODA3LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MTcuNDYzMzcyNjc5WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwNTkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC93aXJlbGVzcy9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHRjb25maWcgV0lSRUxFU1NfRVhUXFxuICAgMzpcXHRcXHRib29sXFxuICAgNDpcXHRcXG4gICA1OlxcdGNvbmZpZyBXRVhUX0NPUkVcXG4gICA2OlxcdFxcdGRlZl9ib29sIHlcXG4gICA3OlxcdFxcdGRlcGVuZHMgb24gQ0ZHODAyMTFfV0VYVCB8fCBXSVJFTEVTU19FWFRcXG4gICA4OlxcdFxcbiAgIDk6XFx0Y29uZmlnIFdFWFRfUFJPQ1xcbiAgMTA6XFx0XFx0ZGVmX2Jvb2wgeVxcbiAgMTE6XFx0XFx0ZGVwZW5kcyBvbiBQUk9DX0ZTXFxuICAxMjpcXHRcXHRkZXBlbmRzIG9uIFdFWFRfQ09SRVxcbiAgMTM6XFx0XFxuICAxNDpcXHRjb25maWcgV0VYVF9QUklWXFxuICAxNTpcXHRcXHRib29sXFxuICAxNjpcXHRcXG4gIDE3OlxcdGNvbmZpZyBDRkc4MDIxMVxcbiAgMTg6XFx0XFx0dHJpc3RhdGUgXFxcImNmZzgwMjExIC0gd2lyZWxlc3MgY29uZmlndXJhdGlvbiBBUElcXFwiXFxuICAxOTpcXHRcXHRkZXBlbmRzIG9uIFJGS0lMTCB8fCAhUkZLSUxMXFxuICAyMDpcXHRcXHRzZWxlY3QgRldfTE9BREVSXFxuICAyMTpcXHRcXHRzZWxlY3QgQ1JDMzJcXG4gIDIyOlxcdFxcdCMgbWF5IG5lZWQgdG8gdXBkYXRlIHRoaXMgd2hlbiBjZXJ0aWZpY2F0ZXMgYXJlIGNoYW5nZWQgYW5kIGFyZVxcbiAgMjM6XFx0XFx0IyB1c2luZyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIHRob3VnaCByaWdodCBub3cgdGhleSBzaG91bGRuJ3RcXG4gIDI0OlxcdFxcdCMgKHRoaXMgaXMgaGVyZSByYXRoZXIgdGhhbiBiZWxvdyB0byBhbGxvdyBpdCB0byBiZSBhIG1vZHVsZSlcXG4gIDI1OlxcdFxcdHNlbGVjdCBDUllQVE9fU0hBMjU2IGlmIENGRzgwMjExX1VTRV9LRVJORUxfUkVHREJfS0VZU1xcbiAgMjY6XFx0XFx0aGVscFxcbiAgMjc6XFx0XFx0ICBjZmc4MDIxMSBpcyB0aGUgTGludXggd2lyZWxlc3MgTEFOICg4MDIuMTEpIGNvbmZpZ3VyYXRpb24gQVBJLlxcbiAgMjg6XFx0XFx0ICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBhIHdpcmVsZXNzIGRldmljZS5cXG4gIDI5OlxcdFxcbiAgMzA6XFx0XFx0ICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBkb2N1bWVudGF0aW9uIG9uIHRoZSB3aXJlbGVzcyB3aWtpOlxcbiAgMzE6XFx0XFxuICAzMjpcXHRcXHQgIGh0dHBzOi8vd2lyZWxlc3Mud2lraS5rZXJuZWwub3JnL2VuL2RldmVsb3BlcnMvRG9jdW1lbnRhdGlvbi9jZmc4MDIxMVxcbiAgMzM6XFx0XFxuICAzNDpcXHRcXHQgIFdoZW4gYnVpbHQgYXMgYSBtb2R1bGUgaXQgd2lsbCBiZSBjYWxsZWQgY2ZnODAyMTEuXFxuICAzNTpcXHRcXG4gIDM2OlxcdGlmIENGRzgwMjExXFxuICAzNzpcXHRcXG4gIDM4OlxcdGNvbmZpZyBOTDgwMjExX1RFU1RNT0RFXFxuICAzOTpcXHRcXHRib29sIFxcXCJubDgwMjExIHRlc3Rtb2RlIGNvbW1hbmRcXFwiXFxuICA0MDpcXHRcXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjE3LjQ2MzQzNjMwOVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MDg1NTIxNDU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggYW5kIFJlYWNoYWJpbGl0eSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGltbWVkaWF0ZWx5IEknbSB0aGlua2luZyBhYm91dCBpdHMgaW1wbGljYXRpb25zIGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgd2l0aCBzeXprYWxsZXIuIFRoZSBjb3JlIG9mIHRoaXMgY2hhbmdlIHNlZW1zIHRvIGJlIGluIGBubDgwMjExX25ld19zdGF0aW9uYCB3aXRoaW4gYG5ldC93aXJlbGVzcy9ubDgwMjExLmNgLiBSaWdodCwgdGhpcyBpcyB3aGVyZSB0aGUgYE5MODAyMTFfQ01EX05FV19TVEFUSU9OYCBjb21tYW5kIGlzIGhhbmRsZWQsIGFsbCB0aHJvdWdoIEdlbmVyaWMgTmV0bGluaydzIGBubDgwMjExYCBpbnRlcmZhY2UuIEEgcXVpY2sgbWVudGFsIGNoZWNrOiBpcyBgbmw4MDIxMWAgYWNjZXNzaWJsZSB3aXRoaW4gYSBzdGFuZGFyZCBzeXprYWxsZXIgc2V0dXAsIGVzcGVjaWFsbHkgaW4gdGhvc2UgdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzPyBBYnNvbHV0ZWx5LiBXZSdyZSBkZWFsaW5nIHdpdGggYG1hYzgwMjExX2h3c2ltYCBhbmQgYGNmZzgwMjExYCBoZXJlLCB3aGljaCBhcmUgcHJldHR5IG11Y2ggdGhlIGJyZWFkIGFuZCBidXR0ZXIgb2Ygc3l6a2FsbGVyIGZ1enppbmcgaW4gdGhpcyBhcmVhLiBHZW5lcmljIE5ldGxpbmsgc29ja2V0cywgYG5sODAyMTFgIGluY2x1ZGVkLCBhcmUgcmVhZGlseSBjcmVhdGFibGUgYW5kIHF1ZXJ5YWJsZSwgbm8gcGh5c2ljYWwgaGFyZHdhcmUgbmVjZXNzYXJ5LiBHb29kLiBOb3csIEkgc2hvdWxkIGRpdmUgaW50byB0aGUgYWN0dWFsIGZ1bmN0aW9uIGl0c2VsZiwgYG5sODAyMTFfbmV3X3N0YXRpb25gLCBhbmQgZ2V0IGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIGl0cyB3b3JraW5ncy4gSSBuZWVkIHRvIHRyYWNlIHRocm91Z2ggdGhlIGNvZGUsIG1hcCBvdXQgY2FsbGVycywgYW5kIHBpbnBvaW50IGFueSBwb3RlbnRpYWxseSBpbnRlcmVzdGluZyBzeW1ib2xzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3NjAyLCJPdXRwdXRUb2tlbnMiOjQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjEuNTQ4OTU5ODk3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwODIwNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA5MzI4LFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI5MzI4OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjkzMjk6XFx0e1xcbjkzMzA6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuOTMzMTpcXHRcXHRpbnQgZXJyLCBsaW5rX2lkO1xcbjkzMzI6XFx0XFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbjkzMzM6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtXFx1MDAzZW5ldGRldjtcXG45MzM0OlxcdFxcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xcbjkzMzU6XFx0XFx0dTggKm1hY19hZGRyID0gTlVMTDtcXG45MzM2OlxcdFxcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxcbjkzMzc6XFx0XFx0XFx0XFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpO1xcbjkzMzg6XFx0XFxuOTMzOTpcXHRcXHRtZW1zZXQoXFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xcbjkzNDA6XFx0XFxuOTM0MTpcXHRcXHRpZiAoIWRldiBcXHUwMDI2XFx1MDAyNiB3ZGV2LVxcdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxcbjkzNDI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM0MzpcXHRcXG45MzQ0OlxcdFxcdGlmICghcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbilcXG45MzQ1OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45MzQ2OlxcdFxcbjkzNDc6XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcXG45MzQ4OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNDk6XFx0XFxuOTM1MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fFxcbjkzNTE6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTI6XFx0XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcXG45MzUzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNTQ6XFx0XFx0XFx0aWYgKHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTU6XFx0XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxcbjkzNTY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM1NzpcXHRcXG45MzU4OlxcdFxcdFxcdFxcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cXG45MzU5OlxcdFxcdFxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcXG45MzYwOlxcdFxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XFxuOTM2MTpcXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxcbjkzNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM2MzpcXHRcXHRcXHR9XFxuOTM2NDpcXHRcXHR9IGVsc2Uge1xcbjkzNjU6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXFxuOTM2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzY3OlxcdFxcbjkzNjg6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXFxuOTM2OTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzcwOlxcdFxcbjkzNzE6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXFx1MDAyNlxcdTAwMjZcXG45MzcyOlxcdFxcdFxcdCAgICAhaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45MzczOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNzQ6XFx0XFx0fVxcbjkzNzU6XFx0XFxuOTM3NjpcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbjkzNzc6XFx0XFx0XFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cXHUwMDNlYXR0cnMpO1xcbjkzNzg6XFx0XFxuOTM3OTpcXHRcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG45MzgwOlxcdFxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzYyAwKVxcbjkzODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM4MjpcXHRcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG45MzgzOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTElOSztcXG45Mzg0OlxcdFxcdH0gZWxzZSB7XFxuOTM4NTpcXHRcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuOTM4NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45Mzg3OlxcdFxcdH1cXG45Mzg4OlxcdFxcbjkzODk6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcXG45MzkwOlxcdFxcdFxcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XFxuOTM5MTpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG45MzkyOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxcbjkzOTM6XFx0XFx0XFx0XFx0bmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xcbjkzOTQ6XFx0XFx0XFx0aWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMpKVxcbjkzOTU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM5NjpcXHRcXHR9IGVsc2Uge1xcbjkzOTc6XFx0XFx0XFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XFxuOTM5ODpcXHRcXHR9XFxuOTM5OTpcXHRcXG45NDAwOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcXG45NDAxOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cXG45NDAyOlxcdFxcdFxcdFxcdG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XFxuOTQwMzpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4gPVxcbjk0MDQ6XFx0XFx0XFx0XFx0bmxhX2xlbihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pO1xcbjk0MDU6XFx0XFx0fVxcbjk0MDY6XFx0XFxuOTQwNzpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDoyMS41NTAwNDM4ODZaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzczNjU0NTU0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd24sIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgaW4gdGhpcyBmaWVsZDpcblxuKipBbmFseXppbmcgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBGdW5jdGlvbioqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUgcmVzdCBvZiB0aGUgYG5sODAyMTFfbmV3X3N0YXRpb25gIGZ1bmN0aW9uLiBJIGFscmVhZHkgaGF2ZSBhIHByZXR0eSBnb29kIG1lbnRhbCBtb2RlbCBvZiB0aGUgZ2VuZXJhbCBmbG93LCBidXQgdW5kZXJzdGFuZGluZyB0aGUgbnVhbmNlcyBpcyBjcnVjaWFsLiBJJ20gZm9jdXNpbmcgbm93IG9uIHRoZSBzcGVjaWZpY3Mgb2YgdGhpcyByb3V0aW5lLiBJJ20gbG9va2luZyBmb3Igd2hlcmUgaXQgaGFuZGxlcyB0aGUgYWN0dWFsIHN0YXRpb24gY3JlYXRpb24sIHdoYXQgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQsIGFuZCBob3cgdGhlIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZC4gSSBuZWVkIHRvIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIGxvY2tpbmcgaXNzdWVzLCBvZiBjb3Vyc2UsIHRoYXQgY291bGQgcG9wIHVwIHdoZW4gbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBiZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJzIHRoYXQgb3BlcmF0ZSBvbiB0aGlzIGRhdGEuXG5cbkknbSBjaGVja2luZyBpZiB0aGVyZSBpcyBhbnkgaW5pdGlhbCBjb25maWd1cmF0aW9uIGNoZWNrcy4gRm9yIGV4YW1wbGUsIGlzIHRoZXJlIGEgbWF4aW11bSBudW1iZXIgb2Ygc3RhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyPyBUaGF0J3MgYSBnb29kIG9uZSB0byBsb29rIGZvci4gQW5kIGlmIHNvLCBob3cgaXMgdGhlIGxpbWl0IGVuZm9yY2VkPyBBcmUgdGhlcmUgYW55IHNhbml0eSBjaGVja3Mgb24gdGhlIGlucHV0IHBhcmFtZXRlcnM/IEkgZXhwZWN0IHRvIHNlZSBjaGVja3Mgb24gdGhlIE1BQyBhZGRyZXNzLCB0aGUgaW50ZXJmYWNlIGluZGV4LCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0J3MgcGFzc2VkIGluIGZyb20gdGhlIG5ldGxpbmsgbWVzc2FnZS5cblxuSSdtIGtlZXBpbmcgYW4gZXllIG91dCBmb3IgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGV4aXN0aW5nIHN0YXRpb24gbWFuYWdlbWVudCBkYXRhIHN0cnVjdHVyZXMuIEFyZSBuZXcgc3RhdGlvbiBlbnRyaWVzIGFkZGVkIHRvIGEgbGlua2VkIGxpc3QsIGEgaGFzaCB0YWJsZSwgb3Igc29tZXRoaW5nIGVsc2UgZW50aXJlbHk/IFdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGFyZSBlbXBsb3llZCB0byBwcm90ZWN0IHRoZSBkYXRhIHN0cnVjdHVyZSBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzPyBJJ20gaG9waW5nIHRvIHNlZSBhIHdlbGwtZGVmaW5lZCBsb2NraW5nIHNjaGVtZSB1c2luZyByZWFkLXdyaXRlIGxvY2tzIG9yIG11dGV4ZXMgdG8gcHJvdmlkZSBzYWZlIG9wZXJhdGlvbnMuXG5cbkknbSBhbHNvIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gYW55IGVycm9yIGhhbmRsaW5nLiBXaGF0IGhhcHBlbnMgaWYgYSByZXNvdXJjZSBhbGxvY2F0aW9uIGZhaWxzIChlLmcuLCBtZW1vcnkgYWxsb2NhdGlvbik/IEhvdyBhcmUgZXJyb3JzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdXNlciBzcGFjZT8gQXJlIHRoZXJlIHByb3BlciBlcnJvciBjb2RlcyB1c2VkPyBJIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBlcnJvciBoYW5kbGluZyBpcyByb2J1c3QuXG5cbkZpbmFsbHksIEknbSBleGFtaW5pbmcgYW55IGhvb2tzIG9yIGNhbGxiYWNrcyB0aGF0IGFyZSB0cmlnZ2VyZWQgZHVyaW5nIHN0YXRpb24gY3JlYXRpb24uIEFyZSB0aGVyZSBhbnkgbm90aWZpY2F0aW9ucyBzZW50IHRvIG90aGVyIHBhcnRzIG9mIHRoZSB3aXJlbGVzcyBzdGFjaywgbGlrZSB0aGUgbWFjODAyMTEgbGF5ZXIsIG9yIG1heWJlIHRvIHVzZXIgc3BhY2UgdmlhIG5ldGxpbms/IEl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgc3lzdGVtIGltcGFjdCBvZiB0aGlzIGZ1bmN0aW9uLiBJIGFtIGFsd2F5cyB0cnlpbmcgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIHdpbGwgaW50ZXJhY3Qgd2l0aCB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTU5NSwiT3V0cHV0VG9rZW5zIjo0MiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjUuMjg2NTkyMTE2WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwOTEyMTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuY1wiLFxuICBcIkZpcnN0TGluZVwiOiA5NTUwLFxuICBcIkxpbmVDb3VudFwiOiAxMDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiOTU1MDpcXHRcXHQgICAgd2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTl9EQVRBKSB7XFxuOTU1MTpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0QpXFxuOTU1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTUzOlxcdFxcdFxcdC8qIE5BTiBOTUkgc3RhdGlvbiBtdXN0IGJlIGFkZGVkIGluIGFzc29jaWF0ZWQgb3IgYXV0aG9yaXplZCBzdGF0ZSAqL1xcbjk1NTQ6XFx0XFx0XFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiAoQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgfFxcbjk1NTU6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpKSlcXG45NTU2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1NTc6XFx0XFx0fVxcbjk1NTg6XFx0XFxuOTU1OTpcXHRcXHQvKiBFbnN1cmUgdGhhdCBIVC9WSFQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc2V0IGZvciA2IEdIeiBIRSBTVEEgKi9cXG45NTYwOlxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmhlXzZnaHpfY2FwYSBcXHUwMDI2XFx1MDAyNlxcbjk1NjE6XFx0XFx0ICAgIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmh0X2NhcGEgfHwgcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy52aHRfY2FwYSkpXFxuOTU2MjpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTYzOlxcdFxcbjk1NjQ6XFx0XFx0LyogV2hlbiB5b3UgcnVuIGludG8gdGhpcywgYWRqdXN0IHRoZSBjb2RlIGJlbG93IGZvciB0aGUgbmV3IGZsYWcgKi9cXG45NTY1OlxcdFxcdEJVSUxEX0JVR19PTihOTDgwMjExX1NUQV9GTEFHX01BWCAhPSA4KTtcXG45NTY2OlxcdFxcbjk1Njc6XFx0XFx0c3dpdGNoICh3ZGV2LVxcdTAwM2VpZnR5cGUpIHtcXG45NTY4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6XFxuOTU2OTpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzpcXG45NTcwOlxcdFxcdFxcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cXG45NTcxOlxcdFxcdFxcdGxpbmtfaWQgPSB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyA/IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZCA6IDA7XFxuOTU3MjpcXHRcXHRcXHRpZiAoIXdkZXYtXFx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbClcXG45NTczOlxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTU3NDpcXHRcXG45NTc1OlxcdFxcdFxcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cXG45NTc2OlxcdFxcdFxcdGlmICghKHJkZXYtXFx1MDAzZXdpcGh5LmZsYWdzIFxcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcXG45NTc3OlxcdFxcdFxcdCAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkpXFxuOTU3ODpcXHRcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk1Nzk6XFx0XFxuOTU4MDpcXHRcXHRcXHQvKiBURExTIHBlZXJzIGNhbm5vdCBiZSBhZGRlZCAqL1xcbjk1ODE6XFx0XFx0XFx0aWYgKChwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpIHx8XFxuOTU4MjpcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45NTgzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1ODQ6XFx0XFx0XFx0LyogYnV0IGRvbid0IGJvdGhlciB0aGUgZHJpdmVyIHdpdGggaXQgKi9cXG45NTg1OlxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2PSB+QklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTtcXG45NTg2OlxcdFxcbjk1ODc6XFx0XFx0XFx0LyogYWxsb3cgYXV0aGVudGljYXRlZC9hc3NvY2lhdGVkIG9ubHkgaWYgZHJpdmVyIGhhbmRsZXMgaXQgKi9cXG45NTg4OlxcdFxcdFxcdGlmICghKHJkZXYtXFx1MDAzZXdpcGh5LmZlYXR1cmVzIFxcdTAwMjZcXG45NTg5OlxcdFxcdFxcdFxcdFxcdE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSkgXFx1MDAyNlxcdTAwMjZcXG45NTkwOlxcdFxcdFxcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBhdXRoX2Fzc29jKVxcbjk1OTE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU5MjpcXHRcXG45NTkzOlxcdFxcdFxcdGlmICghd2lwaHlfZXh0X2ZlYXR1cmVfaXNzZXQoXFx1MDAyNnJkZXYtXFx1MDAzZXdpcGh5LFxcbjk1OTQ6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX1NQUF9BTVNEVV9TVVBQT1JUKSBcXHUwMDI2XFx1MDAyNlxcbjk1OTU6XFx0XFx0XFx0ICAgIHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1NQUF9BTVNEVSkpXFxuOTU5NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTk3OlxcdFxcbjk1OTg6XFx0XFx0XFx0LyogT2xkZXIgdXNlcnNwYWNlLCBvciB1c2Vyc3BhY2Ugd2FudGluZyB0byBiZSBjb21wYXRpYmxlIHdpdGhcXG45NTk5OlxcdFxcdFxcdCAqICFOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUsIHdpbGwgbm90IHNldCB0aGUgYXV0aFxcbjk2MDA6XFx0XFx0XFx0ICogYW5kIGFzc29jIGZsYWdzIGluIHRoZSBtYXNrLCBidXQgYXNzdW1lcyB0aGUgc3RhdGlvbiB3aWxsIGJlXFxuOTYwMTpcXHRcXHRcXHQgKiBhZGRlZCBhcyBhc3NvY2lhdGVkIGFueXdheSBzaW5jZSB0aGlzIHdhcyB0aGUgcmVxdWlyZWQgZHJpdmVyXFxuOTYwMjpcXHRcXHRcXHQgKiBiZWhhdmlvdXIgYmVmb3JlIE5MODAyMTFfRkVBVFVSRV9GVUxMX0FQX0NMSUVOVF9TVEFURSB3YXNcXG45NjAzOlxcdFxcdFxcdCAqIGludHJvZHVjZWQuXFxuOTYwNDpcXHRcXHRcXHQgKiBJbiBvcmRlciB0byBub3QgYm90aGVyIGRyaXZlcnMgd2l0aCB0aGlzIHF1aXJrIGluIHRoZSBBUElcXG45NjA1OlxcdFxcdFxcdCAqIHNldCB0aGUgZmxhZ3MgaW4gYm90aCB0aGUgbWFzayBhbmQgc2V0IGZvciBuZXcgc3RhdGlvbnMgaW5cXG45NjA2OlxcdFxcdFxcdCAqIHRoaXMgY2FzZS5cXG45NjA3OlxcdFxcdFxcdCAqL1xcbjk2MDg6XFx0XFx0XFx0aWYgKCEocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgYXV0aF9hc3NvYykpIHtcXG45NjA5OlxcdFxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayB8PSBhdXRoX2Fzc29jO1xcbjk2MTA6XFx0XFx0XFx0XFx0cGFyYW1zLnN0YV9mbGFnc19zZXQgfD0gYXV0aF9hc3NvYztcXG45NjExOlxcdFxcdFxcdH1cXG45NjEyOlxcdFxcbjk2MTM6XFx0XFx0XFx0LyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovXFxuOTYxNDpcXHRcXHRcXHRwYXJhbXMudmxhbiA9IGdldF92bGFuKGluZm8sIHJkZXYpO1xcbjk2MTU6XFx0XFx0XFx0aWYgKElTX0VSUihwYXJhbXMudmxhbikpXFxuOTYxNjpcXHRcXHRcXHRcXHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XFxuOTYxNzpcXHRcXHRcXHRicmVhaztcXG45NjE4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDpcXG45NjE5OlxcdFxcdFxcdC8qXFxuOTYyMDpcXHRcXHRcXHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXFxuOTYyMTpcXHRcXHRcXHQgKiBsaWJlcnRhcyBkb2Vzbid0IGltcGxlbWVudCBqb2luX21lc2goKTsgaXQgY29uZmlndXJlcyB0aGVcXG45NjIyOlxcdFxcdFxcdCAqIG1lc2ggdmlhIHN5c2ZzIGFuZCBqb2lucyBpdCB3aGVuIHRoZSBjaGFubmVsIGlzIHNldCwgc29cXG45NjIzOlxcdFxcdFxcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cXG45NjI0OlxcdFxcdFxcdCAqL1xcbjk2MjU6XFx0XFx0XFx0aWYgKHJkZXYtXFx1MDAzZW9wcy1cXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbCkge1xcbjk2MjY6XFx0XFx0XFx0XFx0aWYgKCF3ZGV2LVxcdTAwM2V1Lm1lc2guY2hhbmRlZi5jaGFuKVxcbjk2Mjc6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FTkVURE9XTjtcXG45NjI4OlxcdFxcdFxcdH0gZWxzZSBpZiAoIXdkZXYtXFx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcXG45NjI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTYzMDpcXHRcXHRcXHR9XFxuOTYzMTpcXHRcXG45NjMyOlxcdFxcdFxcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXFxuOTYzMzpcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk2MzQ6XFx0XFxuOTYzNTpcXHRcXHRcXHQvKiBhc3NvY2lhdGVkIGlzIGRpc2FsbG93ZWQgKi9cXG45NjM2OlxcdFxcdFxcdGlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BU1NPQ0lBVEVEKSlcXG45NjM3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk2Mzg6XFx0XFx0XFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cXG45NjM5OlxcdFxcdFxcdGlmICgocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxcbjk2NDA6XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTY0MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjQyOlxcdFxcdFxcdGJyZWFrO1xcbjk2NDM6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOlxcbjk2NDQ6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOlxcbjk2NDU6XFx0XFx0XFx0LyogaWdub3JlIHVBUFNEIGRhdGEgKi9cXG45NjQ2OlxcdFxcdFxcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXFx1MDAyNj0gflNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7XFxuOTY0NzpcXHRcXG45NjQ4OlxcdFxcdFxcdC8qIHRoZXNlIGFyZSBkaXNhbGxvd2VkICovXFxuOTY0OTpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjZcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjUuMjg3Njg1Mjc2WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIzMzM2MTAyNDQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaWdnaW5nIGludG8gdGhlIG5sODAyMTEuYyBDb2RlKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBhYm91dCB3aXJlbGVzcyBuZXR3b3JraW5nLCBhbmQgc29tZXRoaW5nIGlzbid0IHF1aXRlIHJpZ2h0LiBUbyBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb24gdGhlIGlzc3VlLCBJIHNob3VsZCBjcm9zcy1yZWZlcmVuY2UgYSBzcGVjaWZpYyBzZWN0aW9uIG9mIHRoZSBrZXJuZWwgY29kZS4gTGV0J3MgbWFrZSBzdXJlIHdlIGV4YW1pbmUgdGhlIHBvdGVudGlhbCBpbXBhY3Qgd2l0aGluIHRoZSBgbmV0L3dpcmVsZXNzL25sODAyMTEuY2AgZmlsZS4gSSdtIGdvaW5nIHRvIGZvY3VzIGluIG9uIGxpbmVzIDk2NTAtOTY5MC4gVGhpcyByYW5nZSB0eXBpY2FsbHkgY29udGFpbnMgY3JpdGljYWwgbG9naWMgcmVsYXRlZCB0byBjZXJ0YWluIHdpcmVsZXNzIG5ldHdvcmsgb3BlcmF0aW9ucywgYW5kIGl0J3MgbGlrZWx5IHRvIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgaXNzdWUgYXQgaGFuZC4gQnkgZXhhbWluaW5nIHRoaXMgc3BlY2lmaWMgY29kZSBibG9jaywgSSBjYW4gZGV2ZWxvcCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgZnVuY3Rpb24gY2FsbHMsIGRhdGEgc3RydWN0dXJlcywgYW5kIHRoZSBmbG93IG9mIHRoZSBwcm9ncmFtIGxvZ2ljLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjAxOCwiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MjcuNjIxMjk4MjhaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAyODcwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDk2NTAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjk2NTA6XFx0XFx0XFx0XFx0XFx0KEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcXG45NjUxOlxcdFxcdFxcdFxcdFxcdCBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSkpXFxuOTY1MjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjUzOlxcdFxcdFxcdC8qIE9ubHkgVERMUyBwZWVycyBjYW4gYmUgYWRkZWQgKi9cXG45NjU0OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpXFxuOTY1NTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjU2OlxcdFxcdFxcdC8qIENhbiBvbmx5IGFkZCBpZiBURExTIC4uLiAqL1xcbjk2NTc6XFx0XFx0XFx0aWYgKCEocmRldi1cXHUwMDNld2lwaHkuZmxhZ3MgXFx1MDAyNiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpKVxcbjk2NTg6XFx0XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbjk2NTk6XFx0XFx0XFx0LyogLi4uIHdpdGggZXh0ZXJuYWwgc2V0dXAgaXMgc3VwcG9ydGVkICovXFxuOTY2MDpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mbGFncyBcXHUwMDI2IFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpXFxuOTY2MTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuOTY2MjpcXHRcXHRcXHQvKlxcbjk2NjM6XFx0XFx0XFx0ICogT2xkZXIgd3BhX3N1cHBsaWNhbnQgdmVyc2lvbnMgYWx3YXlzIG1hcmsgdGhlIFRETFMgcGVlclxcbjk2NjQ6XFx0XFx0XFx0ICogYXMgYXV0aG9yaXplZCwgYnV0IGl0IHNob3VsZG4ndCB5ZXQgYmUuXFxuOTY2NTpcXHRcXHRcXHQgKi9cXG45NjY2OlxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2PSB+QklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCk7XFxuOTY2NzpcXHRcXHRcXHRicmVhaztcXG45NjY4OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOlxcbjk2Njk6XFx0XFx0XFx0YnJlYWs7XFxuOTY3MDpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX05BTl9EQVRBOlxcbjk2NzE6XFx0XFx0XFx0cGFyYW1zLm5taV9tYWMgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKTtcXG45NjcyOlxcdFxcdFxcdGJyZWFrO1xcbjk2NzM6XFx0XFx0ZGVmYXVsdDpcXG45Njc0OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45Njc1OlxcdFxcdH1cXG45Njc2OlxcdFxcbjk2Nzc6XFx0XFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cXG45Njc4OlxcdFxcbjk2Nzk6XFx0XFx0cGFyYW1zLmVwcF9wZWVyID1cXG45NjgwOlxcdFxcdFxcdG5sYV9nZXRfZmxhZyhpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfRVBQX1BFRVJdKTtcXG45NjgxOlxcdFxcbjk2ODI6XFx0XFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXFx1MDAyNnBhcmFtcyk7XFxuOTY4MzpcXHRcXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcXG45Njg0OlxcdFxcdHJldHVybiBlcnI7XFxuOTY4NTpcXHR9XFxuOTY4NjpcXHRcXG45Njg3OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9kZWxfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjk2ODg6XFx0e1xcbjk2ODk6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjI3LjYyMjMyODU2WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjkyNTg0NTI4NzYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBDaGFuZ2VzIGFuZCBGdXp6aW5nIFBvdGVudGlhbCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIHBhdGNoIGlzIGZvY3VzZWQgb24gYG5sODAyMTFfbmV3X3N0YXRpb25gLCB3aGljaCBpbW1lZGlhdGVseSBwaXF1ZXMgbXkgaW50ZXJlc3QgYXMgYSBrbm93biBlbnRyeXBvaW50IGZvciB3aXJlbGVzcyBuZXRsaW5rIGNvbW1hbmRzLiBTcGVjaWZpY2FsbHksIHRoZSBjaGFuZ2VzIGludm9sdmU6IGlucHV0IHZhbGlkYXRpb24gb2YgYHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZGAgYWdhaW5zdCBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AsIHN0YXRlIGNoZWNrcyByZWxhdGVkIHRvIEFQL1AyUF9HTyBhbmQgTUVTSF9QT0lOVCBiZWFjb24gaW50ZXJ2YWxzLCByZW1vdmFsIG9mIGBOTDgwMjExX0lGVFlQRV9BUF9WTEFOYCBmcm9tIHRoZSBBUCBzd2l0Y2ggY2FzZSAobWVhbmluZyBBUF9WTEFOIGludGVyZmFjZXMgd2lsbCBub3cgcmV0dXJuIC1FT1BOT1RTVVBQKSwgYW5kIHJlbW92YWwgb2Ygc29tZSByZWR1bmRhbnQgbGluayBjaGVja3MuXG5cblRoZSBrZXkgcXVlc3Rpb24gaXMgYWx3YXlzOiBjYW4gd2UgZ2V0IHRvIHRoaXMgY29kZT8gQWJzb2x1dGVseS4gYG5sODAyMTFfbmV3X3N0YXRpb25gIGlzIGFuIGVudHJ5IHBvaW50IGNhbGxlZCB2aWEgdGhlIGBOTDgwMjExX0NNRF9ORVdfU1RBVElPTmAgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2UuIEdlbmVyaWMgTmV0bGluayBpcyBhIHN0YW5kYXJkIGF0dGFjayBzdXJmYWNlIGluIExpbnV4IGFuZCBpcyBkZWZpbml0ZWx5IHJlYWNoYWJsZSB0aHJvdWdoIHN0YW5kYXJkIHRlc3RpbmcsIGxpa2Ugc3l6a2FsbGVyLiBUaGlzIGlzIGV4ZWN1dGFibGUga2VybmVsIGNvZGUgd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC5cblxuRnJvbSBhIFwiV29ydGhGdXp6aW5nXCIgcGVyc3BlY3RpdmUsIHRoaXMgaXMgYSBjbGVhciB5ZXMuIFdlJ3JlIGxvb2tpbmcgYXQgYSBjb3JlIHN1YnN5c3RlbSwgdGhlIG5ldGxpbmsvY2ZnODAyMTEgd2lyZWxlc3MgbmV0bGluayBoYW5kbGVyLiBUaGUgcGF0Y2ggbW9kaWZpZXMgaW5wdXQgdmFsaWRhdGlvbiBhbmQgZXJyb3IgcmV0dXJuIHBhdGhzIGZvciBuZXRsaW5rIGNvbW1hbmRzLiBSZWFjaGFiaWxpdHkgaXMgZ3VhcmFudGVlZCB2aWEgdXNlcnNwYWNlIHRocm91Z2ggQUZfTkVUTElOSywgTkVUTElOS19HRU5FUklDLiBObyBxdWVzdGlvbiwgdGhpcyBpcyBmdXp6YWJsZS5cblxuUmVnYXJkaW5nIFwiRm9jdXNTeW1ib2xzLFwiIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyB0aGUgbW9kaWZpZWQgc3ltYm9sLiBJIHNob3VsZCBhbHNvIGNoZWNrIGl0cyBkaXJlY3QgY2FsbGVlcy4gYHJkZXZfYWRkX3N0YXRpb25gIGlzIGNhbGxlZCBmcm9tIGBubDgwMjExX25ld19zdGF0aW9uYC4gSSdsbCB3YW50IHRvIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGByZGV2X2FkZF9zdGF0aW9uYCB0byBoYXZlIGEgZnVsbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjk4OSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjM2Ljg4MDc4NDI0NloiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDUyNTM4OTMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmRldl9hZGRfc3RhdGlvblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvd2lyZWxlc3NcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3dpcmVsZXNzL25sODAyMTEuYz05MzI4PXN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbi0tXFxubmV0L3dpcmVsZXNzL25sODAyMTEuYy05NjgxLVxcbm5ldC93aXJlbGVzcy9ubDgwMjExLmM6OTY4MjpcXHRlcnIgPSByZGV2X2FkZF9zdGF0aW9uKHJkZXYsIHdkZXYsIG1hY19hZGRyLCBcXHUwMDI2cGFyYW1zKTtcXG5uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jLTk2ODMtXFx0ZGV2X3B1dChwYXJhbXMudmxhbik7XFxuLS1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaD0xODU9c3RhdGljIGlubGluZSBpbnQgcmRldl9zdG9wX2FwKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldixcXG4tLVxcbm5ldC93aXJlbGVzcy9yZGV2LW9wcy5oLTE5NC1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoxOTU6c3RhdGljIGlubGluZSBpbnQgcmRldl9hZGRfc3RhdGlvbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsXFxubmV0L3dpcmVsZXNzL3JkZXYtb3BzLmgtMTk2LVxcdFxcdFxcdFxcdCAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU4ICptYWMsXFxuLS1cXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0xOTktXFx0aW50IHJldDtcXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaDoyMDA6XFx0dHJhY2VfcmRldl9hZGRfc3RhdGlvbihcXHUwMDI2cmRldi1cXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcXG5uZXQvd2lyZWxlc3MvcmRldi1vcHMuaC0yMDEtXFx0cmV0ID0gcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbihcXHUwMDI2cmRldi1cXHUwMDNld2lwaHksIHdkZXYsIG1hYywgcGFyYW1zKTtcXG4tLVxcbm5ldC93aXJlbGVzcy90cmFjZS5oPTg2OD1ERUNMQVJFX0VWRU5UX0NMQVNTKHN0YXRpb25fYWRkX2NoYW5nZSxcXG4tLVxcbm5ldC93aXJlbGVzcy90cmFjZS5oLTk1OS1cXG5uZXQvd2lyZWxlc3MvdHJhY2UuaDo5NjA6REVGSU5FX0VWRU5UKHN0YXRpb25fYWRkX2NoYW5nZSwgcmRldl9hZGRfc3RhdGlvbixcXG5uZXQvd2lyZWxlc3MvdHJhY2UuaC05NjEtXFx0VFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgdTggKm1hYyxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6MzYuOTI2MDQ3NDNaIiwiU2VxIjoxOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDkzMDY3MDc2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgU3RhdGlvbiBIYW5kbGluZyBpbiB0aGUgbmw4MDIxMSBTdWJzeXN0ZW0qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBob3cgc3RhdGlvbnMgYXJlIGhhbmRsZWQgd2l0aGluIHRoZSBgbmw4MDIxMWAgZnJhbWV3b3JrLiBNeSBpbml0aWFsIG9ic2VydmF0aW9uIGlzIHRoYXQgYHJkZXZfYWRkX3N0YXRpb25gIGlzIGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGByZGV2LW9wcy5oYCwgd2hlcmVhcyBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgaXMgYSBzdGF0aWMgZnVuY3Rpb24gaW4gYG5sODAyMTEuY2AsIGJ1dCBpdCdzICpleHRlcm5hbGx5KiByZWZlcmVuY2VkIChzcGVjaWZpY2FsbHksIGluIGBubDgwMjExX3NtYWxsX29wc2ApLiBNeSBuZXh0IHRob3VnaHQgaXMgdG8gaW52ZXN0aWdhdGUgZnVydGhlciB3aXRoaW4gYG5sODAyMTEuY2AgaXRzZWxmLlxuXG5JIG5lZWQgdG8gY29uZmlybSB3aGV0aGVyIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludCBmb3Igc3RhdGlvbiBjcmVhdGlvbiwgb3IgaWYgdGhlcmUgYXJlIG90aGVyIHJlbGV2YW50IGZ1bmN0aW9ucyBpbiB0aGF0IGZpbGUuIEknbGwgdGFrZSBhIGxvb2sgYXQgZnVuY3Rpb25zIGxpa2UgYG5sODAyMTFfc2V0X3N0YXRpb25gIGFuZCBhbnkgb3RoZXJzIHRoYXQgZGVhbCB3aXRoIHN0YXRpb25zIHRvIHNlZSBpZiB0aGV5J3ZlIGJlZW4gcmVjZW50bHkgbW9kaWZpZWQuIEl0IHNlZW1zIHRoYXQgKm9ubHkqIGBubDgwMjExX25ld19zdGF0aW9uYCB3YXMgY2hhbmdlZC5cblxuTm93LCBsZXQncyBjb25zaWRlciB0aGUgY29uZmlndXJhdGlvbiBhc3BlY3RzLiBUaGUgY29kZSBpbiBxdWVzdGlvbiwgaW5jbHVkaW5nIGBubDgwMjExLmNgLCBpcyBvbmx5IGJ1aWx0IHdoZW4gYENPTkZJR19DRkc4MDIxMWAgaXMgZW5hYmxlZC4gSXQncyBidWlsdCBiZWNhdXNlIGBjZmc4MDIxMS15ICs9IC4uLiBubDgwMjExLm9gIGluIHRoZSByZWxldmFudCBgTWFrZWZpbGVgLiBTbywgd2hhdCBlbmFibGVzIGBDRkc4MDIxMWAgaXRzZWxmPyBJIG5lZWQgdG8gY2hlY2sgdGhlIGRlcGVuZGVuY2llcy5cblxuTGV0J3MgbG9vayBhdCBgbmV0L3dpcmVsZXNzL0tjb25maWdgLiBgY29uZmlnIENGRzgwMjExYCBkZXBlbmRzIG9uIGBSRktJTEwgfHwgIVJGS0lMTGAuIFRoYXQncyBhIGJpdCBvZGQsIHRob3VnaCBpdCBzZWVtcyBoYXJtbGVzcy4gTGV0J3Mgc2VlIGlmIHRoYXQgbW9kdWxlIGRlcGVuZHMgb24gYW55dGhpbmcsIGJ5IGxvb2tpbmcgYXQgYG5ldC9LY29uZmlnYCwgd2hpY2ggYHNvdXJjZWBzIGBuZXQvd2lyZWxlc3MvS2NvbmZpZ2AuIEknbGwgYWxzbyBnbGFuY2UgYXQgdGhlIGBuZXQvd2lyZWxlc3MvTWFrZWZpbGVgIHRvIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDM5MywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDo0MS44NTY3MjA5NjdaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjE0OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L3dpcmVsZXNzL01ha2VmaWxlXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDMwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0b2JqLSQoQ09ORklHX0NGRzgwMjExKSArPSBjZmc4MDIxMS5vXFxuICAgMzpcXHRvYmoteSArPSB0ZXN0cy9cXG4gICA0OlxcdFxcbiAgIDU6XFx0b2JqLSQoQ09ORklHX1dFWFRfQ09SRSkgKz0gd2V4dC1jb3JlLm9cXG4gICA2OlxcdG9iai0kKENPTkZJR19XRVhUX1BST0MpICs9IHdleHQtcHJvYy5vXFxuICAgNzpcXHRvYmotJChDT05GSUdfV0VYVF9QUklWKSArPSB3ZXh0LXByaXYub1xcbiAgIDg6XFx0XFxuICAgOTpcXHRjZmc4MDIxMS15ICs9IGNvcmUubyBzeXNmcy5vIHJhZGlvdGFwLm8gdXRpbC5vIHJlZy5vIHNjYW4ubyBubDgwMjExLm9cXG4gIDEwOlxcdGNmZzgwMjExLXkgKz0gbWxtZS5vIGlic3MubyBzbWUubyBjaGFuLm8gZXRodG9vbC5vIG1lc2gubyBhcC5vIHRyYWNlLm8gb2NiLm9cXG4gIDExOlxcdGNmZzgwMjExLXkgKz0gbWljaGFlbC1taWMubyBwbXNyLm9cXG4gIDEyOlxcdGNmZzgwMjExLSQoQ09ORklHX09GKSArPSBvZi5vXFxuICAxMzpcXHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9ERUJVR0ZTKSArPSBkZWJ1Z2ZzLm9cXG4gIDE0OlxcdGNmZzgwMjExLSQoQ09ORklHX0NGRzgwMjExX1dFWFQpICs9IHdleHQtY29tcGF0Lm8gd2V4dC1zbWUub1xcbiAgMTU6XFx0XFxuICAxNjpcXHRDRkxBR1NfdHJhY2UubyA6PSAtSSQoc3JjKVxcbiAgMTc6XFx0XFxuICAxODpcXHRjZmc4MDIxMS0kKENPTkZJR19DRkc4MDIxMV9VU0VfS0VSTkVMX1JFR0RCX0tFWVMpICs9IHNoaXBwZWQtY2VydHMub1xcbiAgMTk6XFx0aWZuZXEgKCQoQ09ORklHX0NGRzgwMjExX0VYVFJBX1JFR0RCX0tFWURJUiksKVxcbiAgMjA6XFx0Y2ZnODAyMTEteSArPSBleHRyYS1jZXJ0cy5vXFxuICAyMTpcXHRlbmRpZlxcbiAgMjI6XFx0XFxuICAyMzpcXHQkKG9iaikvc2hpcHBlZC1jZXJ0cy5jOiAkKHNvcnQgJCh3aWxkY2FyZCAkKHNyYykvY2VydHMvKi5oZXgpKVxcbiAgMjQ6XFx0XFx0QCQoa2VjaG8pIFxcXCIgIEdFTiAgICAgJEBcXFwiXFxuICAyNTpcXHRcXHQkKFEpKGVjaG8gJyNpbmNsdWRlIFxcXCJyZWcuaFxcXCInOyBcXFxcXFxuICAyNjpcXHRcXHQgIGVjaG8gJ2NvbnN0IHU4IHNoaXBwZWRfcmVnZGJfY2VydHNbXSA9IHsnOyBcXFxcXFxuICAyNzpcXHRcXHQgIGVjaG8gfCBjYXQgLSAkXiA7IFxcXFxcXG4gIDI4OlxcdFxcdCAgZWNobyAnfTsnOyBcXFxcXFxuICAyOTpcXHRcXHQgIGVjaG8gJ3Vuc2lnbmVkIGludCBzaGlwcGVkX3JlZ2RiX2NlcnRzX2xlbiA9IHNpemVvZihzaGlwcGVkX3JlZ2RiX2NlcnRzKTsnOyBcXFxcXFxuICAzMDpcXHRcXHQgKSBcXHUwMDNlICRAXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjQxLjg1Njc4MzgzN1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNzQ2MTY3NDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBDb2RlIE1vZGlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIEkgc2VlIHRoYXQgYG9iai0kKENPTkZJR19DRkc4MDIxMSkgKz0gY2ZnODAyMTEub2AgYW5kIGBjZmc4MDIxMS15ICs9IC4uLiBubDgwMjExLm9gLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIEFuZCwgY3J1Y2lhbGx5LCBgQ09ORklHX05MODAyMTFfVEVTVE1PREVgIGlzbid0IGEgZ2F0aW5nIGZhY3RvciBmb3IgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBUaGF0IHN0cm9uZ2x5IHN1Z2dlc3RzIHRoZSBwcmltYXJ5IGNvbmZpZ3VyYXRpb24gb3B0aW9uIEkgbmVlZCB0byBiZSBhd2FyZSBvZiBoZXJlIGlzIGBDRkc4MDIxMWAuXG5cbkxldCBtZSBqdXN0IHF1aWNrbHkgY29uZmlybSB0aGVyZSBhcmVuJ3QgYW55IG90aGVyIHN1YnRsZSBjb25maWcgc3ltYm9scyBvciBjb25maWd1cmF0aW9ucyBpbnZvbHZlZCBoZXJlLlxuXG5BbHJpZ2h0LCB0aGUgYEZvY3VzU3ltYm9sc2AgYXJlIGluZGVlZCBqdXN0IGBubDgwMjExX25ld19zdGF0aW9uYCwgYW5kIHRoZSBgRW5hYmxlQ29uZmlnc2AgYXJlIGNvcnJlY3RseSBwb2ludGluZyB0byBgQ0ZHODAyMTFgLCBhcyBleHBlY3RlZC4gR29vZC5cblxuVGhlIHJlYXNvbmluZyBwcm92aWRlZCBjbGFyaWZpZXMgdGhhdCB0aGlzIHBhdGNoIGlzIHRvdWNoaW5nIHRoZSBzdGF0aW9uIGFkZGl0aW9uIGhhbmRsZXIsIGBubDgwMjExX25ld19zdGF0aW9uYCwgd2l0aGluIHRoZSBgY2ZnODAyMTFgIHdpcmVsZXNzIGNvbmZpZyBuZXRsaW5rIEFQSS4gSXQgbG9va3MgbGlrZSB0aGV5J3JlIHRpZ2h0ZW5pbmcgdXAgdmFsaWRhdGlvbiBvbiB0aGUgbGluayBJRCBhbmQgYWRkaW5nIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIEFQIG9yIG1lc2ggaXMgdXAgYW5kIHJ1bm5pbmcgYmVmb3JlIGFsbG93aW5nIGEgc3RhdGlvbiB0byBiZSBhZGRlZC4gVGhpcyBpcyBhIHBvdGVudGlhbCBhdHRhY2sgc3VyZmFjZSBiZWNhdXNlIGl0J3MgaGFuZGxpbmcgdW50cnVzdGVkIHVzZXItc3BhY2UgaW5wdXQgdmlhIEdlbmVyaWMgTmV0bGluayAoTkw4MDIxMSkuXG5cbkV4Y2VsbGVudC4gTXkgYW5hbHlzaXMgY29uZmlybXMgZXZlcnl0aGluZy4gSSdtIHNhdGlzZmllZC4gTGV0J3MgbW92ZSBvbiB0byB0aGUgbmV4dCBzdGVwIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1ODE5LCJPdXRwdXRUb2tlbnMiOjEzOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI1NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIwOjQ1LjYwMjk1MzQwNVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgwNTQwNDM4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJDRkc4MDIxMVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5sODAyMTFfbmV3X3N0YXRpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgc3RhdGlvbiBhZGRpdGlvbiBoYW5kbGVyIG5sODAyMTFfbmV3X3N0YXRpb24oKSBpbiB0aGUgY2ZnODAyMTEgd2lyZWxlc3MgY29uZmlndXJhdGlvbiBzdWJzeXN0ZW0uIEl0IG1vdmVzIGxpbmsgSUQgdmFsaWRhdGlvbiBlYXJsaWVyIGFuZCBpbnRyb2R1Y2VzIG5ldyBpbnRlcmZhY2Ugc3RhdGUgdmFsaWRhdGlvbnMgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBmb3IgQVAvUDJQX0dPIGFuZCBtZXNoIGludGVyZmFjZXMpIGJlZm9yZSBhbGxvd2luZyBhIG5ldyBzdGF0aW9uIHRvIGJlIHJlZ2lzdGVyZWQuIFRoaXMgaXMgcmVhY2hhYmxlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyB2aWEgbmw4MDIxMSBHZW5lcmljIE5ldGxpbmsgbWVzc2FnZXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQ0ZHODAyMTFcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJubDgwMjExX25ld19zdGF0aW9uXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIHN0YXRpb24gYWRkaXRpb24gaGFuZGxlciBubDgwMjExX25ld19zdGF0aW9uKCkgaW4gdGhlIGNmZzgwMjExIHdpcmVsZXNzIGNvbmZpZ3VyYXRpb24gc3Vic3lzdGVtLiBJdCBtb3ZlcyBsaW5rIElEIHZhbGlkYXRpb24gZWFybGllciBhbmQgaW50cm9kdWNlcyBuZXcgaW50ZXJmYWNlIHN0YXRlIHZhbGlkYXRpb25zIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgZm9yIEFQL1AyUF9HTyBhbmQgbWVzaCBpbnRlcmZhY2VzKSBiZWZvcmUgYWxsb3dpbmcgYSBuZXcgc3RhdGlvbiB0byBiZSByZWdpc3RlcmVkLiBUaGlzIGlzIHJlYWNoYWJsZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgdmlhIG5sODAyMTEgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMDo0NS42ODM1MDAwNzNaIiwiU2VxIjoyMywiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJJZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NDAxNDg5MDcyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6NDUuNjgzOTcxNDEzWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NDU0MDEwMTMyNzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rc2ApLlxcblxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cXG4yLiBUaGUgbmV3bHkgaW50cm9kdWNlZCBsb2NhbCB2YXJpYWJsZSBgbGlua19pZGAgaXMgYXNzaWduZWQgYmVmb3JlIHVzZS5cXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxcblxcblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNjk4ZDQ0OGVjYWU2MWZkODk3MTNjYWFlOGM3N2JlNjA4N2RhZmZlM1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDEwIDA5OjE5OjUwIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmNcbmluZGV4IDg5OWI2Mzc0YzU1MDYuLmZjYTE5ZTFkMGM5YWIgMTAwNjQ0XG4tLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG4rKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXG5AQCAtOTMyOCw3ICs5MzI4LDcgQEAgc3RhdGljIGludCBubDgwMjExX3NldF9zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4ge1xuIFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cdTAwM2V1c2VyX3B0clswXTtcbi1cdGludCBlcnI7XG4rXHRpbnQgZXJyLCBsaW5rX2lkO1xuIFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXHUwMDNldXNlcl9wdHJbMV07XG4gXHRzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2Rldi1cdTAwM2VuZXRkZXY7XG4gXHRzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzIHBhcmFtcztcbkBAIC05Mzc2LDYgKzkzNzYsMTYgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxuIFx0XHRubDgwMjExX2xpbmtfaWRfb3JfaW52YWxpZChpbmZvLVx1MDAzZWF0dHJzKTtcbiBcbitcdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG4rXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcbitcdFx0XHRyZXR1cm4gLUVOT0xJTks7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMClcbitcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcbiBcdGlmIChpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcbiBcdFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pO1xuIFx0XHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcbkBAIC05NTU2LDggKzk1NjYsMTIgQEAgc3RhdGljIGludCBubDgwMjExX25ld19zdGF0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pXG4gXG4gXHRzd2l0Y2ggKHdkZXYtXHUwMDNlaWZ0eXBlKSB7XG4gXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxuLVx0Y2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOlxuIFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XG4rXHRcdC8qIEFkZCBhIG5ldyBzdGF0aW9uIG9ubHkgYWZ0ZXIgdGhlIEFQIGFuZCBsaW5rIGhhcyBiZWVuIHN0YXJ0ZWQgKi9cbitcdFx0bGlua19pZCA9IHdkZXYtXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xuK1x0XHRpZiAoIXdkZXYtXHUwMDNlbGlua3NbbGlua19pZF0uYXAuYmVhY29uX2ludGVydmFsKVxuK1x0XHRcdHJldHVybiAtRU5FVERPV047XG4rXG4gXHRcdC8qIGlnbm9yZSBXTUUgYXR0cmlidXRlcyBpZiBpZmFjZS9zdGEgaXMgbm90IGNhcGFibGUgKi9cbiBcdFx0aWYgKCEocmRldi1cdTAwM2V3aXBoeS5mbGFncyBcdTAwMjYgV0lQSFlfRkxBR19BUF9VQVBTRCkgfHxcbiBcdFx0ICAgICEocGFyYW1zLnN0YV9mbGFnc19zZXQgXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxuQEAgLTk2MDIsNiArOTYxNiwxOSBAQCBzdGF0aWMgaW50IG5sODAyMTFfbmV3X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbiBcdFx0XHRyZXR1cm4gUFRSX0VSUihwYXJhbXMudmxhbik7XG4gXHRcdGJyZWFrO1xuIFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOlxuK1x0XHQvKlxuK1x0XHQgKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBtZXNoIGhhcyBiZWVuIHN0YXJ0ZWQuXG4rXHRcdCAqIGxpYmVydGFzIGRvZXNuJ3QgaW1wbGVtZW50IGpvaW5fbWVzaCgpOyBpdCBjb25maWd1cmVzIHRoZVxuK1x0XHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXG4rXHRcdCAqIHVzZSB0aGF0IGFzIHRoZSBzdGFydGVkIGluZGljYXRpb24gaW5zdGVhZC5cbitcdFx0ICovXG4rXHRcdGlmIChyZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsKSB7XG4rXHRcdFx0aWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5jaGFuZGVmLmNoYW4pXG4rXHRcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuK1x0XHR9IGVsc2UgaWYgKCF3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWwpIHtcbitcdFx0XHRyZXR1cm4gLUVORVRET1dOO1xuK1x0XHR9XG4rXG4gXHRcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXG4gXHRcdHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcbiBcbkBAIC05NjQ5LDI3ICs5Njc2LDEwIEBAIHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxuIFxuIFx0LyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi9cbiBcbi1cdGlmICh3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzKSB7XG4tXHRcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXHUwMDNjIDApIHtcbi1cdFx0XHRlcnIgPSAtRUlOVkFMO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHRcdGlmICghKHdkZXYtXHUwMDNldmFsaWRfbGlua3MgXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSkge1xuLVx0XHRcdGVyciA9IC1FTk9MSU5LO1xuLVx0XHRcdGdvdG8gb3V0O1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFx1MDAzZT0gMCkge1xuLVx0XHRcdGVyciA9IC1FSU5WQUw7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cdH1cbi1cbiBcdHBhcmFtcy5lcHBfcGVlciA9XG4gXHRcdG5sYV9nZXRfZmxhZyhpbmZvLVx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9FUFBfUEVFUl0pO1xuIFxuIFx0ZXJyID0gcmRldl9hZGRfc3RhdGlvbihyZGV2LCB3ZGV2LCBtYWNfYWRkciwgXHUwMDI2cGFyYW1zKTtcbi1vdXQ6XG4gXHRkZXZfcHV0KHBhcmFtcy52bGFuKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjA6NDUuNjgzOTcyNDYyWiIsIlNlcSI6MjUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0NDI1ODc5NzE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIEtNU0FOIEZ1enppbmcgUG90ZW50aWFsKipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQgZGVjaWRlIGlmIGl0J3Mgd29ydGggdGhyb3dpbmcgYSBLTVNBTiBmdXp6aW5nIHNlc3Npb24gYXQgaXQuIFRoZSBjaGFuZ2VzIGFyZSBmb2N1c2VkIG9uIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgZnVuY3Rpb24gd2l0aGluIGBuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jYC5cblxuSXQgbG9va3MgbGlrZSB0aGUgcHJpbWFyeSBmb2N1cyBoZXJlIGlzIHRpZ2h0ZW5pbmcgdXAgc29tZSBjaGVja3MgcmVsYXRlZCB0byB2YWxpZCBsaW5rcyBhbmQgbWVzaCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLiBTcGVjaWZpY2FsbHk6XG5cbjEuICBXZSd2ZSBnb3QgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgIGNoZWNrcyBiZWluZyBwZXJmb3JtZWQgZWFybGllciBpbiB0aGUgZnVuY3Rpb24gbm93LiBJdCdzIGVzc2VudGlhbGx5IG1vdmluZyB0aGUgbGluayBJRCB2YWxpZGl0eSBjaGVjayB1cCwgcmlnaHQgYWZ0ZXIgdGhlIHBhcnNpbmcgb2YgYHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19pZGAuIFNtYXJ0LCBjb3VsZCBoYXZlIGJlZW4gYW4gZWRnZSBjYXNlIGJlZm9yZS5cblxuMi4gIFdpdGhpbiB0aGUgYE5MODAyMTFfSUZUWVBFX0FQYCBhbmQgYE5MODAyMTFfSUZUWVBFX1AyUF9HT2AgYmxvY2tzLCBpdCBhcHBlYXJzIHRoYXQgYE5MODAyMTFfSUZUWVBFX0FQX1ZMQU5gIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZmFsbHRocm91Z2gsIGFuZCB3ZSd2ZSBhZGRlZCBhIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBiZWFjb24gaW50ZXJ2YWwgaXMgc2V0IGZvciB2YWxpZCBsaW5rcy4gSXQncyB3b3J0aCBkaWdnaW5nIGludG8gd2hlcmUgQVBfVkxBTiBpcyBjdXJyZW50bHkgaGFuZGxlZCwganVzdCB0byBiZSBzdXJlIG5vdGhpbmcncyBiZWVuIGJyb2tlbiwgb3IgdGhhdCBpdCB3YXNuJ3QgcHJldmlvdXNseSBoYW5kbGVkLlxuXG4zLiAgRm9yIGBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UYCwgdGhlcmUgYXJlIG5ldyBjaGVja3MgcmVsYXRlZCB0byB0aGUgbWVzaCBjaGFubmVsIGJlaW5nIHNldCBiYXNlZCBvbiBgcmRldi1cdTAwM2VvcHMtXHUwMDNlbGliZXJ0YXNfc2V0X21lc2hfY2hhbm5lbGAgZXhpc3RlbmNlLiBJZiB0aGF0J3MgYXZhaWxhYmxlLCBhbmQgYSBjaGFubmVsIGlzbid0IGRlZmluZWQsIHJldHVybiBgRU5FVERPV05gLiBPdGhlcndpc2UsIGlmIHRoYXQgZG9lc24ndCBleGlzdCwgd2UgbXVzdCBjaGVjayB0aGF0IGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgIGlzIHZhbGlkLCBhbHNvIHJldHVybmluZyBgRU5FVERPV05gIGlmIHRoYXQncyBub3QgdGhlIGNhc2UuIFRoaXMgbG9va3MgbGlrZSBhIHBvdGVudGlhbGx5IGdvb2Qgc3BvdCBmb3Igc29tZSBmdXp6aW5nLlxuXG40LiAgVGhlcmUncyBhbHNvIGEgY2xlYW51cCBvZiBzb21lIGR1cGxpY2F0ZSBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AgY2hlY2tzIGFuZCBgZ290byBvdXQ7YCBsYWJlbHMsIHdoaWNoIHN1Z2dlc3RzIHNvbWUgY29kZSB3YXMgbWFkZSBjbGVhbmVyLiBJdCBtZW50aW9ucyB0aGVyZSdzIGEgZ3VhcmQgZWFybHkgcmV0dXJuIGR1ZSB0byB0aGUgYHBhcmFtcy52bGFuYCBub3QgYmVpbmcgYWNxdWlyZWQgYXQgdGhhdCBwb2ludCwgZW5zdXJpbmcgdGhhdCB3ZSBkb24ndCBuZWVkIGEgYGRldl9wdXRgIGNhbGwuIExhdGVyLCB0aGUgY2FsbCB0byBgcmRldl9hZGRfc3RhdGlvbmAgdGFrZXMgY2FyZSBvZiB0aGUgY2xlYW51cC4gVGhpcyBtYWtlcyBpdCBsb29rIGxpa2UgdGhlcmUgd2VyZSBzb21lIGZsb3cgaW1wcm92ZW1lbnRzLCB0aGF0IG1heSBoYXZlIGJlZW4gZHVlIHRvIGVycm9yIG1hbmFnZW1lbnQgY2hhbmdlcy5cblxuQmVmb3JlIEkgY29tbWl0IHRvIGZ1enppbmcsIEknbSBnb2luZyB0byBxdWlja2x5IHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBicm9hZGVyIGNvbnRleHQgb2YgYG5sODAyMTFfbmV3X3N0YXRpb25gLiBJJ2xsIGByZWFkLWZpbGVgIHRoYXQgZnVuY3Rpb24gYWdhaW4gb3IgdXNlIGEgcXVpY2sgYGdyZXBwZXJgIHNlYXJjaCB0byByZWZyZXNoLiBUaGUgbmV3IGNoZWNrcyBjb3VsZCBpbnRyb2R1Y2Ugc3VidGxlIGlzc3VlcyBpZiB0aGV5J3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgc28gSSdsbCB3YW50IHRvIG1ha2Ugc3VyZSBJJ3ZlIGdvdCBhIGdvb2QgbWVudGFsIG1hcCBvZiB0aGUgc3Vycm91bmRpbmcgY29kZS4gTXkgZ3V0IHNheXMgdGhpcyBpcyB3b3J0aCBhIGNsb3NlciBsb29rIHdpdGggS01TQU4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMyNTQsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MjQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMTowMC4xMDk4NTU3MzFaIiwiU2VxIjoyNiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEzNTc5OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvd2lyZWxlc3Mvbmw4MDIxMS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDkzMjgsXG4gIFwiTGluZUNvdW50XCI6IDEwMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI5MzI4OlxcdHN0YXRpYyBpbnQgbmw4MDIxMV9uZXdfc3RhdGlvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKVxcbjkzMjk6XFx0e1xcbjkzMzA6XFx0XFx0c3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby1cXHUwMDNldXNlcl9wdHJbMF07XFxuOTMzMTpcXHRcXHRpbnQgZXJyLCBsaW5rX2lkO1xcbjkzMzI6XFx0XFx0c3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tXFx1MDAzZXVzZXJfcHRyWzFdO1xcbjkzMzM6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHdkZXYtXFx1MDAzZW5ldGRldjtcXG45MzM0OlxcdFxcdHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgcGFyYW1zO1xcbjkzMzU6XFx0XFx0dTggKm1hY19hZGRyID0gTlVMTDtcXG45MzM2OlxcdFxcdHUzMiBhdXRoX2Fzc29jID0gQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgfFxcbjkzMzc6XFx0XFx0XFx0XFx0IEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpO1xcbjkzMzg6XFx0XFxuOTMzOTpcXHRcXHRtZW1zZXQoXFx1MDAyNnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpO1xcbjkzNDA6XFx0XFxuOTM0MTpcXHRcXHRpZiAoIWRldiBcXHUwMDI2XFx1MDAyNiB3ZGV2LVxcdTAwM2VpZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKVxcbjkzNDI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM0MzpcXHRcXG45MzQ0OlxcdFxcdGlmICghcmRldi1cXHUwMDNlb3BzLVxcdTAwM2VhZGRfc3RhdGlvbilcXG45MzQ1OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG45MzQ2OlxcdFxcbjkzNDc6XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSlcXG45MzQ4OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNDk6XFx0XFxuOTM1MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiB8fFxcbjkzNTE6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTI6XFx0XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSlcXG45MzUzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNTQ6XFx0XFx0XFx0aWYgKHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjkzNTU6XFx0XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTkFOX05NSV9NQUNdKVxcbjkzNTY6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM1NzpcXHRcXG45MzU4OlxcdFxcdFxcdFxcdC8qIE9ubHkgTk1JIHN0YXRpb25zIHJlY2VpdmUgdGhlIEhUL1ZIVC9IRSBjYXBhYmlsaXRpZXMgKi9cXG45MzU5OlxcdFxcdFxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0gfHxcXG45MzYwOlxcdFxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkhUX0NBUEFCSUxJVFldIHx8XFxuOTM2MTpcXHRcXHRcXHRcXHQgICAgaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX0hFX0NBUEFCSUxJVFldKVxcbjkzNjI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM2MzpcXHRcXHRcXHR9XFxuOTM2NDpcXHRcXHR9IGVsc2Uge1xcbjkzNjU6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pXFxuOTM2NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzY3OlxcdFxcbjkzNjg6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pXFxuOTM2OTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45MzcwOlxcdFxcbjkzNzE6XFx0XFx0XFx0aWYgKCFpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0FJRF0gXFx1MDAyNlxcdTAwMjZcXG45MzcyOlxcdFxcdFxcdCAgICAhaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSlcXG45MzczOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjkzNzQ6XFx0XFx0fVxcbjkzNzU6XFx0XFxuOTM3NjpcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgPVxcbjkzNzc6XFx0XFx0XFx0bmw4MDIxMV9saW5rX2lkX29yX2ludmFsaWQoaW5mby1cXHUwMDNlYXR0cnMpO1xcbjkzNzg6XFx0XFxuOTM3OTpcXHRcXHRpZiAod2Rldi1cXHUwMDNldmFsaWRfbGlua3MpIHtcXG45MzgwOlxcdFxcdFxcdGlmIChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgXFx1MDAzYyAwKVxcbjkzODE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM4MjpcXHRcXHRcXHRpZiAoISh3ZGV2LVxcdTAwM2V2YWxpZF9saW5rcyBcXHUwMDI2IEJJVChwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQpKSlcXG45MzgzOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTElOSztcXG45Mzg0OlxcdFxcdH0gZWxzZSB7XFxuOTM4NTpcXHRcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIFxcdTAwM2U9IDApXFxuOTM4NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45Mzg3OlxcdFxcdH1cXG45Mzg4OlxcdFxcbjkzODk6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9NTERfQUREUl0pIHtcXG45MzkwOlxcdFxcdFxcdG1hY19hZGRyID0gbmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01MRF9BRERSXSk7XFxuOTM5MTpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLm1sZF9tYWMgPSBtYWNfYWRkcjtcXG45MzkyOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMgPVxcbjkzOTM6XFx0XFx0XFx0XFx0bmxhX2RhdGEoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX01BQ10pO1xcbjkzOTQ6XFx0XFx0XFx0aWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHBhcmFtcy5saW5rX3N0YV9wYXJhbXMubGlua19tYWMpKVxcbjkzOTU6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTM5NjpcXHRcXHR9IGVsc2Uge1xcbjkzOTc6XFx0XFx0XFx0bWFjX2FkZHIgPSBubGFfZGF0YShpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSk7XFxuOTM5ODpcXHRcXHR9XFxuOTM5OTpcXHRcXG45NDAwOlxcdFxcdGlmIChpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pIHtcXG45NDAxOlxcdFxcdFxcdHBhcmFtcy5saW5rX3N0YV9wYXJhbXMuc3VwcG9ydGVkX3JhdGVzID1cXG45NDAyOlxcdFxcdFxcdFxcdG5sYV9kYXRhKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVEVEX1JBVEVTXSk7XFxuOTQwMzpcXHRcXHRcXHRwYXJhbXMubGlua19zdGFfcGFyYW1zLnN1cHBvcnRlZF9yYXRlc19sZW4gPVxcbjk0MDQ6XFx0XFx0XFx0XFx0bmxhX2xlbihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX1NVUFBPUlRFRF9SQVRFU10pO1xcbjk0MDU6XFx0XFx0fVxcbjk0MDY6XFx0XFxuOTQwNzpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9MSVNURU5fSU5URVJWQUxdKVxcbjk0MDg6XFx0XFx0XFx0cGFyYW1zLmxpc3Rlbl9pbnRlcnZhbCA9XFxuOTQwOTpcXHRcXHRcXHRcXHRubGFfZ2V0X3UxNihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfU1RBX0xJU1RFTl9JTlRFUlZBTF0pO1xcbjk0MTA6XFx0XFxuOTQxMTpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1ZMQU5fSURdKVxcbjk0MTI6XFx0XFx0XFx0cGFyYW1zLnZsYW5faWQgPSBubGFfZ2V0X3UxNihpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfVkxBTl9JRF0pO1xcbjk0MTM6XFx0XFxuOTQxNDpcXHRcXHRpZiAoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9TVVBQT1JUX1AyUF9QU10pIHtcXG45NDE1OlxcdFxcdFxcdHBhcmFtcy5zdXBwb3J0X3AycF9wcyA9XFxuOTQxNjpcXHRcXHRcXHRcXHRubGFfZ2V0X3U4KGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9TVEFfU1VQUE9SVF9QMlBfUFNdKTtcXG45NDE3OlxcdFxcdH0gZWxzZSB7XFxuOTQxODpcXHRcXHRcXHQvKlxcbjk0MTk6XFx0XFx0XFx0ICogaWYgbm90IHNwZWNpZmllZCwgYXNzdW1lIGl0J3Mgc3VwcG9ydGVkIGZvciBQMlAgR08gaW50ZXJmYWNlLFxcbjk0MjA6XFx0XFx0XFx0ICogYW5kIGlzIE5PVCBzdXBwb3J0ZWQgZm9yIEFQIGludGVyZmFjZVxcbjk0MjE6XFx0XFx0XFx0ICovXFxuOTQyMjpcXHRcXHRcXHRwYXJhbXMuc3VwcG9ydF9wMnBfcHMgPVxcbjk0MjM6XFx0XFx0XFx0XFx0d2Rldi1cXHUwMDNlaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTztcXG45NDI0OlxcdFxcdH1cXG45NDI1OlxcdFxcbjk0MjY6XFx0XFx0aWYgKGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTQyNzpcXHRcXHRcXHRwYXJhbXMuYWlkID0gbmxhX2dldF91MTYoaW5mby1cXHUwMDNlYXR0cnNbTkw4MDIxMV9BVFRSX1BFRVJfQUlEXSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAwLjExMDk5NDIzWiIsIlNlcSI6MjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM2ODMyMzg5NjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duLCBhc3N1bWluZyBJJ20gYW4gZXhwZXJ0IGluIHRoaXMgZmllbGQ6XG5cbioqQW5hbHl6aW5nIHRoZSBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgRnVuY3Rpb24qKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGludG8gdGhlIHJlc3Qgb2YgdGhlIGBubDgwMjExX25ld19zdGF0aW9uYCBmdW5jdGlvbi4gSSBhbHJlYWR5IGhhdmUgYSBwcmV0dHkgZ29vZCBtZW50YWwgbW9kZWwgb2YgdGhlIGdlbmVyYWwgZmxvdywgYnV0IHVuZGVyc3RhbmRpbmcgdGhlIG51YW5jZXMgaXMgY3J1Y2lhbC4gSSdtIGZvY3VzaW5nIG5vdyBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoaXMgcm91dGluZS4gSSdtIGxvb2tpbmcgZm9yIHdoZXJlIGl0IGhhbmRsZXMgdGhlIGFjdHVhbCBzdGF0aW9uIGNyZWF0aW9uLCB3aGF0IHJlc291cmNlcyBhcmUgYWxsb2NhdGVkLCBhbmQgaG93IHRoZSB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcyBhcmUgaW5pdGlhbGl6ZWQuIEkgbmVlZCB0byBpZGVudGlmeSBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBvciBsb2NraW5nIGlzc3Vlcywgb2YgY291cnNlLCB0aGF0IGNvdWxkIHBvcCB1cCB3aGVuIG11bHRpcGxlIHRocmVhZHMgbWlnaHQgYmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9yIG90aGVycyB0aGF0IG9wZXJhdGUgb24gdGhpcyBkYXRhLlxuXG5JJ20gY2hlY2tpbmcgaWYgdGhlcmUgaXMgYW55IGluaXRpYWwgY29uZmlndXJhdGlvbiBjaGVja3MuIEZvciBleGFtcGxlLCBpcyB0aGVyZSBhIG1heGltdW0gbnVtYmVyIG9mIHN0YXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcj8gVGhhdCdzIGEgZ29vZCBvbmUgdG8gbG9vayBmb3IuIEFuZCBpZiBzbywgaG93IGlzIHRoZSBsaW1pdCBlbmZvcmNlZD8gQXJlIHRoZXJlIGFueSBzYW5pdHkgY2hlY2tzIG9uIHRoZSBpbnB1dCBwYXJhbWV0ZXJzPyBJIGV4cGVjdCB0byBzZWUgY2hlY2tzIG9uIHRoZSBNQUMgYWRkcmVzcywgdGhlIGludGVyZmFjZSBpbmRleCwgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCdzIHBhc3NlZCBpbiBmcm9tIHRoZSBuZXRsaW5rIG1lc3NhZ2UuXG5cbkknbSBrZWVwaW5nIGFuIGV5ZSBvdXQgZm9yIGhvdyB0aGlzIGZ1bmN0aW9uIGludGVyYWN0cyB3aXRoIHRoZSBleGlzdGluZyBzdGF0aW9uIG1hbmFnZW1lbnQgZGF0YSBzdHJ1Y3R1cmVzLiBBcmUgbmV3IHN0YXRpb24gZW50cmllcyBhZGRlZCB0byBhIGxpbmtlZCBsaXN0LCBhIGhhc2ggdGFibGUsIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBXaGF0IGxvY2tpbmcgbWVjaGFuaXNtcyBhcmUgZW1wbG95ZWQgdG8gcHJvdGVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBjb25jdXJyZW50IGFjY2Vzcz8gSSdtIGhvcGluZyB0byBzZWUgYSB3ZWxsLWRlZmluZWQgbG9ja2luZyBzY2hlbWUgdXNpbmcgcmVhZC13cml0ZSBsb2NrcyBvciBtdXRleGVzIHRvIHByb3ZpZGUgc2FmZSBvcGVyYXRpb25zLlxuXG5JJ20gYWxzbyBwYXlpbmcgY2xvc2UgYXR0ZW50aW9uIHRvIGFueSBlcnJvciBoYW5kbGluZy4gV2hhdCBoYXBwZW5zIGlmIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlscyAoZS5nLiwgbWVtb3J5IGFsbG9jYXRpb24pPyBIb3cgYXJlIGVycm9ycyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2U/IEFyZSB0aGVyZSBwcm9wZXIgZXJyb3IgY29kZXMgdXNlZD8gSSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgcm9idXN0LlxuXG5GaW5hbGx5LCBJJ20gZXhhbWluaW5nIGFueSBob29rcyBvciBjYWxsYmFja3MgdGhhdCBhcmUgdHJpZ2dlcmVkIGR1cmluZyBzdGF0aW9uIGNyZWF0aW9uLiBBcmUgdGhlcmUgYW55IG5vdGlmaWNhdGlvbnMgc2VudCB0byBvdGhlciBwYXJ0cyBvZiB0aGUgd2lyZWxlc3Mgc3RhY2ssIGxpa2UgdGhlIG1hYzgwMjExIGxheWVyLCBvciBtYXliZSB0byB1c2VyIHNwYWNlIHZpYSBuZXRsaW5rPyBJdCdzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoZSBmdWxsIHN5c3RlbSBpbXBhY3Qgb2YgdGhpcyBmdW5jdGlvbi4gSSBhbSBhbHdheXMgdHJ5aW5nIHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiB3aWxsIGludGVyYWN0IHdpdGggdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjYzNTgsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAzLjc5NDIzNzI5OFoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjc4NDMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC93aXJlbGVzcy9ubDgwMjExLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTU1MCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjk1NTA6XFx0XFx0ICAgIHdkZXYtXFx1MDAzZWlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9OQU5fREFUQSkge1xcbjk1NTE6XFx0XFx0XFx0aWYgKHBhcmFtcy5zdGFfbW9kaWZ5X21hc2sgXFx1MDAyNiBTVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEKVxcbjk1NTI6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU1MzpcXHRcXHRcXHQvKiBOQU4gTk1JIHN0YXRpb24gbXVzdCBiZSBhZGRlZCBpbiBhc3NvY2lhdGVkIG9yIGF1dGhvcml6ZWQgc3RhdGUgKi9cXG45NTU0OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgKEJJVChOTDgwMjExX1NUQV9GTEFHX0FTU09DSUFURUQpIHxcXG45NTU1OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSkpXFxuOTU1NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTU3OlxcdFxcdH1cXG45NTU4OlxcdFxcbjk1NTk6XFx0XFx0LyogRW5zdXJlIHRoYXQgSFQvVkhUIGNhcGFiaWxpdGllcyBhcmUgbm90IHNldCBmb3IgNiBHSHogSEUgU1RBICovXFxuOTU2MDpcXHRcXHRpZiAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5oZV82Z2h6X2NhcGEgXFx1MDAyNlxcdTAwMjZcXG45NTYxOlxcdFxcdCAgICAocGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5odF9jYXBhIHx8IHBhcmFtcy5saW5rX3N0YV9wYXJhbXMudmh0X2NhcGEpKVxcbjk1NjI6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU2MzpcXHRcXG45NTY0OlxcdFxcdC8qIFdoZW4geW91IHJ1biBpbnRvIHRoaXMsIGFkanVzdCB0aGUgY29kZSBiZWxvdyBmb3IgdGhlIG5ldyBmbGFnICovXFxuOTU2NTpcXHRcXHRCVUlMRF9CVUdfT04oTkw4MDIxMV9TVEFfRkxBR19NQVggIT0gOCk7XFxuOTU2NjpcXHRcXG45NTY3OlxcdFxcdHN3aXRjaCAod2Rldi1cXHUwMDNlaWZ0eXBlKSB7XFxuOTU2ODpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX0FQOlxcbjk1Njk6XFx0XFx0Y2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086XFxuOTU3MDpcXHRcXHRcXHQvKiBBZGQgYSBuZXcgc3RhdGlvbiBvbmx5IGFmdGVyIHRoZSBBUCBhbmQgbGluayBoYXMgYmVlbiBzdGFydGVkICovXFxuOTU3MTpcXHRcXHRcXHRsaW5rX2lkID0gd2Rldi1cXHUwMDNldmFsaWRfbGlua3MgPyBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWQgOiAwO1xcbjk1NzI6XFx0XFx0XFx0aWYgKCF3ZGV2LVxcdTAwM2VsaW5rc1tsaW5rX2lkXS5hcC5iZWFjb25faW50ZXJ2YWwpXFxuOTU3MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbjk1NzQ6XFx0XFxuOTU3NTpcXHRcXHRcXHQvKiBpZ25vcmUgV01FIGF0dHJpYnV0ZXMgaWYgaWZhY2Uvc3RhIGlzIG5vdCBjYXBhYmxlICovXFxuOTU3NjpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mbGFncyBcXHUwMDI2IFdJUEhZX0ZMQUdfQVBfVUFQU0QpIHx8XFxuOTU3NzpcXHRcXHRcXHQgICAgIShwYXJhbXMuc3RhX2ZsYWdzX3NldCBcXHUwMDI2IEJJVChOTDgwMjExX1NUQV9GTEFHX1dNRSkpKVxcbjk1Nzg6XFx0XFx0XFx0XFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcXG45NTc5OlxcdFxcbjk1ODA6XFx0XFx0XFx0LyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi9cXG45NTgxOlxcdFxcdFxcdGlmICgocGFyYW1zLnN0YV9mbGFnc19zZXQgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSB8fFxcbjk1ODI6XFx0XFx0XFx0ICAgIGluZm8tXFx1MDAzZWF0dHJzW05MODAyMTFfQVRUUl9QRUVSX0FJRF0pXFxuOTU4MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NTg0OlxcdFxcdFxcdC8qIGJ1dCBkb24ndCBib3RoZXIgdGhlIGRyaXZlciB3aXRoIGl0ICovXFxuOTU4NTpcXHRcXHRcXHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7XFxuOTU4NjpcXHRcXG45NTg3OlxcdFxcdFxcdC8qIGFsbG93IGF1dGhlbnRpY2F0ZWQvYXNzb2NpYXRlZCBvbmx5IGlmIGRyaXZlciBoYW5kbGVzIGl0ICovXFxuOTU4ODpcXHRcXHRcXHRpZiAoIShyZGV2LVxcdTAwM2V3aXBoeS5mZWF0dXJlcyBcXHUwMDI2XFxuOTU4OTpcXHRcXHRcXHRcXHRcXHROTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUpIFxcdTAwMjZcXHUwMDI2XFxuOTU5MDpcXHRcXHRcXHQgICAgcGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgYXV0aF9hc3NvYylcXG45NTkxOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjk1OTI6XFx0XFxuOTU5MzpcXHRcXHRcXHRpZiAoIXdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KFxcdTAwMjZyZGV2LVxcdTAwM2V3aXBoeSxcXG45NTk0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TUFBfQU1TRFVfU1VQUE9SVCkgXFx1MDAyNlxcdTAwMjZcXG45NTk1OlxcdFxcdFxcdCAgICBwYXJhbXMuc3RhX2ZsYWdzX21hc2sgXFx1MDAyNiBCSVQoTkw4MDIxMV9TVEFfRkxBR19TUFBfQU1TRFUpKVxcbjk1OTY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTU5NzpcXHRcXG45NTk4OlxcdFxcdFxcdC8qIE9sZGVyIHVzZXJzcGFjZSwgb3IgdXNlcnNwYWNlIHdhbnRpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoXFxuOTU5OTpcXHRcXHRcXHQgKiAhTkw4MDIxMV9GRUFUVVJFX0ZVTExfQVBfQ0xJRU5UX1NUQVRFLCB3aWxsIG5vdCBzZXQgdGhlIGF1dGhcXG45NjAwOlxcdFxcdFxcdCAqIGFuZCBhc3NvYyBmbGFncyBpbiB0aGUgbWFzaywgYnV0IGFzc3VtZXMgdGhlIHN0YXRpb24gd2lsbCBiZVxcbjk2MDE6XFx0XFx0XFx0ICogYWRkZWQgYXMgYXNzb2NpYXRlZCBhbnl3YXkgc2luY2UgdGhpcyB3YXMgdGhlIHJlcXVpcmVkIGRyaXZlclxcbjk2MDI6XFx0XFx0XFx0ICogYmVoYXZpb3VyIGJlZm9yZSBOTDgwMjExX0ZFQVRVUkVfRlVMTF9BUF9DTElFTlRfU1RBVEUgd2FzXFxuOTYwMzpcXHRcXHRcXHQgKiBpbnRyb2R1Y2VkLlxcbjk2MDQ6XFx0XFx0XFx0ICogSW4gb3JkZXIgdG8gbm90IGJvdGhlciBkcml2ZXJzIHdpdGggdGhpcyBxdWlyayBpbiB0aGUgQVBJXFxuOTYwNTpcXHRcXHRcXHQgKiBzZXQgdGhlIGZsYWdzIGluIGJvdGggdGhlIG1hc2sgYW5kIHNldCBmb3IgbmV3IHN0YXRpb25zIGluXFxuOTYwNjpcXHRcXHRcXHQgKiB0aGlzIGNhc2UuXFxuOTYwNzpcXHRcXHRcXHQgKi9cXG45NjA4OlxcdFxcdFxcdGlmICghKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2IGF1dGhfYXNzb2MpKSB7XFxuOTYwOTpcXHRcXHRcXHRcXHRwYXJhbXMuc3RhX2ZsYWdzX21hc2sgfD0gYXV0aF9hc3NvYztcXG45NjEwOlxcdFxcdFxcdFxcdHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IHw9IGF1dGhfYXNzb2M7XFxuOTYxMTpcXHRcXHRcXHR9XFxuOTYxMjpcXHRcXG45NjEzOlxcdFxcdFxcdC8qIG11c3QgYmUgbGFzdCBpbiBoZXJlIGZvciBlcnJvciBoYW5kbGluZyAqL1xcbjk2MTQ6XFx0XFx0XFx0cGFyYW1zLnZsYW4gPSBnZXRfdmxhbihpbmZvLCByZGV2KTtcXG45NjE1OlxcdFxcdFxcdGlmIChJU19FUlIocGFyYW1zLnZsYW4pKVxcbjk2MTY6XFx0XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIocGFyYW1zLnZsYW4pO1xcbjk2MTc6XFx0XFx0XFx0YnJlYWs7XFxuOTYxODpcXHRcXHRjYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6XFxuOTYxOTpcXHRcXHRcXHQvKlxcbjk2MjA6XFx0XFx0XFx0ICogQWRkIGEgbmV3IHN0YXRpb24gb25seSBhZnRlciB0aGUgbWVzaCBoYXMgYmVlbiBzdGFydGVkLlxcbjk2MjE6XFx0XFx0XFx0ICogbGliZXJ0YXMgZG9lc24ndCBpbXBsZW1lbnQgam9pbl9tZXNoKCk7IGl0IGNvbmZpZ3VyZXMgdGhlXFxuOTYyMjpcXHRcXHRcXHQgKiBtZXNoIHZpYSBzeXNmcyBhbmQgam9pbnMgaXQgd2hlbiB0aGUgY2hhbm5lbCBpcyBzZXQsIHNvXFxuOTYyMzpcXHRcXHRcXHQgKiB1c2UgdGhhdCBhcyB0aGUgc3RhcnRlZCBpbmRpY2F0aW9uIGluc3RlYWQuXFxuOTYyNDpcXHRcXHRcXHQgKi9cXG45NjI1OlxcdFxcdFxcdGlmIChyZGV2LVxcdTAwM2VvcHMtXFx1MDAzZWxpYmVydGFzX3NldF9tZXNoX2NoYW5uZWwpIHtcXG45NjI2OlxcdFxcdFxcdFxcdGlmICghd2Rldi1cXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbilcXG45NjI3OlxcdFxcdFxcdFxcdFxcdHJldHVybiAtRU5FVERPV047XFxuOTYyODpcXHRcXHRcXHR9IGVsc2UgaWYgKCF3ZGV2LVxcdTAwM2V1Lm1lc2guYmVhY29uX2ludGVydmFsKSB7XFxuOTYyOTpcXHRcXHRcXHRcXHRyZXR1cm4gLUVORVRET1dOO1xcbjk2MzA6XFx0XFx0XFx0fVxcbjk2MzE6XFx0XFxuOTYzMjpcXHRcXHRcXHQvKiBpZ25vcmUgdUFQU0QgZGF0YSAqL1xcbjk2MzM6XFx0XFx0XFx0cGFyYW1zLnN0YV9tb2RpZnlfbWFzayBcXHUwMDI2PSB+U1RBVElPTl9QQVJBTV9BUFBMWV9VQVBTRDtcXG45NjM0OlxcdFxcbjk2MzU6XFx0XFx0XFx0LyogYXNzb2NpYXRlZCBpcyBkaXNhbGxvd2VkICovXFxuOTYzNjpcXHRcXHRcXHRpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrIFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkpXFxuOTYzNzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG45NjM4OlxcdFxcdFxcdC8qIFRETFMgcGVlcnMgY2Fubm90IGJlIGFkZGVkICovXFxuOTYzOTpcXHRcXHRcXHRpZiAoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0IFxcdTAwMjYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgfHxcXG45NjQwOlxcdFxcdFxcdCAgICBpbmZvLVxcdTAwM2VhdHRyc1tOTDgwMjExX0FUVFJfUEVFUl9BSURdKVxcbjk2NDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuOTY0MjpcXHRcXHRcXHRicmVhaztcXG45NjQzOlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjpcXG45NjQ0OlxcdFxcdGNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDpcXG45NjQ1OlxcdFxcdFxcdC8qIGlnbm9yZSB1QVBTRCBkYXRhICovXFxuOTY0NjpcXHRcXHRcXHRwYXJhbXMuc3RhX21vZGlmeV9tYXNrIFxcdTAwMjY9IH5TVEFUSU9OX1BBUkFNX0FQUExZX1VBUFNEO1xcbjk2NDc6XFx0XFxuOTY0ODpcXHRcXHRcXHQvKiB0aGVzZSBhcmUgZGlzYWxsb3dlZCAqL1xcbjk2NDk6XFx0XFx0XFx0aWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayBcXHUwMDI2XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjAzLjc5NTkyMjEyOFoiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MDk5MTI0ODY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlBhdGNoIEFuYWx5c2lzOiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2guIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIGl0cyBjb3JlIHB1cnBvc2UuIEl0IHNlZW1zIHdlJ3JlIGFkZHJlc3NpbmcgYSBwb3RlbnRpYWwgaXNzdWUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLiBCZWZvcmUgdGhpcyBjaGFuZ2UsIHRoZXJlIHdhcyBhIHNjZW5hcmlvIHdoZXJlIGFkZGluZyBhIHN0YXRpb24gdG8gYW4gQVAgb3IgbWVzaCBpbnRlcmZhY2UgKmJlZm9yZSogdGhlIEFQIG9yIG1lc2ggaW50ZXJmYWNlIHdhcyBmdWxseSBzdGFydGVkIGNvdWxkIGxlYWQgdG8gZHJpdmVyIGNyYXNoZXMgb3IgdW5leHBlY3RlZCBiZWhhdmlvci4gU3BlY2lmaWNhbGx5LCB0aGUgY29kZSB3YXMgc3VzY2VwdGlibGUgdG8gZGVyZWZlcmVuY2luZyB1bmluaXRpYWxpemVkIHBvaW50ZXJzIG9yIHVzaW5nIHVuaW5pdGlhbGl6ZWQgc3RhdGUgd2l0aGluIHRoZSBkcml2ZXJzLiBUaGUgYGJlYWNvbl9pbnRlcnZhbGAgd2FzIGxpa2VseSBhIGtleSBjb21wb25lbnQgaGVyZSwgYXMgYSB2YWx1ZSBvZiB6ZXJvLCBvciBhbiBhYnNlbmNlIG9mIG9uZSBvbiBhbiBBUF9WTEFOIGludGVyZmFjZSwgd2FzIGNhdXNpbmcgdHJvdWJsZS4gVGhlIGB2YWxpZF9saW5rc2AgY2hlY2sgd2FzIGFsc28gYmVpbmcgZG9uZSBsYXRlciB0aGFuIGlkZWFsLlxuXG5Ob3csIEkgbmVlZCB0byBhbmFseXplIHRoaXMgZnJvbSBhIG1lbW9yeSBzYWZldHkgcGVyc3BlY3RpdmUuIEFyZSB0aGVyZSBhbnkgbmV3IHZhcmlhYmxlcyBpbnRyb2R1Y2VkIHRoYXQgbWlnaHQgYmUgdW5pbml0aWFsaXplZD8gWWVzLCBgaW50IGxpbmtfaWRgIGlzIGEgbG9jYWwgdmFyaWFibGUgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gLCB3aGljaCBjYW4gYmUgaW5pdGlhbGl6ZWQgdmlhIGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzID8gcGFyYW1zLmxpbmtfc3RhX3BhcmFtcy5saW5rX2lkIDogMDtgICBJdCBzZWVtcyBsaWtlIGBsaW5rX2lkYCBpcyBhbHdheXMgYXNzaWduZWQgYmVmb3JlIGJlaW5nIHVzZWQsIHdoaWNoIGlzIGdvb2QuICBPZiBjb3Vyc2UsIGBwYXJhbXNgIGlzIG1lbXNldC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBhbnkgbmV3IGRhdGEgaXNuJ3QgYmVpbmcgZXhwb3NlZCB0byB1c2Vyc3BhY2UgaW4gYW4gdW5pbml0aWFsaXplZCBzdGF0ZS4gTm8sIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBkaXJlY3RseSBjb3B5IGFueSBkYXRhIGJhY2sgdG8gdGhlIHVzZXIgc3BhY2UuIEl0IGhhbmRsZXMgYSBuZXRsaW5rIGNvbW1hbmQgYW5kIGVpdGhlciByZXR1cm5zIGFuIGVycm9yIG9yIGNhbGxzIGByZGV2X2FkZF9zdGF0aW9uYC5cblxuVGhlbiwgSSBuZWVkIHRvIGxvb2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBjb250cm9sIGZsb3cgb3IgYnJhbmNoaW5nIGlzIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBGcm9tIHdoYXQgSSBjYW4gc2VlLCBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AsIGBwYXJhbXMubGlua19zdGFfcGFyYW1zLmxpbmtfaWRgIChpbml0aWFsaXplZCB2aWEgYG1lbXNldGAsIHRoZW4gYG5sODAyMTFfbGlua19pZF9vcl9pbnZhbGlkYCksIGB3ZGV2LVx1MDAzZWxpbmtzW2xpbmtfaWRdLmFwLmJlYWNvbl9pbnRlcnZhbGAsIGByZGV2LVx1MDAzZW9wcy1cdTAwM2VsaWJlcnRhc19zZXRfbWVzaF9jaGFubmVsYCwgYHdkZXYtXHUwMDNldS5tZXNoLmNoYW5kZWYuY2hhbmAsIGB3ZGV2LVx1MDAzZXUubWVzaC5iZWFjb25faW50ZXJ2YWxgIGFwcGVhciB0byBiZSBleGlzdGluZyBrZXJuZWwgc3RhdGUgb3IgZmllbGRzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gc29tZSBmYXNoaW9uLiBTbywgdGhhdCBzZWVtcyBzYWZlLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8gY29uc2lkZXIgcG90ZW50aWFsIG91dC1vZi1ib3VuZHMgcmVhZHMgb3IgYnVmZmVyIG92ZXJmbG93cyByZWxhdGVkIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBJZiBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AgaXMgbm9uLXplcm8sIHRoZSBgbGlua19pZGAgaXMgdmFsaWRhdGVkIGFnYWluc3QgdGhlIGJvdW5kcyBvZiBgd2Rldi1cdTAwM2V2YWxpZF9saW5rc2AuIElmIGB3ZGV2LVx1MDAzZXZhbGlkX2xpbmtzYCBpcyB6ZXJvLCBgbGlua19pZGAgaXMgYXNzaWduZWQgemVybywgc28gdGhhdCBhZGRyZXNzZXMgdGhhdCBwYXRoLiBBbmQgaW4gZWl0aGVyIGNhc2UsIGB2YWxpZF9saW5rc2AgaXMgYm91bmRlZCBieSBgSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTYCwgdHlwaWNhbGx5IDE1LCBzbyBhbnkgYXJyYXkgYWNjZXNzZXMgYXJlIHdpdGhpbiBsaW1pdHMuICBJIHNob3VsZCBhbHNvIGRvdWJsZS1jaGVjayBgcmRldl9hZGRfc3RhdGlvbmAgYW5kIGB3ZGV2LVx1MDAzZWxpbmtzYCBqdXN0IHRvIGJlIGV4dHJhIHN1cmUsIGJ1dCwgYmFzZWQgb24gdGhpcyBpbml0aWFsIHBhc3MsIGl0IGFwcGVhcnMgdG8gYmUgYSBzb2xpZCBwYXRjaCBmcm9tIGEgbWVtb3J5IHBlcnNwZWN0aXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzgxLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzcxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MTAuODk1MDQ5MTc1WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NzAwNjY0MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3Qgd2lyZWxlc3NfZGV2IFxcXFx7XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvbmV0L2NmZzgwMjExLmhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvY2ZnODAyMTEuaD03MTQyPWVudW0gaWVlZTgwMjExX2FwX3JlZ19wb3dlciB7XFxuLS1cXG5pbmNsdWRlL25ldC9jZmc4MDIxMS5oLTcyMjktICovXFxuaW5jbHVkZS9uZXQvY2ZnODAyMTEuaDo3MjMwOnN0cnVjdCB3aXJlbGVzc19kZXYge1xcbmluY2x1ZGUvbmV0L2NmZzgwMjExLmgtNzIzMS1cXHRzdHJ1Y3Qgd2lwaHkgKndpcGh5O1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxMC45NDIwNjE4ODdaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Mzk0MjI3NTUyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gdGhlIGB3aXJlbGVzc19kZXZgIFN0cnVjdHVyZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyB3aG9sZSB0aGluZyBpcyBzdHJ1Y3R1cmVkLCBzbyBsZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gdGhlIGRlZmluaXRpb24gb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLiBHb3R0YSBzZWUgd2hhdCBmaWVsZHMgYXJlIGF2YWlsYWJsZSwgaG93IHRoZXkncmUgdXNlZCwgYW5kIGhvdyB0aGV5IHJlbGF0ZSB0byB0aGUgb3ZlcmFsbCB3aXJlbGVzcyBzdWJzeXN0ZW0uIFRoaXMgaXMgdGhlIGJlZHJvY2sgb2YgdGhlIGVudGlyZSB3aXJlbGVzcyBkZXZpY2UgcmVwcmVzZW50YXRpb24gd2l0aGluIHRoZSBrZXJuZWwsIHNvIGtub3dpbmcgaXQgaW50aW1hdGVseSBpcyBhYnNvbHV0ZWx5IGNydWNpYWwuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgdmVyaWZ5IHNvbWUgYXNzdW1wdGlvbnMgSSBtaWdodCBoYXZlIG1hZGUsIGFuZCBtYXliZSBwaWNrIHVwIHNvbWV0aGluZyBuZXcuIExldCdzIHNlZSB3aGF0IHdlJ3ZlIGdvdCFcblxuXG4iLCJJbnB1dFRva2VucyI6MTAzNzgsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxNC44ODQzMzk5NDlaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk0NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbmV0L2NmZzgwMjExLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNzIzMCxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNzIzMDpcXHRzdHJ1Y3Qgd2lyZWxlc3NfZGV2IHtcXG43MjMxOlxcdFxcdHN0cnVjdCB3aXBoeSAqd2lwaHk7XFxuNzIzMjpcXHRcXHRlbnVtIG5sODAyMTFfaWZ0eXBlIGlmdHlwZTtcXG43MjMzOlxcdFxcbjcyMzQ6XFx0XFx0LyogdGhlIHJlbWFpbmRlciBvZiB0aGlzIHN0cnVjdCBzaG91bGQgYmUgcHJpdmF0ZSB0byBjZmc4MDIxMSAqL1xcbjcyMzU6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbjcyMzY6XFx0XFx0c3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjtcXG43MjM3OlxcdFxcbjcyMzg6XFx0XFx0dTMyIGlkZW50aWZpZXI7XFxuNzIzOTpcXHRcXG43MjQwOlxcdFxcdHN0cnVjdCBsaXN0X2hlYWQgbWdtdF9yZWdpc3RyYXRpb25zO1xcbjcyNDE6XFx0XFx0dTggbWdtdF9yZWdpc3RyYXRpb25zX25lZWRfdXBkYXRlOjE7XFxuNzI0MjpcXHRcXG43MjQzOlxcdFxcdGJvb2wgdXNlXzRhZGRyLCBpc19ydW5uaW5nLCByZWdpc3RlcmVkLCByZWdpc3RlcmluZztcXG43MjQ0OlxcdFxcbjcyNDU6XFx0XFx0dTggYWRkcmVzc1tFVEhfQUxFTl0gX19hbGlnbmVkKHNpemVvZih1MTYpKTtcXG43MjQ2OlxcdFxcbjcyNDc6XFx0XFx0LyogY3VycmVudGx5IHVzZWQgZm9yIElCU1MgYW5kIFNNRSAtIG1pZ2h0IGJlIHJlYXJyYW5nZWQgbGF0ZXIgKi9cXG43MjQ4OlxcdFxcdHN0cnVjdCBjZmc4MDIxMV9jb25uICpjb25uO1xcbjcyNDk6XFx0XFx0c3RydWN0IGNmZzgwMjExX2NhY2hlZF9rZXlzICpjb25uZWN0X2tleXM7XFxuNzI1MDpcXHRcXHRlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBjb25uX2Jzc190eXBlO1xcbjcyNTE6XFx0XFx0dTMyIGNvbm5fb3duZXJfbmxwb3J0aWQ7XFxuNzI1MjpcXHRcXG43MjUzOlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIGRpc2Nvbm5lY3Rfd2s7XFxuNzI1NDpcXHRcXHR1OCBkaXNjb25uZWN0X2Jzc2lkW0VUSF9BTEVOXTtcXG43MjU1OlxcdFxcbjcyNTY6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBldmVudF9saXN0O1xcbjcyNTc6XFx0XFx0c3BpbmxvY2tfdCBldmVudF9sb2NrO1xcbjcyNTg6XFx0XFxuNzI1OTpcXHRcXHR1OCBjb25uZWN0ZWQ6MTtcXG43MjYwOlxcdFxcbjcyNjE6XFx0XFx0Ym9vbCBwcztcXG43MjYyOlxcdFxcdGludCBwc190aW1lb3V0O1xcbjcyNjM6XFx0XFxuNzI2NDpcXHRcXHR1MzIgdW5leHBlY3RlZF9ubHBvcnRpZDtcXG43MjY1OlxcdFxcbjcyNjY6XFx0XFx0dTMyIG93bmVyX25scG9ydGlkO1xcbjcyNjc6XFx0XFx0Ym9vbCBubF9vd25lcl9kZWFkO1xcbjcyNjg6XFx0XFxuNzI2OTpcXHQjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFRcXG43MjcwOlxcdFxcdC8qIHdleHQgZGF0YSAqL1xcbjcyNzE6XFx0XFx0c3RydWN0IHtcXG43MjcyOlxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyBpYnNzO1xcbjcyNzM6XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zIGNvbm5lY3Q7XFxuNzI3NDpcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKmtleXM7XFxuNzI3NTpcXHRcXHRcXHRjb25zdCB1OCAqaWU7XFxuNzI3NjpcXHRcXHRcXHRzaXplX3QgaWVfbGVuO1xcbjcyNzc6XFx0XFx0XFx0dTggYnNzaWRbRVRIX0FMRU5dO1xcbjcyNzg6XFx0XFx0XFx0dTggcHJldl9ic3NpZFtFVEhfQUxFTl07XFxuNzI3OTpcXHRcXHRcXHR1OCBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToxNC44ODQ3Mzg1MjlaIiwiU2VxIjozMywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQwMTgyODQwMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIERlZXBlciBpbnRvIGBzdHJ1Y3Qgd2lyZWxlc3NfZGV2YCoqXG5cbk9rYXksIHNvIEkndmUgYmVlbiB3b3JraW5nIHdpdGggdGhlIHdpcmVsZXNzIHN0YWNrLCBhbmQgbm93IEkgbmVlZCB0byByZWZyZXNoIG15IHVuZGVyc3RhbmRpbmcgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgIGFuZCBob3cgaXQncyB1c2VkIHdpdGhpbiB0aGUgYnJvYWRlciBjb250ZXh0LiBJIGtub3cgdGhlIGJhc2ljIGRlZmluaXRpb24sIGJ1dCBJIG5lZWQgdG8gc2VlIGl0IGluIGFjdGlvbiwgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSByZXN0IG9mIHRoZSByZWxldmFudCBjb2RlLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byB0cmFjZSB0aGUgdXNlIG9mIHRoaXMgc3RydWN0IGFyb3VuZCBsaW5rcy4gSSBrbm93IGhvdyB0aGluZ3MgZ2VuZXJhbGx5IHdvcmssIGJ1dCBJIG5lZWQgYSBtb3JlIGRldGFpbGVkLCBwcmFjdGljYWwgdW5kZXJzdGFuZGluZy4gU28sIEkgbmVlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgbGlua3MhIExldCdzIGdldCB0byBpdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEzMTgsIk91dHB1dFRva2VucyI6NDEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjE3LjI4NjU2OTU5MVoiLCJTZXEiOjM0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNjk4ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9uZXQvY2ZnODAyMTEuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA3MjgwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCI3MjgwOlxcdFxcdFxcdHM4IGRlZmF1bHRfa2V5LCBkZWZhdWx0X21nbXRfa2V5O1xcbjcyODE6XFx0XFx0XFx0Ym9vbCBwcmV2X2Jzc2lkX3ZhbGlkO1xcbjcyODI6XFx0XFx0fSB3ZXh0O1xcbjcyODM6XFx0I2VuZGlmXFxuNzI4NDpcXHRcXG43Mjg1OlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIGNxbV9yc3NpX3dvcms7XFxuNzI4NjpcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY3FtX2NvbmZpZyBfX3JjdSAqY3FtX2NvbmZpZztcXG43Mjg3OlxcdFxcbjcyODg6XFx0XFx0c3RydWN0IGxpc3RfaGVhZCBwbXNyX2xpc3Q7XFxuNzI4OTpcXHRcXHRzcGlubG9ja190IHBtc3JfbG9jaztcXG43MjkwOlxcdFxcdHN0cnVjdCB3aXBoeV93b3JrIHBtc3JfZnJlZV93aztcXG43MjkxOlxcdFxcbjcyOTI6XFx0XFx0dW5zaWduZWQgbG9uZyB1bnByb3RfYmVhY29uX3JlcG9ydGVkO1xcbjcyOTM6XFx0XFxuNzI5NDpcXHRcXHR1bmlvbiB7XFxuNzI5NTpcXHRcXHRcXHRzdHJ1Y3Qge1xcbjcyOTY6XFx0XFx0XFx0XFx0dTggY29ubmVjdGVkX2FkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43Mjk3OlxcdFxcdFxcdFxcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XFxuNzI5ODpcXHRcXHRcXHRcXHR1OCBzc2lkX2xlbjtcXG43Mjk5OlxcdFxcdFxcdH0gY2xpZW50O1xcbjczMDA6XFx0XFx0XFx0c3RydWN0IHtcXG43MzAxOlxcdFxcdFxcdFxcdGludCBiZWFjb25faW50ZXJ2YWw7XFxuNzMwMjpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgcHJlc2V0X2NoYW5kZWY7XFxuNzMwMzpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjtcXG43MzA0OlxcdFxcdFxcdFxcdHU4IGlkW0lFRUU4MDIxMV9NQVhfTUVTSF9JRF9MRU5dO1xcbjczMDU6XFx0XFx0XFx0XFx0dTggaWRfbGVuLCBpZF91cF9sZW47XFxuNzMwNjpcXHRcXHRcXHR9IG1lc2g7XFxuNzMwNzpcXHRcXHRcXHRzdHJ1Y3Qge1xcbjczMDg6XFx0XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIHByZXNldF9jaGFuZGVmO1xcbjczMDk6XFx0XFx0XFx0XFx0dTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOXTtcXG43MzEwOlxcdFxcdFxcdFxcdHU4IHNzaWRfbGVuO1xcbjczMTE6XFx0XFx0XFx0fSBhcDtcXG43MzEyOlxcdFxcdFxcdHN0cnVjdCB7XFxuNzMxMzpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpjdXJyZW50X2JzcztcXG43MzE0OlxcdFxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmO1xcbjczMTU6XFx0XFx0XFx0XFx0aW50IGJlYWNvbl9pbnRlcnZhbDtcXG43MzE2OlxcdFxcdFxcdFxcdHU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07XFxuNzMxNzpcXHRcXHRcXHRcXHR1OCBzc2lkX2xlbjtcXG43MzE4OlxcdFxcdFxcdH0gaWJzcztcXG43MzE5OlxcdFxcdFxcdHN0cnVjdCB7XFxuNzMyMDpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjtcXG43MzIxOlxcdFxcdFxcdH0gb2NiO1xcbjczMjI6XFx0XFx0XFx0c3RydWN0IHtcXG43MzIzOlxcdFxcdFxcdFxcdHU4IGNsdXN0ZXJfaWRbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43MzI0OlxcdFxcdFxcdFxcdHU4IG5fY2hhbm5lbHM7XFxuNzMyNTpcXHRcXHRcXHRcXHRzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWZzO1xcbjczMjY6XFx0XFx0XFx0XFx0Ym9vbCBzY2hlZF91cGRhdGVfcGVuZGluZztcXG43MzI3OlxcdFxcdFxcdH0gbmFuO1xcbjczMjg6XFx0XFx0fSB1O1xcbjczMjk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTEwVDA5OjIxOjE3LjI4Njk0MDk3MVoiLCJTZXEiOjM1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1ODk4NDY4MDAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCBkZWxpdmVyZWQgaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEaXZpbmcgRGVlcGVyIGludG8gdGhlIFdpcmVsZXNzIERldmljZSBTdHJ1Y3R1cmUqKlxuXG5BbHJpZ2h0LCBzbyB3ZSdyZSBsb29raW5nIGF0IHRoZSBpbnRlcm5hbHMgb2YgYHN0cnVjdCB3aXJlbGVzc19kZXZgLCByaWdodD8gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiT2theSwgd2hhdCdzICpuZXh0Kj8gV2hhdCBvdGhlciBlbGVtZW50cyBkZWZpbmUgdGhlIGNvcmUgb2YgdGhpcyBkZXZpY2U/XCIgSSd2ZSBnb3QgYSBkZWNlbnQgZ3Jhc3Agb2YgdGhlIGJhc2ljIHN0cnVjdHVyZSwgYnV0IGl0J3MgdGhlIGZpbmVyIGRldGFpbHMgdGhhdCByZWFsbHkgbWFrZSBvciBicmVhayBhIHdlbGwtZW5naW5lZXJlZCB3aXJlbGVzcyBpbXBsZW1lbnRhdGlvbi4gSSB3YW50IHRvIHNlZSB0aGUgKndob2xlKiBwaWN0dXJlLiBJ4oCZbSB0aGlua2luZyBhYm91dCB3aGF0IG90aGVyIGZpZWxkcyBtaWdodCBiZSBpbmNsdWRlZC5cblxuSSdtIG1lbnRhbGx5IHByZXBhcmluZyB0byBuYXZpZ2F0ZSBhIHBvdGVudGlhbGx5IGNvbXBsZXggd2ViIG9mIHBvaW50ZXJzLCBuZXN0ZWQgc3RydWN0dXJlcywgYW5kIGJpdGZpZWxkcy4gSSdtIGV4cGVjdGluZyB0byBzZWUgZmxhZ3MgZGVmaW5pbmcgdGhlIGRldmljZSdzIGNhcGFiaWxpdGllcywgcG9pbnRlcnMgdG8gcmVndWxhdG9yeSBkb21haW5zLCBwZXJoYXBzIGNvbmZpZ3VyYXRpb24tcmVsYXRlZCBlbGVtZW50cyBvciBzdGF0aXN0aWNzIGNvdW50ZXJzLCBhbmQgY2VydGFpbmx5IHRoZSBkZXRhaWxzIGFib3V0IHRoZSBvcGVyYXRpbmcgbW9kZXMuIEknbSBob3BpbmcgaXTigJlzIHdlbGwtZG9jdW1lbnRlZCEgVGhlIGRlc2lnbiBjaG9pY2VzIHdpbGwgdGVsbCBhIGxvdCBhYm91dCB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZS4gTGV0J3Mgc2VlIGhvdyB0aGV5IGhhbmRsZWQgdGhlIGludGVyZmFjZXMsIGNvbmN1cnJlbmN5LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEknbSBlc3BlY2lhbGx5IGtlZW4gb24gaG93IHRoZXkgaGFuZGxlZCB0aGUgY29uY3VycmVuY3kgYW5kIGludGVyZmFjZXMgaW4gYSBtb2Rlcm4gd2lyZWxlc3MgZW52aXJvbm1lbnQuIEFuZCBvZiBjb3Vyc2UsIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGVsZW1lbnRzIG5lZWRlZCB0byB0aWUgaXQgYWxsIGludG8gdGhlIG5ldHdvcmsgc3RhY2suIEknbSBsb29raW5nIGZvciB3aGVyZSB0aGUgZHJpdmVyIGZpdHMgaW4sIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHN0YWNrLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMjI4NywiT3V0cHV0VG9rZW5zIjo0MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MjMuMTg1NDExNzgxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM5MTYzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL25ldC9jZmc4MDIxMS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDczMzAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjczMzA6XFx0XFx0c3RydWN0IHtcXG43MzMxOlxcdFxcdFxcdHU4IGFkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTtcXG43MzMyOlxcdFxcdFxcdHVuaW9uIHtcXG43MzMzOlxcdFxcdFxcdFxcdHN0cnVjdCB7XFxuNzMzNDpcXHRcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgYmVhY29uX2ludGVydmFsO1xcbjczMzU6XFx0XFx0XFx0XFx0XFx0c3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7XFxuNzMzNjpcXHRcXHRcXHRcXHR9IGFwO1xcbjczMzc6XFx0XFx0XFx0XFx0c3RydWN0IHtcXG43MzM4OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmN1cnJlbnRfYnNzO1xcbjczMzk6XFx0XFx0XFx0XFx0fSBjbGllbnQ7XFxuNzM0MDpcXHRcXHRcXHR9O1xcbjczNDE6XFx0XFxuNzM0MjpcXHRcXHRcXHRib29sIGNhY19zdGFydGVkO1xcbjczNDM6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBjYWNfc3RhcnRfdGltZTtcXG43MzQ0OlxcdFxcdFxcdHVuc2lnbmVkIGludCBjYWNfdGltZV9tcztcXG43MzQ1OlxcdFxcdH0gbGlua3NbSUVFRTgwMjExX01MRF9NQVhfTlVNX0xJTktTXTtcXG43MzQ2OlxcdFxcdHUxNiB2YWxpZF9saW5rcztcXG43MzQ3OlxcdFxcbjczNDg6XFx0XFx0dTMyIHJhZGlvX21hc2s7XFxuNzM0OTpcXHR9O1xcbjczNTA6XFx0XFxuNzM1MTpcXHRzdGF0aWMgaW5saW5lIGNvbnN0IHU4ICp3ZGV2X2FkZHJlc3Moc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldilcXG43MzUyOlxcdHtcXG43MzUzOlxcdFxcdGlmICh3ZGV2LVxcdTAwM2VuZXRkZXYpXFxuNzM1NDpcXHRcXHRcXHRyZXR1cm4gd2Rldi1cXHUwMDNlbmV0ZGV2LVxcdTAwM2VkZXZfYWRkcjtcXG43MzU1OlxcdFxcdHJldHVybiB3ZGV2LVxcdTAwM2VhZGRyZXNzO1xcbjczNTY6XFx0fVxcbjczNTc6XFx0XFxuNzM1ODpcXHRzdGF0aWMgaW5saW5lIGJvb2wgd2Rldl9ydW5uaW5nKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpXFxuNzM1OTpcXHR7XFxuNzM2MDpcXHRcXHRpZiAod2Rldi1cXHUwMDNlbmV0ZGV2KVxcbjczNjE6XFx0XFx0XFx0cmV0dXJuIG5ldGlmX3J1bm5pbmcod2Rldi1cXHUwMDNlbmV0ZGV2KTtcXG43MzYyOlxcdFxcdHJldHVybiB3ZGV2LVxcdTAwM2Vpc19ydW5uaW5nO1xcbjczNjM6XFx0fVxcbjczNjQ6XFx0XFxuNzM2NTpcXHQvKipcXG43MzY2OlxcdCAqIHdkZXZfcHJpdiAtIHJldHVybiB3aXBoeSBwcml2IGZyb20gd2lyZWxlc3NfZGV2XFxuNzM2NzpcXHQgKlxcbjczNjg6XFx0ICogQHdkZXY6IFRoZSB3aXJlbGVzcyBkZXZpY2Ugd2hvc2Ugd2lwaHkncyBwcml2IHBvaW50ZXIgdG8gcmV0dXJuXFxuNzM2OTpcXHQgKiBSZXR1cm46IFRoZSB3aXBoeSBwcml2IG9mIEB3ZGV2LlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMFQwOToyMToyMy4xODU4MDU0NzFaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzg5OTE2MTYyNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFByb3Bvc2VkIFBhdGNoIGluIGBubDgwMjExX25ld19zdGF0aW9uYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IG9mIHRoaXMgcGF0Y2ggZm9yIGBubDgwMjExX25ld19zdGF0aW9uYCBpcyBmb2N1c2VkIG9uIGl0cyBpbXBhY3Qgb24gbWVtb3J5IHNhZmV0eSBhbmQgd2hldGhlciBpdCBuZWNlc3NpdGF0ZXMgS01TQU4uIEZyb20gd2hhdCBJIGNhbiBzZWUsIHRoZSBjb3JlIG9mIHRoZSBwYXRjaCByZXZvbHZlcyBhcm91bmQgYWRkaW5nIGNydWNpYWwgdmFsaWRhdGlvbiBjaGVja3MuIFNwZWNpZmljYWxseTpcblxuMS4gIEl0J3MgdmFsaWRhdGluZyB0aGUgYGxpbmtfaWRgIG11Y2ggZWFybGllciBpbiB0aGUgZnVuY3Rpb24sIGNyb3NzLXJlZmVyZW5jaW5nIGl0IHdpdGggYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgLiBHb29kIG1vdmUsIGNhdGNoaW5nIHBvdGVudGlhbCBpc3N1ZXMgdXBmcm9udC5cbjIuICBDcnVjaWFsbHksIGl0IG5vdyBlbmZvcmNlcyBhIGNoZWNrIGZvciBBUC9QMlBcXF9HTyBpbnRlcmZhY2VzLiBUaGlzIGVuc3VyZXMgdGhlIEFQJ3MgYmVhY29uIGludGVydmFsIGlzIHNldCwgZWZmZWN0aXZlbHkgbWVhbmluZyB0aGUgQVAgaXMgc3RhcnRlZCwgYmVmb3JlIGFsbG93aW5nIG5ldyBzdGF0aW9ucyB0byBjb25uZWN0LiBUaGlzIGlzIGEgc29saWQgY2hlY2sgZm9yIHByb3BlciBpbml0aWFsaXphdGlvbi5cbjMuICBTaW1pbGFybHksIGZvciBtZXNoIGludGVyZmFjZXMsIGl0IHZhbGlkYXRlcyB0aGF0IHRoZSBtZXNoIGlzIHN0YXJ0ZWQgYmVmb3JlIHBlcm1pdHRpbmcgbmV3IHN0YXRpb24gYWRkaXRpb25zLiBQcm90ZWN0aW5nIGFnYWluc3Qgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYmVmb3JlIGluaXRpYWxpemF0aW9uLlxuNC4gIEFuZCBmaW5hbGx5LCBpdCByZW1vdmVzIGEgcmVkdW5kYW50IGB2YWxpZF9saW5rc2AgY2hlY2sgbGF0ZXIgaW4gdGhlIGZ1bmN0aW9uLiBQcnVuaW5nIGRvd24gdW5uZWNlc3NhcnkgY2hlY2tzIGlzIGFsd2F5cyBhIGdvb2QgcHJhY3RpY2UuXG5cbk5vdywgdGhlIGNyaXRpY2FsIHF1ZXN0aW9uOiBEb2VzIHRoaXMgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcz8gTXkgYW5hbHlzaXMgc3VnZ2VzdHMgYSByZXNvdW5kaW5nIFwibm8uXCIgSSdtIGNvbmZpZGVudCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3Qgb3Igc3RhY2sgdmFyaWFibGVzIGJlaW5nIHJlYWQgb3IgY29waWVkIHRvIHVzZXJzcGFjZS4gQWxsIHRoZSB2YXJpYWJsZXMgdXNlZCDigJMgYHBhcmFtc2AsIGBsaW5rX2lkYCwgYHdkZXYtXHUwMDNldmFsaWRfbGlua3NgLCB0aGUgYmVhY29uIGludGVydmFsIGNoZWNrLCB0aGUgbWVzaC1yZWxhdGVkIHN0YXRlIHZhcmlhYmxlcyDigJMgYXJlIGRlbW9uc3RyYWJseSBwcm9wZXJseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLiBObyBtZW1vcnkgaXMgYmVpbmcgYWxsb2NhdGVkIG9yIGxlYWtlZCB0byB1c2Vyc3BhY2UsIGFuZCB0aGVyZSdzIG5vIGV4cG9zdXJlIG9mIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG9yIHBhZGRpbmcuIFRoYXQncyBhIGNsZWFuIGJpbGwgb2YgaGVhbHRoIGFzIGZhciBhcyBJIGNhbiB0ZWxsLlxuXG5HaXZlbiB0aGlzLCBkb2VzIEtNU0FOIG5lZWQgdG8gYmUgaW52b2x2ZWQ/IEFic29sdXRlbHkgbm90LiBUaGlzIHBhdGNoIGZvY3VzZXMgb24gKnByZXZlbnRpbmcqIG9wZXJhdGlvbnMgb24gdW5pbml0aWFsaXplZCBBUC9tZXNoIGludGVyZmFjZXMgdGhyb3VnaCBzdHJpY3RlciB2YWxpZGF0aW9uLiBUaGUgZ29hbCBpcyB0byBhdm9pZCB0aG9zZSBzaXR1YXRpb25zIGFsdG9nZXRoZXIuIFN0YW5kYXJkIEtBU0FOIGFuZCBkZWJ1Z2dpbmcgYnVpbGRzIGFyZSBlbnRpcmVseSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgY29ycnVwdGlvbiBvciBvdXQtb2YtYm91bmRzIGVycm9ycyB0aGF0ICptaWdodCogYmUgaW50cm9kdWNlZCAodGhvdWdoIEkgZG9uJ3Qgc2VlIGFueSBldmlkZW5jZSBvZiB0aGF0IGhlcmUpLiBJdCdzIG1vcmUgb2YgYSBwcmV2ZW50YXRpdmUgbWVhc3VyZSB0aGFuIGEgZml4IGZvciBhbiBleGlzdGluZyB2dWxuZXJhYmlsaXR5LlxuXG5UaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgdGhhdCB0aGlzIHBhdGNoIGRvZXNuJ3QgcmVxdWlyZSBLTVNBTi4gSSdsbCBwcmVwYXJlIG15IHJlYXNvbmluZyBhY2NvcmRpbmdseSBhbmQgc2V0IHRoZSByZXN1bHRzIHdpdGggYE5lZWRzS01TQU46IGZhbHNlYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTMxOTAsIk91dHB1dFRva2VucyI6MTc3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTBUMDk6MjE6MzEuMDg0OTY5MzQ1WiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM1NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIHNhbml0eSBjaGVja3MgaW4gYG5sODAyMTFfbmV3X3N0YXRpb25gIHRvIHZlcmlmeSB0aGF0IHRoZSBsaW5rL2ludGVyZmFjZSBoYXMgYmVlbiBzdGFydGVkIChjaGVja2luZyBiZWFjb24gaW50ZXJ2YWwgYW5kIGNoYW5uZWwgZGVmaW5pdGlvbiBmb3IgQVAgYW5kIE1lc2ggaW50ZXJmYWNlcywgYW5kIHZhbGlkYXRpbmcgYGxpbmtfaWRgIGVhcmxpZXIgYWdhaW5zdCBgd2Rldi1cXHUwMDNldmFsaWRfbGlua3NgKS5cXG5cXG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIHJlYWQsIG9yIGV4cG9zZWQuXFxuMi4gVGhlIG5ld2x5IGludHJvZHVjZWQgbG9jYWwgdmFyaWFibGUgYGxpbmtfaWRgIGlzIGFzc2lnbmVkIGJlZm9yZSB1c2UuXFxuMy4gVGhlIHN0YWNrIHN0cnVjdHVyZSBgcGFyYW1zYCBpcyBleHBsaWNpdGx5IGNsZWFyZWQgd2l0aCBgbWVtc2V0YCBwcmlvciB0byBwYXJzaW5nIGF0dHJpYnV0ZXMuXFxuNC4gTm8ga2VybmVsIG1lbW9yeSBpcyBjb3BpZWQgdG8gdXNlciBzcGFjZSBpbiB0aGlzIGNvZGUgcGF0aC5cXG5cXG5UaGVyZWZvcmUsIHRoaXMgcGF0Y2ggcG9zZXMgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3MgYW5kIGRvZXMgbm90IHdhcnJhbnQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgc2FuaXR5IGNoZWNrcyBpbiBgbmw4MDIxMV9uZXdfc3RhdGlvbmAgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpbmsvaW50ZXJmYWNlIGhhcyBiZWVuIHN0YXJ0ZWQgKGNoZWNraW5nIGJlYWNvbiBpbnRlcnZhbCBhbmQgY2hhbm5lbCBkZWZpbml0aW9uIGZvciBBUCBhbmQgTWVzaCBpbnRlcmZhY2VzLCBhbmQgdmFsaWRhdGluZyBgbGlua19pZGAgZWFybGllciBhZ2FpbnN0IGB3ZGV2LVxcdTAwM2V2YWxpZF9saW5rc2ApLlxcblxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGFsbG9jYXRlZCwgcmVhZCwgb3IgZXhwb3NlZC5cXG4yLiBUaGUgbmV3bHkgaW50cm9kdWNlZCBsb2NhbCB2YXJpYWJsZSBgbGlua19pZGAgaXMgYXNzaWduZWQgYmVmb3JlIHVzZS5cXG4zLiBUaGUgc3RhY2sgc3RydWN0dXJlIGBwYXJhbXNgIGlzIGV4cGxpY2l0bHkgY2xlYXJlZCB3aXRoIGBtZW1zZXRgIHByaW9yIHRvIHBhcnNpbmcgYXR0cmlidXRlcy5cXG40LiBObyBrZXJuZWwgbWVtb3J5IGlzIGNvcGllZCB0byB1c2VyIHNwYWNlIGluIHRoaXMgY29kZSBwYXRoLlxcblxcblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBwb3NlcyBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyBhbmQgZG9lcyBub3Qgd2FycmFudCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[1] Phase: Succeeded StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 09:21:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 09:21:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2] Phase: Succeeded StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 09:22:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-10 09:21:57 +0000 UTC FinishedAt: 2026-09-10 09:22:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowhtxjw/series-workflowhtxjw-convert-artifact-165664625/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-10 09:22:18 +0000 UTC FinishedAt: 2026-09-10 09:47:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-10 09:22:18 +0000 UTC FinishedAt: 2026-09-10 09:47:55 +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:*17030ae1-db37-4264-b348-f00562f2f97d,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-workflowhtxjw/series-workflowhtxjw-convert-artifact-165664625/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": "ed369c1b-5e8f-49ab-81be-4060e12151ce", "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-workflowhtxjw/series-workflowhtxjw-build-action-910856607/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-10 09:22:18 +0000 UTC FinishedAt: 2026-09-10 09:47:33 +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:*17030ae1-db37-4264-b348-f00562f2f97d,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-workflowhtxjw/series-workflowhtxjw-convert-artifact-165664625/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": "ed369c1b-5e8f-49ab-81be-4060e12151ce", "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-workflowhtxjw/series-workflowhtxjw-build-action-910856607/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-10 09:47:55 +0000 UTC FinishedAt: 2026-09-10 09:47:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-10 09:47:55 +0000 UTC FinishedAt: 2026-09-10 09:47:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-10 09:47:55 +0000 UTC FinishedAt: 2026-09-10 09:48:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-10 09:47:55 +0000 UTC FinishedAt: 2026-09-10 09:48:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowhtxjw/series-workflowhtxjw-convert-artifact-1440075460/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-10 09:48:05 +0000 UTC FinishedAt: 2026-09-10 09:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-10 09:48:05 +0000 UTC FinishedAt: 2026-09-10 09:49:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ed369c1b-5e8f-49ab-81be-4060e12151ce,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-workflowhtxjw/series-workflowhtxjw-build-action-910856607/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-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-10 09:49:53 +0000 UTC FinishedAt: 2026-09-10 09:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-10 09:49:53 +0000 UTC FinishedAt: 2026-09-10 09:49:53 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-10 09:49:53 +0000 UTC FinishedAt: 2026-09-10 10:11:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-10 09:49:53 +0000 UTC FinishedAt: 2026-09-10 10:11:17 +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:*17030ae1-db37-4264-b348-f00562f2f97d,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-workflowhtxjw/series-workflowhtxjw-convert-artifact-1440075460/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": "6992e49f-bea0-4e87-9833-f6be5c38a832", "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-workflowhtxjw/series-workflowhtxjw-build-action-3310089936/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-10 09:49:53 +0000 UTC FinishedAt: 2026-09-10 10:10:55 +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:*17030ae1-db37-4264-b348-f00562f2f97d,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-workflowhtxjw/series-workflowhtxjw-convert-artifact-1440075460/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": "6992e49f-bea0-4e87-9833-f6be5c38a832", "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-workflowhtxjw/series-workflowhtxjw-build-action-3310089936/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-10 10:11:17 +0000 UTC FinishedAt: 2026-09-10 10:11:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-10 10:11:17 +0000 UTC FinishedAt: 2026-09-10 10:11:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-10 10:11:17 +0000 UTC FinishedAt: 2026-09-10 10:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-10 10:11:17 +0000 UTC FinishedAt: 2026-09-10 10:13:01 +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:*6992e49f-bea0-4e87-9833-f6be5c38a832,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-workflowhtxjw/series-workflowhtxjw-build-action-3310089936/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-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"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:*ed369c1b-5e8f-49ab-81be-4060e12151ce,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6992e49f-bea0-4e87-9833-f6be5c38a832,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-workflowhtxjw/series-workflowhtxjw-build-action-910856607/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-workflowhtxjw/series-workflowhtxjw-build-action-3310089936/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 10:13:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 10:13:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"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-workflowhtxjw/series-workflowhtxjw-convert-artifact-411018957/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 10:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 10:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-10 10:13:11 +0000 UTC FinishedAt: 2026-09-10 10:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-10 10:13:21 +0000 UTC FinishedAt: 2026-09-10 13:17:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowhtxjw[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["nl80211_new_station"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"a8bbe92e29262da9d108b5b1e62f26b8aafc4daf","config_name":"upstream-apparmor-kasan.config","enable_configs":["CFG80211"],"series_id":"4e2274f5-8093-44d1-856d-1774513c6368","tree_name":"linux-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/next/linux-next"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-10 10:13:21 +0000 UTC FinishedAt: 2026-09-10 13:17:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*ed369c1b-5e8f-49ab-81be-4060e12151ce,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*6992e49f-bea0-4e87-9833-f6be5c38a832,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-workflowhtxjw/series-workflowhtxjw-build-action-910856607/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-workflowhtxjw/series-workflowhtxjw-build-action-3310089936/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-workflowhtxjw/series-workflowhtxjw-convert-artifact-411018957/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,}