Name: series-workflowjw27z Phase: Failed StartedAt: 2026-08-15 02:15:04 +0000 UTC FinishedAt: 2026-08-15 02:19:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjw27z[0] Phase: Succeeded StartedAt: 2026-08-15 02:15:04 +0000 UTC FinishedAt: 2026-08-15 02:18:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjw27z[0].run-triage Phase: Succeeded StartedAt: 2026-08-15 02:15:04 +0000 UTC FinishedAt: 2026-08-15 02:18:58 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDAyOjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMTUgMDI6MTg6MjggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICYjNDM7MTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwxMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4mIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4mIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuJiM0MzsgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4mIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO1xuJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdHVpbnRwdHJfdCBhbGlnbmVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuJiM0MztcdGlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcClcbiYjNDM7XHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbiYjNDM7XHRpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9ICh1aW50cHRyX3QpcCAmIzQzOyBsZW4pXG4mIzQzO1x0XHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICYjNDM7IHNpemUsXG4mIzQzO1x0XHQgICAgICAgKHVpbnRwdHJfdClwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxuJiM0MzsgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRib29sIG9rID0gdHJ1ZTtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0aWYgKG9yZGVyKVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xuJiM0MztcdCpwID0gMTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4mIzQzO1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIHNpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCYjMzQ7b3JkZXIgJWQgY2xhc3NpZmllZFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9yZGVycztcbiYjNDM7XHRpbnQgb3JkZXI7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfb3JkZXIoMCk7XG4mIzQzO1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcbiYjNDM7XHRrc2Z0X2ZpbmlzaGVkKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyAmIzQzOzY1LDYgQEAgZW51bSB7XG4gI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjRcbiAjZGVmaW5lIE5USU1FU1x0XHQxMFxuIFxuLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgJiM0MzsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xuIFxuICNpZm5kZWYgRk9MTF9XUklURVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi45OTJlZmVlMTdiNzE2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICYjNDM7MTgzLDE5IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkIC0tXG4mIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbiYjNDM7ICogcXVldWUgLS0gYW5kIHNldHRpbmdzIHB1c2hlcy9wb3BzIG11c3Qgbm90IHN0YXJ0IHNjYW4gcGFzc2VzIG5vYm9keVxuJiM0MzsgKiBhc2tlZCBmb3I7IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLiAgVGhlXG4mIzQzOyAqIG90aGVyIGtub2JzIGRvIG5vdCB3YWtlLCBidXQgd3JpdGluZyB0aGVtIHRoZSBzYW1lIHdheSBjb3N0cyBub3RoaW5nLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbiYjNDM7e1xuJiM0MztcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxuJiM0MztcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIHtcbiBcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXHUwMDI2c2V0dGluZ3MtXHUwMDNla2h1Z2VwYWdlZDtcbkBAIC0xOTgsMTUgJiM0MzsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCYjMzQ7dXNlX3plcm9fcGFnZVwmIzM0Oywgc2V0dGluZ3MtXHUwMDNldXNlX3plcm9fcGFnZSk7XG4gXG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICYjNDM7MjQzLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuJiM0MzsgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcbiYjNDM7ICogYSAmIzQzOzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4mIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuXG4mIzQzOyAqXG4mIzQzOyAqIEFueSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBzbyB0aGUgYmFycmllciB3b3Jrc1xuJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuXG4mIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbiYjNDM7ICogcXVldWU7IGlmIHRoZSBkYWVtb24gaXMgYmV0d2VlbiBzY2FucyByYXRoZXIgdGhhbiBzbGVlcGluZywgaXQgc2V0c1xuJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kXG4mIzQzOyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuJiM0MzsgKiBzdG9yaW5nIHVudGlsIHRoZSBwYXNzIGxhbmRzOyBhIHN0b3JlIHdoaWxlIHRoZSBkYWVtb24gaXMgYXdha2UgY29zdHNcbiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy5cbiYjNDM7ICpcbiYjNDM7ICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluXG4mIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxuJiM0MzsgKiBwYWdlc190b19zY2FuLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cbiYjNDM7XHRcdHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuJiM0MztcdGludCBwYXNzO1xuJiM0MztcbiYjNDM7XHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuJiM0MztcdFx0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSAmIzQzOyAxO1xuJiM0MztcbiYjNDM7XHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSBcdTAwM2MgdGFyZ2V0KSB7XG4mIzQzO1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0XHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgc2xlZXBfbXMpO1xuJiM0MztcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbiYjNDM7XHRcdFx0ZWxhcHNlZF9tcyAmIzQzOz0gMTA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7XG4gdm9pZCB0aHBfd3JpdGVfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfcmVhZF9udW0oY29uc3QgY2hhciAqbmFtZSk7XG4gdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTtcbiYjNDM7dm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgJiM0Mzs4NCw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbiYjNDM7XG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICYjNDM7MzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xuJiM0MztzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9naXZlbjtcbiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbiYjNDM7c3RhdGljIGludCBucl9jb2xsYXBzZV9vcmRlcnM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcJiMzNDsvcHJvYy9zZWxmL3NtYXBzXCYjMzQ7XG4gI2RlZmluZSBURVNUX0ZJTEUgXCYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlXCYjMzQ7XG5AQCAtMjE5LDYgJiM0MzsyMjQsNDEgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4gXHRyZXR1cm4gc3dhcDtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFBhZ2UgdGhlIHJhbmdlIG91dCBhbmQgd2FpdCBmb3IgdGhlIHN3YXAgY291bnQgdG8gc2F5IHNvLlxuJiM0MzsgKlxuJiM0MzsgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuJiM0MzsgKiBzaHJpbmtfZm9saW9fbGlzdCgpIGxlYXZlcyBhIGZvbGlvIGFsb25lIHdoZW4gaXQgY2Fubm90IHJlY2xhaW0gaXQgcmlnaHRcbiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vblxuJiM0MzsgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbiYjNDM7ICogYW4gZWFybGllciBjb2xsYXBzZSBsZWZ0IE1BRFZfSFVHRVBBR0UgaXMgb25lIGtodWdlcGFnZWQgaXMgc3RpbGwgd29ya2luZ1xuJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFuc1xuJiM0MzsgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbiYjNDM7ICogaXMgYXNrZWQgZm9yLiAgS2VlcCB0aGUgcmFuZ2Ugb3V0IG9mIGl0cyByZWFjaDsgdGhlIGNvbGxhcHNlIHRoZSBjYWxsZXIgcnVuc1xuJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBGYWlsaW5nIHRvIGdldCB0aGUgcGFnZXMgb3V0IGlzIHRoZSBtYWNoaW5lJiMzOTtzIGFuc3dlciwgbm90IHRoZSBrZXJuZWwmIzM5O3MgLS1cbiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvXG4mIzQzOyAqIGNhbGxlcnMgc2tpcCByYXRoZXIgdGhhbiBmYWlsLiAgQW4gZXJyb3IgZnJvbSBtYWR2aXNlKCkgaXMgZGlmZmVyZW50LCBhbmRcbiYjNDM7ICogZW5kcyB0aGUgcnVuIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQwOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHR1c2xlZXAoNTAgKiAxMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxNSw4ICYjNDM7NTU1LDggQEAgc3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxuIHtcbi1cdGludCByZXQ7XG4gXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IHJldCwgaTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzLi4uXCYjMzQ7LCBtc2cpO1xuIFxuQEAgLTUyOSw5ICYjNDM7NTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHQvKlxuIFx0ICogUHJldmVudCBraHVnZXBhZ2VkIGludGVyZmVyZW5jZSBhbmQgdGVzdHMgdGhhdCBNQURWX0NPTExBUFNFXG4gXHQgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcbiYjNDM7XHQgKlxuJiM0MztcdCAqIFRoZSBwZXItb3JkZXIgY29udHJvbHMgaGF2ZSB0byBnbyB0b28sIG5vdCBqdXN0IHRoZSBnbG9iYWwgb25lOiBhXG4mIzQzO1x0ICogc291cmNlIG9yZGVyIGxlZnQgYXQgXCYjMzQ7YWx3YXlzXCYjMzQ7IC0tIHdoaWNoIC1zIGRvZXMgLS0gbGV0cyBraHVnZXBhZ2VkXG4mIzQzO1x0ICogY29sbGFwc2UgdGhlIHZlcnkgcmFuZ2UgdGhlIGNhc2UgaXMgd29ya2luZyBvbi4gIFNldCB0aGVtIHRvXG4mIzQzO1x0ICogXCYjMzQ7aW5oZXJpdFwmIzM0Oywgbm90IFwmIzM0O25ldmVyXCYjMzQ7LiAga2h1Z2VwYWdlZCBob25vdXJzIHRoZSBnbG9iYWwgbmV2ZXIgYW5kXG4mIzQzO1x0ICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tXG4mIzQzO1x0ICogdGhlc2UgdmVyeSBjb250cm9scywgYW5kIHN0aWxsIGZpbmRzIG9uZS5cbiBcdCAqL1xuIFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4gXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdHNldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tpXS5lbmFibGVkID0gU0hNRU1fSU5IRVJJVDtcbiYjNDM7XHR9XG4gXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4gXG4gXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXG5AQCAtNTYxLDggJiM0Mzs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4mIzQzO1x0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XG4mIzQzO1x0aW50IHRpbWVvdXQgPSA2ICYjNDM7IDIgKiAoYnl0ZXMgLyAoMTI4VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgbGVuLCAwLCBocGFnZV9zaXplKSlcbkBAIC04MjUsMTIgJiM0Mzs4NzgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0IG9uZSBwYWdlLi4uXCYjMzQ7KTtcbi1cdGlmIChtYWR2aXNlKHAsIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4mIzQzO1x0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg1MSwxMiAmIzQzOzkwMiwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cJiMzNDssIG1heF9wdGVzX3N3YXAgJiM0MzsgMSwgaHBhZ2VfcG1kX25yKTtcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg2OCwxMiAmIzQzOzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwLFxuIFx0XHQgICAgICAgaHBhZ2VfcG1kX25yKTtcbi1cdFx0aWYgKG1hZHZpc2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4gXHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTQwLDYgJiM0Mzs5ODcsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xuJiM0MztcdCAqIGZhaWwgZm9yIGxhcmdlIFBNRCBzaXplcy4gIFNraXAgaWYgdGhlIFBNRCBzaXplIGlzIG92ZXIgMzJNLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwmIzM0Oyk7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7XG5AQCAtMTEzMCw2ICYjNDM7MTE4Nyw5NyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIENvbnRlbnQgc3RheXMgaXNvbGF0ZWQgd2hpbGUgYSBjby1zaGFyZXIgd3JpdGVzIGNvbmN1cnJlbnRseS4gQSBzaGFyZWRcbiYjNDM7ICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcbiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGVcbiYjNDM7ICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcbiYjNDM7ICogaXRzIG93biB3cml0ZXMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBzaGFyZWQgPSA2NCAqIHBhZ2Vfc2l6ZTtcbiYjNDM7XHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XG4mIzQzO1x0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XHQvKiB2b2xhdGlsZTogdGhlIGxvb3AgYmVsb3cgbXVzdCByZWFsbHkgc3RvcmUsIG9uIGV2ZXJ5IGl0ZXJhdGlvbiAqL1xuJiM0MztcdHZvbGF0aWxlIGludCAqaXA7XG4mIzQzO1x0cGlkX3QgY2hpbGQ7XG4mIzQzO1x0aW50IHN5bmNbMl07XG4mIzQzO1x0Y2hhciBnbyA9IDE7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcdFx0Lyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqL1xuJiM0MztcdGlmIChwaXBlKHN5bmMpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3BpcGUoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uXCYjMzQ7KTtcbiYjNDM7XHRjaGlsZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkKSB7XG4mIzQzO1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdGNsb3NlKHN5bmNbMF0pO1xuJiM0MztcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbiYjNDM7XHRcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovXG4mIzQzO1x0XHRpZiAod3JpdGUoc3luY1sxXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4mIzQzO1x0XHRcdF9leGl0KEtTRlRfRkFJTCk7XG4mIzQzO1x0XHR1c2xlZXAoNTAwMCk7XG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbiYjNDM7XHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdF9leGl0KGV4aXRfc3RhdHVzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNsb3NlKHN5bmNbMV0pO1xuJiM0MztcdGlmIChyZWFkKHN5bmNbMF0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2NoaWxkIG5ldmVyIHJlYWNoZWQgdGhlIGNvbGxhcHNlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZS4gIEEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIGFsbCBvZiB0aGVtXG4mIzQzO1x0ICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS1cbiYjNDM7XHQgKiBhbmQgdGhlIGNoaWxkIHdvdWxkIGNvbGxhcHNlIHBhZ2VzIGFscmVhZHkgZXhjbHVzaXZlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdGkgPSAwO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGlmIChpIFx1MDAzYyBuKVxuJiM0MztcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDtcbiYjNDM7XHRcdGkmIzQzOyYjNDM7O1xuJiM0MztcdFx0dXNsZWVwKDEwICogMTAwMCk7XG4mIzQzO1x0fSB3aGlsZSAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykgPT0gMCk7XG4mIzQzO1xuJiM0MztcdC8qIFdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoLCBzbyB0aGUgY2hlY2sgYmVsb3cgaXMgZXhhY3QuICovXG4mIzQzO1x0Zm9yICg7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7XG4mIzQzO1x0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cbiYjNDM7XHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0aWYgKGkgPT0gbilcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnRcJiMzNDspO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdC4gKi9cbiYjNDM7XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuJiM0MztcdFx0ZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbkBAIC0xMTc1LDYgJiM0MzsxMzIzLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuIH1cbiBcbiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuJiM0MzsjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgZm9yIHRoZSBtdGhwX2todWdlcGFnZWQgY29udGV4dC4gIFdoYXRcbiYjNDM7ICogdGhleSBhZGQgb3ZlciB0aGUgZ2VuZXJpYyBjYXNlcyBydW4gdW5kZXIgdGhhdCBjb250ZXh0IGlzIHBlci13aW5kb3dcbiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWRcbiYjNDM7ICogbm90LiAgY2hlY2tfaHVnZSgpIGFuc3dlcnMgaG93IG1hbnkgZm9saW9zIG9mIHRoZSBvcmRlciB0aGUgcmFuZ2UgaG9sZHMsXG4mIzQzOyAqIHdoaWNoIGNhbm5vdCB0ZWxsIG9uZSB3aW5kb3cgZnJvbSBhbm90aGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgcmVnaW9uIGlzIGZhdWx0ZWQgYmVmb3JlIE1BRFZfSFVHRVBBR0UsIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzIG9ubHlcbiYjNDM7ICogZW5hYmxlZCBmb3IgbWFkdmlzZSwgc28gdGhlIHNvdXJjZXMgYXJlIGFsd2F5cyBvcmRlciAwIGFuZCB0aGUgY29sbGFwc2VcbiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHNpemVfdCBtdGhwX3dpbmRvd19zaXplKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXG4mIzQzO1x0ICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmVcbiYjNDM7XHQgKiBvcmRlciAwIHdoYXRldmVyIC1zIGFza2VkIHRoZSBmYXVsdCBwYXRoIGZvci4gIFRoYXQgbWF0dGVycyBmb3IgdGhlXG4mIzQzO1x0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXG4mIzQzO1x0ICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLlxuJiM0MztcdCAqIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMgZW5hYmxlcyB0aGUgc291cmNlIG9yZGVyIGl0IHdhbnRzIG9uXG4mIzQzO1x0ICogdG9wIG9mIHRoaXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cbiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcbiYjNDM7e1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0Y2hhciAqYWRkciA9IHA7XG4mIzQzO1xuJiM0MztcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgJiM0Mzs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xuJiM0MztcdFx0aWYgKHdpbmRvd19jb2xsYXBzZWQoYWRkciwgd2luZG93KSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbiYjNDM7XHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCAmIzQzOyB3aW5kb3csIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IDIgKiB3aW5kb3csXG4mIzQzO1x0XHRcdFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuJiM0MztcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXG4mIzQzO1x0aWYgKHNvdXJjZV9vcmRlciBcdTAwM2U9IGNvbGxhcHNlX29yZGVyIHx8XG4mIzQzO1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1xuJiM0MztcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsXG4mIzQzO1x0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxuJiM0MztcdCAqIHdoaWNoIGlzIHRoZSBtYWNoaW5lJiMzOTtzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgaHBhZ2VfcG1kX3NpemUsIHNvdXJjZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cJiMzNDssIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0XHRza2lwKFwmIzM0O1NraXBcJiMzNDspO1xuJiM0MztcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHJlZ2lvbiBiYWNrZWQgYnkgb3JkZXItJWQgc291cmNlcy4uLlwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4ge1xuIFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1xcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFx1MDAzY3Rlc3QgdHlwZVx1MDAzZSBbZGlyXVxcblxcblwmIzM0Oyk7XG5AQCAtMTE5MiwxMSAmIzQzOzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxuXCYjMzQ7KTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCYjMzQ7KTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdGJvb2wgbXRocF9jb250ZXh0X2ltcGxpZWQgPSBmYWxzZTtcbiBcdGludCBvcHQ7XG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbkBAIC0xMjA4LDYgJiM0MzsxNTczLDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2MmIzM5OzpcbiBcdFx0XHRjb2xsYXBzZV9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJfZ2l2ZW4gPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7aCYjMzk7OlxuIFx0XHRkZWZhdWx0OlxuQEAgLTEyMTUsMTIgJiM0MzsxNTgxLDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdH1cbiBcdH1cbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcbiYjNDM7XHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoYW5vbl9vcmRlciBcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcikpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1xuIFx0YXJndiAmIzQzOz0gb3B0aW5kO1xuIFx0YXJnYyAtPSBvcHRpbmQ7XG4gXG4gXHRpZiAoYXJnYyA9PSAwKSB7XG4tXHRcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXG4mIzQzO1x0XHQvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyMzEsMTMgJiM0MzsxNjEwLDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7YWxsXCYjMzQ7KSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFwmIzM0O2FsbFwmIzM0OyBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbiYjNDM7XHRcdCAqIGNhc2VzOiBzdGVwIGl0IGFzaWRlIGZvciB0aGUgb3RoZXIgbWVtX3R5cGVzIHJhdGhlciB0aGFuXG4mIzQzO1x0XHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI1MywyMCAmIzQzOzE2MzgsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjg4LDkgJiM0MzsxNjczLDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMDMsNiAmIzQzOzE2ODksNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNDMsOCAmIzQzOzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xuJiM0MztcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbiYjNDM7XHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7LWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xuJiM0MztcdFx0XHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcbiYjNDM7XHRcdFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XG4mIzQzO1x0XHRcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGludCBmaXJzdCA9IGFub25fb3JkZXIgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChmaXJzdCBcdTAwM2MgTUlOX01USFBfT1JERVIpXG4mIzQzO1x0XHRcdFx0Zmlyc3QgPSBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmICghbnJfY29sbGFwc2Vfb3JkZXJzKVxuJiM0MztcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O21USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbiYjNDM7XHRcdHBhZ2VtYXBfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0c2V0YnVmKHN0ZG91dCwgTlVMTCk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoIGlzXG4mIzQzO1x0ICogYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4gIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XG4mIzQzO1x0ICogZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuICBUaGUgY2FwIGlzIG5vdCBzaG1lbS1zcGVjaWZpYzpcbiYjNDM7XHQgKiBpdCBydWxlcyBvdXQgcmVndWxhciBmaWxlcyB0b28sIGFuZCB0aGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWRcbiYjNDM7XHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuJiM0MztcdCAqIHRoZW0gcmVhZGFibGUgaGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuJiM0MztcdFx0aWYgKHNobWVtX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzaG1lbV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbiYjNDM7XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcbkBAIC0xMzYyLDcgJiM0MzsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xMzcwLDExICYjNDM7MTgzMiw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xuIFxuIFx0VEVTVChjb2xsYXBzZV9lbXB0eSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4tXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVxuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQyOSw2ICYjNDM7MTg4OCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ0NCw3ICYjNDM7MTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlciA9IHQtXHUwMDNlb3JkZXI7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwmIzM0OywgdC1cdTAwM2VkZXNjLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NjgyYmJhZTBhOGY4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCAmIzQzOzEsNTg5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuJiM0MzsgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4mIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4mIzQzOyAqXG4mIzQzOyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUgdGhyb3VnaFxuJiM0MzsgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuJiM0MzsgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbiYjNDM7ICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGFuZCBNQURWX0RPTlRORUVEIGluIGEgbG9vcC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcbiYjNDM7ICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuJiM0MzsgKiBjb2xsYXBzZXMgdG9vLiAgQSBob2xlIGlzIHplcm8tZmlsbGVkIGludG8gdGhlIG5ldyBmb2xpbyByYXRoZXIgdGhhblxuJiM0MzsgKiBjb3BpZWQsIGFuZCB0aGUgcmFjaW5nIE1BRFZfRE9OVE5FRUQga2VlcHMgbW92aW5nIHdoaWNoIHNsb3RzIGFyZSBob2xlcy5cbiYjNDM7ICpcbiYjNDM7ICogRXZlcnkgY29tYmluYXRpb24gYWxzbyBydW5zIHVuZGVyIG1lbW9yeSBwcmVzc3VyZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbiYjNDM7ICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3VyIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IGxlZnQgb3V0XG4mIzQzOyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplXG4mIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbiYjNDM7ICpcbiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4mIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9ya1xuJiM0MzsgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4mIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcbiYjNDM7c3RhdGljIGludCBndXBfZmQgPSAtMTtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJiMzOTtzIHBhdHRlcm4gKi9cbiYjNDM7c3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAqdmFsIFx1MDAyNlx1MDAyNiAqdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4mIzQzO1x0XHRjb3JydXB0ZWQgPSAxO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQmIzM5O3MgYXJlYSAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHdhbnQgXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmFuZF9yKFx1MDAyNnNlZWQpIFx1MDAyNiAxKVxuJiM0MztcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cbiYjNDM7XHRcdFx0XHRwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXG4mIzQzO1x0XHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxuJiM0MztcdFx0ICogKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgdGhlIHRhYmxlIHVuZGVyIGFcbiYjNDM7XHRcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxuJiM0MztcdFx0ICogcmVhY2ggdGhhdCBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuJiM0MztcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcbiYjNDM7XG4mIzQzO1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcdFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcbiYjNDM7XHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xuJiM0MztcdFx0Z3VwLmd1cF9mbGFncyA9IDE7XHQvKiBGT0xMX1dSSVRFICovXG4mIzQzO1x0XHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXG4mIzQzO1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGludCB2YWw7XG4mIzQzO1x0XHRcdGludCBiYWQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkXG4mIzQzO1x0XHRcdCAqIHN0ZG91dCYjMzk7cyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cbiYjNDM7XHRcdFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcbiYjNDM7XHRcdFx0ICogZXhpdCBzdGF0dXMgc2F5cy5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyAxNjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXHUwMDI2c2VlZCksIFx1MDAyNnZhbCk7XG4mIzQzO1x0XHRcdF9leGl0KGJhZCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGludCB3c3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHdhaXRwaWQocGlkLCBcdTAwMjZ3c3RhdHVzLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7d2FpdHBpZCgpXCYjMzQ7KTtcbiYjNDM7XHRcdFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbywgbm90IGp1c3QgaXRzIGV4aXQgY29kZS4gKi9cbiYjNDM7XHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4mIzQzO1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYXdheVwmIzM0Oyk7XG4mIzQzO1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuJiM0MztcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYmFja1wmIzM0Oyk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxuJiM0MzsgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcbiYjNDM7ICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdCoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yIFx1MDAyNlx1MDAyNiAhc3RvcDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzO1xuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcbiYjNDM7XHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuJiM0MztcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXG5cJiMzNDspO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4mIzQzO1x0XHRcJiMzNDtmYXVsdGVyXCYjMzQ7LCBcJiMzNDtmYXVsdGVyMlwmIzM0OywgXCYjMzQ7ZG9udG5lZWRcJiMzNDssIFwmIzM0O3Bpbm5lclwmIzM0OywgXCYjMzQ7Zm9ya2VyXCYjMzQ7LFxuJiM0MztcdFx0XCYjMzQ7bXJlbWFwcGVyXCYjMzQ7LCBcJiMzNDtwYWdlb3V0XCYjMzQ7LCBcJiMzNDtjb21wYWN0b3JcJiMzNDssXG4mIzQzO1x0fTtcbiYjNDM7XHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbiYjNDM7XHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbiYjNDM7XHRcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxuJiM0MztcdH07XG4mIzQzO1x0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxuJiM0MztcdCAgICAgICBUX01SRU1BUFBFUiwgVF9QQUdFT1VULCBUX0NPTVBBQ1RPUiB9O1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfUEFHRU9VVDtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfQ09NUEFDVE9SO1xuJiM0MztcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCYjMzQ7c3RlcHBlZFwmIzM0OywgXCYjMzQ7ZnJlZVwmIzM0OywgXCYjMzQ7bWFkdmlzZVwmIzM0OyB9O1xuJiM0MztcdHN0YXRpYyBjb25zdCBib29sIG9jY3VwYW5jaWVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBzdHJpY3QsIGhvbGVzICovXG4mIzQzO1x0c3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbiYjNDM7XHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcHJlc3N1cmVzID0gQVJSQVlfU0laRShwcmVzc3VyZXMpO1xuJiM0MztcdGNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdO1xuJiM0MztcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4mIzQzO1x0aW50IG5yX21vZGVzID0gQVJSQVlfU0laRShhbGxfbW9kZXMpO1xuJiM0MztcdGNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xuJiM0MztcdGludCBkdXJhdGlvbl9zID0gNTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJhc2VfbWFzaztcbiYjNDM7XHRpbnQgbnJfYXJlYXNfYXJnID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1x0aW50IHN0ZXBzID0gMDtcbiYjNDM7XHRpbnQgb3B0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDthOmQ6bTp0OmhcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTthJiMzOTs6XG4mIzQzO1x0XHRcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ZCYjMzk7OlxuJiM0MztcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt0JiMzOTs6XG4mIzQzO1x0XHRcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobW9kZV9hcmcpIHtcbiYjNDM7XHRcdGlmIChzdHJjbXAobW9kZV9hcmcsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O2ZyZWVcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCYjMzQ7bWFkdmlzZVwmIzM0OykpXG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xuJiM0MztcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbiYjNDM7XHRcdG5yX21vZGVzID0gMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuJiM0MztcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzby4gIENsYWltXG4mIzQzO1x0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cbiYjNDM7XHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuJiM0MztcdCAqIHByb2Nlc3MgbWFwcyB0aGlzIGxvdzogdGhyZWFkIHN0YWNrcyBhbmQgbWFsbG9jIGFyZW5hcyBjb21lIGZyb20gdGhlXG4mIzQzO1x0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbiYjNDM7XHRcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgbXJlbWFwIHNjcmF0Y2hcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbiYjNDM7XHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBiYXNlIGVudHJ5IGZvciB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlIHBvcCBhdCB0aGUgZW5kIG9mIGEgbW9kZVxuJiM0MztcdCAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eVxuJiM0MztcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuJiM0MztcdFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XG4mIzQzO1x0XHRib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107XG4mIzQzO1xuJiM0MztcdFx0dGhyZWFkX21hc2sgPSBiYXNlX21hc2s7XG4mIzQzO1x0XHRpZiAoIXByZXNzdXJlKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcbiYjNDM7XHRcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4mIzQzO1x0XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZSBvbmx5IHN1cHBvcnRzIHRoZSB0d28gZW5kcyBvZiB0aGUgb2NjdXBhbmN5XG4mIzQzO1x0XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4mIzQzO1x0XHQgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyXG4mIzQzO1x0XHQgKiByYWNpbmcgTUFEVl9ET05UTkVFRDsgaG9sZS1oZWF2eSB3aW5kb3dzIGNvbGxhcHNlIGluc3RlYWQsXG4mIzQzO1x0XHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID9cbiYjNDM7XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbiYjNDM7XHRcdFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXG4mIzQzO1x0XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxuJiM0MztcdFx0XHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbiYjNDM7XHRcdGlmIChyZWdpb24gIT0gQkFTRV9BRERSKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIHBsYXlncm91bmRcJiMzNDspO1xuJiM0MztcdFx0bXJlbWFwX2FyZWEgPSByZWdpb24gJiM0MzsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHRocmVhZF9tYXNrIFx1MDAyNiBwYWdlb3V0X2JpdCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdFxuJiM0MztcdFx0XHQgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG9cbiYjNDM7XHRcdFx0ICogWzE2TSwgNjRNXS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfc2l6ZSBcdTAwM2MgMTZVTCBcdTAwM2NcdTAwM2MgMjApXG4mIzQzO1x0XHRcdFx0cGFnZW91dF9zaXplID0gMTZVTCBcdTAwM2NcdTAwM2MgMjA7XG4mIzQzO1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MztcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDY0VUwgXHUwMDNjXHUwMDNjIDIwO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuJiM0MztcdFx0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWFcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4mIzQzO1x0XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4mIzQzO1x0XHRcdFx0dGhyZWFkc1tpXSA9IDA7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXG4mIzQzO1x0XHRcdFx0XHQgICAodm9pZCAqKShpICYjNDM7IDEpKSlcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRlbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMO1xuJiM0MztcdFx0aWYgKCFzdHJjbXAobW9kZSwgXCYjMzQ7c3RlcHBlZFwmIzM0OykpIHtcbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbiYjNDM7XHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4mIzQzO1x0XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7a2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXCYjMzQ7ZnJlZVwmIzM0OykpIHtcbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpXG4mIzQzO1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuJiM0MztcdFx0fSBlbHNlIHtcdC8qIG1hZHZpc2UgKi9cbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbiYjNDM7XHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBpICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0XHRcdGhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0c3RvcCA9IDE7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhyZWFkc1tpXSlcbiYjNDM7XHRcdFx0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LyogRmluYWwgaW50ZWdyaXR5IHN3ZWVwLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRjaGVja19wYWdlKGkpO1xuJiM0MztcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCxcbiYjNDM7XHRcdFx0XHQgXCYjMzQ7JXMvJXMlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcJiMzNDtob2xlc1wmIzM0OyA6IFwmIzM0O3N0cmljdFwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgcHJlc3N1cmUgPyBcJiMzNDsvcHJlc3N1cmVcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4mIzQzO1x0XHRcdFx0IGR1cmF0aW9uX3MsIHN0ZXBzKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogSGFuZCB0aGUgYWRkcmVzcyBzcGFjZSBhbmQgdGhlIHNldHRpbmdzIGJhY2sgYmVmb3JlIHRoZVxuJiM0MztcdFx0ICogbmV4dCBtb2RlOiBpdCBtYXBzIHRoZSByZWdpb24gYXQgdGhlIHNhbWUgZml4ZWQgYWRkcmVzcyxcbiYjNDM7XHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdG11bm1hcChyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuJiM0MztcdFx0XHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdFx0c3RvcCA9IDA7XG4mIzQzO1x0XHRzdGVwcyA9IDA7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbiYjNDM7XHRcdFx0d2hpbGUgKCYjNDM7JiM0MztydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpIHtcbiYjNDM7XHRcdFx0XHRyZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXSA/XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0Oyk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTk2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbiYjNDM7ICpcbiYjNDM7ICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhXG4mIzQzOyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4mIzQzOyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxuJiM0MzsgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzXG4mIzQzOyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4mIzQzOyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcbiYjNDM7ICogd2luZG93JiMzOTtzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4mIzQzOyAqIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyKSBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWRcbiYjNDM7ICogYWZ0ZXJ3YXJkcywgcmVwZWF0YWJseS5cbiYjNDM7ICpcbiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0XG4mIzQzOyAqIHRoZSB3YWtlLCBvbmUgYmFycmllciBzdGVwIHdvdWxkIHNsZWVwIG11bHRpcGxlcyBvZiB0aGF0IGFuZCBibG93XG4mIzQzOyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuJiM0MzsgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MzsjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXHQvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqL1xuJiM0MzsjZGVmaW5lIE5SX0lURVJBVElPTlMgNVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogRWFjaCBzdGVwIHN3aXRjaGVzIHRoZSBldmVudHMgb2ZmIGFnYWluLCBidXQgYSBoZWxwZXIgY2FuIHN0aWxsIGdpdmUgdXBcbiYjNDM7ICogb24gdXMgaW4gYmV0d2VlbiAoYSBmYWlsaW5nIHN5c2ZzIHdyaXRlIGVuZHMgdGhlIHRlc3QgZnJvbSBpbnNpZGVcbiYjNDM7ICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSYjMzk7c1xuJiM0MzsgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0JiMzOTtzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxuJiM0MzsgKiBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcywgcmVwb3J0ZWQgb25jZSBwZXIgYXR0ZW1wdC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsxMDI0XTtcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBvcmQ7XG4mIzQzO1x0XHRjaGFyICpzLCAqbztcbiYjNDM7XHRcdGludCBpO1xuJiM0MztcbiYjNDM7XHRcdHMgPSBzdHJzdHIobGluZSwgXCYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghcylcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAoc3NjYW5mKHMsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fCBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4mIzQzO1x0XHRcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5zWzEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUl07XG4mIzQzO1x0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcbiYjNDM7XHRpbnQgYXR0cmlidXRlZDtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChCQVNFX0FERFIsIGhwYWdlX3BtZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIHdpbmRvd1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxO1xuJiM0MztcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRcdGlmIChwZm5zW2ldID09IC0xVUwpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIHRydWUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBlbmFibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdC8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7XG4mIzQzO1xuJiM0MztcdC8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcdGlmICghcGFzc2VkKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7XHRhdHRyaWJ1dGVkID0gY291bnRfYXR0cmlidXRlZChwZm5zLCBucl9wYWdlcywgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbiYjNDM7XHRcdFx0IFwmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4mIzQzO1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgJiM0Mzs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4mIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4mIzQzOyAqIGFsaWduZWQsIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cmIzM5O3MgZmlyc3RcbiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzogYVxuJiM0MzsgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4mIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspLlxuJiM0MzsgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXG4mIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuJiM0MzsgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cbiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgJiM0MzsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4mIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4mIzQzO1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XG4gaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTtcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwMjoxODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgMTUgMDI6MTg6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2UKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBybWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrCiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfc3luY19jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2UKIAogaWZuZXEgKCQoQVJDSCksYXJtNjQpCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTM3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLAomIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seQomIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6CiYjNDM7ICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzCiYjNDM7ICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvCiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55CiYjNDM7ICogY29sbGFwc2UgdGVzdCByZWxpZXMgb24gdGhlbS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7CiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkOwomIzQzOwomIzQzOy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi8KJiM0MztzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzaXplICogMjsKJiM0MzsJdWludHB0cl90IGFsaWduZWQ7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSYjMzQ7KTsKJiM0MzsKJiM0MzsJYWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7CiYjNDM7CWlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcCkKJiM0MzsJCW11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTsKJiM0MzsJaWYgKGFsaWduZWQgJiM0Mzsgc2l6ZSAhPSAodWludHB0cl90KXAgJiM0MzsgbGVuKQomIzQzOwkJbXVubWFwKChjaGFyICopYWxpZ25lZCAmIzQzOyBzaXplLAomIzQzOwkJICAgICAgICh1aW50cHRyX3QpcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiAoY2hhciAqKWFsaWduZWQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZAomIzQzOyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCBzaXplID0gcHNpemUoKSAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJYm9vbCBvayA9IHRydWU7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlpZiAob3JkZXIpCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7CiYjNDM7CSpwID0gMTsKJiM0MzsKJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLAomIzQzOwkJCQkJICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcbiYjMzQ7LCBvcmRlcik7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJaWYgKG9yZGVyICZhbXA7JmFtcDsgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsCiYjNDM7CQkJCQkJICAgICBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJCSAgICAga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxuJiMzNDssCiYjNDM7CQkJICAgICAgIG9yZGVyLCBvcmRlciAtIDEpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqLwomIzQzOwlpZiAob3JkZXIgJmFtcDsmYW1wOyBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsCiYjNDM7CQkJCQkJICAgICBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJCSAgICAga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltdW5tYXAocCwgc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChvaywgJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXG4mIzM0Oywgb3JkZXIpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBvcmRlcnM7CiYjNDM7CWludCBvcmRlcjsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpOwomIzQzOwlpZiAoIW9yZGVycykKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovCiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwljaGVja19vcmRlcigwKTsKJiM0MzsJZm9yIChvcmRlciA9IDE7IG9yZGVyICZsdDsgTlJfT1JERVJTOyBvcmRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghKG9yZGVycyAmYW1wOyAoMVVMICZsdDsmbHQ7IG9yZGVyKSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQljaGVja19vcmRlcihvcmRlcik7CiYjNDM7CX0KJiM0MzsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0gewogI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjQKICNkZWZpbmUgTlRJTUVTCQkxMAogCi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpICZhbXA7ICh+KChhKSAtIDEpKSkKIC8qIEp1c3QgdGhlIGZsYWdzIHdlIG5lZWQsIGNvcGllZCBmcm9tIG1tLmg6ICovCiAKICNpZm5kZWYgRk9MTF9XUklURQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKaW5kZXggZDc5MTdkY2UzYWJhYy4uOTkyZWZlZTE3YjcxNiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCkBAIC0xODMsNiAmIzQzOzE4MywxOSBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGEgc3RvcmUgdG8gZWl0aGVyIHNsZWVwIGtub2Igd2FrZXMga2h1Z2VwYWdlZCAtLQomIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGUKJiM0MzsgKiBxdWV1ZSAtLSBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5CiYjNDM7ICogYXNrZWQgZm9yOyBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS4gIFRoZQomIzQzOyAqIG90aGVyIGtub2JzIGRvIG5vdCB3YWtlLCBidXQgd3JpdGluZyB0aGVtIHRoZSBzYW1lIHdheSBjb3N0cyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pCiYjNDM7ewomIzQzOwlpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSkKJiM0MzsJCXRocF93cml0ZV9udW0obmFtZSwgbnVtKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIHsKIAlzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9ICZhbXA7c2V0dGluZ3MtJmd0O2todWdlcGFnZWQ7CkBAIC0xOTgsMTUgJiM0MzsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJCQlzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtJmd0O3NobWVtX2VuYWJsZWRdKTsKIAl0aHBfd3JpdGVfbnVtKCYjMzQ7dXNlX3plcm9fcGFnZSYjMzQ7LCBzZXR0aW5ncy0mZ3Q7dXNlX3plcm9fcGFnZSk7CiAKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX25vbmUpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhbiYjMzQ7LCBraHVnZXBhZ2VkLSZndDtwYWdlc190b19zY2FuKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2RlZnJhZyYjMzQ7LCBraHVnZXBhZ2VkLSZndDtkZWZyYWcpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7YWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7c2Nhbl9zbGVlcF9taWxsaXNlY3MpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWQmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiAKIAlpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSkKIAkJd3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLSZndDtyZWFkX2FoZWFkX2tiKTsKQEAgLTIzMCw2ICYjNDM7MjQzLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvOwomIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZQomIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuCiYjNDM7ICoKJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3MKJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuCiYjNDM7ICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZQomIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHMKJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kCiYjNDM7ICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwCiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzCiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy4KJiM0MzsgKgomIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpbgomIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZQomIzQzOyAqIHBhZ2VzX3RvX3NjYW4uCiYjNDM7ICovCiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9CiYjNDM7CQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDspOwomIzQzOwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwOwomIzQzOwlpbnQgcGFzczsKJiM0MzsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKDEwICogMTAwMCk7CiYjNDM7CQkJZWxhcHNlZF9tcyAmIzQzOz0gMTA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwogc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZCkKIHsKIAlpZiAoIXNldHRpbmdzX2luZGV4KSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAppbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7CiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKJiM0Mzt2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKIAogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpOwogdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7CkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IGQzYTUzNjczZTFmOWEuLjE3MmU3MzA3ZWVlZWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTMxLDYgJiM0MzszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjsKIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjsKIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7CiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTIxOSw2ICYjNDM7MjI0LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby4KJiM0MzsgKgomIzQzOyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6CiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0CiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vbgomIzQzOyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZQomIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmcKJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFucwomIzQzOyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdAomIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnMKJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLgomIzQzOyAqCiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tCiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvCiYjNDM7ICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZAomIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0MDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwomIzQzOwkJaWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CQl1c2xlZXAoNTAgKiAxMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKQogewogCXZvaWQgKnA7CkBAIC01MTUsOCAmIzQzOzU1NSw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcykKIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJCQkgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CWludCByZXQsIGk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0OyVzLi4uJiMzNDssIG1zZyk7CiAKQEAgLTUyOSw5ICYjNDM7NTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJLyoKIAkgKiBQcmV2ZW50IGtodWdlcGFnZWQgaW50ZXJmZXJlbmNlIGFuZCB0ZXN0cyB0aGF0IE1BRFZfQ09MTEFQU0UKIAkgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWQKJiM0MzsJICoKJiM0MzsJICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGEKJiM0MzsJICogc291cmNlIG9yZGVyIGxlZnQgYXQgJiMzNDthbHdheXMmIzM0OyAtLSB3aGljaCAtcyBkb2VzIC0tIGxldHMga2h1Z2VwYWdlZAomIzQzOwkgKiBjb2xsYXBzZSB0aGUgdmVyeSByYW5nZSB0aGUgY2FzZSBpcyB3b3JraW5nIG9uLiAgU2V0IHRoZW0gdG8KJiM0MzsJICogJiMzNDtpbmhlcml0JiMzNDssIG5vdCAmIzM0O25ldmVyJiMzNDsuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmQKJiM0MzsJICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tCiYjNDM7CSAqIHRoZXNlIHZlcnkgY29udHJvbHMsIGFuZCBzdGlsbCBmaW5kcyBvbmUuCiAJICovCiAJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7CiAJc2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJCXNldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tpXS5lbmFibGVkID0gU0hNRU1fSU5IRVJJVDsKJiM0MzsJfQogCXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwogCiAJLyogQ2xlYXIgVk1fTk9IVUdFUEFHRSAqLwpAQCAtNTYxLDggJiM0Mzs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sCiAJCWludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiB7CiAJdW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplICZsdDsmbHQ7IGNvbGxhcF9vcmRlcjsKJiM0MzsJLyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovCiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplOwomIzQzOwlpbnQgdGltZW91dCA9IDYgJiM0MzsgMiAqIChieXRlcyAvICgxMjhVTCAmbHQ7Jmx0OyAyMCkpOwogCWludCBmdWxsX3NjYW5zOwotCWludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovCiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKQpAQCAtODI1LDEyICYjNDM7ODc4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi4mIzM0Oyk7Ci0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODUxLDEyICYjNDM7OTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg2OCwxMiAmIzQzOzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05NDAsNiAmIzQzOzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCXZvaWQgKnA7CiAJaW50IGk7CiAKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRlc3QgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBhbGxvY2F0aW9ucywgd2hpY2ggaXMgbGlrZWx5IHRvCiYjNDM7CSAqIGZhaWwgZm9yIGxhcmdlIFBNRCBzaXplcy4gIFNraXAgaWYgdGhlIFBNRCBzaXplIGlzIG92ZXIgMzJNLgomIzQzOwkgKi8KJiM0MzsJaWYgKGhwYWdlX3BtZF9zaXplICZndDsgKDMyVUwgJmx0OyZsdDsgMjApKSB7CiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXG4mIzM0OywKJiM0MzsJCQkJICAgICAgX19mdW5jX18pOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKIAlrc2Z0X3ByaW50X21zZygmIzM0O0NvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXG4mIzM0Oyk7CiAJZm9yIChpID0gMDsgaSAmbHQ7IGhwYWdlX3BtZF9ucjsgaSYjNDM7JiM0MzspIHsKQEAgLTExMzAsNiAmIzQzOzExODcsOTcgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyoKJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkCiYjNDM7ICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGUKJiM0MzsgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlciYjMzk7cyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZQomIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5CiYjNDM7ICogaXRzIG93biB3cml0ZXMuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7CiYjNDM7CWNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTsKJiM0MzsJaW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTsKJiM0MzsJLyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi8KJiM0MzsJdm9sYXRpbGUgaW50ICppcDsKJiM0MzsJcGlkX3QgY2hpbGQ7CiYjNDM7CWludCBzeW5jWzJdOwomIzQzOwljaGFyIGdvID0gMTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJaXAgPSBwOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHNoYXJlZCk7CQkvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovCiYjNDM7CWlmIChwaXBlKHN5bmMpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cGlwZSgpJiMzNDspOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uJiMzNDspOwomIzQzOwljaGlsZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFjaGlsZCkgewomIzQzOwkJaW50IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsKJiM0MzsJCWNsb3NlKHN5bmNbMF0pOwomIzQzOwkJb3BzLSZndDtmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTsJLyogcHJpdmF0ZSByZW1haW5kZXIgKi8KJiM0MzsJCS8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovCiYjNDM7CQlpZiAod3JpdGUoc3luY1sxXSwgJmFtcDtnbywgMSkgIT0gMSkKJiM0MzsJCQlfZXhpdChLU0ZUX0ZBSUwpOwomIzQzOwkJdXNsZWVwKDUwMDApOwomIzQzOwkJYy0mZ3Q7Y29sbGFwc2UoJiMzNDtDb2xsYXBzZSBhIHJhbmdlIHNoYXJlZCB3aXRoIGEgd3JpdGluZyBjby1zaGFyZXImIzM0OywKJiM0MzsJCQkgICAgcCwgMSwgb3BzLCB0cnVlKTsKJiM0MzsJCWNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJaWYgKGkgPT0gbikKJiM0MzsJCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqLwomIzQzOwkJaWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTCkKJiM0MzsJCQlleGl0X3N0YXR1cyA9IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCV9leGl0KGV4aXRfc3RhdHVzKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShzeW5jWzFdKTsKJiM0MzsJaWYgKHJlYWQoc3luY1swXSwgJmFtcDtnbywgMSkgIT0gMSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2NoaWxkIG5ldmVyIHJlYWNoZWQgdGhlIGNvbGxhcHNlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuc2hhcmUgb25lIHBhZ2UgYXQgYSB0aW1lLiAgQSBidXJzdCB3b3VsZCBicmVhayBDb1cgb24gYWxsIG9mIHRoZW0KJiM0MzsJICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS0KJiM0MzsJICogYW5kIHRoZSBjaGlsZCB3b3VsZCBjb2xsYXBzZSBwYWdlcyBhbHJlYWR5IGV4Y2x1c2l2ZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CWkgPSAwOwomIzQzOwlkbyB7CiYjNDM7CQlpZiAoaSAmbHQ7IG4pCiYjNDM7CQkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwl9IHdoaWxlICh3YWl0cGlkKGNoaWxkLCAmYW1wO3dzdGF0dXMsIFdOT0hBTkcpID09IDApOwomIzQzOwomIzQzOwkvKiBXaGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCwgc28gdGhlIGNoZWNrIGJlbG93IGlzIGV4YWN0LiAqLwomIzQzOwlmb3IgKDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CS8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovCiYjNDM7CWNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJLyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTExNzUsNiAmIzQzOzEzMjMsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdAomIzQzOyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93CiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWQKJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcywKJiM0MzsgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci4KJiM0MzsgKgomIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seQomIzQzOyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlCiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGUKJiM0MzsJICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmUKJiM0MzsJICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZQomIzQzOwkgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW4KJiM0MzsJICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLgomIzQzOwkgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvbgomIzQzOwkgKiB0b3Agb2YgdGhpcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICYjNDM7IGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovCiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKQomIzQzO3sKJiM0MzsJLyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CWlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGNvbGxhcHNlX29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwkvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqLwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsCiYjNDM7CSAqIGJhY2sgdW5kZXIgZnJhZ21lbnRhdGlvbi4gIFRoYXQgbGVhdmVzIG5vdGhpbmcgdG8gY29sbGFwc2UgZnJvbSwKJiM0MzsJICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uJiMzNDssCiYjNDM7CQkgICAgICAgc291cmNlX29yZGVyKTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgJiMzNDtcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdICZsdDt0ZXN0IHR5cGUmZ3Q7IFtkaXJdXG5cbiYjMzQ7KTsKQEAgLTExOTIsMTEgJiM0MzsxNTUzLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXG4mIzM0Oyk7CiAJZXhpdCgxKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJYm9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlOwogCWludCBvcHQ7CiAJY2hhciAqYnVmOwogCWNvbnN0IGNoYXIgKnRva2VuOwpAQCAtMTIwOCw2ICYjNDM7MTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O2MmIzM5OzoKIAkJCWNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTIxNSwxMiAmIzQzOzE1ODEsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuICZhbXA7JmFtcDsKJiM0MzsJICAgIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDs9IGhwYWdlX3BtZF9vcmRlcikpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyIC0gMSwgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwogCWFyZ3YgJiM0Mzs9IG9wdGluZDsKIAlhcmdjIC09IG9wdGluZDsKIAogCWlmIChhcmdjID09IDApIHsKLQkJLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KJiM0MzsJCS8qIEV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyBubyBhcmd1bWVudCBvZiBpdHMgb3duOiBhbm9uLCBldmVyeSBjb250ZXh0ICovCiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJCXJldHVybjsKQEAgLTEyMzEsMTMgJiM0MzsxNjEwLDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDthbGwmIzM0OykpIHsKIAkJa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19raHVnZXBhZ2VkX2NvbnRleHQ7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7CiAJCW1hZHZpc2VfY29udGV4dCA9ICAmYW1wO19fbWFkdmlzZV9jb250ZXh0OwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqICYjMzQ7YWxsJiMzNDsgc3dlZXBzIHRoZSBtVEhQIGNvbnRleHQgaW4sIGJ1dCBpdCBvbmx5IGhhcyBhbm9uCiYjNDM7CQkgKiBjYXNlczogc3RlcCBpdCBhc2lkZSBmb3IgdGhlIG90aGVyIG1lbV90eXBlcyByYXRoZXIgdGhhbgomIzQzOwkJICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi4KJiM0MzsJCSAqLwomIzQzOwkJbXRocF9jb250ZXh0X2ltcGxpZWQgPSB0cnVlOwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDtraHVnZXBhZ2VkJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDttdGhwX2todWdlcGFnZWQmIzM0OykpIHsKIAkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwotCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gMCB8fCBjb2xsYXBzZV9vcmRlciAmZ3Q7PSBocGFnZV9wbWRfb3JkZXIpCi0JCQl1c2FnZSgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDttYWR2aXNlJiMzNDspKSB7CiAJCW1hZHZpc2VfY29udGV4dCA9ICAmYW1wO19fbWFkdmlzZV9jb250ZXh0OwogCX0gZWxzZSB7CkBAIC0xMjUzLDIwICYjNDM7MTYzOCwyMCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQlyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzOwogCQlhbm9uX29wcyA9ICZhbXA7X19hbm9uX29wczsKIAkJc2htZW1fb3BzID0gJmFtcDtfX3NobWVtX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQotCQkJdXNhZ2UoKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O2Fub24mIzM0OykpIHsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDtmaWxlJiMzNDspKSB7CiAJCXJlYWRfb25seV9maWxlX29wcyA9ICAmYW1wO19fcmVhZF9vbmx5X2ZpbGVfb3BzOwogCQlyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV9yZWFkX29wczsKIAkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQomIzQzOwkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ICZhbXA7JmFtcDsgIW10aHBfY29udGV4dF9pbXBsaWVkKQogCQkJdXNhZ2UoKTsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O3NobWVtJiMzNDspKSB7CiAJCXNobWVtX29wcyA9ICZhbXA7X19zaG1lbV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKJiM0MzsJCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCAmYW1wOyZhbXA7ICFtdGhwX2NvbnRleHRfaW1wbGllZCkKIAkJCXVzYWdlKCk7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJdXNhZ2UoKTsKIAl9CkBAIC0xMjg4LDkgJiM0MzsxNjczLDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2UgewogCXN0cnVjdCBtZW1fb3BzICpvcHM7CiAJY29uc3QgY2hhciAqZGVzYzsKIAl0ZXN0X2ZuIGZuOwomIzQzOwlpbnQgb3JkZXI7CQkvKiBtVEhQIGNvbnRleHRzOiB0aGUgY29sbGFwc2Ugb3JkZXIgKi8KIH07CiAKLSNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgNjQKJiM0MzsjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1Ngogc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107CiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAKQEAgLTEzMDMsNiAmIzQzOzE2ODksNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAJCQkub3BzCT0gbywJCQkJCVwKIAkJCS5kZXNjCT0gI3QsCQkJCQlcCiAJCQkuZm4JPSB0LAkJCQkJXAomIzQzOwkJCS5vcmRlcgk9IGNvbGxhcHNlX29yZGVyLAkJCVwKIAkJfTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMTM0Myw4ICYjNDM7MTczMCw3MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7CiAKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CiYjNDM7CQlpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHsKJiM0MzsJCQkvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi8KJiM0MzsJCQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcikpKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwkJCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSBhbm9uX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXG4mIzM0OywKJiM0MzsJCQkJCSAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qCiYjNDM7CQkJICogT3RoZXJ3aXNlIGV2ZXJ5IG9yZGVyIGEgY29sbGFwc2UgY291bGQgcHJvZHVjZS4gIC1zCiYjNDM7CQkJICogbWFrZXMgdGhlIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsCiYjNDM7CQkJICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6CiYjNDM7CQkJICogdGhlIHNvdXJjZXMgYXJlIGFscmVhZHkgdGhlIHNpemUgYmVpbmcgYXNrZWQgZm9yLgomIzQzOwkJCSAqLwomIzQzOwkJCWludCBmaXJzdCA9IGFub25fb3JkZXIgJiM0MzsgMTsKJiM0MzsKJiM0MzsJCQlpZiAoZmlyc3QgJmx0OyBNSU5fTVRIUF9PUkRFUikKJiM0MzsJCQkJZmlyc3QgPSBNSU5fTVRIUF9PUkRFUjsKJiM0MzsJCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgJmx0OyBocGFnZV9wbWRfb3JkZXI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWlmIChvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkKJiM0MzsJCQkJCWNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMmIzQzOyYjNDM7XSA9IGk7CiYjNDM7CQkJfQomIzQzOwkJCWlmICghbnJfY29sbGFwc2Vfb3JkZXJzKQomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O21USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxuJiMzNDspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkgewomIzQzOwkJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwkJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJCWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwogCXNldGJ1ZihzdGRvdXQsIE5VTEwpOwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBwYWdlIGNhY2hlIGNhcHMgZm9saW8gb3JkZXIgYXQgTUFYX1BBR0VDQUNIRV9PUkRFUiwgd2hpY2ggaXMKJiM0MzsJICogYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4gIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUKJiM0MzsJICogZm9saW8gaXMgaW1wb3NzaWJsZSB0aGVyZSwgc28gdGhlIGtlcm5lbCByZWZ1c2VzIHRoZXNlIGNvbGxhcHNlcyBieQomIzQzOwkgKiBkZXNpZ24gYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4gIFRoZSBjYXAgaXMgbm90IHNobWVtLXNwZWNpZmljOgomIzQzOwkgKiBpdCBydWxlcyBvdXQgcmVndWxhciBmaWxlcyB0b28sIGFuZCB0aGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQKJiM0MzsJICogY29udHJvbHMgZXhpc3QgZm9yIGV4YWN0bHkgdGhlIG9yZGVycyBpdCBhbGxvd3MsIHdoaWNoIGlzIHdoYXQgbWFrZXMKJiM0MzsJICogdGhlbSByZWFkYWJsZSBoZXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzNjIsNyAmIzQzOzE4MTQsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTM3MCwxMSAmIzQzOzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xNDI5LDYgJiM0MzsxODg4LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQ0NCw3ICYjNDM7MTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjY2ODJiYmFlMGE4ZjgKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw1ODkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuCiYjNDM7ICoKJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGlucwomIzQzOyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW4KJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOgomIzQzOyAqCiYjNDM7ICogICBzdGVwcGVkCWtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2gKJiM0MzsgKgkJa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDsKJiM0MzsgKiAgIGZyZWUJa2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGFuZCBNQURWX0RPTlRORUVEIGluIGEgbG9vcC4KJiM0MzsgKgomIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiAgT2NjdXBhbmN5IHJ1bnMgYXQgYm90aCBlbmRzCiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmUKJiM0MzsgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzCiYjNDM7ICogY29sbGFwc2VzIHRvby4gIEEgaG9sZSBpcyB6ZXJvLWZpbGxlZCBpbnRvIHRoZSBuZXcgZm9saW8gcmF0aGVyIHRoYW4KJiM0MzsgKiBjb3BpZWQsIGFuZCB0aGUgcmFjaW5nIE1BRFZfRE9OVE5FRUQga2VlcHMgbW92aW5nIHdoaWNoIHNsb3RzIGFyZSBob2xlcy4KJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IGNvbWJpbmF0aW9uIGFsc28gcnVucyB1bmRlciBtZW1vcnkgcHJlc3N1cmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nCiYjNDM7ICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3VyIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IGxlZnQgb3V0CiYjNDM7ICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlcgomIzQzOyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJiMzOTtzIGZyZWV6ZQomIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS4KJiM0MzsgKgomIzQzOyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvcgomIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9yawomIzQzOyAqIGNoaWxkcmVuIGNoZWNrIHRoYXQgY29udGludW91c2x5LCBhIGZpbmFsIHN3ZWVwIGNoZWNrcyBpdCBvbmNlIG1vcmUsIHBsdXMKJiM0MzsgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluCiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJBU0VfQUREUgkoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZAomIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZQomIzQzOyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmcKJiM0MzsgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZAomIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZQomIzQzOyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTCTMKJiM0MztzdGF0aWMgaW50IG5yX3NoYXJlZF9hcmVhczsKJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uOwkJLyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqLwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTsJLyogcmVnaW9uICYjNDM7IE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqLwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDsJLyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovCiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTsJLyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplOwomIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbCA/IHZhbCA6IDE7CS8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqLwomIzQzO30KJiM0MzsKJiM0MzsvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UmIzM5O3MgcGF0dGVybiAqLwomIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbCkKJiM0Mzt7CiYjNDM7CSp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKnZhbCAmYW1wOyZhbXA7ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWw7CiYjNDM7CiYjNDM7CWlmIChwYWdlX2lzX2NvcnJ1cHQocGFnZV9pZHgsICZhbXA7dmFsKSkgewomIzQzOwkJY29ycnVwdGVkID0gMTsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIHdhbnQgJmx0OyBsZWZ0ID8gd2FudCA6IGxlZnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYSB6YXAKJiM0MzsJCSAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltCiYjNDM7CQkgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYQomIzQzOwkJICogY29sbGFwc2UgdGhhdCBpcyBtaWR3YXkgdGhyb3VnaCBpdC4gIFN1Yi10YWJsZSB6YXBzIG5ldmVyCiYjNDM7CQkgKiByZWFjaCB0aGF0IHBhdGguCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSAxOwkvKiBGT0xMX1dSSVRFICovCiYjNDM7CQkvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkCiYjNDM7CQkJICogc3Rkb3V0JiMzOTtzIGxvY2sgd2hlbiB3ZSBmb3JrZWQsIGFuZCBwcmludGluZyB1bmRlciBhbgomIzQzOwkJCSAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlCiYjNDM7CQkJICogZXhpdCBzdGF0dXMgc2F5cy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDE2OyBpJiM0MzsmIzQzOykKJiM0MzsJCQkJYmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoJmFtcDtzZWVkKSwgJmFtcDt2YWwpOwomIzQzOwkJCV9leGl0KGJhZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocGlkICZndDsgMCkgewomIzQzOwkJCWludCB3c3RhdHVzOwomIzQzOwomIzQzOwkJCWlmICh3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKSAmbHQ7IDApCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3dhaXRwaWQoKSYjMzQ7KTsKJiM0MzsJCQkvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqLwomIzQzOwkJCWlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKQomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJdm9pZCAqcDsKJiM0MzsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBhd2F5JiMzNDspOwomIzQzOwkJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyA4OyBpJiM0MzsmIzQzOykKJiM0MzsJCQltcmVtYXBfc2NyYXRjaFsocmFuZF9yKCZhbXA7c2VlZCkgJQomIzQzOwkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGJhY2smIzM0Oyk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudAomIzQzOyAqIGNoZWNrIGlzIGV4YWN0OiBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZQomIzQzOyAqIHBhdHRlcm4sIGFuZCBub3RoaW5nIGVsc2UgZXZlciB3cml0ZXMgaGVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQltYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yICZhbXA7JmFtcDsgIXN0b3A7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOwomIzQzOwkJCQkJCQkgICAgIGkgKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCWlmICh2YWwgIT0gcGF0dGVybihpKSkgewomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgaSwgdmFsLCBwYXR0ZXJuKGkpKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi8KJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwlpbnQgZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5JiMzNDssIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJaWYgKHdyaXRlKGZkLCAmIzM0OzEmIzM0OywgMSkgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcigmYW1wO3NlZWQpICUgMTAwMDAwKTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBsaW5lWzI1Nl07CiYjNDM7CWludCBsaW5lcyA9IDA7CiYjNDM7CUZJTEUgKmZwID0gZm9wZW4oJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkKJiM0MzsJCWxpbmVzJiM0MzsmIzQzOzsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGxpbmVzICZndDsgMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0djsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7dHYsIE5VTEwpOwomIzQzOwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQomIzQzO3sKJiM0MzsJZnByaW50ZihzdGRlcnIsCiYjNDM7CQkmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxuJiMzNDsKJiM0MzsJCSYjMzQ7XHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcbiYjMzQ7KTsKJiM0MzsJZXhpdCgxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHsKJiM0MzsJCSYjMzQ7ZmF1bHRlciYjMzQ7LCAmIzM0O2ZhdWx0ZXIyJiMzNDssICYjMzQ7ZG9udG5lZWQmIzM0OywgJiMzNDtwaW5uZXImIzM0OywgJiMzNDtmb3JrZXImIzM0OywKJiM0MzsJCSYjMzQ7bXJlbWFwcGVyJiMzNDssICYjMzQ7cGFnZW91dCYjMzQ7LCAmIzM0O2NvbXBhY3RvciYjMzQ7LAomIzQzOwl9OwomIzQzOwl2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHsKJiM0MzsJCWZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbiwKJiM0MzsJCW1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLAomIzQzOwl9OwomIzQzOwllbnVtIHsgVF9GQVVMVEVSLCBUX0ZBVUxURVIyLCBUX0RPTlRORUVELCBUX1BJTk5FUiwgVF9GT1JLRVIsCiYjNDM7CSAgICAgICBUX01SRU1BUFBFUiwgVF9QQUdFT1VULCBUX0NPTVBBQ1RPUiB9OwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMICZsdDsmbHQ7IFRfUEFHRU9VVDsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBjb21wYWN0b3JfYml0ID0gMVVMICZsdDsmbHQ7IFRfQ09NUEFDVE9SOwomIzQzOwljb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTsKJiM0MzsJcHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgJiMzNDtzdGVwcGVkJiMzNDssICYjMzQ7ZnJlZSYjMzQ7LCAmIzM0O21hZHZpc2UmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9OwkvKiBzdHJpY3QsIGhvbGVzICovCiYjNDM7CXN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9OwkvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi8KJiM0MzsJY29uc3QgaW50IG5yX29jY3VwYW5jaWVzID0gQVJSQVlfU0laRShvY2N1cGFuY2llcyk7CiYjNDM7CWNvbnN0IGludCBucl9wcmVzc3VyZXMgPSBBUlJBWV9TSVpFKHByZXNzdXJlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdOwomIzQzOwljb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzOwomIzQzOwlpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfbXM7CiYjNDM7CWludCBkdXJhdGlvbl9zID0gNTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrOwomIzQzOwlpbnQgbnJfYXJlYXNfYXJnID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwlpbnQgc3RlcHMgPSAwOwomIzQzOwlpbnQgb3B0OwomIzQzOwomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O2E6ZDptOnQ6aCYjMzQ7KSkgIT0gLTEpIHsKJiM0MzsJCXN3aXRjaCAob3B0KSB7CiYjNDM7CQljYXNlICYjMzk7YSYjMzk7OgomIzQzOwkJCW5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTtkJiMzOTs6CiYjNDM7CQkJZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTttJiMzOTs6CiYjNDM7CQkJbW9kZV9hcmcgPSBvcHRhcmc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7dCYjMzk7OgomIzQzOwkJCS8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovCiYjNDM7CQkJdGhyZWFkX21hc2sgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1vZGVfYXJnKSB7CiYjNDM7CQlpZiAoc3RyY21wKG1vZGVfYXJnLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZV9hcmcsICYjMzQ7ZnJlZSYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RyY21wKG1vZGVfYXJnLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCW9uZV9tb2RlWzBdID0gbW9kZV9hcmc7CiYjNDM7CQltb2RlcyA9IG9uZV9tb2RlOwomIzQzOwkJbnJfbW9kZXMgPSAxOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJZ3VwX2ZkID0gb3BlbigmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0JiMzNDssIE9fUkRXUik7CiYjNDM7CWlmIChndXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnICZndDsgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTOwomIzQzOwlucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyAmIzQzOyAxOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZAomIzQzOwkgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbQomIzQzOwkgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvbgomIzQzOwkgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZQomIzQzOwkgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZQomIzQzOwkgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuCiYjNDM7CSAqLwomIzQzOwltcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwlpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLAomIzQzOwkJIC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoJiMzNDspOwomIzQzOwomIzQzOwliYXNlX21hc2sgPSB0aHJlYWRfbWFzazsKJiM0MzsJaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIGJhc2UgZW50cnkgZm9yIHRoZSBzdGFjaywgc28gdGhhdCB0aGUgcG9wIGF0IHRoZSBlbmQgb2YgYSBtb2RlCiYjNDM7CSAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eQomIzQzOwkgKiBzdGFjayBoYXMgbm8gc2V0dGluZ3MgdG8gYXBwbHkgYW5kIGdpdmVzIHVwLgomIzQzOwkgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaW50IHJ1biA9IDA7IHJ1biAmbHQ7IG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldOwomIzQzOwkJYm9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107CiYjNDM7CQlib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107CiYjNDM7CiYjNDM7CQl0aHJlYWRfbWFzayA9IGJhc2VfbWFzazsKJiM0MzsJCWlmICghcHJlc3N1cmUpCiYjNDM7CQkJdGhyZWFkX21hc2sgJmFtcDs9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTsKJiM0MzsJCWVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CiYjNDM7CQl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CQlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0KJiM0MzsJCQlzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspID8gMTAwMCA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeQomIzQzOwkJICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLgomIzQzOwkJICogU3RyaWN0IG5lZWRzIGEgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdywgd2hpY2ggaXMgcmFyZSB1bmRlcgomIzQzOwkJICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLAomIzQzOwkJICogc28gdGhlIHR3byBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzLgomIzQzOwkJICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/CiYjNDM7CQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwOwomIzQzOwkJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0KJiM0MzsJCQlucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4OwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKQomIzQzOwkJCQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwkJfQomIzQzOwkJLyogUG9wcGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2RlLCBiZWZvcmUgdGhlIG5leHQgb25lLiAqLwomIzQzOwkJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CQlyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHwKJiM0MzsJCQkgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTsKJiM0MzsJCWlmIChyZWdpb24gIT0gQkFTRV9BRERSKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwbGF5Z3JvdW5kJiMzNDspOwomIzQzOwkJbXJlbWFwX2FyZWEgPSByZWdpb24gJiM0MzsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CiYjNDM7CQlpZiAodGhyZWFkX21hc2sgJmFtcDsgcGFnZW91dF9iaXQpIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIEJpZyBlbm91Z2ggdG8gY3ljbGUgcmVhbCByZWNsYWltLCBzbWFsbCBlbm91Z2ggbm90CiYjNDM7CQkJICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvCiYjNDM7CQkJICogWzE2TSwgNjRNXS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfc2l6ZSAmbHQ7IDE2VUwgJmx0OyZsdDsgMjApCiYjNDM7CQkJCXBhZ2VvdXRfc2l6ZSA9IDE2VUwgJmx0OyZsdDsgMjA7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfc2l6ZSAmZ3Q7IDY0VUwgJmx0OyZsdDsgMjApCiYjNDM7CQkJCXBhZ2VvdXRfc2l6ZSA9IDY0VUwgJmx0OyZsdDsgMjA7CiYjNDM7CQkJcGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsCiYjNDM7CQkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJCSAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJCQlpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMOwomIzQzOwkJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpCiYjNDM7CQkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XG4mIzM0Oyk7CiYjNDM7CQkJCXN0ZXBzJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkKJiM0MzsJCQkJdXNsZWVwKDEwMCAqIDEwMDApOwomIzQzOwkJfSBlbHNlIHsJLyogbWFkdmlzZSAqLwomIzQzOwkJCXdoaWxlIChub3dfbXMoKSAmbHQ7IGVuZF9tcyAmYW1wOyZhbXA7ICFjb3JydXB0ZWQpIHsKJiM0MzsJCQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJCQlocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7CiYjNDM7CQkJCX0KJiM0MzsJCQkJbWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJTUFEVl9ET05UTkVFRCk7CiYjNDM7CQkJCXN0ZXBzJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlzdG9wID0gMTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHJlYWRzW2ldKQomIzQzOwkJCQlwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KQomIzQzOwkJCWNoZWNrX3BhZ2UoaSk7CiYjNDM7CiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsCiYjNDM7CQkJCSAmIzM0OyVzLyVzJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cbiYjMzQ7LAomIzQzOwkJCQkgbW9kZSwgaG9sZXMgPyAmIzM0O2hvbGVzJiMzNDsgOiAmIzM0O3N0cmljdCYjMzQ7LAomIzQzOwkJCQkgcHJlc3N1cmUgPyAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0OywKJiM0MzsJCQkJIGR1cmF0aW9uX3MsIHN0ZXBzKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlCiYjNDM7CQkgKiBuZXh0IG1vZGU6IGl0IG1hcHMgdGhlIHJlZ2lvbiBhdCB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzLAomIzQzOwkJICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy4KJiM0MzsJCSAqLwomIzQzOwkJbXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAocGFnZW91dF9hcmVhKSB7CiYjNDM7CQkJbXVubWFwKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplKTsKJiM0MzsJCQlwYWdlb3V0X2FyZWEgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJc3RvcCA9IDA7CiYjNDM7CQlzdGVwcyA9IDA7CiYjNDM7CiYjNDM7CQlpZiAoY29ycnVwdGVkKSB7CiYjNDM7CQkJLyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcuICovCiYjNDM7CQkJd2hpbGUgKCYjNDM7JiM0MztydW4gJmx0OyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKSB7CiYjNDM7CQkJCXJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CQkJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCQkJICAgICAgbW9kZXNbcnVuIC8gKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKV0sCiYjNDM7CQkJCQkJICAgICAgb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXSA/CiYjNDM7CQkJCQkJICAgICAgJiMzNDtob2xlcyYjMzQ7IDogJiMzNDtzdHJpY3QmIzM0OywKJiM0MzsJCQkJCQkgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/CiYjNDM7CQkJCQkJICAgICAgJiMzNDsvcHJlc3N1cmUmIzM0OyA6ICYjMzQ7JiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTk2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay4KJiM0MzsgKgomIzQzOyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYQomIzQzOyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zCiYjNDM7ICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0CiYjNDM7ICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlcwomIzQzOyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lCiYjNDM7ICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdAomIzQzOyAqIHdpbmRvdyYjMzk7cyBzb3VyY2UgcGFnZXMgKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50cyBmaWx0ZXJlZAomIzQzOyAqIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyKSBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWQKJiM0MzsgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LgomIzQzOyAqCiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0CiYjNDM7ICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3cKJiM0MzsgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW4KJiM0MzsgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDIJLyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi8KJiM0MzsjZGVmaW5lIE5SX0lURVJBVElPTlMgNQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVhY2ggc3RlcCBzd2l0Y2hlcyB0aGUgZXZlbnRzIG9mZiBhZ2FpbiwgYnV0IGEgaGVscGVyIGNhbiBzdGlsbCBnaXZlIHVwCiYjNDM7ICogb24gdXMgaW4gYmV0d2VlbiAoYSBmYWlsaW5nIHN5c2ZzIHdyaXRlIGVuZHMgdGhlIHRlc3QgZnJvbSBpbnNpZGUKJiM0MzsgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJiMzOTtzCiYjNDM7ICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCYjMzk7cy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodHJhY2VfZXZlbnRzX2ZkICZndDs9IDApCiYjNDM7CQl0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGlzb2xhdGUgZXZlbnRzIHdob3NlCiYjNDM7ICogc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cmIzM5O3Mgc291cmNlIFBGTnMsIHJlcG9ydGVkIG9uY2UgcGVyIGF0dGVtcHQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqcywgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc3NjYW5mKHMsICYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4JiMzNDssCiYjNDM7CQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wZm5zOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwkvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxOwomIzQzOwkJcGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTsKJiM0MzsJCWlmIChwZm5zW2ldID09IC0xVUwpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwlpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpJiMzNDspOwomIzQzOwkvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKTsKJiM0MzsKJiM0MzsJLyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi8KJiM0MzsJaWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0Nhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwlpZiAoIXBhc3NlZCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xuJiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLAomIzQzOwkJCQkJCSAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0MzsJYXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkICZhbXA7JmFtcDsgYXR0cmlidXRlZCA9PSAxLAomIzQzOwkJCSAmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXG4mIzM0OywKJiM0MzsJCQkgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTsKJiM0MzsKJiM0MzsJbXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsJaWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IFRBUkdFVF9PUkRFUikpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcCkmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CXRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oJiMzNDtodWdlX21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKHRyYWNlX2V2ZW50c19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O2h1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsJYXRleGl0KHRyYWNlX2V2ZW50c19vZmYpOwomIzQzOwomIzQzOwlrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpOwomIzQzOwomIzQzOwl0aHBfc2F2ZV9zZXR0aW5ncygpOwomIzQzOwl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJc2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxOwomIzQzOwkvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqLwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX0lURVJBVElPTlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJb25lX3N0ZXAoaSk7CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCkBAIC0yMCw3ICYjNDM7MjAsNiBAQAogCiAjZGVmaW5lIFRXT01FRwkJKDImbHQ7Jmx0OzIwKQogI2RlZmluZSBSVU5USU1FCQkoMjApCi0jZGVmaW5lIEFMSUdOKHgsIGEpCSgoKHgpICYjNDM7IChhIC0gMSkpICZhbXA7ICh+KChhKSAtIDEpKSkKIAogSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPSYjMzQ7cGZubWFwJiMzNDsgcnVuX3Rlc3QgLi9wZm5tYXAKICMgQ09XIHRlc3RzCiBDQVRFR09SWT0mIzM0O2NvdyYjMzQ7IHJ1bl90ZXN0IC4vY293CiAKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2sKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZQomIzQzOwogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQKIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMgpAQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW0KIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW0KIAotQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vbgotCiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZAogaWYgWyAteiAmIzM0OyR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9JiMzNDsgXTsgdGhlbgogICAgIGlmIHRlc3Rfc2VsZWN0ZWQgJiMzNDt0aHAmIzM0OzsgdGhlbgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCkBAIC00Miw2OCAmIzQzOzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDs7CiBpbnQgcGFnZW1hcF9mZDsKIGludCBrcGFnZWZsYWdzX2ZkOwogCi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCi0JCWludCBrcGFnZWZsYWdzX2ZkKQotewotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7Ci0JY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKLQljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7Ci0JdWludDY0X3QgcGZuX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7Ci0KLQkvKiBub24gcHJlc2VudCBwYWdlICovCi0JaWYgKHBmbiA9PSAtMVVMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KLQlpZiAoIW9yZGVyKSB7Ci0JCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogbm9uIFRIUCBmb2xpbyAqLwotCWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KLQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KLQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCi0JICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgotCSAqLwotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCXJldHVybiB0cnVlOwotCi0JLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwotCXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7Ci1mYWlsOgotCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwotCXJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sCiAJCWludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCmluZGV4IDgwYmM5ZjU5N2I1MjEuLmVlMTMzNDc3ODM5MWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKQEAgLTQ5NCw2ICYjNDM7NDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncykKIAlyZXR1cm4gMDsKIH0KIAomIzQzO2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAomIzQzOwkJCWludCBrcGFnZWZsYWdzX2ZkKQomIzQzO3sKJiM0MzsJY29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDsKJiM0MzsJY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm5faGVhZDsKJiM0MzsJdWludDY0X3QgcGZuX2ZsYWdzOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbjsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwomIzQzOwomIzQzOwkvKiBub24gcHJlc2VudCBwYWdlICovCiYjNDM7CWlmIChwZm4gPT0gLTFVTCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovCiYjNDM7CWlmICghb3JkZXIpIHsKJiM0MzsJCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBub24gVEhQIGZvbGlvICovCiYjNDM7CWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwomIzQzOwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqLwomIzQzOwlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCiYjNDM7CSAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXIKJiM0MzsJICovCiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwomIzQzOwlyZXR1cm4gKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzOwomIzQzO2ZhaWw6CiYjNDM7CWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lCiYjNDM7ICogZm9saW8gb2YgdGhhdCBvcmRlciwgaGVhZCB0byB0YWlsLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHkKJiM0MzsgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdyYjMzk7cyBQRk4gcnVuIG11c3QgYmUgY29udGlndW91cywgYW5kIGEgd2luZG93JiMzOTtzIGZpcnN0CiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGlzIHRoZSBjaGVjayAmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvcyYjMzQ7OiBhCiYjNDM7ICogd2luZG93IGFzc2VtYmxlZCBmcm9tIHBhcnRzIG9mIHNldmVyYWwgZm9saW9zLCBvciBtYXBwaW5nIGEgZm9saW8gc2hpZnRlZAomIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLgomIzQzOyAqLwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7CiYjNDM7CWNoYXIgKnZhZGRyOwomIzQzOwomIzQzOwlpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgJmx0OyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSB3aW5kb3cpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJCS8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi8KJiM0MzsJCWlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciAmIzQzOyBpICogcHNpemUoKSkgIT0KJiM0MzsJCQkgICAgcGZuICYjNDM7IGkpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCWtwYWdlZmxhZ3NfZmQpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgJiMzNDsvc3lzL2tlcm5lbC90cmFjaW5nJiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuICYjMzQ7aHVnZV9tZW1vcnkmIzM0OykuCiYjNDM7ICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRyYWNpbmdfZXZlbnRzX2VuYWJsZSgpLCBvciAtMSBpZiB0cmFjZWZzIG9yIHRoZQomIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlcgomIzQzOyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlCiYjNDM7ICogcGF0aHMgd2hlcmUgdGhlIHRlc3QgZ2l2ZXMgdXAuCiYjNDM7ICovCiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKQomIzQzO3sKJiM0MzsJY2hhciBwYXRoWzI1Nl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UICYjMzQ7L2V2ZW50cy8lcy9lbmFibGUmIzM0OywKJiM0MzsJCSBzdWJzeXMpOwomIzQzOwlyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGVuYWJsZSA/ICYjMzQ7MSYjMzQ7IDogJiMzNDswJiMzNDssIDEsIDApICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIuICovCiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UICYjMzQ7L3RyYWNlJiMzNDssIE9fV1JPTkxZIHwgT19UUlVOQyk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7fQomIzQzOwogLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi8KIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCQkgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKaW5kZXggOWE0OWFmODg3MDJlNC4uMTBjN2JlNDZlNDRjYSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaApAQCAtMTAsNiAmIzQzOzEwLDggQEAKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwogCiAjZGVmaW5lIEJJVF9VTEwobnIpICAgICAgICAgICAgICAgICAgICgxVUxMICZsdDsmbHQ7IChucikpCiYjNDM7I2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIzQzOyAoYSkgLSAxKSAmYW1wOyB+KChhKSAtIDEpKQomIzQzOwogI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KQogI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KQogI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KQpAQCAtOTcsNiAmIzQzOzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpOwogaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpOwogaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sCiAJCWludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTsKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCk7CiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsCiYjNDM7CQkJCSAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKTsKIAogaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbiwKIAkJICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpOwpAQCAtMTEzLDYgJiM0MzsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApOwogaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpOwogaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpOwogYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7CiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTsKJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTsKJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dCkKIHsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkxNTAKCQkJCQkJCW91dHB1dDogNzYKCQkJCQkJCXRob3VnaHRzOiAxNTAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBQcm9wb3NlZCBQYXRjaCYjMzk7cyBGdXp6aW5nIFdvcnRoaW5lc3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UgaGF2ZSBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBuZXcgdGVzdHMgcmVsYXRlZCB0byBga2h1Z2VwYWdlZGAgYW5kIGBtVEhQYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGVzZSBjaGFuZ2VzIG5lY2Vzc2l0YXRlIGZ1enppbmcuIFRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoZSBwYXRjaCBhbHRlcnMgdGhlIGNvcmUga2VybmVsIGxvZ2ljIGluIGEgd2F5IHRoYXQgY291bGQgaW50cm9kdWNlIG5ldyB2dWxuZXJhYmlsaXRpZXMgZGV0ZWN0YWJsZSB0aHJvdWdoIGZ1enppbmcuCgpNeSBwcmltYXJ5IHRhc2sgaXMgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoIG1vZGlmaWVzIGFueSBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBMb29raW5nIGF0IHRoZSBkaWZmLCBJIGNhbiBzZWUgdGhhdCBhbGwgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuICBUaGUgZmlsZXMgbGlzdGVkLCBpbmNsdWRpbmcgdGhlIGBNYWtlZmlsZWAsIEMgc291cmNlIGZpbGVzLCBhbmQgaGVhZGVyIGZpbGVzLCBhcmUgYWxsIGNsZWFybHkgcGFydCBvZiB0aGUgc2VsZi10ZXN0IHN1aXRlLgoKVGhlIHByb3ZpZGVkIGNyaXRlcmlhIGZvciBkZXRlcm1pbmluZyBgV29ydGhGdXp6aW5nYCBhcmU6IG1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiwgS2NvbmZpZywgY29tbWVudHMsIGRlY29yYXRpdmUgY2hhbmdlcyBsaWtlIGxvZ2dpbmcsIGNoYW5nZXMgdG8gbm9uLWZ1bmN0aW9uYWwgY29uc3RhbnRzLCB1bnJlYWNoYWJsZSBjb2RlLCBvciBjb2RlIHJlbGF0ZWQgdG8gc3BlY2lmaWMgaGFyZHdhcmUgdGhhdCYjMzk7cyBub3QgZW11bGF0ZWQuIEl0IGFsc28gZXhjbHVkZXMgY2VydGFpbiBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgcGF0Y2ggaXNuJiMzOTt0IGNoYW5naW5nIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzIHRoYXQgYXJlIHJlYWNoYWJsZS4gU2luY2UgdGhpcyBpcyBhbGwgY29uZmluZWQgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIGl0IGRvZXNuJiMzOTt0IG1lZXQgdGhlIGNyaXRlcmlhIGZvciBmdXp6aW5nLiBUaGVzZSBzZWxmLXRlc3RzIHJlc2lkZSBpbiB1c2Vyc3BhY2UgYW5kIGRvIG5vdCBpbnRyb2R1Y2UgbmV3LCBmdXp6ZWQgbG9naWMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuCgpOb3csIEkgZG91YmxlLWNoZWNrLiBUaGUgaW5zdHJ1Y3Rpb25zIGNsZWFybHkgc3RhdGUgdGhhdCBpZiB0aGUgcGF0Y2ggKm9ubHkqIGNvbnRhaW5zIGNoYW5nZXMgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AsIGl0IGRvZXNuJiMzOTt0IHdhcnJhbnQgZnV6emluZy4gVGhlIHBhdGNoIGlzIHNvbGVseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGFyZWEuIE15IGNvZGUgc2VhcmNoIGNvbmZpcm1zIHRoZXJlIGFyZSBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYy4gU2luY2UgdGhlc2UgdGVzdHMgYXJlIHVzZXJzcGFjZSB0ZXN0IHByb2dyYW1zLCB0aGV5IGRvbiYjMzk7dCBoYXZlIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHRvIGJlIGZ1enplZCBpbiB0aGUga2VybmVsLiBUaGVyZWZvcmUsIHRoZSB2YWx1ZSBzaG91bGQgYmUgYFdvcnRoRnV6emluZz1mYWxzZWAuCgpJbiBjb25jbHVzaW9uLCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIHNlbGYtdGVzdCBzdWl0ZSBhbmQgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGtlcm5lbCBjb2RlIHBhdGhzIHRoYXQgcmVxdWlyZSBmdXp6aW5nLiBIZW5jZSwgSSB3aWxsIGlzc3VlIGEgY2FsbCB0byBgc2V0LXJlc3VsdHNgIHdpdGggYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjMwLjQ1NTAzMTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY5MDgxOTgyNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDI6MTg6MzAuNDU1MDM5MjhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NTU1NzA2MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDE1IDAyOjE4OjI4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5pbmRleCAyZDUzNjYxOTZlMzA5Li4zMDhiYmFkNzNjMTFhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5AQCAtMTA0LDYgKzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICs9IGd1YXJkLXJlZ2lvbnNcXG4gVEVTVF9HRU5fRklMRVMgKz0gbWVyZ2VcXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxcbiBURVNUX0dFTl9GSUxFUyArPSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcXG4rVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fb3JkZXJfY2hlY2tcXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfcmFjZVxcbiBcXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHNvZnQtZGlydHlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjkzMDMwYTQyYzNjY2RcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xcbkBAIC0wLDAgKzEsMTM3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxcbisgKlxcbisgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxcbisgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxcbisgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcXG4rICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXFxuKyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwncyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XFxuKyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitcXG4rLyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xcbitzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRzaXplX3QgbGVuID0gc2l6ZSAqIDI7XFxuK1xcdHVpbnRwdHJfdCBhbGlnbmVkO1xcbitcXHRjaGFyICpwO1xcbitcXG4rXFx0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpXFxcIik7XFxuK1xcbitcXHRhbGlnbmVkID0gQUxJR04oKHVpbnRwdHJfdClwLCBzaXplKTtcXG4rXFx0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxcbitcXHRcXHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXFxuK1xcdFxcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxcbitcXHRcXHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xcbitcXG4rXFx0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcXG4rfVxcbitcXG4rLypcXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxcbisgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGJvb2wgb2sgPSB0cnVlO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGlmIChvcmRlcilcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xcbitcXHQqcCA9IDE7XFxuK1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxcXG5cXFwiLCBvcmRlcik7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdG11bm1hcChwLCBzaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChvaywgXFxcIm9yZGVyICVkIGNsYXNzaWZpZWRcXFxcblxcXCIsIG9yZGVyKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIG9yZGVycztcXG4rXFx0aW50IG9yZGVyO1xcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZW1hcF9mZCA9IG9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKHBhZ2VtYXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVxcXCIpO1xcbitcXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKGtwYWdlZmxhZ3NfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwib3BlbihcXFxcXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFxcXFxcIikgcmVxdWlyZXMgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xcbitcXHRpZiAoIW9yZGVycylcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XFxuK1xcbitcXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xcbitcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRjaGVja19vcmRlcigwKTtcXG4rXFx0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFxcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XFxuK1xcdFxcdGlmICghKG9yZGVycyBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGNoZWNrX29yZGVyKG9yZGVyKTtcXG4rXFx0fVxcbitcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuQEAgLTY1LDcgKzY1LDYgQEAgZW51bSB7XFxuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XFxuICNkZWZpbmUgTlRJTUVTXFx0XFx0MTBcXG4gXFxuLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgKyAoYSAtIDEpKSBcXHUwMDI2ICh+KChhKSAtIDEpKSlcXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cXG4gXFxuICNpZm5kZWYgRk9MTF9XUklURVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbmluZGV4IGQ3OTE3ZGNlM2FiYWMuLjk5MmVmZWUxN2I3MTYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5AQCAtMTgzLDYgKzE4MywxOSBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFdyaXRlIG9ubHkgb24gY2hhbmdlOiBhIHN0b3JlIHRvIGVpdGhlciBzbGVlcCBrbm9iIHdha2VzIGtodWdlcGFnZWQgLS1cXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxcbisgKiBxdWV1ZSAtLSBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5XFxuKyAqIGFza2VkIGZvcjsga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuICBUaGVcXG4rICogb3RoZXIga25vYnMgZG8gbm90IHdha2UsIGJ1dCB3cml0aW5nIHRoZW0gdGhlIHNhbWUgd2F5IGNvc3RzIG5vdGhpbmcuXFxuKyAqL1xcbit2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxcbit7XFxuK1xcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxcbitcXHRcXHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XFxuK31cXG4rXFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiB7XFxuIFxcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXFx1MDAyNnNldHRpbmdzLVxcdTAwM2VraHVnZXBhZ2VkO1xcbkBAIC0xOTgsMTUgKzIxMSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0XFx0XFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVxcdTAwM2VzaG1lbV9lbmFibGVkXSk7XFxuIFxcdHRocF93cml0ZV9udW0oXFxcInVzZV96ZXJvX3BhZ2VcXFwiLCBzZXR0aW5ncy1cXHUwMDNldXNlX3plcm9fcGFnZSk7XFxuIFxcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2RlZnJhZ1xcXCIsIGtodWdlcGFnZWQtXFx1MDAzZWRlZnJhZyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4tXFx0XFx0XFx0a2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3N3YXApO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbiBcXG4gXFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXFxuIFxcdFxcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cXHUwMDNlcmVhZF9haGVhZF9rYik7XFxuQEAgLTIzMCw2ICsyNDMsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLypcXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcXG4rICogYSArMSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxcbisgKlxcbisgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3NcXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxcbisgKiBfX3NsZWVwX21pbGxpc2Vjc19zdG9yZSgpIGNsZWFycyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBhbmQgd2FrZXMgdGhlXFxuKyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHNcXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxcbisgKiB0aGVuIHNsZWVwcyBmb3IgdGhlIGZ1bGwgaW50ZXJ2YWwsIGhhdmluZyBuZXZlciBzZWVuIHRoZSBzdG9yZS4gIFNvIGtlZXBcXG4rICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzXFxuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXFxuKyAqXFxuKyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxcbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcXG4rICogcGFnZXNfdG9fc2Nhbi5cXG4rICovXFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xcbitcXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cXG4rXFx0XFx0dGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7XFxuK1xcdGludCBwYXNzO1xcbitcXG4rXFx0Zm9yIChwYXNzID0gMDsgcGFzcyBcXHUwMDNjIDI7IHBhc3MrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XFxuK1xcdFxcdFxcdHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXFxcIikgKyAxO1xcbitcXG4rXFx0XFx0d2hpbGUgKHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXFxcIikgXFx1MDAzYyB0YXJnZXQpIHtcXG4rXFx0XFx0XFx0aWYgKGVsYXBzZWRfbXMgXFx1MDAzZT0gZGVhZGxpbmVfbXMpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0XFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHNsZWVwX21zKTtcXG4rXFx0XFx0XFx0dXNsZWVwKDEwICogMTAwMCk7XFxuK1xcdFxcdFxcdGVsYXBzZWRfbXMgKz0gMTA7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcXG4ge1xcbiBcXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uYmE3ZDM4MzcwZDQzMyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbkBAIC03MCw2ICs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7XFxuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9yZWFkX251bShjb25zdCBjaGFyICpuYW1lKTtcXG4gdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTtcXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XFxuIFxcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7XFxuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xcbkBAIC04Myw2ICs4NCw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxcbiBcXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XFxuIH1cXG4gXFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XFxuK1xcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XFxuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XFxuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XFxuK3N0YXRpYyBib29sIGNvbGxhcHNlX29yZGVyX2dpdmVuO1xcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xcbiBcXG4gI2RlZmluZSBQSURfU01BUFMgXFxcIi9wcm9jL3NlbGYvc21hcHNcXFwiXFxuICNkZWZpbmUgVEVTVF9GSUxFIFxcXCJjb2xsYXBzZV90ZXN0X2ZpbGVcXFwiXFxuQEAgLTIxOSw2ICsyMjQsNDEgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIFxcdHJldHVybiBzd2FwO1xcbiB9XFxuIFxcbisvKlxcbisgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby5cXG4rICpcXG4rICogVHdvIHRoaW5ncyBnZXQgaW4gdGhlIHdheS4gIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydDpcXG4rICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0XFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cXG4rICogY2FzZSwgc28gdGhlIGNvdW50IHRoZSBjYWxsZXIgYXNrcyBmb3IgYXJyaXZlcyBhIG1vbWVudCBsYXRlci4gIEFuZCBhIHJhbmdlXFxuKyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmdcXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcXG4rICogcmVhZGluZyB0aG9zZSBwYWdlcyBiYWNrIGluLCBzbyB0aGUgZGFlbW9uIHVuZG9lcyB0aGUgcGFnZW91dCBhcyBmYXN0IGFzIGl0XFxuKyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnNcXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cXG4rICpcXG4rICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciwgbm90IHRoZSBrZXJuZWwncyAtLVxcbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cXG4rICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZFxcbisgKiBlbmRzIHRoZSBydW4gaGVyZS5cXG4rICovXFxuK3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcXFwiKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyA0MDsgaSsrKSB7XFxuK1xcdFxcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuK1xcdFxcdGlmIChjaGVja19zd2FwKHAsIHNpemUpKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKDUwICogMTAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXFxuIHtcXG4gXFx0dm9pZCAqcDtcXG5AQCAtNTE1LDggKzU1NSw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG4gXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxcbiB7XFxuLVxcdGludCByZXQ7XFxuIFxcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IHJldCwgaTtcXG4gXFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlcy4uLlxcXCIsIG1zZyk7XFxuIFxcbkBAIC01MjksOSArNTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxuIFxcdC8qXFxuIFxcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxcbiBcXHQgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcXG4rXFx0ICpcXG4rXFx0ICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGFcXG4rXFx0ICogc291cmNlIG9yZGVyIGxlZnQgYXQgXFxcImFsd2F5c1xcXCIgLS0gd2hpY2ggLXMgZG9lcyAtLSBsZXRzIGtodWdlcGFnZWRcXG4rXFx0ICogY29sbGFwc2UgdGhlIHZlcnkgcmFuZ2UgdGhlIGNhc2UgaXMgd29ya2luZyBvbi4gIFNldCB0aGVtIHRvXFxuK1xcdCAqIFxcXCJpbmhlcml0XFxcIiwgbm90IFxcXCJuZXZlclxcXCIuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmRcXG4rXFx0ICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tXFxuK1xcdCAqIHRoZXNlIHZlcnkgY29udHJvbHMsIGFuZCBzdGlsbCBmaW5kcyBvbmUuXFxuIFxcdCAqL1xcbiBcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4gXFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xcbitcXHR9XFxuIFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuIFxcbiBcXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXFxuQEAgLTU2MSw4ICs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcF9vcmRlcjtcXG4rXFx0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xcbitcXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXFxuQEAgLTgyNSwxMiArODc4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgb25lIHBhZ2UuLi5cXFwiKTtcXG4tXFx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XFxuK1xcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg1MSwxMiArOTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cXFwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcXG4tXFx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcXG4tXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcXFwiKTtcXG4tXFx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg2OCwxMiArOTE3LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAsXFxuIFxcdFxcdCAgICAgICBocGFnZV9wbWRfbnIpO1xcbi1cXHRcXHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbitcXHRcXHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtOTQwLDYgKzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHR2b2lkICpwO1xcbiBcXHRpbnQgaTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xcbitcXHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cXG4rXFx0ICovXFxuK1xcdGlmIChocGFnZV9wbWRfc2l6ZSBcXHUwMDNlICgzMlVMIFxcdTAwM2NcXHUwMDNjIDIwKSkge1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXFxcblxcXCIpO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHBhZ2VfcG1kX25yOyBpKyspIHtcXG5AQCAtMTEzMCw2ICsxMTg3LDk3IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcXG4gXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXFxuKyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJ3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGVcXG4rICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcXG4rICogaXRzIG93biB3cml0ZXMuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XFxuK1xcdGNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTtcXG4rXFx0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcXG4rXFx0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cXG4rXFx0dm9sYXRpbGUgaW50ICppcDtcXG4rXFx0cGlkX3QgY2hpbGQ7XFxuK1xcdGludCBzeW5jWzJdO1xcbitcXHRjaGFyIGdvID0gMTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlwID0gcDtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xcdFxcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cXG4rXFx0aWYgKHBpcGUoc3luYykpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicGlwZSgpXFxcIik7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Y2hpbGQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQpIHtcXG4rXFx0XFx0aW50IGNvbGxhcHNlX3N0YXR1cztcXG4rXFxuK1xcdFxcdGNsb3NlKHN5bmNbMF0pO1xcbitcXHRcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovXFxuK1xcdFxcdGlmICh3cml0ZShzeW5jWzFdLCBcXHUwMDI2Z28sIDEpICE9IDEpXFxuK1xcdFxcdFxcdF9leGl0KEtTRlRfRkFJTCk7XFxuK1xcdFxcdHVzbGVlcCg1MDAwKTtcXG4rXFx0XFx0Yy1cXHUwMDNlY29sbGFwc2UoXFxcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclxcXCIsXFxuK1xcdFxcdFxcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xcbitcXHRcXHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRmYWlsKFxcXCJGYWlsOiBjaGlsZCBjb250ZW50XFxcIik7XFxuK1xcdFxcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2Uoc3luY1sxXSk7XFxuK1xcdGlmIChyZWFkKHN5bmNbMF0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJjaGlsZCBuZXZlciByZWFjaGVkIHRoZSBjb2xsYXBzZVxcXFxuXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZS4gIEEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIGFsbCBvZiB0aGVtXFxuK1xcdCAqIGluIG1pY3Jvc2Vjb25kcyAtLSB3YWl0X2Zvcl9zY2FuKCkgZG9lcyBub3QgZXZlbiBwb2xsIGZvciBUSUNLIC0tXFxuK1xcdCAqIGFuZCB0aGUgY2hpbGQgd291bGQgY29sbGFwc2UgcGFnZXMgYWxyZWFkeSBleGNsdXNpdmUgdG8gaXQuXFxuK1xcdCAqL1xcbitcXHRpID0gMDtcXG4rXFx0ZG8ge1xcbitcXHRcXHRpZiAoaSBcXHUwMDNjIG4pXFxuK1xcdFxcdFxcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XFxuK1xcdFxcdGkrKztcXG4rXFx0XFx0dXNsZWVwKDEwICogMTAwMCk7XFxuK1xcdH0gd2hpbGUgKHdhaXRwaWQoY2hpbGQsIFxcdTAwMjZ3c3RhdHVzLCBXTk9IQU5HKSA9PSAwKTtcXG4rXFxuK1xcdC8qIFdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoLCBzbyB0aGUgY2hlY2sgYmVsb3cgaXMgZXhhY3QuICovXFxuK1xcdGZvciAoOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvLiAqL1xcbitcXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlxcXCIpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4YmVlZjAwMDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRpZiAoaSA9PSBuKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWw6IHBhcmVudCBjb250ZW50XFxcIik7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0LyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCdzIHZlcmRpY3QuICovXFxuK1xcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbkBAIC0xMTc1LDYgKzEzMjMsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZS4gKi9cXG4rI2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXFxuK1xcbisvKlxcbisgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzIGZvciB0aGUgbXRocF9raHVnZXBhZ2VkIGNvbnRleHQuICBXaGF0XFxuKyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93XFxuKyAqIGRldGVjdGlvbjogd2hpY2ggYWxpZ25lZCB3aW5kb3cgY29sbGFwc2VkLCBhbmQgd2hpY2ggb2YgaXRzIG5laWdoYm91cnMgZGlkXFxuKyAqIG5vdC4gIGNoZWNrX2h1Z2UoKSBhbnN3ZXJzIGhvdyBtYW55IGZvbGlvcyBvZiB0aGUgb3JkZXIgdGhlIHJhbmdlIGhvbGRzLFxcbisgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci5cXG4rICpcXG4rICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBhbmQgdGhlIHRhcmdldCBvcmRlciBpcyBvbmx5XFxuKyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlXFxuKyAqIHByb2R1Y3QgY2FuIG9ubHkgaGF2ZSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cXG4rICovXFxuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBwYWdlX3NpemUgXFx1MDAzY1xcdTAwM2MgY29sbGFwc2Vfb3JkZXI7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcXG4rXFx0ICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmVcXG4rXFx0ICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZVxcbitcXHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cXG4rXFx0ICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLlxcbitcXHQgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvblxcbitcXHQgKiB0b3Agb2YgdGhpcy5cXG4rXFx0ICovXFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rfVxcbitcXG4rLyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgKyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xcbitzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XFxuK1xcdGNoYXIgKmFkZHIgPSBwO1xcbitcXG4rXFx0Zm9yICg7IGxlbiBcXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XFxuK1xcdFxcdGlmICh3aW5kb3dfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxcbit7XFxuK1xcdC8qIFdhaXQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyAyICogd2luZG93LFxcbitcXHRcXHRcXHRcXHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cXG4rXFx0aWYgKHNvdXJjZV9vcmRlciBcXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxcbitcXHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3JkZXIgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkLCBidXQgdGhlIGFsbG9jYXRvciBjYW4gc3RpbGwgZmFsbFxcbitcXHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXFxuK1xcdCAqIHdoaWNoIGlzIHRoZSBtYWNoaW5lJ3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cXFwiLCBzb3VyY2Vfb3JkZXIpO1xcbitcXHRcXHRza2lwKFxcXCJTa2lwXFxcIik7XFxuK1xcdFxcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cXFwiLFxcbitcXHRcXHQgICAgICAgc291cmNlX29yZGVyKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4ge1xcbiBcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlxcXFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXFx1MDAzY3Rlc3QgdHlwZVxcdTAwM2UgW2Rpcl1cXFxcblxcXFxuXFxcIik7XFxuQEAgLTExOTIsMTEgKzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxcXFxuXFxcIik7XFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxcXG5cXFwiKTtcXG4gXFx0ZXhpdCgxKTtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4ge1xcbitcXHRib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7XFxuIFxcdGludCBvcHQ7XFxuIFxcdGNoYXIgKmJ1ZjtcXG4gXFx0Y29uc3QgY2hhciAqdG9rZW47XFxuQEAgLTEyMDgsNiArMTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdjJzpcXG4gXFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2gnOlxcbiBcXHRcXHRkZWZhdWx0OlxcbkBAIC0xMjE1LDEyICsxNTgxLDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxcbitcXHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX29yZGVyIFxcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XFxuK1xcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKGNvbGxhcHNlX29yZGVyIFxcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XFxuK1xcbiBcXHRhcmd2ICs9IG9wdGluZDtcXG4gXFx0YXJnYyAtPSBvcHRpbmQ7XFxuIFxcbiBcXHRpZiAoYXJnYyA9PSAwKSB7XFxuLVxcdFxcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXFxuK1xcdFxcdC8qIEV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyBubyBhcmd1bWVudCBvZiBpdHMgb3duOiBhbm9uLCBldmVyeSBjb250ZXh0ICovXFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuK1xcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRyZXR1cm47XFxuQEAgLTEyMzEsMTMgKzE2MTAsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFxuIFxcdGlmICghc3RyY21wKHRva2VuLCBcXFwiYWxsXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBcXFwiYWxsXFxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cXG4rXFx0XFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cXG4rXFx0XFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwia2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm10aHBfa2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbi1cXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm1hZHZpc2VcXFwiKSkge1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHR9IGVsc2Uge1xcbkBAIC0xMjUzLDIwICsxNjM4LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0XFx0c2htZW1fb3BzID0gXFx1MDAyNl9fc2htZW1fb3BzO1xcbi1cXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJhbm9uXFxcIikpIHtcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImZpbGVcXFwiKSkge1xcbiBcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFxcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwic2htZW1cXFwiKSkge1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHR1c2FnZSgpO1xcbiBcXHR9XFxuQEAgLTEyODgsOSArMTY3MywxMCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHtcXG4gXFx0c3RydWN0IG1lbV9vcHMgKm9wcztcXG4gXFx0Y29uc3QgY2hhciAqZGVzYztcXG4gXFx0dGVzdF9mbiBmbjtcXG4rXFx0aW50IG9yZGVyO1xcdFxcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xcbiB9O1xcbiBcXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcXG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG5AQCAtMTMwMyw2ICsxNjg5LDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXHRcXHRcXHQub3BzXFx0PSBvLFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmRlc2NcXHQ9ICN0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmZuXFx0PSB0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0Lm9yZGVyXFx0PSBjb2xsYXBzZV9vcmRlcixcXHRcXHRcXHRcXFxcXFxuIFxcdFxcdH07XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9IHdoaWxlICgwKVxcbkBAIC0xMzQzLDggKzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xcbiBcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xcbitcXHRcXHRcXHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xcbitcXHRcXHRcXHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcXG4rXFx0XFx0XFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XFxuK1xcdFxcdFxcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGludCBmaXJzdCA9IGFub25fb3JkZXIgKyAxO1xcbitcXG4rXFx0XFx0XFx0aWYgKGZpcnN0IFxcdTAwM2MgTUlOX01USFBfT1JERVIpXFxuK1xcdFxcdFxcdFxcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gaTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm1USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcXFxuXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0XFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaCBpc1xcbitcXHQgKiBiZWxvdyB0aGUgUE1EIG9yZGVyIG9uIGFybTY0IHdpdGggNjRLIHBhZ2VzLiAgQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZVxcbitcXHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XFxuK1xcdCAqIGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LiAgVGhlIGNhcCBpcyBub3Qgc2htZW0tc3BlY2lmaWM6XFxuK1xcdCAqIGl0IHJ1bGVzIG91dCByZWd1bGFyIGZpbGVzIHRvbywgYW5kIHRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZFxcbitcXHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xcbitcXHQgKiB0aGVtIHJlYWRhYmxlIGhlcmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xcbitcXHRcXHRpZiAoc2htZW1fb3BzKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzaG1lbV9vcHMgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChyZWFkX29ubHlfZmlsZV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBmaWxlXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0XFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gTlVMTDtcXG4rXFx0XFx0XFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFhbm9uX29wcyBcXHUwMDI2XFx1MDAyNiAhc2htZW1fb3BzIFxcdTAwMjZcXHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcXG5AQCAtMTM2Miw3ICsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XFxuLVxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl9jb2xsYXBzZV9vcmRlcnM7IGkrKykge1xcbitcXHRcXHRjb2xsYXBzZV9vcmRlciA9IGNvbGxhcHNlX29yZGVyc1tpXTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHR9XFxuK1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuQEAgLTEzNzAsMTEgKzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbiBcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuLVxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4tXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQyOSw2ICsxODg4LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFxuK1xcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuQEAgLTE0NDQsNyArMTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSsrKSB7XFxuIFxcdFxcdHN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSBcXHUwMDI2dGVzdF9jYXNlc1tpXTtcXG4gXFxuLVxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXFxcblxcXCIsIHQtXFx1MDAzZWRlc2MsIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0aWYgKHQtXFx1MDAzZWN0eCA9PSBcXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlciA9IHQtXFx1MDAzZW9yZGVyO1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZWRlc2MsIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlb3JkZXIpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxcXG5cXFwiLCB0LVxcdTAwM2VkZXNjLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHR9XFxuIFxcdFxcdHQtXFx1MDAzZWZuKHQtXFx1MDAzZWN0eCwgdC1cXHUwMDNlb3BzKTtcXG4gXFx0fVxcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjY4MmJiYWUwYThmOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbkBAIC0wLDAgKzEsNTg5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxcbisgKlxcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXFxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XFxuKyAqXFxuKyAqICAgc3RlcHBlZFxcdGtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2hcXG4rICpcXHRcXHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xcbisgKiAgIGZyZWVcXHRraHVnZXBhZ2VkIGxlZnQgdG8gcnVuIChzY2FuX3NsZWVwX21pbGxpc2Vjcz0wKSwgZm9yIHNvYWs7XFxuKyAqICAgbWFkdmlzZVxcdE1BRFZfQ09MTEFQU0UgYW5kIE1BRFZfRE9OVE5FRUQgaW4gYSBsb29wLlxcbisgKlxcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gIE9jY3VwYW5jeSBydW5zIGF0IGJvdGggZW5kc1xcbisgKiBvZiB3aGF0IG1USFAgY29sbGFwc2Ugc3VwcG9ydHM6IG1heF9wdGVzX25vbmUgMCwgd2hlcmUgYSB3aW5kb3cgbXVzdCBiZVxcbisgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzXFxuKyAqIGNvbGxhcHNlcyB0b28uICBBIGhvbGUgaXMgemVyby1maWxsZWQgaW50byB0aGUgbmV3IGZvbGlvIHJhdGhlciB0aGFuXFxuKyAqIGNvcGllZCwgYW5kIHRoZSByYWNpbmcgTUFEVl9ET05UTkVFRCBrZWVwcyBtb3Zpbmcgd2hpY2ggc2xvdHMgYXJlIGhvbGVzLlxcbisgKlxcbisgKiBFdmVyeSBjb21iaW5hdGlvbiBhbHNvIHJ1bnMgdW5kZXIgbWVtb3J5IHByZXNzdXJlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvdXIgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgbGVmdCBvdXRcXG4rICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxcbisgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSdzIGZyZWV6ZVxcbisgKiB3aXRoIHJlZmNvdW50IGVsZXZhdGlvbiBhbmQgbWlncmF0aW9uIGVudHJpZXMgb2YgaXRzIG93bikuXFxuKyAqXFxuKyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvclxcbisgKiB6ZXJvIChNQURWX0RPTlRORUVEKSwgbmV2ZXIgYW55dGhpbmcgZWxzZS4gIFRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmtcXG4rICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1c1xcbisgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluXFxuKyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCIuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXFxcIlxcbitcXG4rI2RlZmluZSBCQVNFX0FERFJcXHQoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4rXFxuKy8qXFxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxcbisgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGVcXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxcbisgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGVcXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbitzdGF0aWMgY2hhciAqcmVnaW9uO1xcdFxcdC8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xcbitzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7XFx0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXFxuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XFx0LyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xcbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcXG4rc3RhdGljIGludCBndXBfZmQgPSAtMTtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XFxuK1xcbitcXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcXHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cXG4rfVxcbitcXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xcbitzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpXFxuK3tcXG4rXFx0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAqdmFsIFxcdTAwMjZcXHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXG4rXFx0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXFx1MDAyNnZhbCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcXG4rfVxcbitcXG4rLyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJ3MgYXJlYSAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XFxuK1xcbitcXHRyZXR1cm4gd2FudCBcXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0aWYgKHJhbmRfcihcXHUwMDI2c2VlZCkgXFx1MDAyNiAxKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxcbitcXHRcXHRcXHRcXHRwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcXHUwMDNjXFx1MDAzYyAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDYpO1xcdC8qIDEuLjMyIHBhZ2VzICovXFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxcbitcXHRcXHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxcbitcXHRcXHQgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYVxcbitcXHRcXHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcXG4rXFx0XFx0ICogcmVhY2ggdGhhdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDY0KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXFxuK1xcdFxcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0TUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA1MDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xcbitcXG4rXFx0XFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXHRcXHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xcbitcXHRcXHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcXG4rXFx0XFx0Z3VwLmd1cF9mbGFncyA9IDE7XFx0LyogRk9MTF9XUklURSAqL1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXFxuK1xcdFxcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcXHUwMDI2Z3VwKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRcXHRpZiAocGlkID09IDApIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbDtcXG4rXFx0XFx0XFx0aW50IGJhZCA9IDA7XFxuK1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBObyBzdGRpbyBpbiB0aGUgY2hpbGQ6IGEgdGhyZWFkIG1heSBoYXZlIGhlbGRcXG4rXFx0XFx0XFx0ICogc3Rkb3V0J3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXFxuK1xcdFxcdFxcdCAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlXFxuK1xcdFxcdFxcdCAqIGV4aXQgc3RhdHVzIHNheXMuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIDE2OyBpKyspXFxuK1xcdFxcdFxcdFxcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFxcdTAwMjZzZWVkKSwgXFx1MDAyNnZhbCk7XFxuK1xcdFxcdFxcdF9leGl0KGJhZCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHBpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0aW50IHdzdGF0dXM7XFxuK1xcbitcXHRcXHRcXHRpZiAod2FpdHBpZChwaWQsIFxcdTAwMjZ3c3RhdHVzLCAwKSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwid2FpdHBpZCgpXFxcIik7XFxuK1xcdFxcdFxcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXFxuK1xcdFxcdFxcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxcbitcXHRcXHRcXHRcXHRjb3JydXB0ZWQgPSAxO1xcbitcXHRcXHR9XFxuK1xcdFxcdHVzbGVlcChyYW5kX3IoXFx1MDAyNnNlZWQpICUgMjAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHZvaWQgKnA7XFxuK1xcbitcXHRcXHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XFxuK1xcdFxcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibXJlbWFwKCkgYXdheVxcXCIpO1xcbitcXHRcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIDg7IGkrKylcXG4rXFx0XFx0XFx0bXJlbWFwX3NjcmF0Y2hbKHJhbmRfcihcXHUwMDI2c2VlZCkgJVxcbitcXHRcXHRcXHRcXHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xcbitcXHRcXHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XFxuK1xcdFxcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibXJlbWFwKCkgYmFja1xcXCIpO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKlxcbisgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxcbisgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdG1hZHZpc2UocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUsIE1BRFZfUEFHRU9VVCk7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuciBcXHUwMDI2XFx1MDAyNiAhc3RvcDsgaSsrKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGkgKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogQ29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdGludCBmZCA9IG9wZW4oXFxcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVxcXCIsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHR9XFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRpZiAod3JpdGUoZmQsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFxcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRjaGFyIGxpbmVbMjU2XTtcXG4rXFx0aW50IGxpbmVzID0gMDtcXG4rXFx0RklMRSAqZnAgPSBmb3BlbihcXFwiL3Byb2Mvc3dhcHNcXFwiLCBcXFwiclxcXCIpO1xcbitcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdGxpbmVzKys7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBsaW5lcyBcXHUwMDNlIDE7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZ0diwgTlVMTCk7XFxuK1xcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4re1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXG4rXFx0XFx0XFxcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXFxcblxcXCIpO1xcbitcXHRleGl0KDEpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcXG4rXFx0XFx0XFxcImZhdWx0ZXJcXFwiLCBcXFwiZmF1bHRlcjJcXFwiLCBcXFwiZG9udG5lZWRcXFwiLCBcXFwicGlubmVyXFxcIiwgXFxcImZvcmtlclxcXCIsXFxuK1xcdFxcdFxcXCJtcmVtYXBwZXJcXFwiLCBcXFwicGFnZW91dFxcXCIsIFxcXCJjb21wYWN0b3JcXFwiLFxcbitcXHR9O1xcbitcXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcXG4rXFx0XFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxcbitcXHRcXHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcXG4rXFx0fTtcXG4rXFx0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxcbitcXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX1BBR0VPVVQ7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX0NPTVBBQ1RPUjtcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFxcXCJzdGVwcGVkXFxcIiwgXFxcImZyZWVcXFwiLCBcXFwibWFkdmlzZVxcXCIgfTtcXG4rXFx0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcXHQvKiBzdHJpY3QsIGhvbGVzICovXFxuK1xcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1xcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xcbitcXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcXG4rXFx0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcXG4rXFx0Y29uc3QgY2hhciAqb25lX21vZGVbMV07XFxuK1xcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XFxuK1xcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcXG4rXFx0Y29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcXG4rXFx0aW50IGR1cmF0aW9uX3MgPSA1O1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XFxuK1xcdGludCBucl9hcmVhc19hcmcgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcdGludCBzdGVwcyA9IDA7XFxuK1xcdGludCBvcHQ7XFxuK1xcbitcXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcXFwiYTpkOm06dDpoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlX2FyZyA9IG9wdGFyZztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xcbitcXHRcXHRcXHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1vZGVfYXJnKSB7XFxuK1xcdFxcdGlmIChzdHJjbXAobW9kZV9hcmcsIFxcXCJzdGVwcGVkXFxcIikgXFx1MDAyNlxcdTAwMjYgc3RyY21wKG1vZGVfYXJnLCBcXFwiZnJlZVxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBzdHJjbXAobW9kZV9hcmcsIFxcXCJtYWR2aXNlXFxcIikpXFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdG9uZV9tb2RlWzBdID0gbW9kZV9hcmc7XFxuK1xcdFxcdG1vZGVzID0gb25lX21vZGU7XFxuK1xcdFxcdG5yX21vZGVzID0gMTtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xcbitcXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XFxuK1xcdGlmICghaHBhZ2VfcG1kX3NpemUpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiUmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGd1cF9mZCA9IG9wZW4oXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0XFxcIiwgT19SRFdSKTtcXG4rXFx0aWYgKGd1cF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFxcdTAwM2UgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTO1xcbitcXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxcbitcXHQgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbVxcbitcXHQgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvblxcbitcXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxcbitcXHQgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZVxcbitcXHQgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuXFxuK1xcdCAqL1xcbitcXHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcXG4rXFx0XFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFxcXCIpO1xcbitcXG4rXFx0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XFxuK1xcdGlmICghc3dhcF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovXFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcXG4rXFx0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XFxuK1xcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXFxuK1xcdCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlczsgcnVuKyspIHtcXG4rXFx0XFx0aW50IHJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XFxuK1xcdFxcdGNvbnN0IGNoYXIgKm1vZGUgPSBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXTtcXG4rXFx0XFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XFxuK1xcdFxcdGJvb2wgcHJlc3N1cmUgPSBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXTtcXG4rXFxuK1xcdFxcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xcbitcXHRcXHRpZiAoIXByZXNzdXJlKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XFxuK1xcdFxcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+cGFnZW91dF9iaXQ7XFxuK1xcbitcXHRcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XFxuK1xcdFxcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cXG4rXFx0XFx0XFx0c3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikgPyAxMDAwIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxcbitcXHRcXHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXFxuK1xcdFxcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcXG4rXFx0XFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxcbitcXHRcXHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXFxuK1xcdFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRcXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XFxuK1xcdFxcdFxcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xcbitcXHRcXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGxheWdyb3VuZFxcXCIpO1xcbitcXHRcXHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0XFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcXG4rXFx0XFx0XFx0ICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvXFxuK1xcdFxcdFxcdCAqIFsxNk0sIDY0TV0uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X3NpemUgXFx1MDAzYyAxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKVxcbitcXHRcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSAxNlVMIFxcdTAwM2NcXHUwMDNjIDIwO1xcbitcXHRcXHRcXHRpZiAocGFnZW91dF9zaXplIFxcdTAwM2UgNjRVTCBcXHUwMDNjXFx1MDAzYyAyMClcXG4rXFx0XFx0XFx0XFx0cGFnZW91dF9zaXplID0gNjRVTCBcXHUwMDNjXFx1MDAzYyAyMDtcXG4rXFx0XFx0XFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGFnZW91dCBhcmVhXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcdFxcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcXFwiKTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKCEodGhyZWFkX21hc2sgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKSkge1xcbitcXHRcXHRcXHRcXHR0aHJlYWRzW2ldID0gMDtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxcbitcXHRcXHRcXHRcXHRcXHQgICAodm9pZCAqKShpICsgMSkpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0ZW5kX21zID0gbm93X21zKCkgKyBkdXJhdGlvbl9zICogMTAwMFVMO1xcbitcXHRcXHRpZiAoIXN0cmNtcChtb2RlLCBcXFwic3RlcHBlZFxcXCIpKSB7XFxuK1xcdFxcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdFxcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSlcXG4rXFx0XFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZClcXG4rXFx0XFx0XFx0XFx0dXNsZWVwKDEwMCAqIDEwMDApO1xcbitcXHRcXHR9IGVsc2Uge1xcdC8qIG1hZHZpc2UgKi9cXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRzdG9wID0gMTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAodGhyZWFkc1tpXSlcXG4rXFx0XFx0XFx0XFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHRjaGVja19wYWdlKGkpO1xcbitcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLFxcbitcXHRcXHRcXHRcXHQgXFxcIiVzLyVzJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCBtb2RlLCBob2xlcyA/IFxcXCJob2xlc1xcXCIgOiBcXFwic3RyaWN0XFxcIixcXG4rXFx0XFx0XFx0XFx0IHByZXNzdXJlID8gXFxcIi9wcmVzc3VyZVxcXCIgOiBcXFwiXFxcIixcXG4rXFx0XFx0XFx0XFx0IGR1cmF0aW9uX3MsIHN0ZXBzKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEhhbmQgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHRoZSBzZXR0aW5ncyBiYWNrIGJlZm9yZSB0aGVcXG4rXFx0XFx0ICogbmV4dCBtb2RlOiBpdCBtYXBzIHRoZSByZWdpb24gYXQgdGhlIHNhbWUgZml4ZWQgYWRkcmVzcyxcXG4rXFx0XFx0ICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG11bm1hcChyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRpZiAocGFnZW91dF9hcmVhKSB7XFxuK1xcdFxcdFxcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XFxuK1xcdFxcdFxcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRcXHRzdG9wID0gMDtcXG4rXFx0XFx0c3RlcHMgPSAwO1xcbitcXG4rXFx0XFx0aWYgKGNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cXG4rXFx0XFx0XFx0d2hpbGUgKCsrcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcykge1xcbitcXHRcXHRcXHRcXHRyZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xcbitcXG4rXFx0XFx0XFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlcy8lcyVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvY2N1cGFuY2llc1tyZW0gLyBucl9wcmVzc3VyZXNdID9cXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxuQEAgLTAsMCArMSwxOTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxcbisgKlxcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcXG4rICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcXG4rICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMgKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50cyBmaWx0ZXJlZFxcbisgKiBieSBzb3VyY2UgUEZOIGFuZCBvcmRlcikgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXFxuKyAqXFxuKyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cXG4rICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXFx1MDAzY1xcdTAwM2MgMzApKVxcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXFx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitzdGF0aWMgaW50IHRyYWNlX2V2ZW50c19mZCA9IC0xO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuKy8qXFxuKyAqIEVhY2ggc3RlcCBzd2l0Y2hlcyB0aGUgZXZlbnRzIG9mZiBhZ2FpbiwgYnV0IGEgaGVscGVyIGNhbiBzdGlsbCBnaXZlIHVwXFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXFxuKyAqIHRocF93cml0ZV9udW0oKSksIGFuZCBodWdlX21lbW9yeSBldmVudHMgbGVmdCBvbiBhcmUgdGhlIHdob2xlIG1hY2hpbmUnc1xcbisgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0J3MuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRyYWNlX2V2ZW50c19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxcbisgKiBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdydzIHNvdXJjZSBQRk5zLCByZXBvcnRlZCBvbmNlIHBlciBhdHRlbXB0LlxcbisgKi9cXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IG9yZGVyKVxcbit7XFxuK1xcdGNoYXIgbGluZVsxMDI0XTtcXG4rXFx0aW50IGNvdW50ID0gMDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB2YWw7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBvcmQ7XFxuK1xcdFxcdGNoYXIgKnMsICpvO1xcbitcXHRcXHRpbnQgaTtcXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAoIXMpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAoc3NjYW5mKHMsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcXFwiLFxcbitcXHRcXHRcXHQgICBcXHUwMDI2dmFsKSAhPSAxKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0byA9IHN0cnN0cihzLCBcXFwib3JkZXI9XFxcIik7XFxuK1xcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcIm9yZGVyPSV1XFxcIiwgXFx1MDAyNm9yZCkgIT0gMSB8fCBvcmQgIT0gb3JkZXIpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGZuczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xcbitcXHRcXHRcXHRcXHRjb3VudCsrO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIGNvdW50O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxcbit7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcXHUwMDNjXFx1MDAzYyBUQVJHRVRfT1JERVI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUl07XFxuK1xcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XFxuK1xcdGlmIChwICE9IEJBU0VfQUREUilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgd2luZG93XFxcIik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cXG4rXFx0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHQvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cXG4rXFx0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKTtcXG4rXFxuK1xcdC8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovXFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGRpc2FibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCFwYXNzZWQpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwia2h1Z2VwYWdlZCBkaWQgbm90IGNvbXBsZXRlIGEgZnVsbCBwYXNzXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rXFx0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcXHUwMDI2XFx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXFxuK1xcdFxcdFxcdCBcXFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xcbitcXG4rXFx0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSKSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFxcXCJodWdlX21lbW9yeVxcXCIpO1xcbitcXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xcbitcXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqL1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXFx1MDAzY1xcdTAwM2MgMjQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG5pbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG5AQCAtMjAsNyArMjAsNiBAQFxcbiBcXG4gI2RlZmluZSBUV09NRUdcXHRcXHQoMlxcdTAwM2NcXHUwMDNjMjApXFxuICNkZWZpbmUgUlVOVElNRVxcdFxcdCgyMClcXG4tI2RlZmluZSBBTElHTih4LCBhKVxcdCgoKHgpICsgKGEgLSAxKSkgXFx1MDAyNiAofigoYSkgLSAxKSkpXFxuIFxcbiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSlcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5AQCAtNDAyLDYgKzQwMiwxMiBAQCBDQVRFR09SWT1cXFwicGZubWFwXFxcIiBydW5fdGVzdCAuL3Bmbm1hcFxcbiAjIENPVyB0ZXN0c1xcbiBDQVRFR09SWT1cXFwiY293XFxcIiBydW5fdGVzdCAuL2Nvd1xcbiBcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlXFxuK1xcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRcXG4gXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXFxuQEAgLTQxMCw4ICs0MTYsNiBAQCBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXFxuIFxcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cXG4gXFxuLUNBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uXFxuLVxcbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxcbiBpZiBbIC16IFxcXCIke1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfVxcXCIgXTsgdGhlblxcbiAgICAgaWYgdGVzdF9zZWxlY3RlZCBcXFwidGhwXFxcIjsgdGhlblxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG5AQCAtNDIsNjggKzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiO1xcbiBpbnQgcGFnZW1hcF9mZDtcXG4gaW50IGtwYWdlZmxhZ3NfZmQ7XFxuIFxcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuLVxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbi17XFxuLVxcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuLVxcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuLVxcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuLVxcdHVuc2lnbmVkIGxvbmcgaTtcXG4tXFxuLVxcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuLVxcbi1cXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuLVxcdGlmIChwZm4gPT0gLTFVTClcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4tXFx0aWYgKCFvcmRlcikge1xcbi1cXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4tXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tXFx0fVxcbi1cXG4tXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbi1cXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFxuLVxcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuLVxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuLVxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuLVxcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuLVxcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4tXFx0ICovXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tXFxuLVxcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4tXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbi1mYWlsOlxcbi1cXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbi1cXG4gc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKVxcbiB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbmluZGV4IDgwYmM5ZjU5N2I1MjEuLmVlMTMzNDc3ODM5MWYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuQEAgLTQ5NCw2ICs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuK1xcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcbitcXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuK1xcdGlmIChwZm4gPT0gLTFVTClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4rXFx0aWYgKCFvcmRlcikge1xcbitcXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbitcXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuK1xcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuK1xcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4rXFx0ICovXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4rXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbitmYWlsOlxcbitcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rLypcXG4rICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXFxuKyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XFxuKyAqIGFsaWduZWQsIGVhY2ggd2luZG93J3MgUEZOIHJ1biBtdXN0IGJlIGNvbnRpZ3VvdXMsIGFuZCBhIHdpbmRvdydzIGZpcnN0XFxuKyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLlxcbisgKlxcbisgKiBUaGlzIGlzIHRoZSBjaGVjayBcXFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXFxcIjogYVxcbisgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXFxuKyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxcbisgKi9cXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XFxuK1xcdGNoYXIgKnZhZGRyO1xcbitcXG4rXFx0aWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFxcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdFxcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cXG4rXFx0XFx0aWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICsgaSAqIHBzaXplKCkpICE9XFxuK1xcdFxcdFxcdCAgICBwZm4gKyBpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0a3BhZ2VmbGFnc19mZCkpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFxcXCIvc3lzL2tlcm5lbC90cmFjaW5nXFxcIlxcbitcXG4rLypcXG4rICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXFxcImh1Z2VfbWVtb3J5XFxcIikuXFxuKyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGVcXG4rICogc3Vic3lzdGVtIGlzIG5vdCB0aGVyZS4gIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlIHN0YXRlOiB3aG9ldmVyXFxuKyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlXFxuKyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLlxcbisgKi9cXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKVxcbit7XFxuK1xcdGNoYXIgcGF0aFsyNTZdO1xcbitcXG4rXFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXFxcIi9ldmVudHMvJXMvZW5hYmxlXFxcIixcXG4rXFx0XFx0IHN1YnN5cyk7XFxuK1xcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rfVxcbitcXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxcbit7XFxuK1xcdGlmIChwd3JpdGUoZmQsIGVuYWJsZSA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIiwgMSwgMCkgIT0gMSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqL1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxcbit7XFxuK1xcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcXG4re1xcbitcXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBcXFwiclxcXCIpO1xcbit9XFxuK1xcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXFxuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuaW5kZXggOWE0OWFmODg3MDJlNC4uMTBjN2JlNDZlNDRjYSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG5AQCAtMTAsNiArMTAsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gXFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKG5yKSlcXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFxcdTAwMjYgfigoYSkgLSAxKSlcXG4rXFxuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcXG4gI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KVxcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXFxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XFxuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcXG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xcbiBcXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxcbiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjMxLjkxMTY0MDY4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE1NDUxNTY5NDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzdhZWE0MDllZTg3ZWVmNzljMDgxNTg4MDI0MDY1ZDNjMWU3ZjkwZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDAyOjE4OjI4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgKz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyArPSBybWFwXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4rVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fb3JkZXJfY2hlY2tcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICsxLDEzNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxuKyAqXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcbisgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxuKyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xuKyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwncyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4rICogY29sbGFwc2UgdGVzdCByZWxpZXMgb24gdGhlbS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuK1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4rXG4rLyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbitcdHVpbnRwdHJfdCBhbGlnbmVkO1xuK1x0Y2hhciAqcDtcbitcbitcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuK1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpXCIpO1xuK1xuK1x0YWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XG4rXHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4rXHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXG4rXHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxuK1x0XHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuK1xuK1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbit9XG4rXG4rLypcbisgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Ym9vbCBvayA9IHRydWU7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRpZiAob3JkZXIpXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbitcdCpwID0gMTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbitcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwiLFxuK1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHRtdW5tYXAocCwgc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcIm9yZGVyICVkIGNsYXNzaWZpZWRcXG5cIiwgb3JkZXIpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIG9yZGVycztcbitcdGludCBvcmRlcjtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwib3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXG4rXHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuK1x0aWYgKCFvcmRlcnMpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiTm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdGNoZWNrX29yZGVyKDApO1xuK1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyKyspIHtcbitcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRjaGVja19vcmRlcihvcmRlcik7XG4rXHR9XG4rXG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbkBAIC02NSw3ICs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xuIFxuICNpZm5kZWYgRk9MTF9XUklURVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi45OTJlZmVlMTdiNzE2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICsxODMsMTkgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkIC0tXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxuKyAqIHF1ZXVlIC0tIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbisgKiBhc2tlZCBmb3I7IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLiAgVGhlXG4rICogb3RoZXIga25vYnMgZG8gbm90IHdha2UsIGJ1dCB3cml0aW5nIHRoZW0gdGhlIHNhbWUgd2F5IGNvc3RzIG5vdGhpbmcuXG4rICovXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyNDMsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuKyAqXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuKyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuKyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4rICpcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbisgKiBwYWdlc190b19zY2FuLlxuKyAqL1xuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xuK1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4rXHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbitcdFx0XHRlbGFwc2VkX21zICs9IDEwO1xuK1x0XHR9XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcbiB7XG4gXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgKzg0LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4rXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcIi9wcm9jL3NlbGYvc21hcHNcIlxuICNkZWZpbmUgVEVTVF9GSUxFIFwiY29sbGFwc2VfdGVzdF9maWxlXCJcbkBAIC0yMTksNiArMjI0LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuKy8qXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXG4rICpcbisgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbisgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbisgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbisgKlxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cbisgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXG4rICovXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxNSw4ICs1NTUsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4ge1xuLVx0aW50IHJldDtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIiVzLi4uXCIsIG1zZyk7XG4gXG5AQCAtNTI5LDkgKzU2OSwyMCBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4rXHQgKlxuK1x0ICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGFcbitcdCAqIHNvdXJjZSBvcmRlciBsZWZ0IGF0IFwiYWx3YXlzXCIgLS0gd2hpY2ggLXMgZG9lcyAtLSBsZXRzIGtodWdlcGFnZWRcbitcdCAqIGNvbGxhcHNlIHRoZSB2ZXJ5IHJhbmdlIHRoZSBjYXNlIGlzIHdvcmtpbmcgb24uICBTZXQgdGhlbSB0b1xuK1x0ICogXCJpbmhlcml0XCIsIG5vdCBcIm5ldmVyXCIuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmRcbitcdCAqIHN0YXlzIG91dC4gIEEgZm9yY2VkIHNobWVtIGNvbGxhcHNlIHRha2VzIHRoZSBvcmRlciBpdCBidWlsZHMgZnJvbVxuK1x0ICogdGhlc2UgdmVyeSBjb250cm9scywgYW5kIHN0aWxsIGZpbmRzIG9uZS5cbiBcdCAqL1xuIFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4gXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0XHRzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XG4rXHR9XG4gXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4gXG4gXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXG5AQCAtNTYxLDggKzYxMiwxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbitcdC8qIFRocmVlIHNlY29uZHMgYXMgYSBmbG9vciwgcGx1cyBhIHNlY29uZCBwZXIgMTI4TSB0byBjb2xsYXBzZSAqL1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XG4rXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFx1MDAzY1x1MDAzYyAyMCkpO1xuIFx0aW50IGZ1bGxfc2NhbnM7XG4tXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xuIFxuIFx0LyogU2FuaXR5IGNoZWNrICovXG4gXHRpZiAoIW9wcy1cdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXG5AQCAtODI1LDEyICs4NzgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIlN3YXBvdXQgb25lIHBhZ2UuLi5cIik7XG4tXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIHBhZ2Vfc2l6ZSkpIHtcbitcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcIk9LXCIpO1xuIFx0fSBlbHNlIHtcbi1cdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdHNraXAoXCJDb3VsZCBub3Qgc3dhcCBvdXRcIik7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg1MSwxMiArOTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAgKyAxLCBocGFnZV9wbWRfbnIpO1xuLVx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuLVx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbitcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NjgsMTIgKzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cIiwgbWF4X3B0ZXNfc3dhcCxcbiBcdFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XG4tXHRcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuLVx0XHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuK1x0XHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuIFx0XHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTQwLDYgKzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0dm9pZCAqcDtcbiBcdGludCBpO1xuIFxuK1x0LypcbitcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xuK1x0ICogZmFpbCBmb3IgbGFyZ2UgUE1EIHNpemVzLiAgU2tpcCBpZiB0aGUgUE1EIHNpemUgaXMgb3ZlciAzMk0uXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTExMzAsNiArMTE4Nyw5NyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4rICogaXRzIG93biB3cml0ZXMuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xuK1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuK1x0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcbitcdC8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovXG4rXHR2b2xhdGlsZSBpbnQgKmlwO1xuK1x0cGlkX3QgY2hpbGQ7XG4rXHRpbnQgc3luY1syXTtcbitcdGNoYXIgZ28gPSAxO1xuK1x0dm9pZCAqcDtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlwID0gcDtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1x0XHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXG4rXHRpZiAocGlwZShzeW5jKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwicGlwZSgpXCIpO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlwiKTtcbitcdGNoaWxkID0gZm9yaygpO1xuK1x0aWYgKCFjaGlsZCkge1xuK1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuK1xuK1x0XHRjbG9zZShzeW5jWzBdKTtcbitcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbitcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydC4gKi9cbitcdFx0aWYgKHdyaXRlKHN5bmNbMV0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuK1x0XHRcdF9leGl0KEtTRlRfRkFJTCk7XG4rXHRcdHVzbGVlcCg1MDAwKTtcbitcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwiLFxuK1x0XHRcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xuK1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhkZWFkMDAwMClcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRpZiAoaSA9PSBuKVxuK1x0XHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGZhaWwoXCJGYWlsOiBjaGlsZCBjb250ZW50XCIpO1xuK1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuK1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0Y2xvc2Uoc3luY1sxXSk7XG4rXHRpZiAocmVhZChzeW5jWzBdLCBcdTAwMjZnbywgMSkgIT0gMSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiY2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cIik7XG4rXG4rXHQvKlxuK1x0ICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWUuICBBIGJ1cnN0IHdvdWxkIGJyZWFrIENvVyBvbiBhbGwgb2YgdGhlbVxuK1x0ICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS1cbitcdCAqIGFuZCB0aGUgY2hpbGQgd291bGQgY29sbGFwc2UgcGFnZXMgYWxyZWFkeSBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKi9cbitcdGkgPSAwO1xuK1x0ZG8ge1xuK1x0XHRpZiAoaSBcdTAwM2MgbilcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1x0XHRpKys7XG4rXHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0fSB3aGlsZSAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykgPT0gMCk7XG4rXG4rXHQvKiBXaGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCwgc28gdGhlIGNoZWNrIGJlbG93IGlzIGV4YWN0LiAqL1xuK1x0Zm9yICg7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICsgMHhiZWVmMDAwMDtcbitcdC8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovXG4rXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcbitcdFx0XHRicmVhaztcbitcdGlmIChpID09IG4pXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWw6IHBhcmVudCBjb250ZW50XCIpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHQvKiBTYW1lIGFnYWluOiBvdXIgb3duIGNoZWNrIG11c3Qgbm90IGJ1cnkgdGhlIGNoaWxkJ3MgdmVyZGljdC4gKi9cbitcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4rXHRcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTExNzUsNiArMTMyMywyMTkgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZS4gKi9cbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbitcbisvKlxuKyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgZm9yIHRoZSBtdGhwX2todWdlcGFnZWQgY29udGV4dC4gIFdoYXRcbisgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xuKyAqIGRldGVjdGlvbjogd2hpY2ggYWxpZ25lZCB3aW5kb3cgY29sbGFwc2VkLCBhbmQgd2hpY2ggb2YgaXRzIG5laWdoYm91cnMgZGlkXG4rICogbm90LiAgY2hlY2tfaHVnZSgpIGFuc3dlcnMgaG93IG1hbnkgZm9saW9zIG9mIHRoZSBvcmRlciB0aGUgcmFuZ2UgaG9sZHMsXG4rICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXG4rICpcbisgKiBUaGUgcmVnaW9uIGlzIGZhdWx0ZWQgYmVmb3JlIE1BRFZfSFVHRVBBR0UsIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzIG9ubHlcbisgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxuKyAqIHByb2R1Y3QgY2FuIG9ubHkgaGF2ZSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cbisgKi9cbitzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcjtcbit9XG4rXG4rc3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCBpO1xuK1xuK1x0LypcbitcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXG4rXHQgKiBjYXNlcyBmYXVsdCB0aGVpciByZWdpb24gYmVmb3JlIE1BRFZfSFVHRVBBR0UsIHNvIHRoZSBzb3VyY2VzIGFyZVxuK1x0ICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZVxuK1x0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXG4rXHQgKiBhbmQgdGhlIHdpbmRvdyB3b3VsZCBjb2xsYXBzZSBhZnRlciBhbGwuXG4rXHQgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvblxuK1x0ICogdG9wIG9mIHRoaXMuXG4rXHQgKi9cbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcbit7XG4rXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4rfVxuK1xuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cbitzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHRjaGFyICphZGRyID0gcDtcbitcbitcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4rXHRcdGlmICh3aW5kb3dfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcbit7XG4rXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuK1x0cmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuK1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyAyICogd2luZG93LFxuK1x0XHRcdFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuK1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHZvaWQgKnA7XG4rXG4rXHQvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqL1xuK1x0aWYgKHNvdXJjZV9vcmRlciBcdTAwM2U9IGNvbGxhcHNlX29yZGVyIHx8XG4rXHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcblwiLFxuK1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHQvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqL1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcbitcdC8qXG4rXHQgKiBUaGUgb3JkZXIgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkLCBidXQgdGhlIGFsbG9jYXRvciBjYW4gc3RpbGwgZmFsbFxuK1x0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxuK1x0ICogd2hpY2ggaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIgcmF0aGVyIHRoYW4gYSByZWFzb24gdG8gZW5kIHRoZSBydW4uXG4rXHQgKi9cbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlwiLCBzb3VyY2Vfb3JkZXIpO1xuK1x0XHRza2lwKFwiU2tpcFwiKTtcbitcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCIsXG4rXHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4ge1xuIFx0ZnByaW50ZihzdGRlcnIsIFwiXFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCIpO1xuQEAgLTExOTIsMTEgKzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCIpO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyMDgsNiArMTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2MnOlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnaCc6XG4gXHRcdGRlZmF1bHQ6XG5AQCAtMTIxNSwxMiArMTU4MSwyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxuK1x0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXG4rXHQgKi9cbitcdGlmIChhbm9uX29yZGVyIFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiLXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcblwiLFxuK1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcbitcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcdTAwMjZcdTAwMjZcbitcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiLWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxcblwiLFxuK1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyIC0gMSwgY29sbGFwc2Vfb3JkZXIpO1xuK1xuIFx0YXJndiArPSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbitcdFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cbiBcdFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyMzEsMTMgKzE2MTAsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcImFsbFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbitcbitcdFx0LypcbitcdFx0ICogXCJhbGxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbitcdFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cbitcdFx0ICovXG4rXHRcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJraHVnZXBhZ2VkXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtdGhwX2todWdlcGFnZWRcIikpIHtcbiBcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbi1cdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcIm1hZHZpc2VcIikpIHtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuIFx0fSBlbHNlIHtcbkBAIC0xMjUzLDIwICsxNjM4LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwiYW5vblwiKSkge1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImZpbGVcIikpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwic2htZW1cIikpIHtcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbitcdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFx1MDAyNlx1MDAyNiAhbXRocF9jb250ZXh0X2ltcGxpZWQpXG4gXHRcdFx0dXNhZ2UoKTtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjg4LDkgKzE2NzMsMTAgQEAgc3RydWN0IHRlc3RfY2FzZSB7XG4gXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xuIFx0Y29uc3QgY2hhciAqZGVzYztcbiBcdHRlc3RfZm4gZm47XG4rXHRpbnQgb3JkZXI7XHRcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xuIH07XG4gXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxuKyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMDMsNiArMTY4OSw3IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcdFx0XHQub3BzXHQ9IG8sXHRcdFx0XHRcdFxcXG4gXHRcdFx0LmRlc2NcdD0gI3QsXHRcdFx0XHRcdFxcXG4gXHRcdFx0LmZuXHQ9IHQsXHRcdFx0XHRcdFxcXG4rXHRcdFx0Lm9yZGVyXHQ9IGNvbGxhcHNlX29yZGVyLFx0XHRcdFxcXG4gXHRcdH07XHRcdFx0XHRcdFx0XHRcXFxuIFx0fVx0XHRcdFx0XHRcdFx0XHRcXFxuIFx0fSB3aGlsZSAoMClcbkBAIC0xMzQzLDggKzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuK1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbitcbitcdFx0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuKSB7XG4rXHRcdFx0LyogLWMgcGlucyBvbmUgb3JkZXI7IGl0IGhhcyB0byBiZSBvbmUgd2UgY2FuIGJ1aWxkICovXG4rXHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuK1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyKTtcbitcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSBhbm9uX29yZGVyKVxuK1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCItYyAlZCBuZWVkcyBhIHNvdXJjZSBvcmRlciBiZWxvdyBpdCwgLXMgc2F5cyAlZFxcblwiLFxuK1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBjb2xsYXBzZV9vcmRlcjtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xuK1x0XHRcdCAqIG1ha2VzIHRoZSBmYXVsdCBwYXRoIGhhbmQgb3V0IGZvbGlvcyBvZiB0aGF0IG9yZGVyLFxuK1x0XHRcdCAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOlxuK1x0XHRcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cbitcdFx0XHQgKi9cbitcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICsgMTtcbitcbitcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuK1x0XHRcdFx0Zmlyc3QgPSBNSU5fTVRIUF9PUkRFUjtcbitcdFx0XHRmb3IgKGludCBpID0gZmlyc3Q7IGkgXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XG4rXHRcdFx0XHRpZiAob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGk7XG4rXHRcdFx0fVxuK1x0XHRcdGlmICghbnJfY29sbGFwc2Vfb3JkZXJzKVxuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJtVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cIik7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVwiKTtcbitcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9rcGFnZWZsYWdzKVwiKTtcbitcdH1cbitcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuK1x0LypcbitcdCAqIFRoZSBwYWdlIGNhY2hlIGNhcHMgZm9saW8gb3JkZXIgYXQgTUFYX1BBR0VDQUNIRV9PUkRFUiwgd2hpY2ggaXNcbitcdCAqIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuICBBIFBNRC1zaXplZCBwYWdlIGNhY2hlXG4rXHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XG4rXHQgKiBkZXNpZ24gYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4gIFRoZSBjYXAgaXMgbm90IHNobWVtLXNwZWNpZmljOlxuK1x0ICogaXQgcnVsZXMgb3V0IHJlZ3VsYXIgZmlsZXMgdG9vLCBhbmQgdGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkXG4rXHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuK1x0ICogdGhlbSByZWFkYWJsZSBoZXJlLlxuK1x0ICovXG4rXHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuK1x0XHRpZiAoc2htZW1fb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cIik7XG4rXHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbitcdFx0fVxuK1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxuXCIpO1xuK1x0fVxuK1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM2Miw3ICsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpKyspIHtcbitcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4rXHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdH1cbitcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTEzNzAsMTEgKzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjksNiArMTg4OCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuK1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ0NCw3ICsxOTA2LDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuK1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyID0gdC1cdTAwM2VvcmRlcjtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIlxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuK1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NjgyYmJhZTBhOGY4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCArMSw1ODkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuXG4rICpcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuKyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW5cbisgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxuKyAqXG4rICogICBzdGVwcGVkXHRraHVnZXBhZ2VkLCBvbmUgZnVsbCBwYXNzIGF0IGEgdGltZSB0aHJvdWdoXG4rICpcdFx0a2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDtcbisgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbisgKiAgIG1hZHZpc2VcdE1BRFZfQ09MTEFQU0UgYW5kIE1BRFZfRE9OVE5FRUQgaW4gYSBsb29wLlxuKyAqXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbisgKiBvZiB3aGF0IG1USFAgY29sbGFwc2Ugc3VwcG9ydHM6IG1heF9wdGVzX25vbmUgMCwgd2hlcmUgYSB3aW5kb3cgbXVzdCBiZVxuKyAqIGZ1bGx5IHBvcHVsYXRlZCwgYW5kIEhQQUdFX1BNRF9OUiAtIDEsIHdoZXJlIGEgd2luZG93IGZ1bGwgb2YgaG9sZXNcbisgKiBjb2xsYXBzZXMgdG9vLiAgQSBob2xlIGlzIHplcm8tZmlsbGVkIGludG8gdGhlIG5ldyBmb2xpbyByYXRoZXIgdGhhblxuKyAqIGNvcGllZCwgYW5kIHRoZSByYWNpbmcgTUFEVl9ET05UTkVFRCBrZWVwcyBtb3Zpbmcgd2hpY2ggc2xvdHMgYXJlIGhvbGVzLlxuKyAqXG4rICogRXZlcnkgY29tYmluYXRpb24gYWxzbyBydW5zIHVuZGVyIG1lbW9yeSBwcmVzc3VyZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvdXIgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgbGVmdCBvdXRcbisgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyXG4rICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UncyBmcmVlemVcbisgKiB3aXRoIHJlZmNvdW50IGVsZXZhdGlvbiBhbmQgbWlncmF0aW9uIGVudHJpZXMgb2YgaXRzIG93bikuXG4rICpcbisgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcbisgKiB6ZXJvIChNQURWX0RPTlRORUVEKSwgbmV2ZXIgYW55dGhpbmcgZWxzZS4gIFRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmtcbisgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxuKyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rI2luY2x1ZGUgXCIuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCJcbitcbisjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuK1xuKy8qXG4rICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4rICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xuKyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4rICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxuKyAqL1xuKyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVNcdDNcbitzdGF0aWMgaW50IG5yX3NoYXJlZF9hcmVhcztcbitzdGF0aWMgaW50IG5yX2FyZWFzO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbitzdGF0aWMgY2hhciAqcmVnaW9uO1x0XHQvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1x0LyogcmVnaW9uICsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1x0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXG4rc3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTtcdC8qIGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcbitzdGF0aWMgaW50IGd1cF9mZCA9IC0xO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcbitcbitzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVO1xuK1xuK1x0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cbit9XG4rXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xuK3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbit7XG4rXHQqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuK1xuK1x0cmV0dXJuICp2YWwgXHUwMDI2XHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgdmFsO1xuK1xuK1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuK1x0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbit7XG4rXHRyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpXG4re1xuK1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xuK31cbitcbisvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQncyBhcmVhICovXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxlZnQgPSBzaGFyZWRfcGFnZXMoKSAtIHBhZ2VfaWR4O1xuK1xuK1x0cmV0dXJuIHdhbnQgXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXG4rXHRcdGlmIChyYW5kX3IoXHUwMDI2c2VlZCkgXHUwMDI2IDEpXG4rXHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cbitcdFx0XHRcdHBhdHRlcm4ocGFnZV9pZHgpO1xuK1x0XHRlbHNlXG4rXHRcdFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxuK1x0XHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxuK1x0XHQgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYVxuK1x0XHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcbitcdFx0ICogcmVhY2ggdGhhdCBwYXRoLlxuK1x0XHQgKi9cbitcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuK1x0XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuK1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xuK1xuK1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXHRcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XG4rXHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xuK1x0XHRndXAuZ3VwX2ZsYWdzID0gMTtcdC8qIEZPTExfV1JJVEUgKi9cbitcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuK1x0XHRcdGludCBiYWQgPSAwO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkXG4rXHRcdFx0ICogc3Rkb3V0J3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXG4rXHRcdFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcbitcdFx0XHQgKiBleGl0IHN0YXR1cyBzYXlzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyAxNjsgaSsrKVxuK1x0XHRcdFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXHUwMDI2c2VlZCksIFx1MDAyNnZhbCk7XG4rXHRcdFx0X2V4aXQoYmFkKTtcbitcdFx0fVxuK1x0XHRpZiAocGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IHdzdGF0dXM7XG4rXG4rXHRcdFx0aWYgKHdhaXRwaWQocGlkLCBcdTAwMjZ3c3RhdHVzLCAwKSBcdTAwM2MgMClcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIndhaXRwaWQoKVwiKTtcbitcdFx0XHQvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqL1xuK1x0XHRcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuK1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbitcdFx0fVxuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dm9pZCAqcDtcbitcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYXdheVwiKTtcbitcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkrKylcbitcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbitcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4rXHRcdHAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuK1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1yZW1hcCgpIGJhY2tcIik7XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKlxuKyAqIFN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Q6IGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1x0aW50IGZkID0gb3BlbihcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVwiLCBPX1dST05MWSk7XG4rXG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXG5cIik7XG4rXHRcdHJldHVybiBOVUxMO1xuK1x0fVxuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdGlmICh3cml0ZShmZCwgXCIxXCIsIDEpIFx1MDAzYyAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAgKyByYW5kX3IoXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0Y2hhciBsaW5lWzI1Nl07XG4rXHRpbnQgbGluZXMgPSAwO1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9wcm9jL3N3YXBzXCIsIFwiclwiKTtcbitcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSlcbitcdFx0bGluZXMrKztcbitcdGZjbG9zZShmcCk7XG4rXHRyZXR1cm4gbGluZXMgXHUwMDNlIDE7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxuK3tcbitcdHN0cnVjdCB0aW1ldmFsIHR2O1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnR2LCBOVUxMKTtcbitcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbit7XG4rXHRmcHJpbnRmKHN0ZGVycixcbitcdFx0XCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc11cXG5cIlxuK1x0XHRcIlxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwiXG4rXHRcdFwiXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxuK1x0ICAgICAgIFRfTVJFTUFQUEVSLCBUX1BBR0VPVVQsIFRfQ09NUEFDVE9SIH07XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX1BBR0VPVVQ7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfQ09NUEFDVE9SO1xuK1x0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XG4rXHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCJzdGVwcGVkXCIsIFwiZnJlZVwiLCBcIm1hZHZpc2VcIiB9O1xuK1x0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbitcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXG4rXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcbitcdGNvbnN0IGludCBucl9wcmVzc3VyZXMgPSBBUlJBWV9TSVpFKHByZXNzdXJlcyk7XG4rXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbitcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4rXHRpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7XG4rXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4rXHRpbnQgZHVyYXRpb25fcyA9IDU7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdHVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXHRpbnQgc3RlcHMgPSAwO1xuK1x0aW50IG9wdDtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiYTpkOm06dDpoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHVzYWdlKCk7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtb2RlX2FyZykge1xuK1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXCJmcmVlXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgc3RyY21wKG1vZGVfYXJnLCBcIm1hZHZpc2VcIikpXG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbitcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbitcdFx0bnJfbW9kZXMgPSAxO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1xuK1x0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcbitcdGd1cF9mZCA9IG9wZW4oXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiLCBPX1JEV1IpO1xuK1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXG5cIik7XG4rXG4rXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcbitcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcbitcbitcdC8qXG4rXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cbitcdCAqIHRoZSBhZGRyZXNzIGhlcmUsIHNvIGEgbGF5b3V0IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhpcyBhc3N1bXB0aW9uXG4rXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuK1x0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcbitcdCAqIHRvcC1kb3duIG1tYXAgYXJlYSwgd2VsbCBhYm92ZS5cbitcdCAqL1xuK1x0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLFxuK1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFwiKTtcbitcbitcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xuK1x0aWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0LypcbitcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcbitcdCAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eVxuK1x0ICogc3RhY2sgaGFzIG5vIHNldHRpbmdzIHRvIGFwcGx5IGFuZCBnaXZlcyB1cC5cbitcdCAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xuK1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuK1x0XHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcbitcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xuK1xuK1x0XHR0aHJlYWRfbWFzayA9IGJhc2VfbWFzaztcbitcdFx0aWYgKCFwcmVzc3VyZSlcbitcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcbitcdFx0ZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4rXHRcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+cGFnZW91dF9iaXQ7XG4rXG4rXHRcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuK1x0XHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4rXHRcdFx0c3RyY21wKG1vZGUsIFwiZnJlZVwiKSA/IDEwMDAgOiAwO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbitcdFx0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxuK1x0XHQgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyXG4rXHRcdCAqIHJhY2luZyBNQURWX0RPTlRORUVEOyBob2xlLWhlYXZ5IHdpbmRvd3MgY29sbGFwc2UgaW5zdGVhZCxcbitcdFx0ICogc28gdGhlIHR3byBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzLlxuK1x0XHQgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuK1x0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbitcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHRcdH1cbitcdFx0LyogUG9wcGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2RlLCBiZWZvcmUgdGhlIG5leHQgb25lLiAqL1xuK1x0XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRcdHJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxuK1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuK1x0XHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKCkgcGxheWdyb3VuZFwiKTtcbitcdFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcbitcdFx0aWYgKHRocmVhZF9tYXNrIFx1MDAyNiBwYWdlb3V0X2JpdCkge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcbitcdFx0XHQgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG9cbitcdFx0XHQgKiBbMTZNLCA2NE1dLlxuK1x0XHRcdCAqL1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbitcdFx0XHRpZiAocGFnZW91dF9zaXplIFx1MDAzYyAxNlVMIFx1MDAzY1x1MDAzYyAyMClcbitcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXHUwMDNjXHUwMDNjIDIwO1xuK1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuK1x0XHRcdFx0cGFnZW91dF9zaXplID0gNjRVTCBcdTAwM2NcdTAwM2MgMjA7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4rXHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBhZ2VvdXQgYXJlYVwiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxuK1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbitcdFx0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRcdGlmIChtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVwiKTtcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XG4rXHRcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuK1x0XHRcdFx0dGhyZWFkc1tpXSA9IDA7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdFx0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXG4rXHRcdFx0XHRcdCAgICh2b2lkICopKGkgKyAxKSkpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcbitcdFx0fVxuK1xuK1x0XHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4rXHRcdGlmICghc3RyY21wKG1vZGUsIFwic3RlcHBlZFwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4rXHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cIik7XG4rXHRcdFx0XHRzdGVwcysrO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwiZnJlZVwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuK1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xuK1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0c3RvcCA9IDE7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1x0XHR9XG4rXG4rXHRcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHRjaGVja19wYWdlKGkpO1xuK1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsXG4rXHRcdFx0XHQgXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0IHByZXNzdXJlID8gXCIvcHJlc3N1cmVcIiA6IFwiXCIsXG4rXHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4rXHRcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXG4rXHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4rXHRcdCAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbitcdFx0XHR3aGlsZSAoKytydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpIHtcbitcdFx0XHRcdHJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XG4rXG4rXHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlcy8lcyVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXG5cIixcbitcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXSxcbitcdFx0XHRcdFx0XHQgICAgICBvY2N1cGFuY2llc1tyZW0gLyBucl9wcmVzc3VyZXNdID9cbitcdFx0XHRcdFx0XHQgICAgICBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0XHRcdCAgICAgIHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdID9cbitcdFx0XHRcdFx0XHQgICAgICBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDUwMDE5OTZiNTdhYVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgKzEsMTk2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbisgKlxuKyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4rICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuKyAqIHdpbmRvdydzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuKyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rXG4rLypcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXG4rICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSdzXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxuKyAqIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93J3Mgc291cmNlIFBGTnMsIHJlcG9ydGVkIG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4re1xuK1x0Y2hhciBsaW5lWzEwMjRdO1xuK1x0aW50IGNvdW50ID0gMDtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbitcdGlmICghZnApXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwiKTtcbitcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbitcdFx0dW5zaWduZWQgaW50IG9yZDtcbitcdFx0Y2hhciAqcywgKm87XG4rXHRcdGludCBpO1xuK1xuK1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XCIpO1xuK1x0XHRpZiAoIXMpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChzc2NhbmYocywgXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcIixcbitcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHwgb3JkICE9IG9yZGVyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wZm5zOyBpKyspIHtcbitcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdGNvdW50Kys7XG4rXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcdGZjbG9zZShmcCk7XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXG4re1xuK1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbitcdGNvbnN0IGludCBucl9wYWdlcyA9IDEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbitcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVJdO1xuK1x0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcbitcdGludCBhdHRyaWJ1dGVkO1xuK1x0Y2hhciAqcDtcbitcdGludCBpO1xuK1xuK1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbitcdGlmIChwICE9IEJBU0VfQUREUilcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHdpbmRvd1wiKTtcbitcbitcdC8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0cFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICsgMTtcbitcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICsgaSAqIGdldHBhZ2VzaXplKCkpO1xuK1x0XHRpZiAocGZuc1tpXSA9PSAtMVVMKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlNvdXJjZSBwYWdlIG5vdCBwcmVzZW50XFxuXCIpO1xuK1x0fVxuK1xuK1x0LyogQ2xlYXIgZmlyc3Q6IHdpdGggdGhlIGV2ZW50cyBzdGlsbCBvZmYgdGhlcmUgaXMgbm90aGluZyB0byB1bmRvLiAqL1xuK1x0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IGNsZWFyIHRoZSB0cmFjZSBidWZmZXJcXG5cIik7XG4rXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBlbmFibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCIpO1xuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuK1xuK1x0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi9cbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcdGlmICghcGFzc2VkKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cIik7XG4rXG4rXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbitcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCBUQVJHRVRfT1JERVIpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbitcdFx0XHQgXCJzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwiLFxuK1x0XHRcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xuK1xuK1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0aW50IGk7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwib3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFwiaHVnZV9tZW1vcnlcIik7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXG5cIik7XG4rXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuK1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbitcdHNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbitcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgKzIwLDYgQEBcbiBcbiAjZGVmaW5lIFRXT01FR1x0XHQoMlx1MDAzY1x1MDAzYzIwKVxuICNkZWZpbmUgUlVOVElNRVx0XHQoMjApXG4tI2RlZmluZSBBTElHTih4LCBhKVx0KCgoeCkgKyAoYSAtIDEpKSBcdTAwMjYgKH4oKGEpIC0gMSkpKVxuIFxuIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbkBAIC00MDIsNiArNDAyLDEyIEBAIENBVEVHT1JZPVwicGZubWFwXCIgcnVuX3Rlc3QgLi9wZm5tYXBcbiAjIENPVyB0ZXN0c1xuIENBVEVHT1JZPVwiY293XCIgcnVuX3Rlc3QgLi9jb3dcbiBcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuK1xuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuQEAgLTQxMCw4ICs0MTYsNiBAQCBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW1cbiBcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxuIFxuLUNBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCIke1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfVwiIF07IHRoZW5cbiAgICAgaWYgdGVzdF9zZWxlY3RlZCBcInRocFwiOyB0aGVuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5AQCAtNDIsNjggKzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gXCIvcHJvYy9rcGFnZWZsYWdzXCI7XG4gaW50IHBhZ2VtYXBfZmQ7XG4gaW50IGtwYWdlZmxhZ3NfZmQ7XG4gXG4tc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuLVx0XHRpbnQga3BhZ2VmbGFnc19mZClcbi17XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbi1cdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuLVx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbi1cdHVpbnQ2NF90IHBmbl9mbGFncztcbi1cdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVx0dW5zaWduZWQgbG9uZyBpO1xuLVxuLVx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbi1cbi1cdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbi1cdGlmIChwZm4gPT0gLTFVTClcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuLVx0aWYgKCFvcmRlcikge1xuLVx0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuLVx0XHRcdHJldHVybiBmYWxzZTtcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHQvKiBub24gVEhQIGZvbGlvICovXG4tXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuLVxuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4tXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4tXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuLVx0XHRcdHJldHVybiBmYWxzZTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuLVx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuLVx0ICovXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cbi1cdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbi1cdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuLWZhaWw6XG4tXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxuIFx0XHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycylcbiB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5pbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbkBAIC00OTQsNiArNDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbitcdHVpbnQ2NF90IHBmbl9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcbitcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbitcdGlmIChwZm4gPT0gLTFVTClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuK1x0aWYgKCFvcmRlcikge1xuK1x0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cmV0dXJuIHRydWU7XG4rXHR9XG4rXG4rXHQvKiBub24gVEhQIGZvbGlvICovXG4rXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4rXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuK1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuK1x0ICovXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcbitcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbitcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuK2ZhaWw6XG4rXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qXG4rICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4rICogZm9saW8gb2YgdGhhdCBvcmRlciwgaGVhZCB0byB0YWlsLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHlcbisgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cncyBmaXJzdFxuKyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLlxuKyAqXG4rICogVGhpcyBpcyB0aGUgY2hlY2sgXCJkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3NcIjogYVxuKyAqIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvIHNoaWZ0ZWRcbisgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy5cbisgKi9cbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbitcdFx0XHRcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTtcbitcdGNoYXIgKnZhZGRyO1xuK1xuK1x0aWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFx1MDAzYyBzdGFydCArIGxlbjsgdmFkZHIgKz0gd2luZG93KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcdFx0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0XHQvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovXG4rXHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICsgaSAqIHBzaXplKCkpICE9XG4rXHRcdFx0ICAgIHBmbiArIGkpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcbitcdFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLFxuK1x0XHRcdFx0XHRrcGFnZWZsYWdzX2ZkKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rI2RlZmluZSBUUkFDRUZTX1JPT1QgXCIvc3lzL2tlcm5lbC90cmFjaW5nXCJcbitcbisvKlxuKyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuIFwiaHVnZV9tZW1vcnlcIikuXG4rICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRyYWNpbmdfZXZlbnRzX2VuYWJsZSgpLCBvciAtMSBpZiB0cmFjZWZzIG9yIHRoZVxuKyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuKyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlXG4rICogcGF0aHMgd2hlcmUgdGhlIHRlc3QgZ2l2ZXMgdXAuXG4rICovXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKVxuK3tcbitcdGNoYXIgcGF0aFsyNTZdO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXCIvZXZlbnRzLyVzL2VuYWJsZVwiLFxuK1x0XHQgc3Vic3lzKTtcbitcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbit9XG4rXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuK3tcbitcdGlmIChwd3JpdGUoZmQsIGVuYWJsZSA/IFwiMVwiIDogXCIwXCIsIDEsIDApICE9IDEpXG4rXHRcdHJldHVybiAtMTtcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIuICovXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbit7XG4rXHRpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcIi90cmFjZVwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4re1xuK1x0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcIi90cmFjZVwiLCBcInJcIik7XG4rfVxuK1xuIC8qIElmIGBpb2N0bHMnIG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgKzEwLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4gXG4gI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCBcdTAwM2NcdTAwM2MgKG5yKSlcbisjZGVmaW5lIEFMSUdOKHgsIGEpICAgICAgICAgICAgICAgICAgICgoKHgpICsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4rXG4gI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KVxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXG5AQCAtOTcsNiArOTksMTAgQEAgaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7XG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxuIFx0XHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4rXHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiArMTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTtcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XG4gaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpO1xuIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTtcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7XG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcbiB7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwMjoxODozMS45MTE2NDI5NjZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTQ1MTUyODE0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUHJvcG9zZWQgUGF0Y2gncyBGdXp6aW5nIFdvcnRoaW5lc3MqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlIGhhdmUgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgbmV3IHRlc3RzIHJlbGF0ZWQgdG8gYGtodWdlcGFnZWRgIGFuZCBgbVRIUGAsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGRpcmVjdG9yeS4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBhc3Nlc3MgaWYgdGhlc2UgY2hhbmdlcyBuZWNlc3NpdGF0ZSBmdXp6aW5nLiBUaGUga2V5IGhlcmUgaXMgd2hldGhlciB0aGUgcGF0Y2ggYWx0ZXJzIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGludHJvZHVjZSBuZXcgdnVsbmVyYWJpbGl0aWVzIGRldGVjdGFibGUgdGhyb3VnaCBmdXp6aW5nLlxuXG5NeSBwcmltYXJ5IHRhc2sgaXMgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoIG1vZGlmaWVzIGFueSBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBMb29raW5nIGF0IHRoZSBkaWZmLCBJIGNhbiBzZWUgdGhhdCBhbGwgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuICBUaGUgZmlsZXMgbGlzdGVkLCBpbmNsdWRpbmcgdGhlIGBNYWtlZmlsZWAsIEMgc291cmNlIGZpbGVzLCBhbmQgaGVhZGVyIGZpbGVzLCBhcmUgYWxsIGNsZWFybHkgcGFydCBvZiB0aGUgc2VsZi10ZXN0IHN1aXRlLlxuXG5UaGUgcHJvdmlkZWQgY3JpdGVyaWEgZm9yIGRldGVybWluaW5nIGBXb3J0aEZ1enppbmdgIGFyZTogbW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uLCBLY29uZmlnLCBjb21tZW50cywgZGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZywgY2hhbmdlcyB0byBub24tZnVuY3Rpb25hbCBjb25zdGFudHMsIHVucmVhY2hhYmxlIGNvZGUsIG9yIGNvZGUgcmVsYXRlZCB0byBzcGVjaWZpYyBoYXJkd2FyZSB0aGF0J3Mgbm90IGVtdWxhdGVkLiBJdCBhbHNvIGV4Y2x1ZGVzIGNlcnRhaW4gZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHBhdGNoIGlzbid0IGNoYW5naW5nIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzIHRoYXQgYXJlIHJlYWNoYWJsZS4gU2luY2UgdGhpcyBpcyBhbGwgY29uZmluZWQgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIGl0IGRvZXNuJ3QgbWVldCB0aGUgY3JpdGVyaWEgZm9yIGZ1enppbmcuIFRoZXNlIHNlbGYtdGVzdHMgcmVzaWRlIGluIHVzZXJzcGFjZSBhbmQgZG8gbm90IGludHJvZHVjZSBuZXcsIGZ1enplZCBsb2dpYyB0byB0aGUga2VybmVsIGl0c2VsZi5cblxuTm93LCBJIGRvdWJsZS1jaGVjay4gVGhlIGluc3RydWN0aW9ucyBjbGVhcmx5IHN0YXRlIHRoYXQgaWYgdGhlIHBhdGNoICpvbmx5KiBjb250YWlucyBjaGFuZ2VzIHRvIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLCBpdCBkb2Vzbid0IHdhcnJhbnQgZnV6emluZy4gVGhlIHBhdGNoIGlzIHNvbGVseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGFyZWEuIE15IGNvZGUgc2VhcmNoIGNvbmZpcm1zIHRoZXJlIGFyZSBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYy4gU2luY2UgdGhlc2UgdGVzdHMgYXJlIHVzZXJzcGFjZSB0ZXN0IHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMgdG8gYmUgZnV6emVkIGluIHRoZSBrZXJuZWwuIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHNob3VsZCBiZSBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuSW4gY29uY2x1c2lvbiwgSSdtIGNvbmZpZGVudCB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIHNlbGYtdGVzdCBzdWl0ZSBhbmQgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGtlcm5lbCBjb2RlIHBhdGhzIHRoYXQgcmVxdWlyZSBmdXp6aW5nLiBIZW5jZSwgSSB3aWxsIGlzc3VlIGEgY2FsbCB0byBgc2V0LXJlc3VsdHNgIHdpdGggYFdvcnRoRnV6emluZz1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MTUwLCJPdXRwdXRUb2tlbnMiOjc2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwMywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjQ3LjM2MzE3NTI4M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA5OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgYWRkcyBhbmQgbW9kaWZpZXMgdXNlci1zcGFjZSB0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGNvZGUgaXRzZWxmLCBzbyB0aGVyZSBpcyBub3RoaW5nIG5ldyB0byBmdXp6IGluIHRoZSBrZXJuZWwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwMjoxODo0Ny4zNjMyMTI2OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzkzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowjw27z[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-15 02:15:04 +0000 UTC FinishedAt: 2026-08-15 02:18:48 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzE1IDAyOjE4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDsmIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMTUgMDI6MTg6MjggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICYjNDM7MTA0LDkgQEAgVEVTVF9HRU5fRklMRVMgJiM0Mzs9IGd1YXJkLXJlZ2lvbnNcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gcm1hcFxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfcmFjZVxuIFxuIGlmbmVxICgkKEFSQ0gpLGFybTY0KVxuIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICYjNDM7MSwxMzcgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7LypcbiYjNDM7ICogU2VsZi1jaGVjayBmb3IgdGhlIHZtX3V0aWwgZm9saW8tb3JkZXIgZGV0ZWN0aW9uIGhlbHBlcnMsXG4mIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuXG4mIzQzOyAqXG4mIzQzOyAqIEZvciBldmVyeSBhbm9uIFRIUCBvcmRlciB0aGUga2VybmVsIHN1cHBvcnRzLCBmYXVsdCBtZW1vcnkgaW4gd2l0aCBvbmx5XG4mIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6XG4mIzQzOyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuJiM0MzsgKiBhcmUgd2hhdCB0aGUga2h1Z2VwYWdlZCBtVEhQIHRlc3RzIHVzZSB0byBkZXRlY3QgY29sbGFwc2UgcmVzdWx0cywgc29cbiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4mIzQzOyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO1xuJiM0MzsvKiBtbWFwIGFuIGFub24gVk1BIG9mIGV4YWN0bHkgQHNpemUgYnl0ZXMgYXQgYSBAc2l6ZS1hbGlnbmVkIGFkZHJlc3MuICovXG4mIzQzO3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IHNpemUgKiAyO1xuJiM0MztcdHVpbnRwdHJfdCBhbGlnbmVkO1xuJiM0MztcdGNoYXIgKnA7XG4mIzQzO1xuJiM0MztcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbiYjNDM7XHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGFsaWduZWQgPSBBTElHTigodWludHB0cl90KXAsIHNpemUpO1xuJiM0MztcdGlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcClcbiYjNDM7XHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbiYjNDM7XHRpZiAoYWxpZ25lZCAmIzQzOyBzaXplICE9ICh1aW50cHRyX3QpcCAmIzQzOyBsZW4pXG4mIzQzO1x0XHRtdW5tYXAoKGNoYXIgKilhbGlnbmVkICYjNDM7IHNpemUsXG4mIzQzO1x0XHQgICAgICAgKHVpbnRwdHJfdClwICYjNDM7IGxlbiAtIGFsaWduZWQgLSBzaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxuJiM0MzsgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0c2l6ZV90IHNpemUgPSBwc2l6ZSgpIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRib29sIG9rID0gdHJ1ZTtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0aWYgKG9yZGVyKVxuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xuJiM0MztcdCpwID0gMTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLFxuJiM0MztcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgbm90IGRldGVjdGVkIGFmdGVyIGZhdWx0XFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogQSBsb3dlciBvcmRlciBtdXN0IGJlIHJlamVjdGVkOiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdGlmIChvcmRlciBcdTAwMjZcdTAwMjYgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIG9yZGVyLCBvcmRlciAtIDEpO1xuJiM0MztcdFx0b2sgPSBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4mIzQzO1x0aWYgKG9yZGVyIFx1MDAyNlx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxuXCYjMzQ7LCBvcmRlcik7XG4mIzQzO1x0XHRvayA9IGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIHNpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChvaywgXCYjMzQ7b3JkZXIgJWQgY2xhc3NpZmllZFxcblwmIzM0Oywgb3JkZXIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgbWFpbih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG9yZGVycztcbiYjNDM7XHRpbnQgb3JkZXI7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcdGlmICghb3JkZXJzKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSAmIzQzOyAxKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Y2hlY2tfb3JkZXIoMCk7XG4mIzQzO1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGNoZWNrX29yZGVyKG9yZGVyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcbiYjNDM7XHRrc2Z0X2ZpbmlzaGVkKCk7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5pbmRleCBlMjY0MmVjYTBkMDJiLi5kZjQyNmY5MjE4ZTcxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXG5AQCAtNjUsNyAmIzQzOzY1LDYgQEAgZW51bSB7XG4gI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjRcbiAjZGVmaW5lIE5USU1FU1x0XHQxMFxuIFxuLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgJiM0MzsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xuIFxuICNpZm5kZWYgRk9MTF9XUklURVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi45OTJlZmVlMTdiNzE2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICYjNDM7MTgzLDE5IEBAIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkIC0tXG4mIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbiYjNDM7ICogcXVldWUgLS0gYW5kIHNldHRpbmdzIHB1c2hlcy9wb3BzIG11c3Qgbm90IHN0YXJ0IHNjYW4gcGFzc2VzIG5vYm9keVxuJiM0MzsgKiBhc2tlZCBmb3I7IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLiAgVGhlXG4mIzQzOyAqIG90aGVyIGtub2JzIGRvIG5vdCB3YWtlLCBidXQgd3JpdGluZyB0aGVtIHRoZSBzYW1lIHdheSBjb3N0cyBub3RoaW5nLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbiYjNDM7e1xuJiM0MztcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxuJiM0MztcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuJiM0Mzt9XG4mIzQzO1xuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIHtcbiBcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXHUwMDI2c2V0dGluZ3MtXHUwMDNla2h1Z2VwYWdlZDtcbkBAIC0xOTgsMTUgJiM0MzsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCYjMzQ7dXNlX3plcm9fcGFnZVwmIzM0Oywgc2V0dGluZ3MtXHUwMDNldXNlX3plcm9fcGFnZSk7XG4gXG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvZGVmcmFnXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1wmIzM0Oyxcbi1cdFx0XHRraHVnZXBhZ2VkLVx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX25vbmUpO1xuLVx0dGhwX3dyaXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCYjMzQ7LCBraHVnZXBhZ2VkLVx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhblwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VwYWdlc190b19zY2FuKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL2RlZnJhZ1wmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VkZWZyYWcpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuJiM0MztcdHRocF91cGRhdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZVwmIzM0Oywga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4mIzQzO1x0dGhwX3VwZGF0ZV9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbiYjNDM7XHR0aHBfdXBkYXRlX251bShcJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW5cJiMzNDssIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICYjNDM7MjQzLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxuIFx0fVxuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuJiM0MzsgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcbiYjNDM7ICogYSAmIzQzOzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4mIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuXG4mIzQzOyAqXG4mIzQzOyAqIEFueSBzdG9yZSB0byBzY2FuX3NsZWVwX21pbGxpc2VjcyB3YWtlcyB0aGUgZGFlbW9uLCBzbyB0aGUgYmFycmllciB3b3Jrc1xuJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuXG4mIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbiYjNDM7ICogcXVldWU7IGlmIHRoZSBkYWVtb24gaXMgYmV0d2VlbiBzY2FucyByYXRoZXIgdGhhbiBzbGVlcGluZywgaXQgc2V0c1xuJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kXG4mIzQzOyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuJiM0MzsgKiBzdG9yaW5nIHVudGlsIHRoZSBwYXNzIGxhbmRzOyBhIHN0b3JlIHdoaWxlIHRoZSBkYWVtb24gaXMgYXdha2UgY29zdHNcbiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy5cbiYjNDM7ICpcbiYjNDM7ICogT25lIHdha2UgY29tcGxldGVzIG9uZSBmdWxsIHBhc3Mgb25seSBpZiB0aGUgd2hvbGUgbW0gbGlzdCBmaXRzIGluXG4mIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZVxuJiM0MzsgKiBwYWdlc190b19zY2FuLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cbiYjNDM7XHRcdHRocF9yZWFkX251bShcJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCYjMzQ7KTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuJiM0MztcdGludCBwYXNzO1xuJiM0MztcbiYjNDM7XHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzJiM0MzsmIzQzOykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuJiM0MztcdFx0XHR0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSAmIzQzOyAxO1xuJiM0MztcbiYjNDM7XHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zXCYjMzQ7KSBcdTAwM2MgdGFyZ2V0KSB7XG4mIzQzO1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0XHR0aHBfd3JpdGVfbnVtKFwmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgc2xlZXBfbXMpO1xuJiM0MztcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbiYjNDM7XHRcdFx0ZWxhcHNlZF9tcyAmIzQzOz0gMTA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCB0aHBfc2V0dGluZ3MgKnRocF9jdXJyZW50X3NldHRpbmdzKHZvaWQpXG4ge1xuIFx0aWYgKCFzZXR0aW5nc19pbmRleCkge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5pbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxuQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7XG4gdm9pZCB0aHBfd3JpdGVfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCk7XG4gdW5zaWduZWQgbG9uZyB0aHBfcmVhZF9udW0oY29uc3QgY2hhciAqbmFtZSk7XG4gdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTtcbiYjNDM7dm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgJiM0Mzs4NCw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxuIFx0aHVnZXBhZ2Vfc2F2ZV9zZXR0aW5ncygvKiB0aHAgPSAqLyB0cnVlLCAvKiBodWdldGxiID0gKi8gZmFsc2UpO1xuIH1cbiBcbiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKTtcbiYjNDM7XG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICYjNDM7MzEsMTEgQEAgc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xuIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjtcbiBzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyO1xuJiM0MztzdGF0aWMgYm9vbCBjb2xsYXBzZV9vcmRlcl9naXZlbjtcbiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbiYjNDM7c3RhdGljIGludCBucl9jb2xsYXBzZV9vcmRlcnM7XG4mIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZCA9IC0xO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcJiMzNDsvcHJvYy9zZWxmL3NtYXBzXCYjMzQ7XG4gI2RlZmluZSBURVNUX0ZJTEUgXCYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlXCYjMzQ7XG5AQCAtMjE5LDYgJiM0MzsyMjQsNDEgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXG4gXHRyZXR1cm4gc3dhcDtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIFBhZ2UgdGhlIHJhbmdlIG91dCBhbmQgd2FpdCBmb3IgdGhlIHN3YXAgY291bnQgdG8gc2F5IHNvLlxuJiM0MzsgKlxuJiM0MzsgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuJiM0MzsgKiBzaHJpbmtfZm9saW9fbGlzdCgpIGxlYXZlcyBhIGZvbGlvIGFsb25lIHdoZW4gaXQgY2Fubm90IHJlY2xhaW0gaXQgcmlnaHRcbiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vblxuJiM0MzsgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbiYjNDM7ICogYW4gZWFybGllciBjb2xsYXBzZSBsZWZ0IE1BRFZfSFVHRVBBR0UgaXMgb25lIGtodWdlcGFnZWQgaXMgc3RpbGwgd29ya2luZ1xuJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFuc1xuJiM0MzsgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbiYjNDM7ICogaXMgYXNrZWQgZm9yLiAgS2VlcCB0aGUgcmFuZ2Ugb3V0IG9mIGl0cyByZWFjaDsgdGhlIGNvbGxhcHNlIHRoZSBjYWxsZXIgcnVuc1xuJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLlxuJiM0MzsgKlxuJiM0MzsgKiBGYWlsaW5nIHRvIGdldCB0aGUgcGFnZXMgb3V0IGlzIHRoZSBtYWNoaW5lJiMzOTtzIGFuc3dlciwgbm90IHRoZSBrZXJuZWwmIzM5O3MgLS1cbiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvXG4mIzQzOyAqIGNhbGxlcnMgc2tpcCByYXRoZXIgdGhhbiBmYWlsLiAgQW4gZXJyb3IgZnJvbSBtYWR2aXNlKCkgaXMgZGlmZmVyZW50LCBhbmRcbiYjNDM7ICogZW5kcyB0aGUgcnVuIGhlcmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBzd2Fwb3V0X3JhbmdlKHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9OT0hVR0VQQUdFKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIDQwOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbiYjNDM7XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHR1c2xlZXAoNTAgKiAxMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxNSw4ICYjNDM7NTU1LDggQEAgc3RhdGljIGJvb2wgaXNfYW5vbihzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHRcdFx0ICAgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxuIHtcbi1cdGludCByZXQ7XG4gXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0aW50IHJldCwgaTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0OyVzLi4uXCYjMzQ7LCBtc2cpO1xuIFxuQEAgLTUyOSw5ICYjNDM7NTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXG4gXHQvKlxuIFx0ICogUHJldmVudCBraHVnZXBhZ2VkIGludGVyZmVyZW5jZSBhbmQgdGVzdHMgdGhhdCBNQURWX0NPTExBUFNFXG4gXHQgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcbiYjNDM7XHQgKlxuJiM0MztcdCAqIFRoZSBwZXItb3JkZXIgY29udHJvbHMgaGF2ZSB0byBnbyB0b28sIG5vdCBqdXN0IHRoZSBnbG9iYWwgb25lOiBhXG4mIzQzO1x0ICogc291cmNlIG9yZGVyIGxlZnQgYXQgXCYjMzQ7YWx3YXlzXCYjMzQ7IC0tIHdoaWNoIC1zIGRvZXMgLS0gbGV0cyBraHVnZXBhZ2VkXG4mIzQzO1x0ICogY29sbGFwc2UgdGhlIHZlcnkgcmFuZ2UgdGhlIGNhc2UgaXMgd29ya2luZyBvbi4gIFNldCB0aGVtIHRvXG4mIzQzO1x0ICogXCYjMzQ7aW5oZXJpdFwmIzM0Oywgbm90IFwmIzM0O25ldmVyXCYjMzQ7LiAga2h1Z2VwYWdlZCBob25vdXJzIHRoZSBnbG9iYWwgbmV2ZXIgYW5kXG4mIzQzO1x0ICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tXG4mIzQzO1x0ICogdGhlc2UgdmVyeSBjb250cm9scywgYW5kIHN0aWxsIGZpbmRzIG9uZS5cbiBcdCAqL1xuIFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4gXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcbiYjNDM7XHRcdHNldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tpXS5lbmFibGVkID0gU0hNRU1fSU5IRVJJVDtcbiYjNDM7XHR9XG4gXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4gXG4gXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXG5AQCAtNTYxLDggJiM0Mzs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXG4gXHRcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBfb3JkZXI7XG4mIzQzO1x0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XG4mIzQzO1x0aW50IHRpbWVvdXQgPSA2ICYjNDM7IDIgKiAoYnl0ZXMgLyAoMTI4VUwgXHUwMDNjXHUwMDNjIDIwKSk7XG4gXHRpbnQgZnVsbF9zY2Fucztcbi1cdGludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovXG4gXG4gXHQvKiBTYW5pdHkgY2hlY2sgKi9cbiBcdGlmICghb3BzLVx1MDAzZWNoZWNrX2h1Z2UocCwgbGVuLCAwLCBocGFnZV9zaXplKSlcbkBAIC04MjUsMTIgJiM0Mzs4NzgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0IG9uZSBwYWdlLi4uXCYjMzQ7KTtcbi1cdGlmIChtYWR2aXNlKHAsIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9QQUdFT1VUKVwmIzM0Oyk7XG4tXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XG4mIzQzO1x0aWYgKHN3YXBvdXRfcmFuZ2UocCwgcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg1MSwxMiAmIzQzOzkwMiwxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbiBcbiBcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cJiMzNDssIG1heF9wdGVzX3N3YXAgJiM0MzsgMSwgaHBhZ2VfcG1kX25yKTtcbi1cdGlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxuLVx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdGlmIChjaGVja19zd2FwKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuJiM0MztcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkge1xuIFx0XHRzdWNjZXNzKFwmIzM0O09LXCYjMzQ7KTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1x0XHRza2lwKFwmIzM0O0NvdWxkIG5vdCBzd2FwIG91dFwmIzM0Oyk7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg2OCwxMiAmIzQzOzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCYjMzQ7LCBtYXhfcHRlc19zd2FwLFxuIFx0XHQgICAgICAgaHBhZ2VfcG1kX25yKTtcbi1cdFx0aWYgKG1hZHZpc2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpXCYjMzQ7KTtcbi1cdFx0aWYgKGNoZWNrX3N3YXAocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHtcbiYjNDM7XHRcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUpKSB7XG4gXHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XHRcdFx0c2tpcChcJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXRcJiMzNDspO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTQwLDYgJiM0Mzs5ODcsMTYgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfY29tcG91bmRfZXh0cmVtZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcbiBcdHZvaWQgKnA7XG4gXHRpbnQgaTtcbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xuJiM0MztcdCAqIGZhaWwgZm9yIGxhcmdlIFBNRCBzaXplcy4gIFNraXAgaWYgdGhlIFBNRCBzaXplIGlzIG92ZXIgMzJNLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuJiM0MztcdFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFwmIzM0OyVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4gXHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb25zdHJ1Y3QgUFRFIHBhZ2UgdGFibGUgZnVsbCBvZiBkaWZmZXJlbnQgUFRFLW1hcHBlZCBjb21wb3VuZCBwYWdlc1xcblwmIzM0Oyk7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkmIzQzOyYjNDM7KSB7XG5AQCAtMTEzMCw2ICYjNDM7MTE4Nyw5NyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIENvbnRlbnQgc3RheXMgaXNvbGF0ZWQgd2hpbGUgYSBjby1zaGFyZXIgd3JpdGVzIGNvbmN1cnJlbnRseS4gQSBzaGFyZWRcbiYjNDM7ICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGVcbiYjNDM7ICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXImIzM5O3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGVcbiYjNDM7ICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcbiYjNDM7ICogaXRzIG93biB3cml0ZXMuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBzaGFyZWQgPSA2NCAqIHBhZ2Vfc2l6ZTtcbiYjNDM7XHRjb25zdCBpbnQgc3RyaWRlID0gcGFnZV9zaXplIC8gc2l6ZW9mKGludCk7XG4mIzQzO1x0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XHQvKiB2b2xhdGlsZTogdGhlIGxvb3AgYmVsb3cgbXVzdCByZWFsbHkgc3RvcmUsIG9uIGV2ZXJ5IGl0ZXJhdGlvbiAqL1xuJiM0MztcdHZvbGF0aWxlIGludCAqaXA7XG4mIzQzO1x0cGlkX3QgY2hpbGQ7XG4mIzQzO1x0aW50IHN5bmNbMl07XG4mIzQzO1x0Y2hhciBnbyA9IDE7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdGlwID0gcDtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgc2hhcmVkKTtcdFx0Lyogc2hhcmVkIHByZWZpeCwgcHJlLWZvcmsgcGF0dGVybiAqL1xuJiM0MztcdGlmIChwaXBlKHN5bmMpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O3BpcGUoKVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uXCYjMzQ7KTtcbiYjNDM7XHRjaGlsZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIWNoaWxkKSB7XG4mIzQzO1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdGNsb3NlKHN5bmNbMF0pO1xuJiM0MztcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbiYjNDM7XHRcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovXG4mIzQzO1x0XHRpZiAod3JpdGUoc3luY1sxXSwgXHUwMDI2Z28sIDEpICE9IDEpXG4mIzQzO1x0XHRcdF9leGl0KEtTRlRfRkFJTCk7XG4mIzQzO1x0XHR1c2xlZXAoNTAwMCk7XG4mIzQzO1x0XHRjLVx1MDAzZWNvbGxhcHNlKFwmIzM0O0NvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgIHAsIDEsIG9wcywgdHJ1ZSk7XG4mIzQzO1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGRlYWQwMDAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0aWYgKGkgPT0gbilcbiYjNDM7XHRcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0XHRlbHNlXG4mIzQzO1x0XHRcdGZhaWwoXCYjMzQ7RmFpbDogY2hpbGQgY29udGVudFwmIzM0Oyk7XG4mIzQzO1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuJiM0MztcdFx0aWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTClcbiYjNDM7XHRcdFx0ZXhpdF9zdGF0dXMgPSBjb2xsYXBzZV9zdGF0dXM7XG4mIzQzO1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdF9leGl0KGV4aXRfc3RhdHVzKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGNsb3NlKHN5bmNbMV0pO1xuJiM0MztcdGlmIChyZWFkKHN5bmNbMF0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2NoaWxkIG5ldmVyIHJlYWNoZWQgdGhlIGNvbGxhcHNlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZS4gIEEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIGFsbCBvZiB0aGVtXG4mIzQzO1x0ICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS1cbiYjNDM7XHQgKiBhbmQgdGhlIGNoaWxkIHdvdWxkIGNvbGxhcHNlIHBhZ2VzIGFscmVhZHkgZXhjbHVzaXZlIHRvIGl0LlxuJiM0MztcdCAqL1xuJiM0MztcdGkgPSAwO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGlmIChpIFx1MDAzYyBuKVxuJiM0MztcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgJiM0MzsgMHhiZWVmMDAwMDtcbiYjNDM7XHRcdGkmIzQzOyYjNDM7O1xuJiM0MztcdFx0dXNsZWVwKDEwICogMTAwMCk7XG4mIzQzO1x0fSB3aGlsZSAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykgPT0gMCk7XG4mIzQzO1xuJiM0MztcdC8qIFdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoLCBzbyB0aGUgY2hlY2sgYmVsb3cgaXMgZXhhY3QuICovXG4mIzQzO1x0Zm9yICg7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7XG4mIzQzO1x0LyogQSBjaGlsZCB0aGF0IGRpZWQgcmVhZGluZyB0aGUgcmFjaW5nIHBhZ2VzIGlzIGEgZmFpbHVyZSwgbm90IGEgemVyby4gKi9cbiYjNDM7XHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbiYjNDM7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cJiMzNDspO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgJiM0MzsgMHhiZWVmMDAwMClcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0aWYgKGkgPT0gbilcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnRcJiMzNDspO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdC8qIFNhbWUgYWdhaW46IG91ciBvd24gY2hlY2sgbXVzdCBub3QgYnVyeSB0aGUgY2hpbGQmIzM5O3MgdmVyZGljdC4gKi9cbiYjNDM7XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuJiM0MztcdFx0ZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwmIzM0OyVzXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIHZvaWQgbWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuIFx0XHRcdFx0XHQgICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuIHtcbkBAIC0xMTc1LDYgJiM0MzsxMzIzLDIxOSBAQCBzdGF0aWMgdm9pZCBtYWR2aXNlX3JldHJhY3RlZF9wYWdlX3RhYmxlcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbiBcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuIH1cbiBcbiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqL1xuJiM0MzsjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgZm9yIHRoZSBtdGhwX2todWdlcGFnZWQgY29udGV4dC4gIFdoYXRcbiYjNDM7ICogdGhleSBhZGQgb3ZlciB0aGUgZ2VuZXJpYyBjYXNlcyBydW4gdW5kZXIgdGhhdCBjb250ZXh0IGlzIHBlci13aW5kb3dcbiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWRcbiYjNDM7ICogbm90LiAgY2hlY2tfaHVnZSgpIGFuc3dlcnMgaG93IG1hbnkgZm9saW9zIG9mIHRoZSBvcmRlciB0aGUgcmFuZ2UgaG9sZHMsXG4mIzQzOyAqIHdoaWNoIGNhbm5vdCB0ZWxsIG9uZSB3aW5kb3cgZnJvbSBhbm90aGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgcmVnaW9uIGlzIGZhdWx0ZWQgYmVmb3JlIE1BRFZfSFVHRVBBR0UsIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzIG9ubHlcbiYjNDM7ICogZW5hYmxlZCBmb3IgbWFkdmlzZSwgc28gdGhlIHNvdXJjZXMgYXJlIGFsd2F5cyBvcmRlciAwIGFuZCB0aGUgY29sbGFwc2VcbiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHNpemVfdCBtdGhwX3dpbmRvd19zaXplKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXG4mIzQzO1x0ICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmVcbiYjNDM7XHQgKiBvcmRlciAwIHdoYXRldmVyIC1zIGFza2VkIHRoZSBmYXVsdCBwYXRoIGZvci4gIFRoYXQgbWF0dGVycyBmb3IgdGhlXG4mIzQzO1x0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXG4mIzQzO1x0ICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLlxuJiM0MztcdCAqIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMgZW5hYmxlcyB0aGUgc291cmNlIG9yZGVyIGl0IHdhbnRzIG9uXG4mIzQzO1x0ICogdG9wIG9mIHRoaXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuJiM0MztcdHNldHRpbmdzLmh1Z2VwYWdlc1tjb2xsYXBzZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgbGVuLCBjb2xsYXBzZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgJiM0MzsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cbiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcbiYjNDM7e1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0Y2hhciAqYWRkciA9IHA7XG4mIzQzO1xuJiM0MztcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgJiM0Mzs9IHdpbmRvdywgbGVuIC09IHdpbmRvdykge1xuJiM0MztcdFx0aWYgKHdpbmRvd19jb2xsYXBzZWQoYWRkciwgd2luZG93KSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0LyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cbiYjNDM7XHRyZXR1cm4ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMzApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbiYjNDM7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O1VuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbiYjNDM7XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCAmIzQzOyB3aW5kb3csIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IDIgKiB3aW5kb3csXG4mIzQzO1x0XHRcdFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuJiM0MztcdG9wcy1cdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbiYjNDM7XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4mIzQzO1x0XHRcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHR2b2lkICpwO1xuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgcGFnZV9zaXplKTtcbiYjNDM7XHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4mIzQzO1x0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7VGltZW91dFwmIzM0Oyk7XG4mIzQzO1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuJiM0MztcdFx0c3VjY2VzcyhcJiMzNDtPS1wmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZmFpbChcJiMzNDtGYWlsXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4mIzQzO1x0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuJiM0MztcdHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gMDtcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiYjNDM7XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4mIzQzO1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4mIzQzO1x0XHRmYWlsKFwmIzM0O1RpbWVvdXRcJiMzNDspO1xuJiM0MztcdGVsc2UgaWYgKHdpbmRvd19jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcbiYjNDM7XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuJiM0MztcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc291cmNlX29yZGVyID0gYW5vbl9vcmRlciA/IGFub25fb3JkZXIgOiBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHZvaWQgKnA7XG4mIzQzO1xuJiM0MztcdC8qIFNvdXJjZXMgbXVzdCBiZSBhIHN1cHBvcnRlZCBtVEhQIG9yZGVyIHN0cmljdGx5IGJlbG93IHRoZSB0YXJnZXQuICovXG4mIzQzO1x0aWYgKHNvdXJjZV9vcmRlciBcdTAwM2U9IGNvbGxhcHNlX29yZGVyIHx8XG4mIzQzO1x0ICAgICEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2Mgc291cmNlX29yZGVyKSkpIHtcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHRfc2tpcChcJiMzNDslczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4mIzQzO1xuJiM0MztcdC8qIEZhdWx0IHRoZSB3aG9sZSByZWdpb24gYXMgb3JkZXItQHNvdXJjZV9vcmRlciBmb2xpb3MuICovXG4mIzQzO1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcbiYjNDM7XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuJiM0MztcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsXG4mIzQzO1x0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxuJiM0MztcdCAqIHdoaWNoIGlzIHRoZSBtYWNoaW5lJiMzOTtzIGFuc3dlciByYXRoZXIgdGhhbiBhIHJlYXNvbiB0byBlbmQgdGhlIHJ1bi5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgaHBhZ2VfcG1kX3NpemUsIHNvdXJjZV9vcmRlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cJiMzNDssIHNvdXJjZV9vcmRlcik7XG4mIzQzO1x0XHRza2lwKFwmIzM0O1NraXBcJiMzNDspO1xuJiM0MztcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4mIzQzO1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCYjMzQ7JXNcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuJiM0MztcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O0NvbGxhcHNlIHJlZ2lvbiBiYWNrZWQgYnkgb3JkZXItJWQgc291cmNlcy4uLlwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuJiM0MztcdGlmICgha2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcygpKVxuJiM0MztcdFx0ZmFpbChcJiMzNDtUaW1lb3V0XCYjMzQ7KTtcbiYjNDM7XHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbiYjNDM7XHRcdHN1Y2Nlc3MoXCYjMzQ7T0tcJiMzNDspO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdGZhaWwoXCYjMzQ7RmFpbFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4mIzQzO1x0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcJiMzNDslc1xcblwmIzM0OywgX19mdW5jX18pO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4ge1xuIFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O1xcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdIFx1MDAzY3Rlc3QgdHlwZVx1MDAzZSBbZGlyXVxcblxcblwmIzM0Oyk7XG5AQCAtMTE5MiwxMSAmIzQzOzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LXM6IG1USFAgc2l6ZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxuXCYjMzQ7KTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCYjMzQ7KTtcbiBcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIERlZmF1bHRzIHRvIGV2ZXJ5IHN1cHBvcnRlZCBvcmRlciBiZWxvdyB0aGUgUE1ELlxcblwmIzM0Oyk7XG4mIzQzO1x0ZnByaW50ZihzdGRlcnIsXHRcJiMzNDtcXHRcXHQgICAgV2l0aCAtcywgLXMgbmFtZXMgdGhlIG1USFAgc291cmNlIG9yZGVyIGZvciB0aGVcXG5cJiMzNDspO1xuJiM0MztcdGZwcmludGYoc3RkZXJyLFx0XCYjMzQ7XFx0XFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxuXCYjMzQ7KTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuJiM0MztcdGJvb2wgbXRocF9jb250ZXh0X2ltcGxpZWQgPSBmYWxzZTtcbiBcdGludCBvcHQ7XG4gXHRjaGFyICpidWY7XG4gXHRjb25zdCBjaGFyICp0b2tlbjtcbkBAIC0xMjA4LDYgJiM0MzsxNTczLDcgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O2MmIzM5OzpcbiBcdFx0XHRjb2xsYXBzZV9vcmRlciA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0Y29sbGFwc2Vfb3JkZXJfZ2l2ZW4gPSB0cnVlO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7aCYjMzk7OlxuIFx0XHRkZWZhdWx0OlxuQEAgLTEyMTUsMTIgJiM0MzsxNTgxLDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdH1cbiBcdH1cbiBcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJvdGggb3JkZXJzIGVuZCB1cCBhcyBhcnJheSBpbmRpY2VzIGFuZCBzaGlmdCBjb3VudHMsIHNvIG5laXRoZXJcbiYjNDM7XHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoYW5vbl9vcmRlciBcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFx1MDAzZSBocGFnZV9wbWRfb3JkZXIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcikpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7LWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1xuIFx0YXJndiAmIzQzOz0gb3B0aW5kO1xuIFx0YXJnYyAtPSBvcHRpbmQ7XG4gXG4gXHRpZiAoYXJnYyA9PSAwKSB7XG4tXHRcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXG4mIzQzO1x0XHQvKiBFdmVyeXRoaW5nIHRoYXQgbmVlZHMgbm8gYXJndW1lbnQgb2YgaXRzIG93bjogYW5vbiwgZXZlcnkgY29udGV4dCAqL1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyMzEsMTMgJiM0MzsxNjEwLDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXG4gXHRpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7YWxsXCYjMzQ7KSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4mIzQzO1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIFwmIzM0O2FsbFwmIzM0OyBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbiYjNDM7XHRcdCAqIGNhc2VzOiBzdGVwIGl0IGFzaWRlIGZvciB0aGUgb3RoZXIgbWVtX3R5cGVzIHJhdGhlciB0aGFuXG4mIzQzO1x0XHQgKiByZWZ1c2luZyB0aGUgd2hvbGUgcnVuLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRtdGhwX2NvbnRleHRfaW1wbGllZCA9IHRydWU7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O2todWdlcGFnZWRcJiMzNDspKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCYjMzQ7bXRocF9raHVnZXBhZ2VkXCYjMzQ7KSkge1xuIFx0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuLVx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKVxuLVx0XHRcdHVzYWdlKCk7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAodG9rZW4sIFwmIzM0O21hZHZpc2VcJiMzNDspKSB7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbiBcdH0gZWxzZSB7XG5AQCAtMTI1MywyMCAmIzQzOzE2MzgsMjAgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICBcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7YW5vblwmIzM0OykpIHtcbiBcdFx0YW5vbl9vcHMgPSBcdTAwMjZfX2Fub25fb3BzO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7ZmlsZVwmIzM0OykpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXCYjMzQ7c2htZW1cJiMzNDspKSB7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4mIzQzO1x0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQgXHUwMDI2XHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcbiBcdFx0XHR1c2FnZSgpO1xuJiM0MztcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjg4LDkgJiM0MzsxNjczLDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2Uge1xuIFx0c3RydWN0IG1lbV9vcHMgKm9wcztcbiBcdGNvbnN0IGNoYXIgKmRlc2M7XG4gXHR0ZXN0X2ZuIGZuO1xuJiM0MztcdGludCBvcmRlcjtcdFx0LyogbVRIUCBjb250ZXh0czogdGhlIGNvbGxhcHNlIG9yZGVyICovXG4gfTtcbiBcbi0jZGVmaW5lIE1BWF9URVNUX0NBU0VTIDY0XG4mIzQzOyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMDMsNiAmIzQzOzE2ODksNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7XG4gXHRcdFx0Lm9wc1x0PSBvLFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5kZXNjXHQ9ICN0LFx0XHRcdFx0XHRcXFxuIFx0XHRcdC5mblx0PSB0LFx0XHRcdFx0XHRcXFxuJiM0MztcdFx0XHQub3JkZXJcdD0gY29sbGFwc2Vfb3JkZXIsXHRcdFx0XFxcbiBcdFx0fTtcdFx0XHRcdFx0XHRcdFxcXG4gXHR9XHRcdFx0XHRcdFx0XHRcdFxcXG4gXHR9IHdoaWxlICgwKVxuQEAgLTEzNDMsOCAmIzQzOzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuJiM0MztcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuJiM0MztcbiYjNDM7XHRcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xuJiM0MztcdFx0XHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cbiYjNDM7XHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuJiM0MztcdFx0XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb2xsYXBzZV9vcmRlcik7XG4mIzQzO1x0XHRcdGlmIChjb2xsYXBzZV9vcmRlciBcdTAwM2M9IGFub25fb3JkZXIpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7LWMgJWQgbmVlZHMgYSBzb3VyY2Ugb3JkZXIgYmVsb3cgaXQsIC1zIHNheXMgJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBjb2xsYXBzZV9vcmRlcjtcbiYjNDM7XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdC8qXG4mIzQzO1x0XHRcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xuJiM0MztcdFx0XHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcbiYjNDM7XHRcdFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XG4mIzQzO1x0XHRcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGludCBmaXJzdCA9IGFub25fb3JkZXIgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0XHRcdGlmIChmaXJzdCBcdTAwM2MgTUlOX01USFBfT1JERVIpXG4mIzQzO1x0XHRcdFx0Zmlyc3QgPSBNSU5fTVRIUF9PUkRFUjtcbiYjNDM7XHRcdFx0Zm9yIChpbnQgaSA9IGZpcnN0OyBpIFx1MDAzYyBocGFnZV9wbWRfb3JkZXI7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0aWYgKG9yZGVycyBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpXG4mIzQzO1x0XHRcdFx0XHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzJiM0MzsmIzQzO10gPSBpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHRcdGlmICghbnJfY29sbGFwc2Vfb3JkZXJzKVxuJiM0MztcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O21USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHtcbiYjNDM7XHRcdHBhZ2VtYXBfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL3NlbGYvcGFnZW1hcFwmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKHBhZ2VtYXBfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OywgT19SRE9OTFkpO1xuJiM0MztcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXCYjMzQ7KTtcbiYjNDM7XHR9XG4mIzQzO1xuIFx0c2V0YnVmKHN0ZG91dCwgTlVMTCk7XG4gXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgcGFnZSBjYWNoZSBjYXBzIGZvbGlvIG9yZGVyIGF0IE1BWF9QQUdFQ0FDSEVfT1JERVIsIHdoaWNoIGlzXG4mIzQzO1x0ICogYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4gIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGVcbiYjNDM7XHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XG4mIzQzO1x0ICogZGVzaWduIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIHRlc3QuICBUaGUgY2FwIGlzIG5vdCBzaG1lbS1zcGVjaWZpYzpcbiYjNDM7XHQgKiBpdCBydWxlcyBvdXQgcmVndWxhciBmaWxlcyB0b28sIGFuZCB0aGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWRcbiYjNDM7XHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuJiM0MztcdCAqIHRoZW0gcmVhZGFibGUgaGVyZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuJiM0MztcdFx0aWYgKHNobWVtX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cJiMzNDspO1xuJiM0MztcdFx0XHRzaG1lbV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHJlYWRfb25seV9maWxlX29wcykge1xuJiM0MztcdFx0XHRrc2Z0X3ByaW50X21zZyhcJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJlYWRfb25seV9maWxlX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4mIzQzO1x0XHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbiYjNDM7XHRcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7Tm90aGluZyBsZWZ0IHRvIGNvbGxhcHNlIGludG9cXG5cJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhwYWdlX3BtZF9uciAtIDE7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc3dhcCA9IGhwYWdlX3BtZF9uciAvIDg7XG4gXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcbkBAIC0xMzYyLDcgJiM0MzsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIG5yX2NvbGxhcHNlX29yZGVyczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGNvbGxhcHNlX29yZGVyID0gY29sbGFwc2Vfb3JkZXJzW2ldO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiYjNDM7XHRcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX210aHAsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdH1cbiYjNDM7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcbkBAIC0xMzcwLDExICYjNDM7MTgzMiw4IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xuIFxuIFx0VEVTVChjb2xsYXBzZV9lbXB0eSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXG4tXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVxuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQyOSw2ICYjNDM7MTg4OCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbiYjNDM7XHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuJiM0MztcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4mIzQzO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ0NCw3ICYjNDM7MTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXG5cJiMzNDssIHQtXHUwMDNlZGVzYywgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuJiM0MztcdFx0XHRjb2xsYXBzZV9vcmRlciA9IHQtXHUwMDNlb3JkZXI7XG4mIzQzO1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1xcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7XFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwmIzM0OywgdC1cdTAwM2VkZXNjLFxuJiM0MztcdFx0XHRcdCAgICAgICB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NjgyYmJhZTBhOGY4XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCAmIzQzOzEsNTg5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxuJiM0MzsgKlxuJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuJiM0MzsgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXG4mIzQzOyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XG4mIzQzOyAqXG4mIzQzOyAqICAgc3RlcHBlZFx0a2h1Z2VwYWdlZCwgb25lIGZ1bGwgcGFzcyBhdCBhIHRpbWUgdGhyb3VnaFxuJiM0MzsgKlx0XHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xuJiM0MzsgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbiYjNDM7ICogICBtYWR2aXNlXHRNQURWX0NPTExBUFNFIGFuZCBNQURWX0RPTlRORUVEIGluIGEgbG9vcC5cbiYjNDM7ICpcbiYjNDM7ICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmVcbiYjNDM7ICogZnVsbHkgcG9wdWxhdGVkLCBhbmQgSFBBR0VfUE1EX05SIC0gMSwgd2hlcmUgYSB3aW5kb3cgZnVsbCBvZiBob2xlc1xuJiM0MzsgKiBjb2xsYXBzZXMgdG9vLiAgQSBob2xlIGlzIHplcm8tZmlsbGVkIGludG8gdGhlIG5ldyBmb2xpbyByYXRoZXIgdGhhblxuJiM0MzsgKiBjb3BpZWQsIGFuZCB0aGUgcmFjaW5nIE1BRFZfRE9OVE5FRUQga2VlcHMgbW92aW5nIHdoaWNoIHNsb3RzIGFyZSBob2xlcy5cbiYjNDM7ICpcbiYjNDM7ICogRXZlcnkgY29tYmluYXRpb24gYWxzbyBydW5zIHVuZGVyIG1lbW9yeSBwcmVzc3VyZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbiYjNDM7ICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3VyIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IGxlZnQgb3V0XG4mIzQzOyAqIHdpdGggYSBub3RlIHdoZW4gdGhlIGhvc3QgaGFzIG5vIHN3YXApIGFuZCBhIGNvbXBhY3RfbWVtb3J5IHRyaWdnZXJcbiYjNDM7ICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UmIzM5O3MgZnJlZXplXG4mIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS5cbiYjNDM7ICpcbiYjNDM7ICogQ29ycmVjdG5lc3Mgc2lnbmFsczogZXZlcnkgcmFjaW5nIHBhZ2UgbXVzdCByZWFkIGFzIGl0cyBwYXR0ZXJuIG9yXG4mIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9ya1xuJiM0MzsgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4mIzQzOyAqIHdoYXRldmVyIERFQlVHX1ZNIC8gcGFnZV90YWJsZV9jaGVjayAvIEtBU0FOIC8gbG9ja2RlcCByZXBvcnQgaW5cbiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgX0dOVV9TT1VSQ0VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRpby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3RpbWUuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4mIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZVxuJiM0MzsgKiBtcmVtYXAgdGhyZWFkLiBNb3JlIGFyZWFzIG1lYW5zIG1vcmUgaW5kZXBlbmRlbnQgcmVnaW9ucyBjb2xsYXBzaW5nXG4mIzQzOyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4mIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZVxuJiM0MzsgKiBkZWZhdWx0IHBsYXlncm91bmQgbXVsdGktZ2lnYWJ5dGUgLS0gcGFzcyAtYSB0byBzaHJpbmsgaXQuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTXHQzXG4mIzQzO3N0YXRpYyBpbnQgbnJfc2hhcmVkX2FyZWFzO1xuJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzO1xuJiM0MztcbiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbiYjNDM7c3RhdGljIGNoYXIgKnJlZ2lvbjtcdFx0LyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqL1xuJiM0MztzdGF0aWMgY2hhciAqbXJlbWFwX2FyZWE7XHQvKiByZWdpb24gJiM0MzsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4mIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDtcdC8qIHdlbGwgYWJvdmUgdGhlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFnZW91dF9hcmVhO1x0LyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xuJiM0MztzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcbiYjNDM7c3RhdGljIGludCBndXBfZmQgPSAtMTtcbiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xuJiM0MztzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJiMzOTtzIHBhdHRlcm4gKi9cbiYjNDM7c3RhdGljIGJvb2wgcGFnZV9pc19jb3JydXB0KHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGludCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAqdmFsIFx1MDAyNlx1MDAyNiAqdmFsICE9IHBhdHRlcm4ocGFnZV9pZHgpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBjaGVja19wYWdlKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgdmFsO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZV9pc19jb3JydXB0KHBhZ2VfaWR4LCBcdTAwMjZ2YWwpKSB7XG4mIzQzO1x0XHRjb3JydXB0ZWQgPSAxO1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoYXJlZF9wYWdlcyh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQmIzM5O3MgYXJlYSAqL1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHdhbnQgXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAocmFuZF9yKFx1MDAyNnNlZWQpIFx1MDAyNiAxKVxuJiM0MztcdFx0XHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cbiYjNDM7XHRcdFx0XHRwYXR0ZXJuKHBhZ2VfaWR4KTtcbiYjNDM7XHRcdGVsc2VcbiYjNDM7XHRcdFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqZG9udG5lZWRfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgXHUwMDNjXHUwMDNjIChyYW5kX3IoXHUwMDI2c2VlZCkgJSA2KTtcdC8qIDEuLjMyIHBhZ2VzICovXG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIE9uY2UgaW4gYSB3aGlsZSB6YXAgYSB3aG9sZSBQTUQtYWxpZ25lZCBhcmVhOiBvbmx5IGEgemFwXG4mIzQzO1x0XHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxuJiM0MztcdFx0ICogKENPTkZJR19QVF9SRUNMQUlNKSwgd2hpY2ggY2FuIGZyZWUgdGhlIHRhYmxlIHVuZGVyIGFcbiYjNDM7XHRcdCAqIGNvbGxhcHNlIHRoYXQgaXMgbWlkd2F5IHRocm91Z2ggaXQuICBTdWItdGFibGUgemFwcyBuZXZlclxuJiM0MztcdFx0ICogcmVhY2ggdGhhdCBwYXRoLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIShyYW5kX3IoXHUwMDI2c2VlZCkgJSA2NCkpIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuJiM0MztcdFx0XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0XHRcdG1hZHZpc2UocmVnaW9uICYjNDM7IGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbiYjNDM7XHRcdFx0XHRNQURWX0RPTlRORUVEKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnBpbm5lcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuJiM0MztcbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgbnIgPSByb29tX2Zyb20ocGFnZV9pZHgsIDE2KTtcbiYjNDM7XG4mIzQzO1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuJiM0MztcdFx0Z3VwLnNpemUgPSBuciAqIHBhZ2Vfc2l6ZTtcbiYjNDM7XHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xuJiM0MztcdFx0Z3VwLmd1cF9mbGFncyA9IDE7XHQvKiBGT0xMX1dSSVRFICovXG4mIzQzO1x0XHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXG4mIzQzO1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDApO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKCFzdG9wKSB7XG4mIzQzO1x0XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHBpZCA9PSAwKSB7XG4mIzQzO1x0XHRcdHVuc2lnbmVkIGludCB2YWw7XG4mIzQzO1x0XHRcdGludCBiYWQgPSAwO1xuJiM0MztcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkXG4mIzQzO1x0XHRcdCAqIHN0ZG91dCYjMzk7cyBsb2NrIHdoZW4gd2UgZm9ya2VkLCBhbmQgcHJpbnRpbmcgdW5kZXIgYW5cbiYjNDM7XHRcdFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcbiYjNDM7XHRcdFx0ICogZXhpdCBzdGF0dXMgc2F5cy5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyAxNjsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXHUwMDI2c2VlZCksIFx1MDAyNnZhbCk7XG4mIzQzO1x0XHRcdF9leGl0KGJhZCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAocGlkIFx1MDAzZSAwKSB7XG4mIzQzO1x0XHRcdGludCB3c3RhdHVzO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKHdhaXRwaWQocGlkLCBcdTAwMjZ3c3RhdHVzLCAwKSBcdTAwM2MgMClcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7d2FpdHBpZCgpXCYjMzQ7KTtcbiYjNDM7XHRcdFx0LyogQSBjaGlsZCBraWxsZWQgb24gdGhlIHJlYWQgY291bnRzIHRvbywgbm90IGp1c3QgaXRzIGV4aXQgY29kZS4gKi9cbiYjNDM7XHRcdFx0aWYgKCFXSUZFWElURUQod3N0YXR1cykgfHwgV0VYSVRTVEFUVVMod3N0YXR1cykpXG4mIzQzO1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIE5VTEw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0dm9pZCAqcDtcbiYjNDM7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYXdheVwmIzM0Oyk7XG4mIzQzO1x0XHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgODsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdG1yZW1hcF9zY3JhdGNoWyhyYW5kX3IoXHUwMDI2c2VlZCkgJVxuJiM0MztcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4mIzQzO1x0XHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XG4mIzQzO1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bXJlbWFwKCkgYmFja1wmIzM0Oyk7XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxuJiM0MzsgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcbiYjNDM7ICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdCoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghc3RvcCkge1xuJiM0MztcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yIFx1MDAyNlx1MDAyNiAhc3RvcDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0dW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzO1xuJiM0MztcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAodmFsICE9IHBhdHRlcm4oaSkpIHtcbiYjNDM7XHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuJiM0MztcdFx0XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZylcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuJiM0MztcdGludCBmZCA9IG9wZW4oXCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5XCYjMzQ7LCBPX1dST05MWSk7XG4mIzQzO1xuJiM0MztcdGlmIChmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0a3NmdF9wcmludF9tc2coXCYjMzQ7Tm8gY29tcGFjdF9tZW1vcnk7IGNvbXBhY3RvciBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHR3aGlsZSAoIXN0b3ApIHtcbiYjNDM7XHRcdGlmICh3cml0ZShmZCwgXCYjMzQ7MVwmIzM0OywgMSkgXHUwMDNjIDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0dXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcihcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsyNTZdO1xuJiM0MztcdGludCBsaW5lcyA9IDA7XG4mIzQzO1x0RklMRSAqZnAgPSBmb3BlbihcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKVxuJiM0MztcdFx0bGluZXMmIzQzOyYjNDM7O1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGxpbmVzIFx1MDAzZSAxO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBub3dfbXModm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aW1ldmFsIHR2O1xuJiM0MztcbiYjNDM7XHRnZXR0aW1lb2ZkYXkoXHUwMDI2dHYsIE5VTEwpO1xuJiM0MztcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgJiM0MzsgdHYudHZfdXNlYyAvIDEwMDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRmcHJpbnRmKHN0ZGVycixcbiYjNDM7XHRcdFwmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0V2l0aG91dCAtbSwgZXZlcnkgbW9kZSBydW5zIGluIHR1cm4uXFxuXCYjMzQ7XG4mIzQzO1x0XHRcJiMzNDtcXHQtZDogc2Vjb25kcyBwZXIgbW9kZSAoZGVmYXVsdCA1KVxcblwmIzM0O1xuJiM0MztcdFx0XCYjMzQ7XFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXG5cJiMzNDspO1xuJiM0MztcdGV4aXQoMSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiYjNDM7e1xuJiM0MztcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4mIzQzO1x0XHRcJiMzNDtmYXVsdGVyXCYjMzQ7LCBcJiMzNDtmYXVsdGVyMlwmIzM0OywgXCYjMzQ7ZG9udG5lZWRcJiMzNDssIFwmIzM0O3Bpbm5lclwmIzM0OywgXCYjMzQ7Zm9ya2VyXCYjMzQ7LFxuJiM0MztcdFx0XCYjMzQ7bXJlbWFwcGVyXCYjMzQ7LCBcJiMzNDtwYWdlb3V0XCYjMzQ7LCBcJiMzNDtjb21wYWN0b3JcJiMzNDssXG4mIzQzO1x0fTtcbiYjNDM7XHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcbiYjNDM7XHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbiYjNDM7XHRcdG1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLFxuJiM0MztcdH07XG4mIzQzO1x0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxuJiM0MztcdCAgICAgICBUX01SRU1BUFBFUiwgVF9QQUdFT1VULCBUX0NPTVBBQ1RPUiB9O1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGFnZW91dF9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfUEFHRU9VVDtcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfQ09NUEFDVE9SO1xuJiM0MztcdGNvbnN0IGludCBucl90aHJlYWRzID0gQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpO1xuJiM0MztcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCYjMzQ7c3RlcHBlZFwmIzM0OywgXCYjMzQ7ZnJlZVwmIzM0OywgXCYjMzQ7bWFkdmlzZVwmIzM0OyB9O1xuJiM0MztcdHN0YXRpYyBjb25zdCBib29sIG9jY3VwYW5jaWVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBzdHJpY3QsIGhvbGVzICovXG4mIzQzO1x0c3RhdGljIGNvbnN0IGJvb2wgcHJlc3N1cmVzW10gPSB7IGZhbHNlLCB0cnVlIH07XHQvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi9cbiYjNDM7XHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcHJlc3N1cmVzID0gQVJSQVlfU0laRShwcmVzc3VyZXMpO1xuJiM0MztcdGNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdO1xuJiM0MztcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4mIzQzO1x0aW50IG5yX21vZGVzID0gQVJSQVlfU0laRShhbGxfbW9kZXMpO1xuJiM0MztcdGNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgZW5kX21zO1xuJiM0MztcdGludCBkdXJhdGlvbl9zID0gNTtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGJhc2VfbWFzaztcbiYjNDM7XHRpbnQgbnJfYXJlYXNfYXJnID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIGk7XG4mIzQzO1x0aW50IHN0ZXBzID0gMDtcbiYjNDM7XHRpbnQgb3B0O1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcJiMzNDthOmQ6bTp0OmhcJiMzNDspKSAhPSAtMSkge1xuJiM0MztcdFx0c3dpdGNoIChvcHQpIHtcbiYjNDM7XHRcdGNhc2UgJiMzOTthJiMzOTs6XG4mIzQzO1x0XHRcdG5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHRjYXNlICYjMzk7ZCYjMzk7OlxuJiM0MztcdFx0XHRkdXJhdGlvbl9zID0gYXRvaShvcHRhcmcpO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTttJiMzOTs6XG4mIzQzO1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGNhc2UgJiMzOTt0JiMzOTs6XG4mIzQzO1x0XHRcdC8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovXG4mIzQzO1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdGRlZmF1bHQ6XG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAobW9kZV9hcmcpIHtcbiYjNDM7XHRcdGlmIChzdHJjbXAobW9kZV9hcmcsIFwmIzM0O3N0ZXBwZWRcJiMzNDspIFx1MDAyNlx1MDAyNiBzdHJjbXAobW9kZV9hcmcsIFwmIzM0O2ZyZWVcJiMzNDspIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIHN0cmNtcChtb2RlX2FyZywgXCYjMzQ7bWFkdmlzZVwmIzM0OykpXG4mIzQzO1x0XHRcdHVzYWdlKCk7XG4mIzQzO1x0XHRvbmVfbW9kZVswXSA9IG1vZGVfYXJnO1xuJiM0MztcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbiYjNDM7XHRcdG5yX21vZGVzID0gMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Z3VwX2ZkID0gb3BlbihcJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwmIzM0OywgT19SRFdSKTtcbiYjNDM7XHRpZiAoZ3VwX2ZkIFx1MDAzYyAwKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7L3N5cy9rZXJuZWwvZGVidWcvZ3VwX3Rlc3QgcmVxdWlyZXMgQ09ORklHX0dVUF9URVNUIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFx1MDAzZSAwID8gbnJfYXJlYXNfYXJnIDogREVGQVVMVF9TSEFSRURfQVJFQVM7XG4mIzQzO1x0bnJfYXJlYXMgPSBucl9zaGFyZWRfYXJlYXMgJiM0MzsgMTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuJiM0MztcdCAqIE1SRU1BUF9GSVhFRCB1bm1hcHMgd2hhdGV2ZXIgaXMgaW4gdGhlIHdheSB3aXRob3V0IHNheWluZyBzby4gIENsYWltXG4mIzQzO1x0ICogdGhlIGFkZHJlc3MgaGVyZSwgc28gYSBsYXlvdXQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGlzIGFzc3VtcHRpb25cbiYjNDM7XHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuJiM0MztcdCAqIHByb2Nlc3MgbWFwcyB0aGlzIGxvdzogdGhyZWFkIHN0YWNrcyBhbmQgbWFsbG9jIGFyZW5hcyBjb21lIGZyb20gdGhlXG4mIzQzO1x0ICogdG9wLWRvd24gbW1hcCBhcmVhLCB3ZWxsIGFib3ZlLlxuJiM0MztcdCAqL1xuJiM0MztcdG1yZW1hcF9zY3JhdGNoID0gKGNoYXIgKilCQVNFX0FERFIgJiM0MzsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4mIzQzO1x0XHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcbiYjNDM7XHRcdCAtMSwgMCkgIT0gKHZvaWQgKiltcmVtYXBfc2NyYXRjaClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttbWFwKCkgbXJlbWFwIHNjcmF0Y2hcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRiYXNlX21hc2sgPSB0aHJlYWRfbWFzaztcbiYjNDM7XHRpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4mIzQzO1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbiYjNDM7XHRcdGtzZnRfcHJpbnRfbXNnKFwmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9zZXRfcGxhbihucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbiYjNDM7XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBiYXNlIGVudHJ5IGZvciB0aGUgc3RhY2ssIHNvIHRoYXQgdGhlIHBvcCBhdCB0aGUgZW5kIG9mIGEgbW9kZVxuJiM0MztcdCAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eVxuJiM0MztcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBydW4gPSAwOyBydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuJiM0MztcdFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XG4mIzQzO1x0XHRib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107XG4mIzQzO1xuJiM0MztcdFx0dGhyZWFkX21hc2sgPSBiYXNlX21hc2s7XG4mIzQzO1x0XHRpZiAoIXByZXNzdXJlKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcbiYjNDM7XHRcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH5wYWdlb3V0X2JpdDtcbiYjNDM7XG4mIzQzO1x0XHR0aHBfcmVhZF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1x0XHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xuJiM0MztcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4mIzQzO1x0XHRcdHN0cmNtcChtb2RlLCBcJiMzNDtmcmVlXCYjMzQ7KSA/IDEwMDAgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogbVRIUCBjb2xsYXBzZSBvbmx5IHN1cHBvcnRzIHRoZSB0d28gZW5kcyBvZiB0aGUgb2NjdXBhbmN5XG4mIzQzO1x0XHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXG4mIzQzO1x0XHQgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyXG4mIzQzO1x0XHQgKiByYWNpbmcgTUFEVl9ET05UTkVFRDsgaG9sZS1oZWF2eSB3aW5kb3dzIGNvbGxhcHNlIGluc3RlYWQsXG4mIzQzO1x0XHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IGhvbGVzID9cbiYjNDM7XHRcdFx0KGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwO1xuJiM0MztcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbiYjNDM7XHRcdFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKVxuJiM0MztcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXG4mIzQzO1x0XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4mIzQzO1xuJiM0MztcdFx0cmVnaW9uID0gbW1hcChCQVNFX0FERFIsIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxuJiM0MztcdFx0XHQgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbiYjNDM7XHRcdGlmIChyZWdpb24gIT0gQkFTRV9BRERSKVxuJiM0MztcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIHBsYXlncm91bmRcJiMzNDspO1xuJiM0MztcdFx0bXJlbWFwX2FyZWEgPSByZWdpb24gJiM0MzsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHRocmVhZF9tYXNrIFx1MDAyNiBwYWdlb3V0X2JpdCkge1xuJiM0MztcdFx0XHQvKlxuJiM0MztcdFx0XHQgKiBCaWcgZW5vdWdoIHRvIGN5Y2xlIHJlYWwgcmVjbGFpbSwgc21hbGwgZW5vdWdoIG5vdFxuJiM0MztcdFx0XHQgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG9cbiYjNDM7XHRcdFx0ICogWzE2TSwgNjRNXS5cbiYjNDM7XHRcdFx0ICovXG4mIzQzO1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbiYjNDM7XHRcdFx0aWYgKHBhZ2VvdXRfc2l6ZSBcdTAwM2MgMTZVTCBcdTAwM2NcdTAwM2MgMjApXG4mIzQzO1x0XHRcdFx0cGFnZW91dF9zaXplID0gMTZVTCBcdTAwM2NcdTAwM2MgMjA7XG4mIzQzO1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuJiM0MztcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDY0VUwgXHUwMDNjXHUwMDNjIDIwO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBtbWFwKE5VTEwsIHBhZ2VvdXRfc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0XHRcdFx0ICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuJiM0MztcdFx0XHRpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWFcJiMzNDspO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4mIzQzO1x0XHRtZW1zZXQobXJlbWFwX2FyZWEsIDEsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7XHRcdGlmIChtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAoISh0aHJlYWRfbWFzayBcdTAwMjYgKDFVTCBcdTAwM2NcdTAwM2MgaSkpKSB7XG4mIzQzO1x0XHRcdFx0dGhyZWFkc1tpXSA9IDA7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXG4mIzQzO1x0XHRcdFx0XHQgICAodm9pZCAqKShpICYjNDM7IDEpKSlcbiYjNDM7XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRlbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMO1xuJiM0MztcdFx0aWYgKCFzdHJjbXAobW9kZSwgXCYjMzQ7c3RlcHBlZFwmIzM0OykpIHtcbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbiYjNDM7XHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4mIzQzO1x0XHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7a2h1Z2VwYWdlZCBwYXNzIHRpbWVkIG91dFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXCYjMzQ7ZnJlZVwmIzM0OykpIHtcbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpXG4mIzQzO1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuJiM0MztcdFx0fSBlbHNlIHtcdC8qIG1hZHZpc2UgKi9cbiYjNDM7XHRcdFx0d2hpbGUgKG5vd19tcygpIFx1MDAzYyBlbmRfbXMgXHUwMDI2XHUwMDI2ICFjb3JydXB0ZWQpIHtcbiYjNDM7XHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiAmIzQzOyBpICogaHBhZ2VfcG1kX3NpemUsXG4mIzQzO1x0XHRcdFx0XHRcdGhwYWdlX3BtZF9zaXplLCBNQURWX0NPTExBUFNFKTtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuJiM0MztcdFx0XHRcdFx0TUFEVl9ET05UTkVFRCk7XG4mIzQzO1x0XHRcdFx0c3RlcHMmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0c3RvcCA9IDE7XG4mIzQzO1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAodGhyZWFkc1tpXSlcbiYjNDM7XHRcdFx0XHRwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0LyogRmluYWwgaW50ZWdyaXR5IHN3ZWVwLiAqL1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0XHRjaGVja19wYWdlKGkpO1xuJiM0MztcbiYjNDM7XHRcdGtzZnRfdGVzdF9yZXN1bHQoIWNvcnJ1cHRlZCxcbiYjNDM7XHRcdFx0XHQgXCYjMzQ7JXMvJXMlczogJWRzLCAlZCBzdGVwcywgbm8gY29ycnVwdGlvblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcJiMzNDtob2xlc1wmIzM0OyA6IFwmIzM0O3N0cmljdFwmIzM0OyxcbiYjNDM7XHRcdFx0XHQgcHJlc3N1cmUgPyBcJiMzNDsvcHJlc3N1cmVcJiMzNDsgOiBcJiMzNDtcJiMzNDssXG4mIzQzO1x0XHRcdFx0IGR1cmF0aW9uX3MsIHN0ZXBzKTtcbiYjNDM7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogSGFuZCB0aGUgYWRkcmVzcyBzcGFjZSBhbmQgdGhlIHNldHRpbmdzIGJhY2sgYmVmb3JlIHRoZVxuJiM0MztcdFx0ICogbmV4dCBtb2RlOiBpdCBtYXBzIHRoZSByZWdpb24gYXQgdGhlIHNhbWUgZml4ZWQgYWRkcmVzcyxcbiYjNDM7XHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdG11bm1hcChyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUpO1xuJiM0MztcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuJiM0MztcdFx0XHRtdW5tYXAocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUpO1xuJiM0MztcdFx0XHRwYWdlb3V0X2FyZWEgPSBOVUxMO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0dGhwX3BvcF9zZXR0aW5ncygpO1xuJiM0MztcdFx0c3RvcCA9IDA7XG4mIzQzO1x0XHRzdGVwcyA9IDA7XG4mIzQzO1xuJiM0MztcdFx0aWYgKGNvcnJ1cHRlZCkge1xuJiM0MztcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbiYjNDM7XHRcdFx0d2hpbGUgKCYjNDM7JiM0MztydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpIHtcbiYjNDM7XHRcdFx0XHRyZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xuJiM0MztcbiYjNDM7XHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCYjMzQ7JXMvJXMlczogc2tpcHBlZCBhZnRlciBjb3JydXB0aW9uXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgICAgb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXSA/XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIFwmIzM0O2hvbGVzXCYjMzQ7IDogXCYjMzQ7c3RyaWN0XCYjMzQ7LFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/XG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgIFwmIzM0Oy9wcmVzc3VyZVwmIzM0OyA6IFwmIzM0O1wmIzM0Oyk7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuJiM0MztcdGtzZnRfZmluaXNoZWQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suY1xuQEAgLTAsMCAmIzQzOzEsMTk2IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOy8qXG4mIzQzOyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbiYjNDM7ICpcbiYjNDM7ICogUmFjZSB0ZXN0cyBkcml2ZSBraHVnZXBhZ2VkIHRocm91Z2ggdGhlIGV4aXN0aW5nIHN5c2ZzIGNvbnRyb2xzOiBhXG4mIzQzOyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4mIzQzOyAqIGFkdmFuY2luZyBieSB0d28gaXMgYSBjb21wbGV0aW9uIGJhcnJpZXIgZm9yIG9uZSBmdWxsIHBhc3MgdGhhdFxuJiM0MzsgKiBzdGFydGVkIGFmdGVyIHNldHVwIChraHVnZXBhZ2VkX2Z1bGxfcGFzcygpKS4gVmVyaWZ5IHRoZSBwYWlyIGdpdmVzXG4mIzQzOyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4mIzQzOyAqIHByZXBhcmVkIHdpbmRvdyBwcm9kdWNlcyBleGFjdGx5IG9uZSBjb2xsYXBzZSBhdHRlbXB0IG9uIHRoYXRcbiYjNDM7ICogd2luZG93JiMzOTtzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4mIzQzOyAqIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyKSBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWRcbiYjNDM7ICogYWZ0ZXJ3YXJkcywgcmVwZWF0YWJseS5cbiYjNDM7ICpcbiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0XG4mIzQzOyAqIHRoZSB3YWtlLCBvbmUgYmFycmllciBzdGVwIHdvdWxkIHNsZWVwIG11bHRpcGxlcyBvZiB0aGF0IGFuZCBibG93XG4mIzQzOyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuJiM0MzsgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuXG4mIzQzOyAqL1xuJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtrc2VsZnRlc3QuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bV91dGlsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuJiM0MzsjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXHQvKiBzbWFsbGVzdCBvcmRlciBraHVnZXBhZ2VkIGNvbnNpZGVycyAqL1xuJiM0MzsjZGVmaW5lIE5SX0lURVJBVElPTlMgNVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwYWdlbWFwX2ZkO1xuJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4mIzQzO3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4mIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogRWFjaCBzdGVwIHN3aXRjaGVzIHRoZSBldmVudHMgb2ZmIGFnYWluLCBidXQgYSBoZWxwZXIgY2FuIHN0aWxsIGdpdmUgdXBcbiYjNDM7ICogb24gdXMgaW4gYmV0d2VlbiAoYSBmYWlsaW5nIHN5c2ZzIHdyaXRlIGVuZHMgdGhlIHRlc3QgZnJvbSBpbnNpZGVcbiYjNDM7ICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSYjMzk7c1xuJiM0MzsgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0JiMzOTtzLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgdHJhY2VfZXZlbnRzX29mZih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHRyYWNlX2V2ZW50c19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxuJiM0MzsgKiBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdyYjMzk7cyBzb3VyY2UgUEZOcywgcmVwb3J0ZWQgb25jZSBwZXIgYXR0ZW1wdC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgY291bnRfYXR0cmlidXRlZCh1bnNpZ25lZCBsb25nICpwZm5zLCBpbnQgbnJfcGZucyxcbiYjNDM7XHRcdFx0ICAgIHVuc2lnbmVkIGludCBvcmRlcilcbiYjNDM7e1xuJiM0MztcdGNoYXIgbGluZVsxMDI0XTtcbiYjNDM7XHRpbnQgY291bnQgPSAwO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcbiYjNDM7XHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBvcmQ7XG4mIzQzO1x0XHRjaGFyICpzLCAqbztcbiYjNDM7XHRcdGludCBpO1xuJiM0MztcbiYjNDM7XHRcdHMgPSBzdHJzdHIobGluZSwgXCYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghcylcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRpZiAoc3NjYW5mKHMsIFwmIzM0O21tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOiBzY2FuX3Bmbj0weCVseFwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgXHUwMDI2dmFsKSAhPSAxKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdG8gPSBzdHJzdHIocywgXCYjMzQ7b3JkZXI9XCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghbyB8fCBzc2NhbmYobywgXCYjMzQ7b3JkZXI9JXVcJiMzNDssIFx1MDAyNm9yZCkgIT0gMSB8fCBvcmQgIT0gb3JkZXIpXG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfcGZuczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdFx0aWYgKHZhbCA9PSBwZm5zW2ldKSB7XG4mIzQzO1x0XHRcdFx0Y291bnQmIzQzOyYjNDM7O1xuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1x0cmV0dXJuIGNvdW50O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbiYjNDM7XHRjb25zdCBpbnQgbnJfcGFnZXMgPSAxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5zWzEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUl07XG4mIzQzO1x0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcbiYjNDM7XHRpbnQgYXR0cmlidXRlZDtcbiYjNDM7XHRjaGFyICpwO1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRwID0gbW1hcChCQVNFX0FERFIsIGhwYWdlX3BtZF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbiYjNDM7XHRpZiAocCAhPSBCQVNFX0FERFIpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCYjMzQ7bW1hcCgpIHdpbmRvd1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxO1xuJiM0MztcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTtcbiYjNDM7XHRcdGlmIChwZm5zW2ldID09IC0xVUwpXG4mIzQzO1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcblwmIzM0Oyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcblwmIzM0Oyk7XG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIHRydWUpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O0Nhbm5vdCBlbmFibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSlcJiMzNDspO1xuJiM0MztcdC8qIFdhaXQgdXAgdG8gMTIwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuJiM0MztcdHBhc3NlZCA9IGtodWdlcGFnZWRfZnVsbF9wYXNzKDEyMCk7XG4mIzQzO1xuJiM0MztcdC8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovXG4mIzQzO1x0aWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSlcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtDYW5ub3QgZGlzYWJsZSBodWdlX21lbW9yeSBldmVudHNcXG5cJiMzNDspO1xuJiM0MztcdGlmICghcGFzc2VkKVxuJiM0MztcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xcblwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7XHRhdHRyaWJ1dGVkID0gY291bnRfYXR0cmlidXRlZChwZm5zLCBucl9wYWdlcywgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbiYjNDM7XHRcdFx0IFwmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTtcbiYjNDM7XG4mIzQzO1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IG1haW4odm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cJiMzNDspO1xuJiM0MztcdGlmICghKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUikpKVxuJiM0MztcdFx0a3NmdF9leGl0X3NraXAoXCYjMzQ7T3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbiYjNDM7XG4mIzQzO1x0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xuJiM0MztcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4mIzQzO1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCYjMzQ7UmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRwYWdlbWFwX2ZkID0gb3BlbihcJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXBcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAocGFnZW1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcJiMzNDspO1xuJiM0MztcdGtwYWdlZmxhZ3NfZmQgPSBvcGVuKFwmIzM0Oy9wcm9jL2twYWdlZmxhZ3NcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoa3BhZ2VmbGFnc19mZCBcdTAwM2MgMClcbiYjNDM7XHRcdGtzZnRfZXhpdF9za2lwKFwmIzM0O29wZW4oXFxcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXFxcJiMzNDspIHJlcXVpcmVzIHJvb3RcXG5cJiMzNDspO1xuJiM0MztcdHRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspO1xuJiM0MztcdGlmICh0cmFjZV9ldmVudHNfZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRrc2Z0X2V4aXRfc2tpcChcJiMzNDtodWdlX21lbW9yeSBldmVudHMgcmVxdWlyZSB0cmFjZWZzIGFuZCByb290XFxuXCYjMzQ7KTtcbiYjNDM7XHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4mIzQzO1xuJiM0MztcdGtzZnRfc2V0X3BsYW4oTlJfSVRFUkFUSU9OUyk7XG4mIzQzO1xuJiM0MztcdHRocF9zYXZlX3NldHRpbmdzKCk7XG4mIzQzO1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuJiM0MztcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4mIzQzO1x0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuJiM0MztcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4mIzQzO1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAoaHBhZ2VfcG1kX3NpemUgLyBnZXRwYWdlc2l6ZSgpKSAtIDE7XG4mIzQzO1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbiYjNDM7XHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXHUwMDNjXHUwMDNjIDI0O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5SX09SREVSUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9ORVZFUjtcbiYjNDM7XHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4mIzQzO1x0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xuJiM0MztcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfSVRFUkFUSU9OUzsgaSYjNDM7JiM0MzspXG4mIzQzO1x0XHRvbmVfc3RlcChpKTtcbiYjNDM7XG4mIzQzO1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbiYjNDM7XG4mIzQzO1x0a3NmdF9maW5pc2hlZCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgJiM0MzsyMCw2IEBAXG4gXG4gI2RlZmluZSBUV09NRUdcdFx0KDJcdTAwM2NcdTAwM2MyMClcbiAjZGVmaW5lIFJVTlRJTUVcdFx0KDIwKVxuLSNkZWZpbmUgQUxJR04oeCwgYSlcdCgoKHgpICYjNDM7IChhIC0gMSkpIFx1MDAyNiAofigoYSkgLSAxKSkpXG4gXG4gSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpXG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPVwmIzM0O3Bmbm1hcFwmIzM0OyBydW5fdGVzdCAuL3Bmbm1hcFxuICMgQ09XIHRlc3RzXG4gQ0FURUdPUlk9XCYjMzQ7Y293XCYjMzQ7IHJ1bl90ZXN0IC4vY293XG4gXG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2ZvbGlvX29yZGVyX2NoZWNrXG4mIzQzO1xuJiM0MztDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcbiYjNDM7XG4mIzQzO0NBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuJiM0MztcbiBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCYjMzQ7dGhwXCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXG5AQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIGFsbDpzaG1lbVxuIFxuIENBVEVHT1JZPVwmIzM0O3RocFwmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cbiBcbi1DQVRFR09SWT1cJiMzNDt0aHBcJiMzNDsgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCYjMzQ7JHtTUExJVF9IVUdFX1BBR0VfVEVTVF9YRlNfUEFUSH1cJiMzNDsgXTsgdGhlblxuICAgICBpZiB0ZXN0X3NlbGVjdGVkIFwmIzM0O3RocFwmIzM0OzsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5pbmRleCA4NmE2MDM2OTI4MjYxLi4wYWRmZTdkZGU3ZTU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xuQEAgLTQyLDY4ICYjNDM7NDIsNiBAQCBjb25zdCBjaGFyICprcGFnZWZsYWdzX3Byb2MgPSBcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7O1xuIGludCBwYWdlbWFwX2ZkO1xuIGludCBrcGFnZWZsYWdzX2ZkO1xuIFxuLXN0YXRpYyBib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbi1cdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4te1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDtcbi1cdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4tXHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbi1cdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XG4tXHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4tXHR1bnNpZ25lZCBsb25nIHBmbjtcbi1cdHVuc2lnbmVkIGxvbmcgaTtcbi1cbi1cdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XG4tXG4tXHQvKiBub24gcHJlc2VudCBwYWdlICovXG4tXHRpZiAocGZuID09IC0xVUwpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbiwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0Z290byBmYWlsO1xuLVxuLVx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cbi1cdGlmICghb3JkZXIpIHtcbi1cdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHRcdHJldHVybiB0cnVlO1xuLVx0fVxuLVxuLVx0Lyogbm9uIFRIUCBmb2xpbyAqL1xuLVx0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbi1cbi1cdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqL1xuLVx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4tXHRcdHJldHVybiBmYWxzZTtcbi1cbi1cdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuLVx0Zm9yIChpID0gMTsgaSBcdTAwM2MgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdFx0Z290byBmYWlsO1xuLVx0XHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncylcbi1cdFx0XHRyZXR1cm4gZmFsc2U7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbi1cdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcbi1cdCAqL1xuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdHJldHVybiB0cnVlO1xuLVxuLVx0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuLVx0cmV0dXJuIChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7XG4tZmFpbDpcbi1cdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuLVx0cmV0dXJuIGZhbHNlO1xuLX1cbi1cbiBzdGF0aWMgaW50IGNoZWNrX2FmdGVyX3NwbGl0X2ZvbGlvX29yZGVycyhjaGFyICp2YWRkcl9zdGFydCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkLCBpbnQgb3JkZXJzW10sIGludCBucl9vcmRlcnMpXG4ge1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuaW5kZXggODBiYzlmNTk3YjUyMS4uZWUxMzM0Nzc4MzkxZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5AQCAtNDk0LDYgJiM0Mzs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuJiM0MztcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XG4mIzQzO1x0Y29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCBcdTAwM2NcdTAwM2Mgb3JkZXI7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbiYjNDM7XHR1aW50NjRfdCBwZm5fZmxhZ3M7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBwZm47XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcbiYjNDM7XHQvKiBub24gcHJlc2VudCBwYWdlICovXG4mIzQzO1x0aWYgKHBmbiA9PSAtMVVMKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovXG4mIzQzO1x0aWYgKCFvcmRlcikge1xuJiM0MztcdFx0aWYgKHBmbl9mbGFncyBcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBub24gVEhQIGZvbGlvICovXG4mIzQzO1x0aWYgKCEocGZuX2ZsYWdzIFx1MDAyNiBLUEZfVEhQKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0cGZuX2hlYWQgPSBwZm4gXHUwMDI2IH4obnJfcGFnZXMgLSAxKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1xuJiM0MztcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4mIzQzO1x0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX2hlYWRfZmxhZ3MpICE9IGZvbGlvX2hlYWRfZmxhZ3MpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdC8qIGNoZWNrIGFsbCB0YWlsIFBGTiBmbGFncyAqL1xuJiM0MztcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbiYjNDM7XHRcdFx0Z290byBmYWlsO1xuJiM0MztcdFx0aWYgKChwZm5fZmxhZ3MgXHUwMDI2IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogY2hlY2sgdGhlIFBGTiBhZnRlciB0aGlzIGZvbGlvLCBidXQgaWYgaXRzIGZsYWdzIGNhbm5vdCBiZSBvYnRhaW5lZCxcbiYjNDM7XHQgKiBhc3N1bWUgdGhpcyBmb2xpbyBoYXMgdGhlIGV4cGVjdGVkIG9yZGVyXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4mIzQzO1x0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XG4mIzQzO1x0LyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqL1xuJiM0MztcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuJiM0MztmYWlsOlxuJiM0MztcdGtzZnRfZXhpdF9mYWlsX21zZyhcJiMzNDtGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4mIzQzOyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XG4mIzQzOyAqIGFsaWduZWQsIGVhY2ggd2luZG93JiMzOTtzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cmIzM5O3MgZmlyc3RcbiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaXMgdGhlIGNoZWNrIFwmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvc1wmIzM0OzogYVxuJiM0MzsgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXG4mIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxuJiM0MzsgKi9cbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMIFx1MDAzY1x1MDAzYyBvcmRlcjtcbiYjNDM7XHRjb25zdCBzaXplX3Qgd2luZG93ID0gbnJfcGFnZXMgKiBwc2l6ZSgpO1xuJiM0MztcdGNoYXIgKnZhZGRyO1xuJiM0MztcbiYjNDM7XHRpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgXHUwMDNjIHN0YXJ0ICYjNDM7IGxlbjsgdmFkZHIgJiM0Mzs9IHdpbmRvdykge1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBpO1xuJiM0MztcbiYjNDM7XHRcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cbiYjNDM7XHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICYjNDM7IGkgKiBwc2l6ZSgpKSAhPVxuJiM0MztcdFx0XHQgICAgcGZuICYjNDM7IGkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcbiYjNDM7XHRcdFx0XHRcdGtwYWdlZmxhZ3NfZmQpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgXCYjMzQ7L3N5cy9rZXJuZWwvdHJhY2luZ1wmIzM0O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXCYjMzQ7aHVnZV9tZW1vcnlcJiMzNDspLlxuJiM0MzsgKiBSZXR1cm5zIGEgZGVzY3JpcHRvciBmb3IgdHJhY2luZ19ldmVudHNfZW5hYmxlKCksIG9yIC0xIGlmIHRyYWNlZnMgb3IgdGhlXG4mIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuJiM0MzsgKiBzd2l0Y2hlcyB0aGVtIG9uIG93bnMgdGhlbSB1bnRpbCBpdCBzd2l0Y2hlcyB0aGVtIG9mZiwgaW5jbHVkaW5nIG9uIHRoZVxuJiM0MzsgKiBwYXRocyB3aGVyZSB0aGUgdGVzdCBnaXZlcyB1cC5cbiYjNDM7ICovXG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cylcbiYjNDM7e1xuJiM0MztcdGNoYXIgcGF0aFsyNTZdO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFRSQUNFRlNfUk9PVCBcJiMzNDsvZXZlbnRzLyVzL2VuYWJsZVwmIzM0OyxcbiYjNDM7XHRcdCBzdWJzeXMpO1xuJiM0MztcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHB3cml0ZShmZCwgZW5hYmxlID8gXCYjMzQ7MVwmIzM0OyA6IFwmIzM0OzBcJiMzNDssIDEsIDApICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIERyb3Agd2hhdCB0aGUgdHJhY2UgYnVmZmVyIGhvbGRzIHNvIGZhci4gKi9cbiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbiYjNDM7e1xuJiM0MztcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgT19XUk9OTFkgfCBPX1RSVU5DKTtcbiYjNDM7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7RklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFwmIzM0Oy90cmFjZVwmIzM0OywgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgJiM0MzsxMCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuIFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXHUwMDNjXHUwMDNjIChucikpXG4mIzQzOyNkZWZpbmUgQUxJR04oeCwgYSkgICAgICAgICAgICAgICAgICAgKCgoeCkgJiM0MzsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4mIzQzO1xuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcbiAjZGVmaW5lIFBNX01NQVBfRVhDTFVTSVZFICAgICAgICAgICAgIEJJVF9VTEwoNTYpXG4gI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KVxuQEAgLTk3LDYgJiM0Mzs5OSwxMCBAQCBpbnQ2NF90IGFsbG9jYXRlX3RyYW5zaHVnZSh2b2lkICpwdHIsIGludCBwYWdlbWFwX2ZkKTtcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XG4gaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXG4gXHRcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTtcbiYjNDM7Ym9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4mIzQzO1x0XHRcdGludCBrcGFnZWZsYWdzX2ZkKTtcbiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXG4mIzQzO1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiAmIzQzOzExOSwxMCBAQCBpbnQgY2xvc2VfcHJvY21hcChzdHJ1Y3QgcHJvY21hcF9mZCAqcHJvY21hcCk7XG4gaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpO1xuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcbiBib29sIHNvZnRkaXJ0eV9zdXBwb3J0ZWQodm9pZCk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7XG4mIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4mIzQzO2ludCB0cmFjaW5nX2NsZWFyX3RyYWNlKHZvaWQpO1xuJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8xNSAwMjoxODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgMTUgMDI6MTg6MjggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCmluZGV4IDJkNTM2NjE5NmUzMDkuLjMwOGJiYWQ3M2MxMWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlCkBAIC0xMDQsNiAmIzQzOzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBndWFyZC1yZWdpb25zCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gbWVyZ2UKIFRFU1RfR0VOX0ZJTEVTICYjNDM7PSBybWFwCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0CiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGZvbGlvX29yZGVyX2NoZWNrCiYjNDM7VEVTVF9HRU5fRklMRVMgJiM0Mzs9IGtodWdlcGFnZWRfc3luY19jaGVjawomIzQzO1RFU1RfR0VOX0ZJTEVTICYjNDM7PSBraHVnZXBhZ2VkX3JhY2UKIAogaWZuZXEgKCQoQVJDSCksYXJtNjQpCiBURVNUX0dFTl9GSUxFUyAmIzQzOz0gc29mdC1kaXJ0eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uOTMwMzBhNDJjM2NjZAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTM3IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLAomIzQzOyAqIGlzX2JhY2tlZF9ieV9mb2xpbygpIGFuZCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKCkuCiYjNDM7ICoKJiM0MzsgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seQomIzQzOyAqIHRoYXQgb3JkZXIgZW5hYmxlZCBhbmQgdmVyaWZ5IHRoZSBoZWxwZXJzIHJlcG9ydCBleGFjdGx5IHRoYXQgb3JkZXI6CiYjNDM7ICogbm90IGEgbmVpZ2hib3VyaW5nIG9yZGVyLCBhbmQgcGxhaW4gNEsgbWVtb3J5IGFzIG9yZGVyIDAuIFRoZSBoZWxwZXJzCiYjNDM7ICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvCiYjNDM7ICogdGhleSBtdXN0IGFncmVlIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55CiYjNDM7ICogY29sbGFwc2UgdGVzdCByZWxpZXMgb24gdGhlbS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt1bmlzdGQuaCZndDsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O2tzZWxmdGVzdC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtX3V0aWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDtodWdlcGFnZV9zZXR0aW5ncy5oJiMzNDsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7CiYjNDM7c3RhdGljIGludCBrcGFnZWZsYWdzX2ZkOwomIzQzOwomIzQzOy8qIG1tYXAgYW4gYW5vbiBWTUEgb2YgZXhhY3RseSBAc2l6ZSBieXRlcyBhdCBhIEBzaXplLWFsaWduZWQgYWRkcmVzcy4gKi8KJiM0MztzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSkKJiM0Mzt7CiYjNDM7CXNpemVfdCBsZW4gPSBzaXplICogMjsKJiM0MzsJdWludHB0cl90IGFsaWduZWQ7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSYjMzQ7KTsKJiM0MzsKJiM0MzsJYWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7CiYjNDM7CWlmIChhbGlnbmVkICE9ICh1aW50cHRyX3QpcCkKJiM0MzsJCW11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTsKJiM0MzsJaWYgKGFsaWduZWQgJiM0Mzsgc2l6ZSAhPSAodWludHB0cl90KXAgJiM0MzsgbGVuKQomIzQzOwkJbXVubWFwKChjaGFyICopYWxpZ25lZCAmIzQzOyBzaXplLAomIzQzOwkJICAgICAgICh1aW50cHRyX3QpcCAmIzQzOyBsZW4gLSBhbGlnbmVkIC0gc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiAoY2hhciAqKWFsaWduZWQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZAomIzQzOyAqIGNoZWNrIHRoZSBoZWxwZXJzIHNlZSBleGFjdGx5IEBvcmRlci4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CXNpemVfdCBzaXplID0gcHNpemUoKSAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJYm9vbCBvayA9IHRydWU7CiYjNDM7CWNoYXIgKnA7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlpZiAob3JkZXIpCiYjNDM7CQlzZXR0aW5ncy5odWdlcGFnZXNbb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IGFsbG9jX2FsaWduZWQoc2l6ZSk7CiYjNDM7CSpwID0gMTsKJiM0MzsKJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyLAomIzQzOwkJCQkJICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtvcmRlciAlZCBub3QgZGV0ZWN0ZWQgYWZ0ZXIgZmF1bHRcbiYjMzQ7LCBvcmRlcik7CiYjNDM7CQlvayA9IGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEEgbG93ZXIgb3JkZXIgbXVzdCBiZSByZWplY3RlZDogdGhlIGZvbGlvIGlzIGxhcmdlci4gKi8KJiM0MzsJaWYgKG9yZGVyICZhbXA7JmFtcDsgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlciAtIDEsCiYjNDM7CQkJCQkJICAgICBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJCSAgICAga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxuJiMzNDssCiYjNDM7CQkJICAgICAgIG9yZGVyLCBvcmRlciAtIDEpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBPcmRlciAwIHBhZ2VzIG11c3Qgbm90IGxvb2sgbGlrZSBhbnkgbGFyZ2UgZm9saW8sIGFuZCB2aWNlIHZlcnNhLiAqLwomIzQzOwlpZiAob3JkZXIgJmFtcDsmYW1wOyBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsCiYjNDM7CQkJCQkJICAgICBwYWdlbWFwX2ZkLAomIzQzOwkJCQkJCSAgICAga3BhZ2VmbGFnc19mZCkpIHsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7b3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXG4mIzM0Oywgb3JkZXIpOwomIzQzOwkJb2sgPSBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltdW5tYXAocCwgc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdChvaywgJiMzNDtvcmRlciAlZCBjbGFzc2lmaWVkXG4mIzM0Oywgb3JkZXIpOwomIzQzO30KJiM0MzsKJiM0MztpbnQgbWFpbih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBvcmRlcnM7CiYjNDM7CWludCBvcmRlcjsKJiM0MzsKJiM0MzsJa3NmdF9wcmludF9oZWFkZXIoKTsKJiM0MzsKJiM0MzsJaWYgKCF0aHBfYXZhaWxhYmxlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXBhZ2VtYXBfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9wYWdlbWFwJiMzNDssIE9fUkRPTkxZKTsKJiM0MzsJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9zZWxmL3BhZ2VtYXApJiMzNDspOwomIzQzOwlrcGFnZWZsYWdzX2ZkID0gb3BlbigmIzM0Oy9wcm9jL2twYWdlZmxhZ3MmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O29wZW4oXCYjMzQ7L3Byb2Mva3BhZ2VmbGFnc1wmIzM0OykgcmVxdWlyZXMgcm9vdFxuJiMzNDspOwomIzQzOwomIzQzOwlvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpOwomIzQzOwlpZiAoIW9yZGVycykKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7Tm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJa3NmdF9zZXRfcGxhbihfX2J1aWx0aW5fcG9wY291bnRsKG9yZGVycykgJiM0MzsgMSk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwkvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovCiYjNDM7CXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwljaGVja19vcmRlcigwKTsKJiM0MzsJZm9yIChvcmRlciA9IDE7IG9yZGVyICZsdDsgTlJfT1JERVJTOyBvcmRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWlmICghKG9yZGVycyAmYW1wOyAoMVVMICZsdDsmbHQ7IG9yZGVyKSkpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQljaGVja19vcmRlcihvcmRlcik7CiYjNDM7CX0KJiM0MzsKJiM0MzsKJiM0MzsJa3NmdF9maW5pc2hlZCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmMKQEAgLTY1LDcgJiM0Mzs2NSw2IEBAIGVudW0gewogI2RlZmluZSBITU1fUEFUSF9NQVggICAgNjQKICNkZWZpbmUgTlRJTUVTCQkxMAogCi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICYjNDM7IChhIC0gMSkpICZhbXA7ICh+KChhKSAtIDEpKSkKIC8qIEp1c3QgdGhlIGZsYWdzIHdlIG5lZWQsIGNvcGllZCBmcm9tIG1tLmg6ICovCiAKICNpZm5kZWYgRk9MTF9XUklURQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMKaW5kZXggZDc5MTdkY2UzYWJhYy4uOTkyZWZlZTE3YjcxNiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jCkBAIC0xODMsNiAmIzQzOzE4MywxOSBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogV3JpdGUgb25seSBvbiBjaGFuZ2U6IGEgc3RvcmUgdG8gZWl0aGVyIHNsZWVwIGtub2Igd2FrZXMga2h1Z2VwYWdlZCAtLQomIzQzOyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGUKJiM0MzsgKiBxdWV1ZSAtLSBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5CiYjNDM7ICogYXNrZWQgZm9yOyBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGlzIHRoZSBvbmx5IHNhbmN0aW9uZWQgd2FrZS4gIFRoZQomIzQzOyAqIG90aGVyIGtub2JzIGRvIG5vdCB3YWtlLCBidXQgd3JpdGluZyB0aGVtIHRoZSBzYW1lIHdheSBjb3N0cyBub3RoaW5nLgomIzQzOyAqLwomIzQzO3ZvaWQgdGhwX3VwZGF0ZV9udW0oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBudW0pCiYjNDM7ewomIzQzOwlpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSkKJiM0MzsJCXRocF93cml0ZV9udW0obmFtZSwgbnVtKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncykKIHsKIAlzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9ICZhbXA7c2V0dGluZ3MtJmd0O2todWdlcGFnZWQ7CkBAIC0xOTgsMTUgJiM0MzsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpCiAJCQlzaG1lbV9lbmFibGVkX3N0cmluZ3Nbc2V0dGluZ3MtJmd0O3NobWVtX2VuYWJsZWRdKTsKIAl0aHBfd3JpdGVfbnVtKCYjMzQ7dXNlX3plcm9fcGFnZSYjMzQ7LCBzZXR0aW5ncy0mZ3Q7dXNlX3plcm9fcGFnZSk7CiAKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9kZWZyYWcmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7ZGVmcmFnKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O2FsbG9jX3NsZWVwX21pbGxpc2Vjcyk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3MmIzM0OywKLQkJCWtodWdlcGFnZWQtJmd0O3NjYW5fc2xlZXBfbWlsbGlzZWNzKTsKLQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX25vbmUpOwotCXRocF93cml0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkJiMzNDssIGtodWdlcGFnZWQtJmd0O21heF9wdGVzX3NoYXJlZCk7Ci0JdGhwX3dyaXRlX251bSgmIzM0O2todWdlcGFnZWQvcGFnZXNfdG9fc2NhbiYjMzQ7LCBraHVnZXBhZ2VkLSZndDtwYWdlc190b19zY2FuKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL2RlZnJhZyYjMzQ7LCBraHVnZXBhZ2VkLSZndDtkZWZyYWcpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7YWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDssCiYjNDM7CQkgICAgICAga2h1Z2VwYWdlZC0mZ3Q7c2Nhbl9zbGVlcF9taWxsaXNlY3MpOwomIzQzOwl0aHBfdXBkYXRlX251bSgmIzM0O2todWdlcGFnZWQvbWF4X3B0ZXNfbm9uZSYjMzQ7LCBraHVnZXBhZ2VkLSZndDttYXhfcHRlc19ub25lKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL21heF9wdGVzX3N3YXAmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc3dhcCk7CiYjNDM7CXRocF91cGRhdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWQmIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7bWF4X3B0ZXNfc2hhcmVkKTsKJiM0MzsJdGhwX3VwZGF0ZV9udW0oJiMzNDtraHVnZXBhZ2VkL3BhZ2VzX3RvX3NjYW4mIzM0Oywga2h1Z2VwYWdlZC0mZ3Q7cGFnZXNfdG9fc2Nhbik7CiAKIAlpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSkKIAkJd3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLSZndDtyZWFkX2FoZWFkX2tiKTsKQEAgLTIzMCw2ICYjNDM7MjQzLDQ5IEBAIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKQogCX0KIH0KIAomIzQzOy8qCiYjNDM7ICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdAomIzQzOyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvOwomIzQzOyAqIGEgJiM0MzsxIHN0ZXAgbWF5IGNvbXBsZXRlIGEgcGFzcyB0aGF0IGV4YW1pbmVkIHRoaXMgbW0gYmVmb3JlIHRoZQomIzQzOyAqIGNhbGxlciYjMzk7cyBzZXR1cCB3YXMgaW4gcGxhY2UuCiYjNDM7ICoKJiM0MzsgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3MKJiM0MzsgKiB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCBzY2FuIGNhZGVuY2UgLS0gYnV0IGEgc3RvcmUgY2FuIGJlIGxvc3QuCiYjNDM7ICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZQomIzQzOyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHMKJiM0MzsgKiBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBpdHNlbGYgb24gdGhlIHdheSBpbnRvIGtodWdlcGFnZWRfd2FpdF93b3JrKCkgYW5kCiYjNDM7ICogdGhlbiBzbGVlcHMgZm9yIHRoZSBmdWxsIGludGVydmFsLCBoYXZpbmcgbmV2ZXIgc2VlbiB0aGUgc3RvcmUuICBTbyBrZWVwCiYjNDM7ICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzCiYjNDM7ICogbm90aGluZyBhbmQgZG9lcyBub3QgcXVldWUgYW4gZXh0cmEgcGFzcy4KJiM0MzsgKgomIzQzOyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpbgomIzQzOyAqIG9uZSBzY2FuIGJhdGNoLCBzbyBjYWxsZXJzIG11c3QgcGFpciB0aGlzIHdpdGggYSBsYXJnZQomIzQzOyAqIHBhZ2VzX3RvX3NjYW4uCiYjNDM7ICovCiYjNDM7Ym9vbCBraHVnZXBhZ2VkX2Z1bGxfcGFzcyh1bnNpZ25lZCBpbnQgdGltZW91dF9zKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBkZWFkbGluZV9tcyA9IHRpbWVvdXRfcyAqIDEwMDBVTDsKJiM0MzsJdW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9CiYjNDM7CQl0aHBfcmVhZF9udW0oJiMzNDtraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzJiMzNDspOwomIzQzOwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwOwomIzQzOwlpbnQgcGFzczsKJiM0MzsKJiM0MzsJZm9yIChwYXNzID0gMDsgcGFzcyAmbHQ7IDI7IHBhc3MmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIHRhcmdldCA9CiYjNDM7CQkJdGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICYjNDM7IDE7CiYjNDM7CiYjNDM7CQl3aGlsZSAodGhwX3JlYWRfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9mdWxsX3NjYW5zJiMzNDspICZsdDsgdGFyZ2V0KSB7CiYjNDM7CQkJaWYgKGVsYXBzZWRfbXMgJmd0Oz0gZGVhZGxpbmVfbXMpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCQl0aHBfd3JpdGVfbnVtKCYjMzQ7a2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2VjcyYjMzQ7LAomIzQzOwkJCQkgICAgICBzbGVlcF9tcyk7CiYjNDM7CQkJdXNsZWVwKDEwICogMTAwMCk7CiYjNDM7CQkJZWxhcHNlZF9tcyAmIzQzOz0gMTA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwogc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZCkKIHsKIAlpZiAoIXNldHRpbmdzX2luZGV4KSB7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaAppbmRleCA3MjZjNzNjNDNjMDViLi5iYTdkMzgzNzBkNDMzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmgKQEAgLTcwLDYgJiM0Mzs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7CiB2b2lkIHRocF93cml0ZV9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpOwogdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKJiM0Mzt2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTsKIAogdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpOwogdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7CkBAIC04Myw2ICYjNDM7ODQsOCBAQCBzdGF0aWMgaW5saW5lIHZvaWQgdGhwX3NhdmVfc2V0dGluZ3Modm9pZCkKIAlodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7CiB9CiAKJiM0Mztib29sIGtodWdlcGFnZWRfZnVsbF9wYXNzKHVuc2lnbmVkIGludCB0aW1lb3V0X3MpOwomIzQzOwogdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTsKIHVuc2lnbmVkIGxvbmcgdGhwX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7CiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jCmluZGV4IGQzYTUzNjczZTFmOWEuLjE3MmU3MzA3ZWVlZWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMKQEAgLTMxLDYgJiM0MzszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7CiBzdGF0aWMgaW50IGhwYWdlX3BtZF9ucjsKIHN0YXRpYyBpbnQgYW5vbl9vcmRlcjsKIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7CiYjNDM7c3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47CiYjNDM7c3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTsKJiM0MztzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVyczsKJiM0MztzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTsKIAogI2RlZmluZSBQSURfU01BUFMgJiMzNDsvcHJvYy9zZWxmL3NtYXBzJiMzNDsKICNkZWZpbmUgVEVTVF9GSUxFICYjMzQ7Y29sbGFwc2VfdGVzdF9maWxlJiMzNDsKQEAgLTIxOSw2ICYjNDM7MjI0LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogCXJldHVybiBzd2FwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby4KJiM0MzsgKgomIzQzOyAqIFR3byB0aGluZ3MgZ2V0IGluIHRoZSB3YXkuICBNQURWX1BBR0VPVVQgaXMgYmVzdCBlZmZvcnQ6CiYjNDM7ICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0CiYjNDM7ICogYXdheSwgYW5kIG9uZSBzdGlsbCB1bmRlciB3cml0ZWJhY2sgZnJvbSBhbiBlYXJsaWVyIHBhZ2VvdXQgaXMgdGhlIGNvbW1vbgomIzQzOyAqIGNhc2UsIHNvIHRoZSBjb3VudCB0aGUgY2FsbGVyIGFza3MgZm9yIGFycml2ZXMgYSBtb21lbnQgbGF0ZXIuICBBbmQgYSByYW5nZQomIzQzOyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmcKJiM0MzsgKiBvbjogY29sbGFwc2luZyBhIHJhbmdlIHdpdGggdXAgdG8gbWF4X3B0ZXNfc3dhcCBwYWdlcyBzd2FwcGVkIG91dCBtZWFucwomIzQzOyAqIHJlYWRpbmcgdGhvc2UgcGFnZXMgYmFjayBpbiwgc28gdGhlIGRhZW1vbiB1bmRvZXMgdGhlIHBhZ2VvdXQgYXMgZmFzdCBhcyBpdAomIzQzOyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnMKJiM0MzsgKiBuZXh0IHB1dHMgTUFEVl9IVUdFUEFHRSBiYWNrLgomIzQzOyAqCiYjNDM7ICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSYjMzk7cyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJiMzOTtzIC0tCiYjNDM7ICogc3dhcCB0b28gc21hbGwsIHN3YXAgZnVsbCwgYSBtZW1jZyBjYXAsIGEgZm9saW8gc3RpbGwgdW5kZXIgd3JpdGViYWNrIC0tIHNvCiYjNDM7ICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZAomIzQzOyAqIGVuZHMgdGhlIHJ1biBoZXJlLgomIzQzOyAqLwomIzQzO3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfTk9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyA0MDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwomIzQzOwkJaWYgKGNoZWNrX3N3YXAocCwgc2l6ZSkpCiYjNDM7CQkJcmV0dXJuIHRydWU7CiYjNDM7CQl1c2xlZXAoNTAgKiAxMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgKmFsbG9jX21hcHBpbmcoaW50IG5yKQogewogCXZvaWQgKnA7CkBAIC01MTUsOCAmIzQzOzU1NSw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcykKIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJCQkgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7CiYjNDM7CWludCByZXQsIGk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0OyVzLi4uJiMzNDssIG1zZyk7CiAKQEAgLTUyOSw5ICYjNDM7NTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsCiAJLyoKIAkgKiBQcmV2ZW50IGtodWdlcGFnZWQgaW50ZXJmZXJlbmNlIGFuZCB0ZXN0cyB0aGF0IE1BRFZfQ09MTEFQU0UKIAkgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWQKJiM0MzsJICoKJiM0MzsJICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGEKJiM0MzsJICogc291cmNlIG9yZGVyIGxlZnQgYXQgJiMzNDthbHdheXMmIzM0OyAtLSB3aGljaCAtcyBkb2VzIC0tIGxldHMga2h1Z2VwYWdlZAomIzQzOwkgKiBjb2xsYXBzZSB0aGUgdmVyeSByYW5nZSB0aGUgY2FzZSBpcyB3b3JraW5nIG9uLiAgU2V0IHRoZW0gdG8KJiM0MzsJICogJiMzNDtpbmhlcml0JiMzNDssIG5vdCAmIzM0O25ldmVyJiMzNDsuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmQKJiM0MzsJICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tCiYjNDM7CSAqIHRoZXNlIHZlcnkgY29udHJvbHMsIGFuZCBzdGlsbCBmaW5kcyBvbmUuCiAJICovCiAJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7CiAJc2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykgewomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJCXNldHRpbmdzLnNobWVtX2h1Z2VwYWdlc1tpXS5lbmFibGVkID0gU0hNRU1fSU5IRVJJVDsKJiM0MzsJfQogCXRocF9wdXNoX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwogCiAJLyogQ2xlYXIgVk1fTk9IVUdFUEFHRSAqLwpAQCAtNTYxLDggJiM0Mzs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sCiAJCWludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpCiB7CiAJdW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplICZsdDsmbHQ7IGNvbGxhcF9vcmRlcjsKJiM0MzsJLyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovCiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplOwomIzQzOwlpbnQgdGltZW91dCA9IDYgJiM0MzsgMiAqIChieXRlcyAvICgxMjhVTCAmbHQ7Jmx0OyAyMCkpOwogCWludCBmdWxsX3NjYW5zOwotCWludCB0aW1lb3V0ID0gNjsgLyogMyBzZWNvbmRzICovCiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoIW9wcy0mZ3Q7Y2hlY2tfaHVnZShwLCBsZW4sIDAsIGhwYWdlX3NpemUpKQpAQCAtODI1LDEyICYjNDM7ODc4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgb25lIHBhZ2UuLi4mIzM0Oyk7Ci0JaWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgcGFnZV9zaXplKSkgewomIzQzOwlpZiAoc3dhcG91dF9yYW5nZShwLCBwYWdlX3NpemUpKSB7CiAJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAl9IGVsc2UgewotCQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtODUxLDEyICYjNDM7OTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvCiAJb3BzLSZndDtmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7CiAKIAlrc2Z0X3ByaW50X21zZygmIzM0O1N3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi4mIzM0OywgbWF4X3B0ZXNfc3dhcCAmIzQzOyAxLCBocGFnZV9wbWRfbnIpOwotCWlmIChtYWR2aXNlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfUEFHRU9VVCkmIzM0Oyk7Ci0JaWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgJiM0MzsgMSkgKiBwYWdlX3NpemUpKSB7CiYjNDM7CWlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICYjNDM7IDEpICogcGFnZV9zaXplKSkgewogCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiAJfSBlbHNlIHsKLQkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CQlza2lwKCYjMzQ7Q291bGQgbm90IHN3YXAgb3V0JiMzNDspOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTg2OCwxMiAmIzQzOzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqbwogCQlvcHMtJmd0O2ZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTsKIAkJa3NmdF9wcmludF9tc2coJiMzNDtTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uJiMzNDssIG1heF9wdGVzX3N3YXAsCiAJCSAgICAgICBocGFnZV9wbWRfbnIpOwotCQlpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKQotCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bWFkdmlzZShNQURWX1BBR0VPVVQpJiMzNDspOwotCQlpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkgewomIzQzOwkJaWYgKHN3YXBvdXRfcmFuZ2UocCwgbWF4X3B0ZXNfc3dhcCAqIHBhZ2Vfc2l6ZSkpIHsKIAkJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKIAkJfSBlbHNlIHsKLQkJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwkJCXNraXAoJiMzNDtDb3VsZCBub3Qgc3dhcCBvdXQmIzM0Oyk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC05NDAsNiAmIzQzOzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCXZvaWQgKnA7CiAJaW50IGk7CiAKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRlc3QgbmVlZHMgaHBhZ2VfcG1kX25yIFBNRC1vcmRlciBhbGxvY2F0aW9ucywgd2hpY2ggaXMgbGlrZWx5IHRvCiYjNDM7CSAqIGZhaWwgZm9yIGxhcmdlIFBNRCBzaXplcy4gIFNraXAgaWYgdGhlIFBNRCBzaXplIGlzIG92ZXIgMzJNLgomIzQzOwkgKi8KJiM0MzsJaWYgKGhwYWdlX3BtZF9zaXplICZndDsgKDMyVUwgJmx0OyZsdDsgMjApKSB7CiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoJiMzNDslczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXG4mIzM0OywKJiM0MzsJCQkJICAgICAgX19mdW5jX18pOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiAJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKIAlrc2Z0X3ByaW50X21zZygmIzM0O0NvbnN0cnVjdCBQVEUgcGFnZSB0YWJsZSBmdWxsIG9mIGRpZmZlcmVudCBQVEUtbWFwcGVkIGNvbXBvdW5kIHBhZ2VzXG4mIzM0Oyk7CiAJZm9yIChpID0gMDsgaSAmbHQ7IGhwYWdlX3BtZF9ucjsgaSYjNDM7JiM0MzspIHsKQEAgLTExMzAsNiAmIzQzOzExODcsOTcgQEAgc3RhdGljIHZvaWQgY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcwogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyoKJiM0MzsgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkCiYjNDM7ICogc291cmNlIGlzIGNvcGllZCBsaXZlIChub3QgZnJvemVuKSwgcmVseWluZyBvbiBpdCBiZWluZyBDb1cgLSBpbW11dGFibGUKJiM0MzsgKiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb3B5OyBhIGNvLXNoYXJlciYjMzk7cyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZQomIzQzOyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5CiYjNDM7ICogaXRzIG93biB3cml0ZXMuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7CiYjNDM7CWNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTsKJiM0MzsJaW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTsKJiM0MzsJLyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi8KJiM0MzsJdm9sYXRpbGUgaW50ICppcDsKJiM0MzsJcGlkX3QgY2hpbGQ7CiYjNDM7CWludCBzeW5jWzJdOwomIzQzOwljaGFyIGdvID0gMTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJaXAgPSBwOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIDAsIHNoYXJlZCk7CQkvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovCiYjNDM7CWlmIChwaXBlKHN5bmMpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7cGlwZSgpJiMzNDspOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0ZvcmssIGNvbGxhcHNlIGluIHRoZSBjaGlsZCB3aGlsZSB0aGUgcGFyZW50IHJld3JpdGVzLi4uJiMzNDspOwomIzQzOwljaGlsZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFjaGlsZCkgewomIzQzOwkJaW50IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsKJiM0MzsJCWNsb3NlKHN5bmNbMF0pOwomIzQzOwkJb3BzLSZndDtmYXVsdChwLCBzaGFyZWQsIGhwYWdlX3BtZF9zaXplKTsJLyogcHJpdmF0ZSByZW1haW5kZXIgKi8KJiM0MzsJCS8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovCiYjNDM7CQlpZiAod3JpdGUoc3luY1sxXSwgJmFtcDtnbywgMSkgIT0gMSkKJiM0MzsJCQlfZXhpdChLU0ZUX0ZBSUwpOwomIzQzOwkJdXNsZWVwKDUwMDApOwomIzQzOwkJYy0mZ3Q7Y29sbGFwc2UoJiMzNDtDb2xsYXBzZSBhIHJhbmdlIHNoYXJlZCB3aXRoIGEgd3JpdGluZyBjby1zaGFyZXImIzM0OywKJiM0MzsJCQkgICAgcCwgMSwgb3BzLCB0cnVlKTsKJiM0MzsJCWNvbGxhcHNlX3N0YXR1cyA9IGV4aXRfc3RhdHVzOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJCWlmIChpcFtpICogc3RyaWRlXSAhPSBpICYjNDM7IDB4ZGVhZDAwMDApCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJaWYgKGkgPT0gbikKJiM0MzsJCQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CQllbHNlCiYjNDM7CQkJZmFpbCgmIzM0O0ZhaWw6IGNoaWxkIGNvbnRlbnQmIzM0Oyk7CiYjNDM7CQkvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqLwomIzQzOwkJaWYgKGV4aXRfc3RhdHVzICE9IEtTRlRfRkFJTCkKJiM0MzsJCQlleGl0X3N0YXR1cyA9IGNvbGxhcHNlX3N0YXR1czsKJiM0MzsJCW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJCV9leGl0KGV4aXRfc3RhdHVzKTsKJiM0MzsJfQomIzQzOwomIzQzOwljbG9zZShzeW5jWzFdKTsKJiM0MzsJaWYgKHJlYWQoc3luY1swXSwgJmFtcDtnbywgMSkgIT0gMSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2NoaWxkIG5ldmVyIHJlYWNoZWQgdGhlIGNvbGxhcHNlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVuc2hhcmUgb25lIHBhZ2UgYXQgYSB0aW1lLiAgQSBidXJzdCB3b3VsZCBicmVhayBDb1cgb24gYWxsIG9mIHRoZW0KJiM0MzsJICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS0KJiM0MzsJICogYW5kIHRoZSBjaGlsZCB3b3VsZCBjb2xsYXBzZSBwYWdlcyBhbHJlYWR5IGV4Y2x1c2l2ZSB0byBpdC4KJiM0MzsJICovCiYjNDM7CWkgPSAwOwomIzQzOwlkbyB7CiYjNDM7CQlpZiAoaSAmbHQ7IG4pCiYjNDM7CQkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CQlpJiM0MzsmIzQzOzsKJiM0MzsJCXVzbGVlcCgxMCAqIDEwMDApOwomIzQzOwl9IHdoaWxlICh3YWl0cGlkKGNoaWxkLCAmYW1wO3dzdGF0dXMsIFdOT0hBTkcpID09IDApOwomIzQzOwomIzQzOwkvKiBXaGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCwgc28gdGhlIGNoZWNrIGJlbG93IGlzIGV4YWN0LiAqLwomIzQzOwlmb3IgKDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KQomIzQzOwkJaXBbaSAqIHN0cmlkZV0gPSBpICYjNDM7IDB4YmVlZjAwMDA7CiYjNDM7CS8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovCiYjNDM7CWNoaWxkX3N0YXR1cyA9IFdJRkVYSVRFRCh3c3RhdHVzKSA/IFdFWElUU1RBVFVTKHdzdGF0dXMpIDogS1NGVF9GQUlMOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NoZWNrIHRoZSBwYXJlbnQgc2VlcyBvbmx5IGl0cyBvd24gd3JpdGVzLi4uJiMzNDspOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbjsgaSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSAmIzQzOyAweGJlZWYwMDAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwlpZiAoaSA9PSBuKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbDogcGFyZW50IGNvbnRlbnQmIzM0Oyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJLyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCYjMzk7cyB2ZXJkaWN0LiAqLwomIzQzOwlpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKQomIzQzOwkJZXhpdF9zdGF0dXMgPSBjaGlsZF9zdGF0dXM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwomIzQzO30KJiM0MzsKIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKIAkJCQkJICAgc3RydWN0IG1lbV9vcHMgKm9wcykKIHsKQEAgLTExNzUsNiAmIzQzOzEzMjMsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLAogCWtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCAmIzM0OyVzXG4mIzM0OywgX19mdW5jX18pOwogfQogCiYjNDM7LyogU21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCB3aWxsIGNvbnNpZGVyIGZvciBtVEhQIGNvbGxhcHNlLiAqLwomIzQzOyNkZWZpbmUgTUlOX01USFBfT1JERVIgMgomIzQzOwomIzQzOy8qCiYjNDM7ICogT3JkZXItcGFyYW1ldGVyaXplZCBjb2xsYXBzZSBjYXNlcyBmb3IgdGhlIG10aHBfa2h1Z2VwYWdlZCBjb250ZXh0LiAgV2hhdAomIzQzOyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93CiYjNDM7ICogZGV0ZWN0aW9uOiB3aGljaCBhbGlnbmVkIHdpbmRvdyBjb2xsYXBzZWQsIGFuZCB3aGljaCBvZiBpdHMgbmVpZ2hib3VycyBkaWQKJiM0MzsgKiBub3QuICBjaGVja19odWdlKCkgYW5zd2VycyBob3cgbWFueSBmb2xpb3Mgb2YgdGhlIG9yZGVyIHRoZSByYW5nZSBob2xkcywKJiM0MzsgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci4KJiM0MzsgKgomIzQzOyAqIFRoZSByZWdpb24gaXMgZmF1bHRlZCBiZWZvcmUgTUFEVl9IVUdFUEFHRSwgYW5kIHRoZSB0YXJnZXQgb3JkZXIgaXMgb25seQomIzQzOyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlCiYjNDM7ICogcHJvZHVjdCBjYW4gb25seSBoYXZlIGNvbWUgZnJvbSBraHVnZXBhZ2VkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIHBhZ2Vfc2l6ZSAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGUKJiM0MzsJICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmUKJiM0MzsJICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZQomIzQzOwkgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW4KJiM0MzsJICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLgomIzQzOwkgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvbgomIzQzOwkgKiB0b3Agb2YgdGhpcy4KJiM0MzsJICovCiYjNDM7CXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgTlJfT1JERVJTOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7CiYjNDM7fQomIzQzOwomIzQzOy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICYjNDM7IGxlbikgaXMgYmFja2VkIGF0IHRoZSB0YXJnZXQgb3JkZXIuICovCiYjNDM7c3RhdGljIGJvb2wgd2luZG93X25vdF9jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbikKJiM0Mzt7CiYjNDM7CXNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7CiYjNDM7CWNoYXIgKmFkZHIgPSBwOwomIzQzOwomIzQzOwlmb3IgKDsgbGVuICZndDs9IHdpbmRvdzsgYWRkciAmIzQzOz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7CiYjNDM7CQlpZiAod2luZG93X2NvbGxhcHNlZChhZGRyLCB3aW5kb3cpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKQomIzQzO3sKJiM0MzsJLyogV2FpdCB1cCB0byAzMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwlwID0gb3BzLSZndDtzZXR1cF9hcmVhKDEpOwomIzQzOwlvcHMtJmd0O2ZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CWlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7VW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxuJiMzNDspOwomIzQzOwomIzQzOwltYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTsKJiM0MzsJa3NmdF9wcmludF9tc2coJiMzNDtDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSAmYW1wOyZhbXA7CiYjNDM7CQkgd2luZG93X25vdF9jb2xsYXBzZWQocCAmIzQzOyAyICogd2luZG93LAomIzQzOwkJCQkgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgIHN0cnVjdCBtZW1fb3BzICpvcHMpCiYjNDM7ewomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwltdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7CiYjNDM7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIHdpbmRvdyB3aXRoIHNpbmdsZSBQVEUgZW50cnkgcHJlc2VudC4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKQomIzQzOwkJc3VjY2VzcygmIzM0O09LJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlmYWlsKCYjMzQ7RmFpbCYjMzQ7KTsKJiM0MzsKJiM0MzsJdmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7CiYjNDM7CW9wcy0mZ3Q7Y2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0MzsJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgJiMzNDslc1xuJiMzNDssIF9fZnVuY19fKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywKJiM0MzsJCQkJCSBzdHJ1Y3QgbWVtX29wcyAqb3BzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJc2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTsKJiM0MzsJdm9pZCAqcDsKJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwOwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJcCA9IG9wcy0mZ3Q7c2V0dXBfYXJlYSgxKTsKJiM0MzsJb3BzLSZndDtmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJaWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XG4mIzM0Oyk7CiYjNDM7CiYjNDM7CW1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpOwomIzQzOwlrc2Z0X3ByaW50X21zZygmIzM0O0NvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLiYjMzQ7KTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCB3aW5kb3cpICZhbXA7JmFtcDsKJiM0MzsJCSB3aW5kb3dfbm90X2NvbGxhcHNlZChwICYjNDM7IHdpbmRvdywgd2luZG93KSkKJiM0MzsJCXN1Y2Nlc3MoJiMzNDtPSyYjMzQ7KTsKJiM0MzsJZWxzZQomIzQzOwkJZmFpbCgmIzM0O0ZhaWwmIzM0Oyk7CiYjNDM7CiYjNDM7CXZhbGlkYXRlX21lbW9yeShwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTsKJiM0MzsJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsCiYjNDM7CQkJCQkgc3RydWN0IG1lbV9vcHMgKm9wcykKJiM0Mzt7CiYjNDM7CWludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSOwomIzQzOwlzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzOwomIzQzOwl2b2lkICpwOwomIzQzOwomIzQzOwkvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqLwomIzQzOwlpZiAoc291cmNlX29yZGVyICZndDs9IGNvbGxhcHNlX29yZGVyIHx8CiYjNDM7CSAgICAhKHRocF9zdXBwb3J0ZWRfb3JkZXJzKCkgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBzb3VyY2Vfb3JkZXIpKSkgewomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9za2lwKCYjMzQ7JXM6IG5vIHNvdXJjZSBvcmRlciBiZWxvdyB0YXJnZXRcbiYjMzQ7LAomIzQzOwkJCQkgICAgICBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbXRocF9wdXNoX3RhcmdldF9vcmRlcigpOwomIzQzOwomIzQzOwkvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqLwomIzQzOwlzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpOwomIzQzOwlzZXR0aW5ncy5odWdlcGFnZXNbc291cmNlX29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUzsKJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CXAgPSBvcHMtJmd0O3NldHVwX2FyZWEoMSk7CiYjNDM7CW9wcy0mZ3Q7ZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwl0aHBfcG9wX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBvcmRlciBpcyBlbmFibGVkIGFuZCBzdXBwb3J0ZWQsIGJ1dCB0aGUgYWxsb2NhdG9yIGNhbiBzdGlsbCBmYWxsCiYjNDM7CSAqIGJhY2sgdW5kZXIgZnJhZ21lbnRhdGlvbi4gIFRoYXQgbGVhdmVzIG5vdGhpbmcgdG8gY29sbGFwc2UgZnJvbSwKJiM0MzsJICogd2hpY2ggaXMgdGhlIG1hY2hpbmUmIzM5O3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsCiYjNDM7CQkJCQkgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7CiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O05vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi4mIzM0Oywgc291cmNlX29yZGVyKTsKJiM0MzsJCXNraXAoJiMzNDtTa2lwJiMzNDspOwomIzQzOwkJb3BzLSZndDtjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7CiYjNDM7CWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uJiMzNDssCiYjNDM7CQkgICAgICAgc291cmNlX29yZGVyKTsKJiM0MzsJaWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpCiYjNDM7CQlmYWlsKCYjMzQ7VGltZW91dCYjMzQ7KTsKJiM0MzsJZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpCiYjNDM7CQlzdWNjZXNzKCYjMzQ7T0smIzM0Oyk7CiYjNDM7CWVsc2UKJiM0MzsJCWZhaWwoJiMzNDtGYWlsJiMzNDspOwomIzQzOwomIzQzOwl2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpOwomIzQzOwlvcHMtJmd0O2NsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CXRocF9wb3Bfc2V0dGluZ3MoKTsKJiM0MzsJa3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsICYjMzQ7JXNcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKIHsKIAlmcHJpbnRmKHN0ZGVyciwgJiMzNDtcblVzYWdlOiAuL2todWdlcGFnZWQgW09QVElPTlNdICZsdDt0ZXN0IHR5cGUmZ3Q7IFtkaXJdXG5cbiYjMzQ7KTsKQEAgLTExOTIsMTEgJiM0MzsxNTUzLDE1IEBAIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiAJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdC1zOiBtVEhQIHNpemUsIGV4cHJlc3NlZCBhcyBwYWdlIG9yZGVyLlxuJiMzNDspOwogCWZwcmludGYoc3RkZXJyLAkmIzM0O1x0XHQgICAgRGVmYXVsdHMgdG8gMC4gVXNlIHRoaXMgc2l6ZSBmb3IgYW5vbiBvciBzaG1lbSBhbGxvY2F0aW9ucy5cbiYjMzQ7KTsKIAlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cbiYjMzQ7KTsKJiM0MzsJZnByaW50ZihzdGRlcnIsCSYjMzQ7XHRcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxuJiMzNDspOwomIzQzOwlmcHJpbnRmKHN0ZGVyciwJJiMzNDtcdFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXG4mIzM0Oyk7CiAJZXhpdCgxKTsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKJiM0MzsJYm9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlOwogCWludCBvcHQ7CiAJY2hhciAqYnVmOwogCWNvbnN0IGNoYXIgKnRva2VuOwpAQCAtMTIwOCw2ICYjNDM7MTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O2MmIzM5OzoKIAkJCWNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpOwomIzQzOwkJCWNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlICYjMzk7aCYjMzk7OgogCQlkZWZhdWx0OgpAQCAtMTIxNSwxMiAmIzQzOzE1ODEsMjUgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAomIzQzOwkvKgomIzQzOwkgKiBCb3RoIG9yZGVycyBlbmQgdXAgYXMgYXJyYXkgaW5kaWNlcyBhbmQgc2hpZnQgY291bnRzLCBzbyBuZWl0aGVyCiYjNDM7CSAqIGNhbiBiZSBuZWdhdGl2ZSwgYW5kIGEgemVybyBjb2xsYXBzZSBvcmRlciBhc2tzIGZvciBiYXNlIHBhZ2VzLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFub25fb3JkZXIgJmx0OyAwIHx8IGFub25fb3JkZXIgJmd0OyBocGFnZV9wbWRfb3JkZXIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstcyB0YWtlcyBhbiBvcmRlciBpbiAwLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTsKJiM0MzsJaWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuICZhbXA7JmFtcDsKJiM0MzsJICAgIChjb2xsYXBzZV9vcmRlciAmbHQ7PSAwIHx8IGNvbGxhcHNlX29yZGVyICZndDs9IGhwYWdlX3BtZF9vcmRlcikpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDstYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXG4mIzM0OywKJiM0MzsJCQkJICAgaHBhZ2VfcG1kX29yZGVyIC0gMSwgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwogCWFyZ3YgJiM0Mzs9IG9wdGluZDsKIAlhcmdjIC09IG9wdGluZDsKIAogCWlmIChhcmdjID09IDApIHsKLQkJLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KJiM0MzsJCS8qIEV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyBubyBhcmd1bWVudCBvZiBpdHMgb3duOiBhbm9uLCBldmVyeSBjb250ZXh0ICovCiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwomIzQzOwkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwogCQltYWR2aXNlX2NvbnRleHQgPSAgJmFtcDtfX21hZHZpc2VfY29udGV4dDsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJCXJldHVybjsKQEAgLTEyMzEsMTMgJiM0MzsxNjEwLDE5IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDthbGwmIzM0OykpIHsKIAkJa2h1Z2VwYWdlZF9jb250ZXh0ID0gICZhbXA7X19raHVnZXBhZ2VkX2NvbnRleHQ7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7CiAJCW1hZHZpc2VfY29udGV4dCA9ICAmYW1wO19fbWFkdmlzZV9jb250ZXh0OwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqICYjMzQ7YWxsJiMzNDsgc3dlZXBzIHRoZSBtVEhQIGNvbnRleHQgaW4sIGJ1dCBpdCBvbmx5IGhhcyBhbm9uCiYjNDM7CQkgKiBjYXNlczogc3RlcCBpdCBhc2lkZSBmb3IgdGhlIG90aGVyIG1lbV90eXBlcyByYXRoZXIgdGhhbgomIzQzOwkJICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi4KJiM0MzsJCSAqLwomIzQzOwkJbXRocF9jb250ZXh0X2ltcGxpZWQgPSB0cnVlOwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDtraHVnZXBhZ2VkJiMzNDspKSB7CiAJCWtodWdlcGFnZWRfY29udGV4dCA9ICAmYW1wO19fa2h1Z2VwYWdlZF9jb250ZXh0OwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDttdGhwX2todWdlcGFnZWQmIzM0OykpIHsKIAkJbXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgJmFtcDtfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0OwotCQlpZiAoY29sbGFwc2Vfb3JkZXIgJmx0Oz0gMCB8fCBjb2xsYXBzZV9vcmRlciAmZ3Q7PSBocGFnZV9wbWRfb3JkZXIpCi0JCQl1c2FnZSgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgJiMzNDttYWR2aXNlJiMzNDspKSB7CiAJCW1hZHZpc2VfY29udGV4dCA9ICAmYW1wO19fbWFkdmlzZV9jb250ZXh0OwogCX0gZWxzZSB7CkBAIC0xMjUzLDIwICYjNDM7MTYzOCwyMCBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCQlyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gICZhbXA7X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzOwogCQlhbm9uX29wcyA9ICZhbXA7X19hbm9uX29wczsKIAkJc2htZW1fb3BzID0gJmFtcDtfX3NobWVtX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQotCQkJdXNhZ2UoKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O2Fub24mIzM0OykpIHsKIAkJYW5vbl9vcHMgPSAmYW1wO19fYW5vbl9vcHM7CiAJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgJiMzNDtmaWxlJiMzNDspKSB7CiAJCXJlYWRfb25seV9maWxlX29wcyA9ICAmYW1wO19fcmVhZF9vbmx5X2ZpbGVfb3BzOwogCQlyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgJmFtcDtfX3JlYWRfd3JpdGVfZmlsZV9yZWFkX29wczsKIAkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9ICAmYW1wO19fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wczsKLQkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KQomIzQzOwkJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ICZhbXA7JmFtcDsgIW10aHBfY29udGV4dF9pbXBsaWVkKQogCQkJdXNhZ2UoKTsKJiM0MzsJCW10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAmIzM0O3NobWVtJiMzNDspKSB7CiAJCXNobWVtX29wcyA9ICZhbXA7X19zaG1lbV9vcHM7Ci0JCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkKJiM0MzsJCWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCAmYW1wOyZhbXA7ICFtdGhwX2NvbnRleHRfaW1wbGllZCkKIAkJCXVzYWdlKCk7CiYjNDM7CQltdGhwX2todWdlcGFnZWRfY29udGV4dCA9IE5VTEw7CiAJfSBlbHNlIHsKIAkJdXNhZ2UoKTsKIAl9CkBAIC0xMjg4LDkgJiM0MzsxNjczLDEwIEBAIHN0cnVjdCB0ZXN0X2Nhc2UgewogCXN0cnVjdCBtZW1fb3BzICpvcHM7CiAJY29uc3QgY2hhciAqZGVzYzsKIAl0ZXN0X2ZuIGZuOwomIzQzOwlpbnQgb3JkZXI7CQkvKiBtVEhQIGNvbnRleHRzOiB0aGUgY29sbGFwc2Ugb3JkZXIgKi8KIH07CiAKLSNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgNjQKJiM0MzsjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1Ngogc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107CiBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAKQEAgLTEzMDMsNiAmIzQzOzE2ODksNyBAQCBzdGF0aWMgaW50IG5yX3Rlc3RfY2FzZXM7CiAJCQkub3BzCT0gbywJCQkJCVwKIAkJCS5kZXNjCT0gI3QsCQkJCQlcCiAJCQkuZm4JPSB0LAkJCQkJXAomIzQzOwkJCS5vcmRlcgk9IGNvbGxhcHNlX29yZGVyLAkJCVwKIAkJfTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIAl9IHdoaWxlICgwKQpAQCAtMTM0Myw4ICYjNDM7MTczMCw3MyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAKIAlwYXJzZV90ZXN0X3R5cGUoYXJnYywgYXJndik7CiAKJiM0MzsJaWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7CiYjNDM7CQl1bnNpZ25lZCBsb25nIG9yZGVycyA9IHRocF9zdXBwb3J0ZWRfb3JkZXJzKCk7CiYjNDM7CiYjNDM7CQlpZiAoY29sbGFwc2Vfb3JkZXJfZ2l2ZW4pIHsKJiM0MzsJCQkvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi8KJiM0MzsJCQlpZiAoIShvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBjb2xsYXBzZV9vcmRlcikpKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0O09yZGVyICVkIGlzIG5vdCBhIHN1cHBvcnRlZCBhbm9uIFRIUCBvcmRlclxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgY29sbGFwc2Vfb3JkZXIpOwomIzQzOwkJCWlmIChjb2xsYXBzZV9vcmRlciAmbHQ7PSBhbm9uX29yZGVyKQomIzQzOwkJCQlrc2Z0X2V4aXRfc2tpcCgmIzM0Oy1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXG4mIzM0OywKJiM0MzsJCQkJCSAgICAgICBjb2xsYXBzZV9vcmRlciwgYW5vbl9vcmRlcik7CiYjNDM7CQkJY29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycyYjNDM7JiM0MztdID0gY29sbGFwc2Vfb3JkZXI7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCS8qCiYjNDM7CQkJICogT3RoZXJ3aXNlIGV2ZXJ5IG9yZGVyIGEgY29sbGFwc2UgY291bGQgcHJvZHVjZS4gIC1zCiYjNDM7CQkJICogbWFrZXMgdGhlIGZhdWx0IHBhdGggaGFuZCBvdXQgZm9saW9zIG9mIHRoYXQgb3JkZXIsCiYjNDM7CQkJICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6CiYjNDM7CQkJICogdGhlIHNvdXJjZXMgYXJlIGFscmVhZHkgdGhlIHNpemUgYmVpbmcgYXNrZWQgZm9yLgomIzQzOwkJCSAqLwomIzQzOwkJCWludCBmaXJzdCA9IGFub25fb3JkZXIgJiM0MzsgMTsKJiM0MzsKJiM0MzsJCQlpZiAoZmlyc3QgJmx0OyBNSU5fTVRIUF9PUkRFUikKJiM0MzsJCQkJZmlyc3QgPSBNSU5fTVRIUF9PUkRFUjsKJiM0MzsJCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgJmx0OyBocGFnZV9wbWRfb3JkZXI7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJCWlmIChvcmRlcnMgJmFtcDsgKDFVTCAmbHQ7Jmx0OyBpKSkKJiM0MzsJCQkJCWNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMmIzQzOyYjNDM7XSA9IGk7CiYjNDM7CQkJfQomIzQzOwkJCWlmICghbnJfY29sbGFwc2Vfb3JkZXJzKQomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O21USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxuJiMzNDspOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkgewomIzQzOwkJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwkJaWYgKHBhZ2VtYXBfZmQgJmx0OyAwKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O29wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKSYjMzQ7KTsKJiM0MzsJCWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CQlpZiAoa3BhZ2VmbGFnc19mZCAmbHQ7IDApCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7b3BlbigvcHJvYy9rcGFnZWZsYWdzKSYjMzQ7KTsKJiM0MzsJfQomIzQzOwogCXNldGJ1ZihzdGRvdXQsIE5VTEwpOwogCiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBwYWdlIGNhY2hlIGNhcHMgZm9saW8gb3JkZXIgYXQgTUFYX1BBR0VDQUNIRV9PUkRFUiwgd2hpY2ggaXMKJiM0MzsJICogYmVsb3cgdGhlIFBNRCBvcmRlciBvbiBhcm02NCB3aXRoIDY0SyBwYWdlcy4gIEEgUE1ELXNpemVkIHBhZ2UgY2FjaGUKJiM0MzsJICogZm9saW8gaXMgaW1wb3NzaWJsZSB0aGVyZSwgc28gdGhlIGtlcm5lbCByZWZ1c2VzIHRoZXNlIGNvbGxhcHNlcyBieQomIzQzOwkgKiBkZXNpZ24gYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4gIFRoZSBjYXAgaXMgbm90IHNobWVtLXNwZWNpZmljOgomIzQzOwkgKiBpdCBydWxlcyBvdXQgcmVndWxhciBmaWxlcyB0b28sIGFuZCB0aGUgcGVyLW9yZGVyIHNobWVtX2VuYWJsZWQKJiM0MzsJICogY29udHJvbHMgZXhpc3QgZm9yIGV4YWN0bHkgdGhlIG9yZGVycyBpdCBhbGxvd3MsIHdoaWNoIGlzIHdoYXQgbWFrZXMKJiM0MzsJICogdGhlbSByZWFkYWJsZSBoZXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCEodGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGhwYWdlX3BtZF9vcmRlcikpKSB7CiYjNDM7CQlpZiAoc2htZW1fb3BzKSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cbiYjMzQ7KTsKJiM0MzsJCQlzaG1lbV9vcHMgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJaWYgKHJlYWRfb25seV9maWxlX29wcykgewomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7bm8gUE1ELW9yZGVyIHBhZ2UgY2FjaGUgZm9saW86IHNraXBwaW5nIGZpbGVcbiYjMzQ7KTsKJiM0MzsJCQlyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMOwomIzQzOwkJCXJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7CiYjNDM7CQkJcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7CiYjNDM7CQl9CiYjNDM7CQlpZiAoIWFub25fb3BzICZhbXA7JmFtcDsgIXNobWVtX29wcyAmYW1wOyZhbXA7ICFyZWFkX29ubHlfZmlsZV9vcHMpCiYjNDM7CQkJa3NmdF9leGl0X3NraXAoJiMzNDtOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xuJiMzNDspOwomIzQzOwl9CiYjNDM7CiAJZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxOwogCWRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19zd2FwID0gaHBhZ2VfcG1kX25yIC8gODsKIAlkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjsKQEAgLTEzNjIsNyAmIzQzOzE4MTQsMTcgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIGtodWdlcGFnZWRfY29udGV4dCwgc2htZW1fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CWZvciAoaW50IGkgPSAwOyBpICZsdDsgbnJfY29sbGFwc2Vfb3JkZXJzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJY29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07CiYjNDM7CQlURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwomIzQzOwkJVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJCVRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CQlURVNUKGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiYjNDM7CX0KJiM0MzsKIAlURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpOwogCVRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTM3MCwxMSAmIzQzOzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJVEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHNobWVtX29wcyk7CiAKIAlURVNUKGNvbGxhcHNlX2VtcHR5LCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQlURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpOwogCVRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpOwogCi0JVEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKLQogCVRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7CiAJVEVTVChjb2xsYXBzZV9zaW5nbGVfcHRlX2VudHJ5LCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7CkBAIC0xNDI5LDYgJiM0MzsxODg4LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogCVRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKIAlURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsJVEVTVChjb2xsYXBzZV9mb3JrX2Nvd19yYWNlLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTsKJiM0MzsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7CiAJVEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTsKIAlURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpOwpAQCAtMTQ0NCw3ICYjNDM7MTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBucl90ZXN0X2Nhc2VzOyBpJiM0MzsmIzQzOykgewogCQlzdHJ1Y3QgdGVzdF9jYXNlICp0ID0gJmFtcDt0ZXN0X2Nhc2VzW2ldOwogCi0JCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXG4mIzM0OywgdC0mZ3Q7ZGVzYywgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJaWYgKHQtJmd0O2N0eCA9PSAmYW1wO19fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQpIHsKJiM0MzsJCQljb2xsYXBzZV9vcmRlciA9IHQtJmd0O29yZGVyOwomIzQzOwkJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7XG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxuJiMzNDssCiYjNDM7CQkJCSAgICAgICB0LSZndDtkZXNjLCB0LSZndDtjdHgtJmd0O25hbWUsIHQtJmd0O29wcy0mZ3Q7bmFtZSwKJiM0MzsJCQkJICAgICAgIHQtJmd0O29yZGVyKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJa3NmdF9wcmludF9tc2coJiMzNDtcbiMgUnVuIHRlc3Q6ICVzICglczolcylcbiYjMzQ7LCB0LSZndDtkZXNjLAomIzQzOwkJCQkgICAgICAgdC0mZ3Q7Y3R4LSZndDtuYW1lLCB0LSZndDtvcHMtJmd0O25hbWUpOwomIzQzOwkJfQogCQl0LSZndDtmbih0LSZndDtjdHgsIHQtJmd0O29wcyk7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjY2ODJiYmFlMGE4ZjgKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuYwpAQCAtMCwwICYjNDM7MSw1ODkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuCiYjNDM7ICoKJiM0MzsgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGlucwomIzQzOyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW4KJiM0MzsgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOgomIzQzOyAqCiYjNDM7ICogICBzdGVwcGVkCWtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2gKJiM0MzsgKgkJa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDsKJiM0MzsgKiAgIGZyZWUJa2h1Z2VwYWdlZCBsZWZ0IHRvIHJ1biAoc2Nhbl9zbGVlcF9taWxsaXNlY3M9MCksIGZvciBzb2FrOwomIzQzOyAqICAgbWFkdmlzZQlNQURWX0NPTExBUFNFIGFuZCBNQURWX0RPTlRORUVEIGluIGEgbG9vcC4KJiM0MzsgKgomIzQzOyAqIEFsbCBhbm9uIFRIUCBvcmRlcnMgYXJlIGVuYWJsZWQgKGluaGVyaXQpLiAgT2NjdXBhbmN5IHJ1bnMgYXQgYm90aCBlbmRzCiYjNDM7ICogb2Ygd2hhdCBtVEhQIGNvbGxhcHNlIHN1cHBvcnRzOiBtYXhfcHRlc19ub25lIDAsIHdoZXJlIGEgd2luZG93IG11c3QgYmUKJiM0MzsgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzCiYjNDM7ICogY29sbGFwc2VzIHRvby4gIEEgaG9sZSBpcyB6ZXJvLWZpbGxlZCBpbnRvIHRoZSBuZXcgZm9saW8gcmF0aGVyIHRoYW4KJiM0MzsgKiBjb3BpZWQsIGFuZCB0aGUgcmFjaW5nIE1BRFZfRE9OVE5FRUQga2VlcHMgbW92aW5nIHdoaWNoIHNsb3RzIGFyZSBob2xlcy4KJiM0MzsgKgomIzQzOyAqIEV2ZXJ5IGNvbWJpbmF0aW9uIGFsc28gcnVucyB1bmRlciBtZW1vcnkgcHJlc3N1cmU6IE1BRFZfUEFHRU9VVCBjeWNsaW5nCiYjNDM7ICogb24gYSBkZWRpY2F0ZWQgbmVpZ2hib3VyIHJlZ2lvbiAoc3dhcCB0cmFmZmljIGFuZCBMUlUgY2h1cm47IGxlZnQgb3V0CiYjNDM7ICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlcgomIzQzOyAqIGxvb3AgKGNvbXBhY3Rpb24gbWlncmF0ZXMgc291cmNlIGZvbGlvcywgcmFjaW5nIGNvbGxhcHNlJiMzOTtzIGZyZWV6ZQomIzQzOyAqIHdpdGggcmVmY291bnQgZWxldmF0aW9uIGFuZCBtaWdyYXRpb24gZW50cmllcyBvZiBpdHMgb3duKS4KJiM0MzsgKgomIzQzOyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvcgomIzQzOyAqIHplcm8gKE1BRFZfRE9OVE5FRUQpLCBuZXZlciBhbnl0aGluZyBlbHNlLiAgVGhlIGZhdWx0ZXJzIGFuZCB0aGUgZm9yawomIzQzOyAqIGNoaWxkcmVuIGNoZWNrIHRoYXQgY29udGludW91c2x5LCBhIGZpbmFsIHN3ZWVwIGNoZWNrcyBpdCBvbmNlIG1vcmUsIHBsdXMKJiM0MzsgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluCiYjNDM7ICogZG1lc2csIHdoaWNoIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5zcGVjdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIF9HTlVfU09VUkNFCiYjNDM7I2luY2x1ZGUgJmx0O2Vycm5vLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3B0aHJlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtrc2VsZnRlc3QuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bV91dGlsLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7aHVnZXBhZ2Vfc2V0dGluZ3MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDsuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEJBU0VfQUREUgkoKHZvaWQgKikoMVVMICZsdDsmbHQ7IDMwKSkKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZAomIzQzOyAqIGFyZWFzIHRoZSByYWNpbmcgdGhyZWFkcyBzcHJlYWQgYWNyb3NzLCBwbHVzIG9uZSBhcmVhIG93bmVkIGJ5IHRoZQomIzQzOyAqIG1yZW1hcCB0aHJlYWQuIE1vcmUgYXJlYXMgbWVhbnMgbW9yZSBpbmRlcGVuZGVudCByZWdpb25zIGNvbGxhcHNpbmcKJiM0MzsgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZAomIzQzOyAqIGhvc3QgLS0gb3IgdW5kZXIgZW11bGF0aW9uLCB3aGVyZSBhIDUxMk0gUE1EIChhcm02NC82NEspIG1ha2VzIHRoZQomIzQzOyAqIGRlZmF1bHQgcGxheWdyb3VuZCBtdWx0aS1naWdhYnl0ZSAtLSBwYXNzIC1hIHRvIHNocmluayBpdC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERFRkFVTFRfU0hBUkVEX0FSRUFTCTMKJiM0MztzdGF0aWMgaW50IG5yX3NoYXJlZF9hcmVhczsKJiM0MztzdGF0aWMgaW50IG5yX2FyZWFzOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKJiM0MztzdGF0aWMgY2hhciAqcmVnaW9uOwkJLyogTlJfQVJFQVMgKiBocGFnZV9wbWRfc2l6ZSAqLwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfYXJlYTsJLyogcmVnaW9uICYjNDM7IE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqLwomIzQzO3N0YXRpYyBjaGFyICptcmVtYXBfc2NyYXRjaDsJLyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovCiYjNDM7c3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTsJLyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqLwomIzQzO3N0YXRpYyBzaXplX3QgcGFnZW91dF9zaXplOwomIzQzO3N0YXRpYyBpbnQgZ3VwX2ZkID0gLTE7CiYjNDM7c3RhdGljIHZvbGF0aWxlIGludCBzdG9wOwomIzQzO3N0YXRpYyB2b2xhdGlsZSBpbnQgY29ycnVwdGVkOwomIzQzOwomIzQzO3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpcGFnZV9pZHggKiAyNjU0NDM1NzYxVTsKJiM0MzsKJiM0MzsJcmV0dXJuIHZhbCA/IHZhbCA6IDE7CS8qIG5ldmVyIGNvbGxpZGVzIHdpdGggdGhlIHplcm8tZmlsbCAqLwomIzQzO30KJiM0MzsKJiM0MzsvKiBaZXJvIG1lYW5zIG5ldmVyIHdyaXR0ZW47IGFueXRoaW5nIGVsc2UgbXVzdCBiZSB0aGlzIHBhZ2UmIzM5O3MgcGF0dGVybiAqLwomIzQzO3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbCkKJiM0Mzt7CiYjNDM7CSp2YWwgPSAqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwlyZXR1cm4gKnZhbCAmYW1wOyZhbXA7ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCB2YWw7CiYjNDM7CiYjNDM7CWlmIChwYWdlX2lzX2NvcnJ1cHQocGFnZV9pZHgsICZhbXA7dmFsKSkgewomIzQzOwkJY29ycnVwdGVkID0gMTsKJiM0MzsJCWtzZnRfcHJpbnRfbXNnKCYjMzQ7Q29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJICAgICAgIHBhZ2VfaWR4LCB2YWwsIHBhdHRlcm4ocGFnZV9pZHgpKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZF9wYWdlKHVuc2lnbmVkIGludCAqc2VlZCkKJiM0Mzt7CiYjNDM7CXJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJiMzOTtzIGFyZWEgKi8KJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KQomIzQzO3sKJiM0MzsJdW5zaWduZWQgbG9uZyBsZWZ0ID0gc2hhcmVkX3BhZ2VzKCkgLSBwYWdlX2lkeDsKJiM0MzsKJiM0MzsJcmV0dXJuIHdhbnQgJmx0OyBsZWZ0ID8gd2FudCA6IGxlZnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpmYXVsdGVyX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsKJiM0MzsJCWlmIChyYW5kX3IoJmFtcDtzZWVkKSAmYW1wOyAxKQomIzQzOwkJCSoodW5zaWduZWQgaW50ICopKHJlZ2lvbiAmIzQzOyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPQomIzQzOwkJCQlwYXR0ZXJuKHBhZ2VfaWR4KTsKJiM0MzsJCWVsc2UKJiM0MzsJCQljaGVja19wYWdlKHBhZ2VfaWR4KTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwomIzQzOwl3aGlsZSAoIXN0b3ApIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoJmFtcDtzZWVkKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgbnIgPSAxVUwgJmx0OyZsdDsgKHJhbmRfcigmYW1wO3NlZWQpICUgNik7CS8qIDEuLjMyIHBhZ2VzICovCiYjNDM7CiYjNDM7CQkvKgomIzQzOwkJICogT25jZSBpbiBhIHdoaWxlIHphcCBhIHdob2xlIFBNRC1hbGlnbmVkIGFyZWE6IG9ubHkgYSB6YXAKJiM0MzsJCSAqIHNwYW5uaW5nIHRoZSBmdWxsIHRhYmxlIHRyaWdnZXJzIHRoZSBlbXB0eS10YWJsZSByZWNsYWltCiYjNDM7CQkgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYQomIzQzOwkJICogY29sbGFwc2UgdGhhdCBpcyBtaWR3YXkgdGhyb3VnaCBpdC4gIFN1Yi10YWJsZSB6YXBzIG5ldmVyCiYjNDM7CQkgKiByZWFjaCB0aGF0IHBhdGguCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghKHJhbmRfcigmYW1wO3NlZWQpICUgNjQpKSB7CiYjNDM7CQkJdW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggLwomIzQzOwkJCQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKTsKJiM0MzsKJiM0MzsJCQltYWR2aXNlKHJlZ2lvbiAmIzQzOyBhcmVhICogaHBhZ2VfcG1kX3NpemUsCiYjNDM7CQkJCWhwYWdlX3BtZF9zaXplLCBNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJbWFkdmlzZShyZWdpb24gJiM0MzsgcGFnZV9pZHggKiBwYWdlX3NpemUsCiYjNDM7CQkJCXJvb21fZnJvbShwYWdlX2lkeCwgbnIpICogcGFnZV9zaXplLAomIzQzOwkJCQlNQURWX0RPTlRORUVEKTsKJiM0MzsJCX0KJiM0MzsJCXVzbGVlcChyYW5kX3IoJmFtcDtzZWVkKSAlIDUwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJc3RydWN0IGd1cF90ZXN0IGd1cCA9IHt9OwomIzQzOwkJdW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZSgmYW1wO3NlZWQpOwomIzQzOwomIzQzOwkJdW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpOwomIzQzOwomIzQzOwkJZ3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICYjNDM7IHBhZ2VfaWR4ICogcGFnZV9zaXplKTsKJiM0MzsJCWd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7CiYjNDM7CQlndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjsKJiM0MzsJCWd1cC5ndXBfZmxhZ3MgPSAxOwkvKiBGT0xMX1dSSVRFICovCiYjNDM7CQkvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovCiYjNDM7CQlpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgJmFtcDtndXApOwomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQlwaWRfdCBwaWQgPSBmb3JrKCk7CiYjNDM7CiYjNDM7CQlpZiAocGlkID09IDApIHsKJiM0MzsJCQl1bnNpZ25lZCBpbnQgdmFsOwomIzQzOwkJCWludCBiYWQgPSAwOwomIzQzOwomIzQzOwkJCS8qCiYjNDM7CQkJICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkCiYjNDM7CQkJICogc3Rkb3V0JiMzOTtzIGxvY2sgd2hlbiB3ZSBmb3JrZWQsIGFuZCBwcmludGluZyB1bmRlciBhbgomIzQzOwkJCSAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlCiYjNDM7CQkJICogZXhpdCBzdGF0dXMgc2F5cy4KJiM0MzsJCQkgKi8KJiM0MzsJCQlmb3IgKGludCBpID0gMDsgaSAmbHQ7IDE2OyBpJiM0MzsmIzQzOykKJiM0MzsJCQkJYmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoJmFtcDtzZWVkKSwgJmFtcDt2YWwpOwomIzQzOwkJCV9leGl0KGJhZCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAocGlkICZndDsgMCkgewomIzQzOwkJCWludCB3c3RhdHVzOwomIzQzOwomIzQzOwkJCWlmICh3YWl0cGlkKHBpZCwgJmFtcDt3c3RhdHVzLCAwKSAmbHQ7IDApCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O3dhaXRwaWQoKSYjMzQ7KTsKJiM0MzsJCQkvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqLwomIzQzOwkJCWlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKQomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJfQomIzQzOwkJdXNsZWVwKHJhbmRfcigmYW1wO3NlZWQpICUgMjAwMCk7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7CiYjNDM7CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJdm9pZCAqcDsKJiM0MzsKJiM0MzsJCXAgPSBtcmVtYXAobXJlbWFwX2FyZWEsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX3NjcmF0Y2gpOwomIzQzOwkJaWYgKHAgPT0gTUFQX0ZBSUxFRCkKJiM0MzsJCQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttcmVtYXAoKSBhd2F5JiMzNDspOwomIzQzOwkJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyA4OyBpJiM0MzsmIzQzOykKJiM0MzsJCQltcmVtYXBfc2NyYXRjaFsocmFuZF9yKCZhbXA7c2VlZCkgJQomIzQzOwkJCQkoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxOwomIzQzOwkJcCA9IG1yZW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCSAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7CiYjNDM7CQlpZiAocCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21yZW1hcCgpIGJhY2smIzM0Oyk7CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudAomIzQzOyAqIGNoZWNrIGlzIGV4YWN0OiBhIHBhZ2Ugb3V0IGFuZCBiYWNrIHRocm91Z2ggc3dhcCBtdXN0IHByZXNlcnZlIHRoZQomIzQzOyAqIHBhdHRlcm4sIGFuZCBub3RoaW5nIGVsc2UgZXZlciB3cml0ZXMgaGVyZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCAqcGFnZW91dF9mbih2b2lkICphcmcpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZzsKJiM0MzsJdW5zaWduZWQgbG9uZyBuciA9IHBhZ2VvdXRfc2l6ZSAvIHBhZ2Vfc2l6ZTsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgbnI7IGkmIzQzOyYjNDM7KQomIzQzOwkJKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICYjNDM7IGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTsKJiM0MzsKJiM0MzsJd2hpbGUgKCFzdG9wKSB7CiYjNDM7CQltYWR2aXNlKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplLCBNQURWX1BBR0VPVVQpOwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yICZhbXA7JmFtcDsgIXN0b3A7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJdW5zaWduZWQgaW50IHZhbCA9ICoodW5zaWduZWQgaW50ICopKHBhZ2VvdXRfYXJlYSAmIzQzOwomIzQzOwkJCQkJCQkgICAgIGkgKiBwYWdlX3NpemUpOwomIzQzOwomIzQzOwkJCWlmICh2YWwgIT0gcGF0dGVybihpKSkgewomIzQzOwkJCQljb3JydXB0ZWQgPSAxOwomIzQzOwkJCQlrc2Z0X3ByaW50X21zZygmIzM0O1BhZ2VvdXQgY29ycnVwdGlvbiBhdCBwYWdlICVsdTogJSN4ICE9ICUjeFxuJiMzNDssCiYjNDM7CQkJCQkgICAgICAgaSwgdmFsLCBwYXR0ZXJuKGkpKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQl1c2xlZXAocmFuZF9yKCZhbXA7c2VlZCkgJSAyMDAwKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogQ29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi8KJiM0MztzdGF0aWMgdm9pZCAqY29tcGFjdG9yX2ZuKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnOwomIzQzOwlpbnQgZmQgPSBvcGVuKCYjMzQ7L3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5JiMzNDssIE9fV1JPTkxZKTsKJiM0MzsKJiM0MzsJaWYgKGZkICZsdDsgMCkgewomIzQzOwkJa3NmdF9wcmludF9tc2coJiMzNDtObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXdoaWxlICghc3RvcCkgewomIzQzOwkJaWYgKHdyaXRlKGZkLCAmIzM0OzEmIzM0OywgMSkgJmx0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKDEwMDAwICYjNDM7IHJhbmRfcigmYW1wO3NlZWQpICUgMTAwMDAwKTsKJiM0MzsJfQomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzd2FwX2F2YWlsYWJsZSh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBsaW5lWzI1Nl07CiYjNDM7CWludCBsaW5lcyA9IDA7CiYjNDM7CUZJTEUgKmZwID0gZm9wZW4oJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkKJiM0MzsJCWxpbmVzJiM0MzsmIzQzOzsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsJcmV0dXJuIGxpbmVzICZndDsgMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHVuc2lnbmVkIGxvbmcgbm93X21zKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXZhbCB0djsKJiM0MzsKJiM0MzsJZ2V0dGltZW9mZGF5KCZhbXA7dHYsIE5VTEwpOwomIzQzOwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMICYjNDM7IHR2LnR2X3VzZWMgLyAxMDAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQomIzQzO3sKJiM0MzsJZnByaW50ZihzdGRlcnIsCiYjNDM7CQkmIzM0O1VzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxuJiMzNDsKJiM0MzsJCSYjMzQ7XHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcbiYjMzQ7CiYjNDM7CQkmIzM0O1x0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcbiYjMzQ7KTsKJiM0MzsJZXhpdCgxKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHsKJiM0MzsJCSYjMzQ7ZmF1bHRlciYjMzQ7LCAmIzM0O2ZhdWx0ZXIyJiMzNDssICYjMzQ7ZG9udG5lZWQmIzM0OywgJiMzNDtwaW5uZXImIzM0OywgJiMzNDtmb3JrZXImIzM0OywKJiM0MzsJCSYjMzQ7bXJlbWFwcGVyJiMzNDssICYjMzQ7cGFnZW91dCYjMzQ7LCAmIzM0O2NvbXBhY3RvciYjMzQ7LAomIzQzOwl9OwomIzQzOwl2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHsKJiM0MzsJCWZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbiwKJiM0MzsJCW1yZW1hcHBlcl9mbiwgcGFnZW91dF9mbiwgY29tcGFjdG9yX2ZuLAomIzQzOwl9OwomIzQzOwllbnVtIHsgVF9GQVVMVEVSLCBUX0ZBVUxURVIyLCBUX0RPTlRORUVELCBUX1BJTk5FUiwgVF9GT1JLRVIsCiYjNDM7CSAgICAgICBUX01SRU1BUFBFUiwgVF9QQUdFT1VULCBUX0NPTVBBQ1RPUiB9OwomIzQzOwljb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMICZsdDsmbHQ7IFRfUEFHRU9VVDsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBjb21wYWN0b3JfYml0ID0gMVVMICZsdDsmbHQ7IFRfQ09NUEFDVE9SOwomIzQzOwljb25zdCBpbnQgbnJfdGhyZWFkcyA9IEFSUkFZX1NJWkUodGhyZWFkX25hbWVzKTsKJiM0MzsJcHRocmVhZF90IHRocmVhZHNbQVJSQVlfU0laRSh0aHJlYWRfbmFtZXMpXTsKJiM0MzsJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgJiMzNDtzdGVwcGVkJiMzNDssICYjMzQ7ZnJlZSYjMzQ7LCAmIzM0O21hZHZpc2UmIzM0OyB9OwomIzQzOwlzdGF0aWMgY29uc3QgYm9vbCBvY2N1cGFuY2llc1tdID0geyBmYWxzZSwgdHJ1ZSB9OwkvKiBzdHJpY3QsIGhvbGVzICovCiYjNDM7CXN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9OwkvKiBxdWlldCwgdW5kZXIgcHJlc3N1cmUgKi8KJiM0MzsJY29uc3QgaW50IG5yX29jY3VwYW5jaWVzID0gQVJSQVlfU0laRShvY2N1cGFuY2llcyk7CiYjNDM7CWNvbnN0IGludCBucl9wcmVzc3VyZXMgPSBBUlJBWV9TSVpFKHByZXNzdXJlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm9uZV9tb2RlWzFdOwomIzQzOwljb25zdCBjaGFyICogY29uc3QgKm1vZGVzID0gYWxsX21vZGVzOwomIzQzOwlpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7CiYjNDM7CWNvbnN0IGNoYXIgKm1vZGVfYXJnID0gTlVMTDsKJiM0MzsJc3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5nczsKJiM0MzsJdW5zaWduZWQgbG9uZyBlbmRfbXM7CiYjNDM7CWludCBkdXJhdGlvbl9zID0gNTsKJiM0MzsJdW5zaWduZWQgbG9uZyB0aHJlYWRfbWFzayA9IH4wVUw7CiYjNDM7CXVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrOwomIzQzOwlpbnQgbnJfYXJlYXNfYXJnID0gMDsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwlpbnQgc3RlcHMgPSAwOwomIzQzOwlpbnQgb3B0OwomIzQzOwomIzQzOwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAmIzM0O2E6ZDptOnQ6aCYjMzQ7KSkgIT0gLTEpIHsKJiM0MzsJCXN3aXRjaCAob3B0KSB7CiYjNDM7CQljYXNlICYjMzk7YSYjMzk7OgomIzQzOwkJCW5yX2FyZWFzX2FyZyA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTtkJiMzOTs6CiYjNDM7CQkJZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCWNhc2UgJiMzOTttJiMzOTs6CiYjNDM7CQkJbW9kZV9hcmcgPSBvcHRhcmc7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQljYXNlICYjMzk7dCYjMzk7OgomIzQzOwkJCS8qIGRlYnVnOiBiaXRtYXNrIG9mIHJhY2luZyB0aHJlYWRzIHRvIHN0YXJ0ICovCiYjNDM7CQkJdGhyZWFkX21hc2sgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMCk7CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQlkZWZhdWx0OgomIzQzOwkJCXVzYWdlKCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG1vZGVfYXJnKSB7CiYjNDM7CQlpZiAoc3RyY21wKG1vZGVfYXJnLCAmIzM0O3N0ZXBwZWQmIzM0OykgJmFtcDsmYW1wOyBzdHJjbXAobW9kZV9hcmcsICYjMzQ7ZnJlZSYjMzQ7KSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgc3RyY21wKG1vZGVfYXJnLCAmIzM0O21hZHZpc2UmIzM0OykpCiYjNDM7CQkJdXNhZ2UoKTsKJiM0MzsJCW9uZV9tb2RlWzBdID0gbW9kZV9hcmc7CiYjNDM7CQltb2RlcyA9IG9uZV9tb2RlOwomIzQzOwkJbnJfbW9kZXMgPSAxOwomIzQzOwl9CiYjNDM7CiYjNDM7CWtzZnRfcHJpbnRfaGVhZGVyKCk7CiYjNDM7CWlmICghdGhwX2F2YWlsYWJsZSgpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxuJiMzNDspOwomIzQzOwomIzQzOwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJZ3VwX2ZkID0gb3BlbigmIzM0Oy9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0JiMzNDssIE9fUkRXUik7CiYjNDM7CWlmIChndXBfZmQgJmx0OyAwKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDsvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsKJiM0MzsJbnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnICZndDsgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTOwomIzQzOwlucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyAmIzQzOyAxOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZAomIzQzOwkgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbQomIzQzOwkgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvbgomIzQzOwkgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZQomIzQzOwkgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZQomIzQzOwkgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuCiYjNDM7CSAqLwomIzQzOwltcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICYjNDM7IDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplOwomIzQzOwlpZiAobW1hcChtcmVtYXBfc2NyYXRjaCwgaHBhZ2VfcG1kX3NpemUsIFBST1RfTk9ORSwKJiM0MzsJCSBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLAomIzQzOwkJIC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKCYjMzQ7bW1hcCgpIG1yZW1hcCBzY3JhdGNoJiMzNDspOwomIzQzOwomIzQzOwliYXNlX21hc2sgPSB0aHJlYWRfbWFzazsKJiM0MzsJaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJLyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovCiYjNDM7CQlrc2Z0X3ByaW50X21zZygmIzM0O25vIHN3YXA6IHRoZSBwYWdlb3V0IHRocmVhZCBzdGF5cyBpZGxlXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CWtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CXRocF9zYXZlX3NldHRpbmdzKCk7CiYjNDM7CXRocF9yZWFkX3NldHRpbmdzKCZhbXA7c2V0dGluZ3MpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBBIGJhc2UgZW50cnkgZm9yIHRoZSBzdGFjaywgc28gdGhhdCB0aGUgcG9wIGF0IHRoZSBlbmQgb2YgYSBtb2RlCiYjNDM7CSAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eQomIzQzOwkgKiBzdGFjayBoYXMgbm8gc2V0dGluZ3MgdG8gYXBwbHkgYW5kIGdpdmVzIHVwLgomIzQzOwkgKi8KJiM0MzsJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CWZvciAoaW50IHJ1biA9IDA7IHJ1biAmbHQ7IG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXM7IHJ1biYjNDM7JiM0MzspIHsKJiM0MzsJCWludCByZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpOwomIzQzOwkJY29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldOwomIzQzOwkJYm9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107CiYjNDM7CQlib29sIHByZXNzdXJlID0gcHJlc3N1cmVzW3JlbSAlIG5yX3ByZXNzdXJlc107CiYjNDM7CiYjNDM7CQl0aHJlYWRfbWFzayA9IGJhc2VfbWFzazsKJiM0MzsJCWlmICghcHJlc3N1cmUpCiYjNDM7CQkJdGhyZWFkX21hc2sgJmFtcDs9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTsKJiM0MzsJCWVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKQomIzQzOwkJCXRocmVhZF9tYXNrICZhbXA7PSB+cGFnZW91dF9iaXQ7CiYjNDM7CiYjNDM7CQl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJCXNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7CiYjNDM7CQlzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7CiYjNDM7CQlzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0KJiM0MzsJCQlzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspID8gMTAwMCA6IDA7CiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeQomIzQzOwkJICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLgomIzQzOwkJICogU3RyaWN0IG5lZWRzIGEgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdywgd2hpY2ggaXMgcmFyZSB1bmRlcgomIzQzOwkJICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLAomIzQzOwkJICogc28gdGhlIHR3byBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzLgomIzQzOwkJICovCiYjNDM7CQlzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/CiYjNDM7CQkJKGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplKSAtIDEgOiAwOwomIzQzOwkJc2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID0KJiM0MzsJCQlucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4OwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IE5SX09SREVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKQomIzQzOwkJCQlzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUOwomIzQzOwkJfQomIzQzOwkJLyogUG9wcGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2RlLCBiZWZvcmUgdGhlIG5leHQgb25lLiAqLwomIzQzOwkJdGhwX3B1c2hfc2V0dGluZ3MoJmFtcDtzZXR0aW5ncyk7CiYjNDM7CiYjNDM7CQlyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfQU5PTllNT1VTIHwKJiM0MzsJCQkgICAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTsKJiM0MzsJCWlmIChyZWdpb24gIT0gQkFTRV9BRERSKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwbGF5Z3JvdW5kJiMzNDspOwomIzQzOwkJbXJlbWFwX2FyZWEgPSByZWdpb24gJiM0MzsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CiYjNDM7CQlpZiAodGhyZWFkX21hc2sgJmFtcDsgcGFnZW91dF9iaXQpIHsKJiM0MzsJCQkvKgomIzQzOwkJCSAqIEJpZyBlbm91Z2ggdG8gY3ljbGUgcmVhbCByZWNsYWltLCBzbWFsbCBlbm91Z2ggbm90CiYjNDM7CQkJICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvCiYjNDM7CQkJICogWzE2TSwgNjRNXS4KJiM0MzsJCQkgKi8KJiM0MzsJCQlwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfc2l6ZSAmbHQ7IDE2VUwgJmx0OyZsdDsgMjApCiYjNDM7CQkJCXBhZ2VvdXRfc2l6ZSA9IDE2VUwgJmx0OyZsdDsgMjA7CiYjNDM7CQkJaWYgKHBhZ2VvdXRfc2l6ZSAmZ3Q7IDY0VUwgJmx0OyZsdDsgMjApCiYjNDM7CQkJCXBhZ2VvdXRfc2l6ZSA9IDY0VUwgJmx0OyZsdDsgMjA7CiYjNDM7CQkJcGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsCiYjNDM7CQkJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKJiM0MzsJCQkJCSAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIC0xLCAwKTsKJiM0MzsJCQlpZiAocGFnZW91dF9hcmVhID09IE1BUF9GQUlMRUQpCiYjNDM7CQkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21tYXAoKSBwYWdlb3V0IGFyZWEmIzM0Oyk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqLwomIzQzOwkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCQkqKHVuc2lnbmVkIGludCAqKShyZWdpb24gJiM0MzsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpOwomIzQzOwkJbWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKQomIzQzOwkJCWtzZnRfZXhpdF9mYWlsX3BlcnJvcigmIzM0O21hZHZpc2UoTUFEVl9IVUdFUEFHRSkmIzM0Oyk7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfdGhyZWFkczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQlpZiAoISh0aHJlYWRfbWFzayAmYW1wOyAoMVVMICZsdDsmbHQ7IGkpKSkgewomIzQzOwkJCQl0aHJlYWRzW2ldID0gMDsKJiM0MzsJCQkJY29udGludWU7CiYjNDM7CQkJfQomIzQzOwkJCWlmIChwdGhyZWFkX2NyZWF0ZSgmYW1wO3RocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sCiYjNDM7CQkJCQkgICAodm9pZCAqKShpICYjNDM7IDEpKSkKJiM0MzsJCQkJa3NmdF9leGl0X2ZhaWxfcGVycm9yKHRocmVhZF9uYW1lc1tpXSk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQllbmRfbXMgPSBub3dfbXMoKSAmIzQzOyBkdXJhdGlvbl9zICogMTAwMFVMOwomIzQzOwkJaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtzdGVwcGVkJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkgewomIzQzOwkJCQlpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpCiYjNDM7CQkJCQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XG4mIzM0Oyk7CiYjNDM7CQkJCXN0ZXBzJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgJiMzNDtmcmVlJiMzNDspKSB7CiYjNDM7CQkJd2hpbGUgKG5vd19tcygpICZsdDsgZW5kX21zICZhbXA7JmFtcDsgIWNvcnJ1cHRlZCkKJiM0MzsJCQkJdXNsZWVwKDEwMCAqIDEwMDApOwomIzQzOwkJfSBlbHNlIHsJLyogbWFkdmlzZSAqLwomIzQzOwkJCXdoaWxlIChub3dfbXMoKSAmbHQ7IGVuZF9tcyAmYW1wOyZhbXA7ICFjb3JydXB0ZWQpIHsKJiM0MzsJCQkJZm9yIChpID0gMDsgaSAmbHQ7IG5yX3NoYXJlZF9hcmVhczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCQkJCW1hZHZpc2UocmVnaW9uICYjNDM7IGkgKiBocGFnZV9wbWRfc2l6ZSwKJiM0MzsJCQkJCQlocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7CiYjNDM7CQkJCX0KJiM0MzsJCQkJbWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLAomIzQzOwkJCQkJTUFEVl9ET05UTkVFRCk7CiYjNDM7CQkJCXN0ZXBzJiM0MzsmIzQzOzsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlzdG9wID0gMTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl90aHJlYWRzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh0aHJlYWRzW2ldKQomIzQzOwkJCQlwdGhyZWFkX2pvaW4odGhyZWFkc1tpXSwgTlVMTCk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovCiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkmIzQzOyYjNDM7KQomIzQzOwkJCWNoZWNrX3BhZ2UoaSk7CiYjNDM7CiYjNDM7CQlrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsCiYjNDM7CQkJCSAmIzM0OyVzLyVzJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cbiYjMzQ7LAomIzQzOwkJCQkgbW9kZSwgaG9sZXMgPyAmIzM0O2hvbGVzJiMzNDsgOiAmIzM0O3N0cmljdCYjMzQ7LAomIzQzOwkJCQkgcHJlc3N1cmUgPyAmIzM0Oy9wcmVzc3VyZSYjMzQ7IDogJiMzNDsmIzM0OywKJiM0MzsJCQkJIGR1cmF0aW9uX3MsIHN0ZXBzKTsKJiM0MzsKJiM0MzsJCS8qCiYjNDM7CQkgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlCiYjNDM7CQkgKiBuZXh0IG1vZGU6IGl0IG1hcHMgdGhlIHJlZ2lvbiBhdCB0aGUgc2FtZSBmaXhlZCBhZGRyZXNzLAomIzQzOwkJICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy4KJiM0MzsJCSAqLwomIzQzOwkJbXVubWFwKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSk7CiYjNDM7CQlpZiAocGFnZW91dF9hcmVhKSB7CiYjNDM7CQkJbXVubWFwKHBhZ2VvdXRfYXJlYSwgcGFnZW91dF9zaXplKTsKJiM0MzsJCQlwYWdlb3V0X2FyZWEgPSBOVUxMOwomIzQzOwkJfQomIzQzOwkJdGhwX3BvcF9zZXR0aW5ncygpOwomIzQzOwkJc3RvcCA9IDA7CiYjNDM7CQlzdGVwcyA9IDA7CiYjNDM7CiYjNDM7CQlpZiAoY29ycnVwdGVkKSB7CiYjNDM7CQkJLyogTWVtb3J5IGlzIHN1c3BlY3Q7IHRoZSByZXN0IHdvdWxkIHByb3ZlIG5vdGhpbmcuICovCiYjNDM7CQkJd2hpbGUgKCYjNDM7JiM0MztydW4gJmx0OyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKSB7CiYjNDM7CQkJCXJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7CiYjNDM7CiYjNDM7CQkJCWtzZnRfdGVzdF9yZXN1bHRfc2tpcCgmIzM0OyVzLyVzJXM6IHNraXBwZWQgYWZ0ZXIgY29ycnVwdGlvblxuJiMzNDssCiYjNDM7CQkJCQkJICAgICAgbW9kZXNbcnVuIC8gKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKV0sCiYjNDM7CQkJCQkJICAgICAgb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXSA/CiYjNDM7CQkJCQkJICAgICAgJiMzNDtob2xlcyYjMzQ7IDogJiMzNDtzdHJpY3QmIzM0OywKJiM0MzsJCQkJCQkgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/CiYjNDM7CQkJCQkJICAgICAgJiMzNDsvcHJlc3N1cmUmIzM0OyA6ICYjMzQ7JiMzNDspOwomIzQzOwkJCX0KJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwl0aHBfcmVzdG9yZV9zZXR0aW5ncygpOwomIzQzOwlrc2Z0X2ZpbmlzaGVkKCk7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmMKQEAgLTAsMCAmIzQzOzEsMTk2IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay4KJiM0MzsgKgomIzQzOyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYQomIzQzOyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zCiYjNDM7ICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0CiYjNDM7ICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlcwomIzQzOyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lCiYjNDM7ICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdAomIzQzOyAqIHdpbmRvdyYjMzk7cyBzb3VyY2UgcGFnZXMgKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50cyBmaWx0ZXJlZAomIzQzOyAqIGJ5IHNvdXJjZSBQRk4gYW5kIG9yZGVyKSBhbmQgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWQKJiM0MzsgKiBhZnRlcndhcmRzLCByZXBlYXRhYmx5LgomIzQzOyAqCiYjNDM7ICogc2Nhbl9zbGVlcF9taWxsaXNlY3MgaXMgc2V0IHRvIDYwcyB0byBwcm92ZSB0aGUgd2FrZSBwYXRoOiB3aXRob3V0CiYjNDM7ICogdGhlIHdha2UsIG9uZSBiYXJyaWVyIHN0ZXAgd291bGQgc2xlZXAgbXVsdGlwbGVzIG9mIHRoYXQgYW5kIGJsb3cKJiM0MzsgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW4KJiM0MzsgKiBzdGVwcywgcGVyIHRoZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpIGRpc2NpcGxpbmUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBfR05VX1NPVVJDRQomIzQzOyNpbmNsdWRlICZsdDtmY250bC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7a3NlbGZ0ZXN0LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dm1fdXRpbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2h1Z2VwYWdlX3NldHRpbmdzLmgmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgJmx0OyZsdDsgMzApKQomIzQzOyNkZWZpbmUgVEFSR0VUX09SREVSIDIJLyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi8KJiM0MzsjZGVmaW5lIE5SX0lURVJBVElPTlMgNQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcGFnZW1hcF9mZDsKJiM0MztzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7CiYjNDM7c3RhdGljIGludCB0cmFjZV9ldmVudHNfZmQgPSAtMTsKJiM0MztzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIEVhY2ggc3RlcCBzd2l0Y2hlcyB0aGUgZXZlbnRzIG9mZiBhZ2FpbiwgYnV0IGEgaGVscGVyIGNhbiBzdGlsbCBnaXZlIHVwCiYjNDM7ICogb24gdXMgaW4gYmV0d2VlbiAoYSBmYWlsaW5nIHN5c2ZzIHdyaXRlIGVuZHMgdGhlIHRlc3QgZnJvbSBpbnNpZGUKJiM0MzsgKiB0aHBfd3JpdGVfbnVtKCkpLCBhbmQgaHVnZV9tZW1vcnkgZXZlbnRzIGxlZnQgb24gYXJlIHRoZSB3aG9sZSBtYWNoaW5lJiMzOTtzCiYjNDM7ICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCYjMzk7cy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpCiYjNDM7ewomIzQzOwlpZiAodHJhY2VfZXZlbnRzX2ZkICZndDs9IDApCiYjNDM7CQl0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ291bnQgY29sbGFwc2UgYXR0ZW1wdHMgYXR0cmlidXRhYmxlIHRvIG91ciB3aW5kb3c6IGlzb2xhdGUgZXZlbnRzIHdob3NlCiYjNDM7ICogc2Nhbl9wZm4gaXMgb25lIG9mIHRoZSB3aW5kb3cmIzM5O3Mgc291cmNlIFBGTnMsIHJlcG9ydGVkIG9uY2UgcGVyIGF0dGVtcHQuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLAomIzQzOwkJCSAgICB1bnNpZ25lZCBpbnQgb3JkZXIpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbMTAyNF07CiYjNDM7CWludCBjb3VudCA9IDA7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7Q2Fubm90IG9wZW4gdHJhY2UgYnVmZmVyXG4mIzM0Oyk7CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgewomIzQzOwkJdW5zaWduZWQgbG9uZyB2YWw7CiYjNDM7CQl1bnNpZ25lZCBpbnQgb3JkOwomIzQzOwkJY2hhciAqcywgKm87CiYjNDM7CQlpbnQgaTsKJiM0MzsKJiM0MzsJCXMgPSBzdHJzdHIobGluZSwgJiMzNDttbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTomIzM0Oyk7CiYjNDM7CQlpZiAoIXMpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlpZiAoc3NjYW5mKHMsICYjMzQ7bW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6IHNjYW5fcGZuPTB4JWx4JiMzNDssCiYjNDM7CQkJICAgJmFtcDt2YWwpICE9IDEpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CQlvID0gc3Ryc3RyKHMsICYjMzQ7b3JkZXI9JiMzNDspOwomIzQzOwkJaWYgKCFvIHx8IHNzY2FuZihvLCAmIzM0O29yZGVyPSV1JiMzNDssICZhbXA7b3JkKSAhPSAxIHx8IG9yZCAhPSBvcmRlcikKJiM0MzsJCQljb250aW51ZTsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBucl9wZm5zOyBpJiM0MzsmIzQzOykgewomIzQzOwkJCWlmICh2YWwgPT0gcGZuc1tpXSkgewomIzQzOwkJCQljb3VudCYjNDM7JiM0Mzs7CiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCX0KJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlmY2xvc2UoZnApOwomIzQzOwlyZXR1cm4gY291bnQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pCiYjNDM7ewomIzQzOwljb25zdCBzaXplX3Qgd2luZG93ID0gZ2V0cGFnZXNpemUoKSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVI7CiYjNDM7CWNvbnN0IGludCBucl9wYWdlcyA9IDEgJmx0OyZsdDsgVEFSR0VUX09SREVSOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbnNbMSAmbHQ7Jmx0OyBUQVJHRVRfT1JERVJdOwomIzQzOwlib29sIGNvbGxhcHNlZCwgcGFzc2VkOwomIzQzOwlpbnQgYXR0cmlidXRlZDsKJiM0MzsJY2hhciAqcDsKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CXAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApOwomIzQzOwlpZiAocCAhPSBCQVNFX0FERFIpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttbWFwKCkgd2luZG93JiMzNDspOwomIzQzOwomIzQzOwkvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBucl9wYWdlczsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCXBbaSAqIGdldHBhZ2VzaXplKCldID0gaSAmIzQzOyAxOwomIzQzOwkJcGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICYjNDM7IGkgKiBnZXRwYWdlc2l6ZSgpKTsKJiM0MzsJCWlmIChwZm5zW2ldID09IC0xVUwpCiYjNDM7CQkJa3NmdF9leGl0X2ZhaWxfbXNnKCYjMzQ7U291cmNlIHBhZ2Ugbm90IHByZXNlbnRcbiYjMzQ7KTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBDbGVhciBmaXJzdDogd2l0aCB0aGUgZXZlbnRzIHN0aWxsIG9mZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVuZG8uICovCiYjNDM7CWlmICh0cmFjaW5nX2NsZWFyX3RyYWNlKCkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxuJiMzNDspOwomIzQzOwlpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwomIzQzOwlpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDttYWR2aXNlKE1BRFZfSFVHRVBBR0UpJiMzNDspOwomIzQzOwkvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi8KJiM0MzsJcGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKTsKJiM0MzsKJiM0MzsJLyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi8KJiM0MzsJaWYgKHRyYWNpbmdfZXZlbnRzX2VuYWJsZSh0cmFjZV9ldmVudHNfZmQsIGZhbHNlKSkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0Nhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xuJiMzNDspOwomIzQzOwlpZiAoIXBhc3NlZCkKJiM0MzsJCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O2todWdlcGFnZWQgZGlkIG5vdCBjb21wbGV0ZSBhIGZ1bGwgcGFzc1xuJiMzNDspOwomIzQzOwomIzQzOwljb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLAomIzQzOwkJCQkJCSAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTsKJiM0MzsJYXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7CiYjNDM7CiYjNDM7CWtzZnRfdGVzdF9yZXN1bHQoY29sbGFwc2VkICZhbXA7JmFtcDsgYXR0cmlidXRlZCA9PSAxLAomIzQzOwkJCSAmIzM0O3N0ZXAgJWQ6IHdpbmRvdyBjb2xsYXBzZWQsICVkIGF0dHJpYnV0ZWQgcmVzdWx0KHMpXG4mIzM0OywKJiM0MzsJCQkgaXRlcmF0aW9uLCBhdHRyaWJ1dGVkKTsKJiM0MzsKJiM0MzsJbXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IG1haW4odm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlrc2Z0X3ByaW50X2hlYWRlcigpOwomIzQzOwomIzQzOwlpZiAoIXRocF9hdmFpbGFibGUoKSkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7VHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcbiYjMzQ7KTsKJiM0MzsJaWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSAmYW1wOyAoMVVMICZsdDsmbHQ7IFRBUkdFVF9PUkRFUikpKQomIzQzOwkJa3NmdF9leGl0X3NraXAoJiMzNDtPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcbiYjMzQ7LAomIzQzOwkJCSAgICAgICBUQVJHRVRfT1JERVIpOwomIzQzOwomIzQzOwlocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7CiYjNDM7CWlmICghaHBhZ2VfcG1kX3NpemUpCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9tc2coJiMzNDtSZWFkaW5nIFBNRCBwYWdlc2l6ZSBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJcGFnZW1hcF9mZCA9IG9wZW4oJiMzNDsvcHJvYy9zZWxmL3BhZ2VtYXAmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAocGFnZW1hcF9mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoJiMzNDtvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcCkmIzM0Oyk7CiYjNDM7CWtwYWdlZmxhZ3NfZmQgPSBvcGVuKCYjMzQ7L3Byb2Mva3BhZ2VmbGFncyYjMzQ7LCBPX1JET05MWSk7CiYjNDM7CWlmIChrcGFnZWZsYWdzX2ZkICZsdDsgMCkKJiM0MzsJCWtzZnRfZXhpdF9za2lwKCYjMzQ7b3BlbihcJiMzNDsvcHJvYy9rcGFnZWZsYWdzXCYjMzQ7KSByZXF1aXJlcyByb290XG4mIzM0Oyk7CiYjNDM7CXRyYWNlX2V2ZW50c19mZCA9IHRyYWNpbmdfZXZlbnRzX29wZW4oJiMzNDtodWdlX21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKHRyYWNlX2V2ZW50c19mZCAmbHQ7IDApCiYjNDM7CQlrc2Z0X2V4aXRfc2tpcCgmIzM0O2h1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcbiYjMzQ7KTsKJiM0MzsJYXRleGl0KHRyYWNlX2V2ZW50c19vZmYpOwomIzQzOwomIzQzOwlrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpOwomIzQzOwomIzQzOwl0aHBfc2F2ZV9zZXR0aW5ncygpOwomIzQzOwl0aHBfcmVhZF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsJc2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTsKJiM0MzsJc2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTOwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7CiYjNDM7CXNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDsKJiM0MzsJc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxOwomIzQzOwkvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqLwomIzQzOwlzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgJmx0OyZsdDsgMjQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBOUl9PUkRFUlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJc2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7CiYjNDM7CXNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDsKJiM0MzsJLyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqLwomIzQzOwl0aHBfcHVzaF9zZXR0aW5ncygmYW1wO3NldHRpbmdzKTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5SX0lURVJBVElPTlM7IGkmIzQzOyYjNDM7KQomIzQzOwkJb25lX3N0ZXAoaSk7CiYjNDM7CiYjNDM7CXRocF9yZXN0b3JlX3NldHRpbmdzKCk7CiYjNDM7CiYjNDM7CWtzZnRfZmluaXNoZWQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCmluZGV4IGYxOWQ1M2M2OTU3NjQuLmZkMzVmOGE3YjViODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jCkBAIC0yMCw3ICYjNDM7MjAsNiBAQAogCiAjZGVmaW5lIFRXT01FRwkJKDImbHQ7Jmx0OzIwKQogI2RlZmluZSBSVU5USU1FCQkoMjApCi0jZGVmaW5lIEFMSUdOKHgsIGEpCSgoKHgpICYjNDM7IChhIC0gMSkpICZhbXA7ICh+KChhKSAtIDEpKSkKIAogSFVHRVRMQl9TRVRVUF9ERUZBVUxUX1BBR0VTKDEpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKaW5kZXggZDA5ZjlmNmEzODRlZS4uZmM2MTkwN2FhM2IyYSAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2gKQEAgLTQwMiw2ICYjNDM7NDAyLDEyIEBAIENBVEVHT1JZPSYjMzQ7cGZubWFwJiMzNDsgcnVuX3Rlc3QgLi9wZm5tYXAKICMgQ09XIHRlc3RzCiBDQVRFR09SWT0mIzM0O2NvdyYjMzQ7IHJ1bl90ZXN0IC4vY293CiAKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2sKJiM0MzsKJiM0MztDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrCiYjNDM7CiYjNDM7Q0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZQomIzQzOwogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQKIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMgpAQCAtNDEwLDggJiM0Mzs0MTYsNiBAQCBDQVRFR09SWT0mIzM0O3RocCYjMzQ7IHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW0KIAogQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW0KIAotQ0FURUdPUlk9JiMzNDt0aHAmIzM0OyBydW5fdGVzdCAuL2todWdlcGFnZWQgLWMgNCBtdGhwX2todWdlcGFnZWQ6YW5vbgotCiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZAogaWYgWyAteiAmIzM0OyR7U1BMSVRfSFVHRV9QQUdFX1RFU1RfWEZTX1BBVEh9JiMzNDsgXTsgdGhlbgogICAgIGlmIHRlc3Rfc2VsZWN0ZWQgJiMzNDt0aHAmIzM0OzsgdGhlbgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmMKaW5kZXggODZhNjAzNjkyODI2MS4uMGFkZmU3ZGRlN2U1OSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jCkBAIC00Miw2OCAmIzQzOzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gJiMzNDsvcHJvYy9rcGFnZWZsYWdzJiMzNDs7CiBpbnQgcGFnZW1hcF9mZDsKIGludCBrcGFnZWZsYWdzX2ZkOwogCi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsCi0JCWludCBrcGFnZWZsYWdzX2ZkKQotewotCWNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7Ci0JY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKLQljb25zdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMVVMICZsdDsmbHQ7IG9yZGVyOwotCXVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7Ci0JdWludDY0X3QgcGZuX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCXBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7Ci0KLQkvKiBub24gcHJlc2VudCBwYWdlICovCi0JaWYgKHBmbiA9PSAtMVVMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAocGFnZWZsYWdzX2dldChwZm4sIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi8KLQlpZiAoIW9yZGVyKSB7Ci0JCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogbm9uIFRIUCBmb2xpbyAqLwotCWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwotCi0JaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJZ290byBmYWlsOwotCi0JLyogaGVhZCBQRk4gaGFzIG5vIGNvbXBvdW5kX2hlYWQgZmxhZyBzZXQgKi8KLQlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KLQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IGksIGtwYWdlZmxhZ3NfZmQsICZhbXA7cGZuX2ZsYWdzKSkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKChwZm5fZmxhZ3MgJmFtcDsgZm9saW9fdGFpbF9mbGFncykgIT0gZm9saW9fdGFpbF9mbGFncykKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCi0JICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlcgotCSAqLwotCWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCi0JCXJldHVybiB0cnVlOwotCi0JLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwotCXJldHVybiAocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3M7Ci1mYWlsOgotCWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwotCXJldHVybiBmYWxzZTsKLX0KLQogc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sCiAJCWludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jCmluZGV4IDgwYmM5ZjU5N2I1MjEuLmVlMTMzNDc3ODM5MWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmMKQEAgLTQ5NCw2ICYjNDM7NDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncykKIAlyZXR1cm4gMDsKIH0KIAomIzQzO2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLAomIzQzOwkJCWludCBrcGFnZWZsYWdzX2ZkKQomIzQzO3sKJiM0MzsJY29uc3QgdWludDY0X3QgZm9saW9faGVhZF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfSEVBRDsKJiM0MzsJY29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDFVTCAmbHQ7Jmx0OyBvcmRlcjsKJiM0MzsJdW5zaWduZWQgbG9uZyBwZm5faGVhZDsKJiM0MzsJdWludDY0X3QgcGZuX2ZsYWdzOwomIzQzOwl1bnNpZ25lZCBsb25nIHBmbjsKJiM0MzsJdW5zaWduZWQgbG9uZyBpOwomIzQzOwomIzQzOwlwZm4gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgdmFkZHIpOwomIzQzOwomIzQzOwkvKiBub24gcHJlc2VudCBwYWdlICovCiYjNDM7CWlmIChwZm4gPT0gLTFVTCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlnb3RvIGZhaWw7CiYjNDM7CiYjNDM7CS8qIGNoZWNrIGZvciBvcmRlci0wIHBhZ2VzICovCiYjNDM7CWlmICghb3JkZXIpIHsKJiM0MzsJCWlmIChwZm5fZmxhZ3MgJmFtcDsgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBub24gVEhQIGZvbGlvICovCiYjNDM7CWlmICghKHBmbl9mbGFncyAmYW1wOyBLUEZfVEhQKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJcGZuX2hlYWQgPSBwZm4gJmFtcDsgfihucl9wYWdlcyAtIDEpOwomIzQzOwomIzQzOwlpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwkvKiBoZWFkIFBGTiBoYXMgbm8gY29tcG91bmRfaGVhZCBmbGFnIHNldCAqLwomIzQzOwlpZiAoKHBmbl9mbGFncyAmYW1wOyBmb2xpb19oZWFkX2ZsYWdzKSAhPSBmb2xpb19oZWFkX2ZsYWdzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwkvKiBjaGVjayBhbGwgdGFpbCBQRk4gZmxhZ3MgKi8KJiM0MzsJZm9yIChpID0gMTsgaSAmbHQ7IG5yX3BhZ2VzOyBpJiM0MzsmIzQzOykgewomIzQzOwkJaWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQgJiM0MzsgaSwga3BhZ2VmbGFnc19mZCwgJmFtcDtwZm5fZmxhZ3MpKQomIzQzOwkJCWdvdG8gZmFpbDsKJiM0MzsJCWlmICgocGZuX2ZsYWdzICZhbXA7IGZvbGlvX3RhaWxfZmxhZ3MpICE9IGZvbGlvX3RhaWxfZmxhZ3MpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsCiYjNDM7CSAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXIKJiM0MzsJICovCiYjNDM7CWlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICYjNDM7IG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCAmYW1wO3Bmbl9mbGFncykpCiYjNDM7CQlyZXR1cm4gdHJ1ZTsKJiM0MzsKJiM0MzsJLyogSWYgd2UgZmluZCBhbm90aGVyIHRhaWwgcGFnZSwgdGhlbiB0aGUgZm9saW8gaXMgbGFyZ2VyLiAqLwomIzQzOwlyZXR1cm4gKHBmbl9mbGFncyAmYW1wOyBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzOwomIzQzO2ZhaWw6CiYjNDM7CWtzZnRfZXhpdF9mYWlsX21zZygmIzM0O0ZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xuJiMzNDspOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lCiYjNDM7ICogZm9saW8gb2YgdGhhdCBvcmRlciwgaGVhZCB0byB0YWlsLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHkKJiM0MzsgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdyYjMzk7cyBQRk4gcnVuIG11c3QgYmUgY29udGlndW91cywgYW5kIGEgd2luZG93JiMzOTtzIGZpcnN0CiYjNDM7ICogUEZOIG11c3QgYmUgdGhlIGZvbGlvIGhlYWQuCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGlzIHRoZSBjaGVjayAmIzM0O2RpZCB0aGlzIHJhbmdlIGNvbGxhcHNlIGludG8gb3JkZXItQG9yZGVyIGZvbGlvcyYjMzQ7OiBhCiYjNDM7ICogd2luZG93IGFzc2VtYmxlZCBmcm9tIHBhcnRzIG9mIHNldmVyYWwgZm9saW9zLCBvciBtYXBwaW5nIGEgZm9saW8gc2hpZnRlZAomIzQzOyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLgomIzQzOyAqLwomIzQzO2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLAomIzQzOwkJCQkgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCkKJiM0Mzt7CiYjNDM7CWNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgJmx0OyZsdDsgb3JkZXI7CiYjNDM7CWNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7CiYjNDM7CWNoYXIgKnZhZGRyOwomIzQzOwomIzQzOwlpZiAoKHVpbnRwdHJfdClzdGFydCAlIHdpbmRvdyB8fCBsZW4gJSB3aW5kb3cpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWZvciAodmFkZHIgPSBzdGFydDsgdmFkZHIgJmx0OyBzdGFydCAmIzQzOyBsZW47IHZhZGRyICYjNDM7PSB3aW5kb3cpIHsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaTsKJiM0MzsKJiM0MzsJCS8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi8KJiM0MzsJCWlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlmb3IgKGkgPSAxOyBpICZsdDsgbnJfcGFnZXM7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQkJaWYgKHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkciAmIzQzOyBpICogcHNpemUoKSkgIT0KJiM0MzsJCQkgICAgcGZuICYjNDM7IGkpCiYjNDM7CQkJCXJldHVybiBmYWxzZTsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCwKJiM0MzsJCQkJCWtwYWdlZmxhZ3NfZmQpKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2RlZmluZSBUUkFDRUZTX1JPT1QgJiMzNDsvc3lzL2tlcm5lbC90cmFjaW5nJiMzNDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuICYjMzQ7aHVnZV9tZW1vcnkmIzM0OykuCiYjNDM7ICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRyYWNpbmdfZXZlbnRzX2VuYWJsZSgpLCBvciAtMSBpZiB0cmFjZWZzIG9yIHRoZQomIzQzOyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlcgomIzQzOyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlCiYjNDM7ICogcGF0aHMgd2hlcmUgdGhlIHRlc3QgZ2l2ZXMgdXAuCiYjNDM7ICovCiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKQomIzQzO3sKJiM0MzsJY2hhciBwYXRoWzI1Nl07CiYjNDM7CiYjNDM7CXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgVFJBQ0VGU19ST09UICYjMzQ7L2V2ZW50cy8lcy9lbmFibGUmIzM0OywKJiM0MzsJCSBzdWJzeXMpOwomIzQzOwlyZXR1cm4gb3BlbihwYXRoLCBPX1dST05MWSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSkKJiM0Mzt7CiYjNDM7CWlmIChwd3JpdGUoZmQsIGVuYWJsZSA/ICYjMzQ7MSYjMzQ7IDogJiMzNDswJiMzNDssIDEsIDApICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIuICovCiYjNDM7aW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCkKJiM0Mzt7CiYjNDM7CWludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UICYjMzQ7L3RyYWNlJiMzNDssIE9fV1JPTkxZIHwgT19UUlVOQyk7CiYjNDM7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO0ZJTEUgKnRyYWNpbmdfb3Blbl90cmFjZSh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCAmIzM0Oy90cmFjZSYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7fQomIzQzOwogLyogSWYgYGlvY3RscyYjMzk7IG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi8KIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sCiAJCQkgICAgICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IsIHVpbnQ2NF90ICppb2N0bHMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmgKaW5kZXggOWE0OWFmODg3MDJlNC4uMTBjN2JlNDZlNDRjYSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaApAQCAtMTAsNiAmIzQzOzEwLDggQEAKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwogCiAjZGVmaW5lIEJJVF9VTEwobnIpICAgICAgICAgICAgICAgICAgICgxVUxMICZsdDsmbHQ7IChucikpCiYjNDM7I2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIzQzOyAoYSkgLSAxKSAmYW1wOyB+KChhKSAtIDEpKQomIzQzOwogI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KQogI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KQogI2RlZmluZSBQTV9VRkZEX1dQICAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KQpAQCAtOTcsNiAmIzQzOzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpOwogaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpOwogaW50IGdhdGhlcl9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sCiAJCWludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKTsKJiM0Mztib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCwKJiM0MzsJCQlpbnQga3BhZ2VmbGFnc19mZCk7CiYjNDM7Ym9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsCiYjNDM7CQkJCSAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKTsKIAogaW50IHVmZmRfcmVnaXN0ZXIoaW50IHVmZmQsIHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbiwKIAkJICBib29sIG1pc3MsIGJvb2wgd3AsIGJvb2wgbWlub3IpOwpAQCAtMTEzLDYgJiM0MzsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApOwogaW50IHdyaXRlX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyB2YWwpOwogaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpOwogYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpOwomIzQzO2ludCB0cmFjaW5nX2V2ZW50c19vcGVuKGNvbnN0IGNoYXIgKnN1YnN5cyk7CiYjNDM7aW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKTsKJiM0MztpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTsKJiM0MztGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dCkKIHsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkxNTAKCQkJCQkJCW91dHB1dDogNzYKCQkJCQkJCXRob3VnaHRzOiAxNTAzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5c2lzIG9mIHRoZSBQcm9wb3NlZCBQYXRjaCYjMzk7cyBGdXp6aW5nIFdvcnRoaW5lc3MqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gV2UgaGF2ZSBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBuZXcgdGVzdHMgcmVsYXRlZCB0byBga2h1Z2VwYWdlZGAgYW5kIGBtVEhQYCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AgZGlyZWN0b3J5LiBNeSBpbml0aWFsIGluc3RpbmN0IGlzIHRvIGFzc2VzcyBpZiB0aGVzZSBjaGFuZ2VzIG5lY2Vzc2l0YXRlIGZ1enppbmcuIFRoZSBrZXkgaGVyZSBpcyB3aGV0aGVyIHRoZSBwYXRjaCBhbHRlcnMgdGhlIGNvcmUga2VybmVsIGxvZ2ljIGluIGEgd2F5IHRoYXQgY291bGQgaW50cm9kdWNlIG5ldyB2dWxuZXJhYmlsaXRpZXMgZGV0ZWN0YWJsZSB0aHJvdWdoIGZ1enppbmcuCgpNeSBwcmltYXJ5IHRhc2sgaXMgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoIG1vZGlmaWVzIGFueSBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBMb29raW5nIGF0IHRoZSBkaWZmLCBJIGNhbiBzZWUgdGhhdCBhbGwgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuICBUaGUgZmlsZXMgbGlzdGVkLCBpbmNsdWRpbmcgdGhlIGBNYWtlZmlsZWAsIEMgc291cmNlIGZpbGVzLCBhbmQgaGVhZGVyIGZpbGVzLCBhcmUgYWxsIGNsZWFybHkgcGFydCBvZiB0aGUgc2VsZi10ZXN0IHN1aXRlLgoKVGhlIHByb3ZpZGVkIGNyaXRlcmlhIGZvciBkZXRlcm1pbmluZyBgV29ydGhGdXp6aW5nYCBhcmU6IG1vZGlmaWNhdGlvbnMgdG8gZG9jdW1lbnRhdGlvbiwgS2NvbmZpZywgY29tbWVudHMsIGRlY29yYXRpdmUgY2hhbmdlcyBsaWtlIGxvZ2dpbmcsIGNoYW5nZXMgdG8gbm9uLWZ1bmN0aW9uYWwgY29uc3RhbnRzLCB1bnJlYWNoYWJsZSBjb2RlLCBvciBjb2RlIHJlbGF0ZWQgdG8gc3BlY2lmaWMgaGFyZHdhcmUgdGhhdCYjMzk7cyBub3QgZW11bGF0ZWQuIEl0IGFsc28gZXhjbHVkZXMgY2VydGFpbiBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgcGF0Y2ggaXNuJiMzOTt0IGNoYW5naW5nIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzIHRoYXQgYXJlIHJlYWNoYWJsZS4gU2luY2UgdGhpcyBpcyBhbGwgY29uZmluZWQgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIGl0IGRvZXNuJiMzOTt0IG1lZXQgdGhlIGNyaXRlcmlhIGZvciBmdXp6aW5nLiBUaGVzZSBzZWxmLXRlc3RzIHJlc2lkZSBpbiB1c2Vyc3BhY2UgYW5kIGRvIG5vdCBpbnRyb2R1Y2UgbmV3LCBmdXp6ZWQgbG9naWMgdG8gdGhlIGtlcm5lbCBpdHNlbGYuCgpOb3csIEkgZG91YmxlLWNoZWNrLiBUaGUgaW5zdHJ1Y3Rpb25zIGNsZWFybHkgc3RhdGUgdGhhdCBpZiB0aGUgcGF0Y2ggKm9ubHkqIGNvbnRhaW5zIGNoYW5nZXMgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AsIGl0IGRvZXNuJiMzOTt0IHdhcnJhbnQgZnV6emluZy4gVGhlIHBhdGNoIGlzIHNvbGVseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGFyZWEuIE15IGNvZGUgc2VhcmNoIGNvbmZpcm1zIHRoZXJlIGFyZSBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYy4gU2luY2UgdGhlc2UgdGVzdHMgYXJlIHVzZXJzcGFjZSB0ZXN0IHByb2dyYW1zLCB0aGV5IGRvbiYjMzk7dCBoYXZlIGZ1bmN0aW9uYWwgaW1wbGljYXRpb25zIHRvIGJlIGZ1enplZCBpbiB0aGUga2VybmVsLiBUaGVyZWZvcmUsIHRoZSB2YWx1ZSBzaG91bGQgYmUgYFdvcnRoRnV6emluZz1mYWxzZWAuCgpJbiBjb25jbHVzaW9uLCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIHNlbGYtdGVzdCBzdWl0ZSBhbmQgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGtlcm5lbCBjb2RlIHBhdGhzIHRoYXQgcmVxdWlyZSBmdXp6aW5nLiBIZW5jZSwgSSB3aWxsIGlzc3VlIGEgY2FsbCB0byBgc2V0LXJlc3VsdHNgIHdpdGggYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMTUgMDI6MTg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjMwLjQ1NTAzMTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY5MDgxOTgyNjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJcIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMTVUMDI6MTg6MzAuNDU1MDM5MjhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0NTU1NzA2MzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA3N2FlYTQwOWVlODdlZWY3OWMwODE1ODgwMjQwNjVkM2MxZTdmOTBlXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDE1IDAyOjE4OjI4IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5pbmRleCAyZDUzNjYxOTZlMzA5Li4zMDhiYmFkNzNjMTFhIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGVcXG5AQCAtMTA0LDYgKzEwNCw5IEBAIFRFU1RfR0VOX0ZJTEVTICs9IGd1YXJkLXJlZ2lvbnNcXG4gVEVTVF9HRU5fRklMRVMgKz0gbWVyZ2VcXG4gVEVTVF9HRU5fRklMRVMgKz0gcm1hcFxcbiBURVNUX0dFTl9GSUxFUyArPSBmb2xpb19zcGxpdF9yYWNlX3Rlc3RcXG4rVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fb3JkZXJfY2hlY2tcXG4rVEVTVF9HRU5fRklMRVMgKz0ga2h1Z2VwYWdlZF9zeW5jX2NoZWNrXFxuK1RFU1RfR0VOX0ZJTEVTICs9IGtodWdlcGFnZWRfcmFjZVxcbiBcXG4gaWZuZXEgKCQoQVJDSCksYXJtNjQpXFxuIFRFU1RfR0VOX0ZJTEVTICs9IHNvZnQtZGlydHlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjkzMDMwYTQyYzNjY2RcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suY1xcbkBAIC0wLDAgKzEsMTM3IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIFNlbGYtY2hlY2sgZm9yIHRoZSB2bV91dGlsIGZvbGlvLW9yZGVyIGRldGVjdGlvbiBoZWxwZXJzLFxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxcbisgKlxcbisgKiBGb3IgZXZlcnkgYW5vbiBUSFAgb3JkZXIgdGhlIGtlcm5lbCBzdXBwb3J0cywgZmF1bHQgbWVtb3J5IGluIHdpdGggb25seVxcbisgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxcbisgKiBub3QgYSBuZWlnaGJvdXJpbmcgb3JkZXIsIGFuZCBwbGFpbiA0SyBtZW1vcnkgYXMgb3JkZXIgMC4gVGhlIGhlbHBlcnNcXG4rICogYXJlIHdoYXQgdGhlIGtodWdlcGFnZWQgbVRIUCB0ZXN0cyB1c2UgdG8gZGV0ZWN0IGNvbGxhcHNlIHJlc3VsdHMsIHNvXFxuKyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwncyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XFxuKyAqIGNvbGxhcHNlIHRlc3QgcmVsaWVzIG9uIHRoZW0uXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NmY250bC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitcXG4rLyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xcbitzdGF0aWMgY2hhciAqYWxsb2NfYWxpZ25lZChzaXplX3Qgc2l6ZSlcXG4re1xcbitcXHRzaXplX3QgbGVuID0gc2l6ZSAqIDI7XFxuK1xcdHVpbnRwdHJfdCBhbGlnbmVkO1xcbitcXHRjaGFyICpwO1xcbitcXG4rXFx0cCA9IG1tYXAoTlVMTCwgbGVuLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibW1hcCgpXFxcIik7XFxuK1xcbitcXHRhbGlnbmVkID0gQUxJR04oKHVpbnRwdHJfdClwLCBzaXplKTtcXG4rXFx0aWYgKGFsaWduZWQgIT0gKHVpbnRwdHJfdClwKVxcbitcXHRcXHRtdW5tYXAocCwgYWxpZ25lZCAtICh1aW50cHRyX3QpcCk7XFxuK1xcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXFxuK1xcdFxcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxcbitcXHRcXHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xcbitcXG4rXFx0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcXG4rfVxcbitcXG4rLypcXG4rICogRW5hYmxlIG9ubHkgQG9yZGVyIChvcmRlciAwOiBub3RoaW5nKSwgZmF1bHQgb25lIGFsaWduZWQgd2luZG93IGluIGFuZFxcbisgKiBjaGVjayB0aGUgaGVscGVycyBzZWUgZXhhY3RseSBAb3JkZXIuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjaGVja19vcmRlcihpbnQgb3JkZXIpXFxuK3tcXG4rXFx0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGJvb2wgb2sgPSB0cnVlO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdGlmIChvcmRlcilcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW29yZGVyXS5lbmFibGVkID0gVEhQX0FMV0FZUztcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdHAgPSBhbGxvY19hbGlnbmVkKHNpemUpO1xcbitcXHQqcCA9IDE7XFxuK1xcbitcXHRpZiAoIWlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcXFxuXFxcIiwgb3JkZXIpO1xcbitcXHRcXHRvayA9IGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIG9yZGVyIC0gMSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJvcmRlciAlZCBhbHNvIHJlcG9ydGVkIGFzIG9yZGVyICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHQgICAgICAgb3JkZXIsIG9yZGVyIC0gMSk7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXFxuK1xcdGlmIChvcmRlciBcXHUwMDI2XFx1MDAyNiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHNpemUsIDAsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xcbitcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAwXFxcXG5cXFwiLCBvcmRlcik7XFxuK1xcdFxcdG9rID0gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdG11bm1hcChwLCBzaXplKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdChvaywgXFxcIm9yZGVyICVkIGNsYXNzaWZpZWRcXFxcblxcXCIsIG9yZGVyKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIG9yZGVycztcXG4rXFx0aW50IG9yZGVyO1xcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFxuK1xcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXFxcblxcXCIpO1xcbitcXG4rXFx0cGFnZW1hcF9mZCA9IG9wZW4oXFxcIi9wcm9jL3NlbGYvcGFnZW1hcFxcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKHBhZ2VtYXBfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVxcXCIpO1xcbitcXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKGtwYWdlZmxhZ3NfZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwib3BlbihcXFxcXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFxcXFxcIikgcmVxdWlyZXMgcm9vdFxcXFxuXFxcIik7XFxuK1xcbitcXHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xcbitcXHRpZiAoIW9yZGVycylcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIk5vIHN1cHBvcnRlZCBUSFAgb3JkZXJzXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGtzZnRfc2V0X3BsYW4oX19idWlsdGluX3BvcGNvdW50bChvcmRlcnMpICsgMSk7XFxuK1xcbitcXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xcbitcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRjaGVja19vcmRlcigwKTtcXG4rXFx0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFxcdTAwM2MgTlJfT1JERVJTOyBvcmRlcisrKSB7XFxuK1xcdFxcdGlmICghKG9yZGVycyBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXIpKSlcXG4rXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdGNoZWNrX29yZGVyKG9yZGVyKTtcXG4rXFx0fVxcbitcXG4rXFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuaW5kZXggZTI2NDJlY2EwZDAyYi4uZGY0MjZmOTIxOGU3MSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jXFxuQEAgLTY1LDcgKzY1LDYgQEAgZW51bSB7XFxuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XFxuICNkZWZpbmUgTlRJTUVTXFx0XFx0MTBcXG4gXFxuLSNkZWZpbmUgQUxJR04oeCwgYSkgKCgoeCkgKyAoYSAtIDEpKSBcXHUwMDI2ICh+KChhKSAtIDEpKSlcXG4gLyogSnVzdCB0aGUgZmxhZ3Mgd2UgbmVlZCwgY29waWVkIGZyb20gbW0uaDogKi9cXG4gXFxuICNpZm5kZWYgRk9MTF9XUklURVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbmluZGV4IGQ3OTE3ZGNlM2FiYWMuLjk5MmVmZWUxN2I3MTYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmNcXG5AQCAtMTgzLDYgKzE4MywxOSBAQCB2b2lkIHRocF9yZWFkX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiBcXHR9XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFdyaXRlIG9ubHkgb24gY2hhbmdlOiBhIHN0b3JlIHRvIGVpdGhlciBzbGVlcCBrbm9iIHdha2VzIGtodWdlcGFnZWQgLS1cXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxcbisgKiBxdWV1ZSAtLSBhbmQgc2V0dGluZ3MgcHVzaGVzL3BvcHMgbXVzdCBub3Qgc3RhcnQgc2NhbiBwYXNzZXMgbm9ib2R5XFxuKyAqIGFza2VkIGZvcjsga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBpcyB0aGUgb25seSBzYW5jdGlvbmVkIHdha2UuICBUaGVcXG4rICogb3RoZXIga25vYnMgZG8gbm90IHdha2UsIGJ1dCB3cml0aW5nIHRoZW0gdGhlIHNhbWUgd2F5IGNvc3RzIG5vdGhpbmcuXFxuKyAqL1xcbit2b2lkIHRocF91cGRhdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKVxcbit7XFxuK1xcdGlmICh0aHBfcmVhZF9udW0obmFtZSkgIT0gbnVtKVxcbitcXHRcXHR0aHBfd3JpdGVfbnVtKG5hbWUsIG51bSk7XFxuK31cXG4rXFxuIHZvaWQgdGhwX3dyaXRlX3NldHRpbmdzKHN0cnVjdCB0aHBfc2V0dGluZ3MgKnNldHRpbmdzKVxcbiB7XFxuIFxcdHN0cnVjdCBraHVnZXBhZ2VkX3NldHRpbmdzICpraHVnZXBhZ2VkID0gXFx1MDAyNnNldHRpbmdzLVxcdTAwM2VraHVnZXBhZ2VkO1xcbkBAIC0xOTgsMTUgKzIxMSwxNSBAQCB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcXG4gXFx0XFx0XFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVxcdTAwM2VzaG1lbV9lbmFibGVkXSk7XFxuIFxcdHRocF93cml0ZV9udW0oXFxcInVzZV96ZXJvX3BhZ2VcXFwiLCBzZXR0aW5ncy1cXHUwMDNldXNlX3plcm9fcGFnZSk7XFxuIFxcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL2RlZnJhZ1xcXCIsIGtodWdlcGFnZWQtXFx1MDAzZWRlZnJhZyk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXFxcIixcXG4tXFx0XFx0XFx0a2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuLVxcdFxcdFxcdGtodWdlcGFnZWQtXFx1MDAzZXNjYW5fc2xlZXBfbWlsbGlzZWNzKTtcXG4tXFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc3dhcFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3N3YXApO1xcbi1cXHR0aHBfd3JpdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3NoYXJlZFxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZW1heF9wdGVzX3NoYXJlZCk7XFxuLVxcdHRocF93cml0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9kZWZyYWdcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VkZWZyYWcpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9hbGxvY19zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcXFwiLFxcbitcXHRcXHQgICAgICAga2h1Z2VwYWdlZC1cXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xcbitcXHR0aHBfdXBkYXRlX251bShcXFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XFxuK1xcdHRocF91cGRhdGVfbnVtKFxcXCJraHVnZXBhZ2VkL21heF9wdGVzX3N3YXBcXFwiLCBraHVnZXBhZ2VkLVxcdTAwM2VtYXhfcHRlc19zd2FwKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXFxcIiwga2h1Z2VwYWdlZC1cXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcXG4rXFx0dGhwX3VwZGF0ZV9udW0oXFxcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblxcXCIsIGtodWdlcGFnZWQtXFx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xcbiBcXG4gXFx0aWYgKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGhbMF0pXFxuIFxcdFxcdHdyaXRlX251bShkZXZfcXVldWVfcmVhZF9haGVhZF9wYXRoLCBzZXR0aW5ncy1cXHUwMDNlcmVhZF9haGVhZF9rYik7XFxuQEAgLTIzMCw2ICsyNDMsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXFxuIFxcdH1cXG4gfVxcbiBcXG4rLypcXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxcbisgKiBzdGFydGVkIGFmdGVyIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQuIGZ1bGxfc2NhbnMgbXVzdCBhZHZhbmNlIGJ5IHR3bztcXG4rICogYSArMSBzdGVwIG1heSBjb21wbGV0ZSBhIHBhc3MgdGhhdCBleGFtaW5lZCB0aGlzIG1tIGJlZm9yZSB0aGVcXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxcbisgKlxcbisgKiBBbnkgc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgc28gdGhlIGJhcnJpZXIgd29ya3NcXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxcbisgKiBfX3NsZWVwX21pbGxpc2Vjc19zdG9yZSgpIGNsZWFycyBraHVnZXBhZ2VkX3NsZWVwX2V4cGlyZSBhbmQgd2FrZXMgdGhlXFxuKyAqIHF1ZXVlOyBpZiB0aGUgZGFlbW9uIGlzIGJldHdlZW4gc2NhbnMgcmF0aGVyIHRoYW4gc2xlZXBpbmcsIGl0IHNldHNcXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxcbisgKiB0aGVuIHNsZWVwcyBmb3IgdGhlIGZ1bGwgaW50ZXJ2YWwsIGhhdmluZyBuZXZlciBzZWVuIHRoZSBzdG9yZS4gIFNvIGtlZXBcXG4rICogc3RvcmluZyB1bnRpbCB0aGUgcGFzcyBsYW5kczsgYSBzdG9yZSB3aGlsZSB0aGUgZGFlbW9uIGlzIGF3YWtlIGNvc3RzXFxuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXFxuKyAqXFxuKyAqIE9uZSB3YWtlIGNvbXBsZXRlcyBvbmUgZnVsbCBwYXNzIG9ubHkgaWYgdGhlIHdob2xlIG1tIGxpc3QgZml0cyBpblxcbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcXG4rICogcGFnZXNfdG9fc2Nhbi5cXG4rICovXFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xcbitcXHR1bnNpZ25lZCBsb25nIHNsZWVwX21zID1cXG4rXFx0XFx0dGhwX3JlYWRfbnVtKFxcXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXFxcIik7XFxuK1xcdHVuc2lnbmVkIGxvbmcgZWxhcHNlZF9tcyA9IDA7XFxuK1xcdGludCBwYXNzO1xcbitcXG4rXFx0Zm9yIChwYXNzID0gMDsgcGFzcyBcXHUwMDNjIDI7IHBhc3MrKykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHRhcmdldCA9XFxuK1xcdFxcdFxcdHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXFxcIikgKyAxO1xcbitcXG4rXFx0XFx0d2hpbGUgKHRocF9yZWFkX251bShcXFwia2h1Z2VwYWdlZC9mdWxsX3NjYW5zXFxcIikgXFx1MDAzYyB0YXJnZXQpIHtcXG4rXFx0XFx0XFx0aWYgKGVsYXBzZWRfbXMgXFx1MDAzZT0gZGVhZGxpbmVfbXMpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0XFx0XFx0dGhwX3dyaXRlX251bShcXFwia2h1Z2VwYWdlZC9zY2FuX3NsZWVwX21pbGxpc2Vjc1xcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHNsZWVwX21zKTtcXG4rXFx0XFx0XFx0dXNsZWVwKDEwICogMTAwMCk7XFxuK1xcdFxcdFxcdGVsYXBzZWRfbXMgKz0gMTA7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcXG4ge1xcbiBcXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuaW5kZXggNzI2YzczYzQzYzA1Yi4uYmE3ZDM4MzcwZDQzMyAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcbkBAIC03MCw2ICs3MCw3IEBAIGludCB0aHBfcmVhZF9zdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqIGNvbnN0IHN0cmluZ3NbXSk7XFxuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9yZWFkX251bShjb25zdCBjaGFyICpuYW1lKTtcXG4gdm9pZCB0aHBfd3JpdGVfbnVtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbnVtKTtcXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XFxuIFxcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncyk7XFxuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xcbkBAIC04Myw2ICs4NCw4IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHBfc2F2ZV9zZXR0aW5ncyh2b2lkKVxcbiBcXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XFxuIH1cXG4gXFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XFxuK1xcbiB2b2lkIHRocF9zZXRfcmVhZF9haGVhZF9wYXRoKGNoYXIgKnBhdGgpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xcbiB1bnNpZ25lZCBsb25nIHRocF9zaG1lbV9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWQuY1xcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XFxuIHN0YXRpYyBpbnQgaHBhZ2VfcG1kX25yO1xcbiBzdGF0aWMgaW50IGFub25fb3JkZXI7XFxuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XFxuK3N0YXRpYyBib29sIGNvbGxhcHNlX29yZGVyX2dpdmVuO1xcbitzdGF0aWMgaW50IGNvbGxhcHNlX29yZGVyc1tOUl9PUkRFUlNdO1xcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcXG4rc3RhdGljIGludCBwYWdlbWFwX2ZkID0gLTE7XFxuK3N0YXRpYyBpbnQga3BhZ2VmbGFnc19mZCA9IC0xO1xcbiBcXG4gI2RlZmluZSBQSURfU01BUFMgXFxcIi9wcm9jL3NlbGYvc21hcHNcXFwiXFxuICNkZWZpbmUgVEVTVF9GSUxFIFxcXCJjb2xsYXBzZV90ZXN0X2ZpbGVcXFwiXFxuQEAgLTIxOSw2ICsyMjQsNDEgQEAgc3RhdGljIGJvb2wgY2hlY2tfc3dhcCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpXFxuIFxcdHJldHVybiBzd2FwO1xcbiB9XFxuIFxcbisvKlxcbisgKiBQYWdlIHRoZSByYW5nZSBvdXQgYW5kIHdhaXQgZm9yIHRoZSBzd2FwIGNvdW50IHRvIHNheSBzby5cXG4rICpcXG4rICogVHdvIHRoaW5ncyBnZXQgaW4gdGhlIHdheS4gIE1BRFZfUEFHRU9VVCBpcyBiZXN0IGVmZm9ydDpcXG4rICogc2hyaW5rX2ZvbGlvX2xpc3QoKSBsZWF2ZXMgYSBmb2xpbyBhbG9uZSB3aGVuIGl0IGNhbm5vdCByZWNsYWltIGl0IHJpZ2h0XFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cXG4rICogY2FzZSwgc28gdGhlIGNvdW50IHRoZSBjYWxsZXIgYXNrcyBmb3IgYXJyaXZlcyBhIG1vbWVudCBsYXRlci4gIEFuZCBhIHJhbmdlXFxuKyAqIGFuIGVhcmxpZXIgY29sbGFwc2UgbGVmdCBNQURWX0hVR0VQQUdFIGlzIG9uZSBraHVnZXBhZ2VkIGlzIHN0aWxsIHdvcmtpbmdcXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcXG4rICogcmVhZGluZyB0aG9zZSBwYWdlcyBiYWNrIGluLCBzbyB0aGUgZGFlbW9uIHVuZG9lcyB0aGUgcGFnZW91dCBhcyBmYXN0IGFzIGl0XFxuKyAqIGlzIGFza2VkIGZvci4gIEtlZXAgdGhlIHJhbmdlIG91dCBvZiBpdHMgcmVhY2g7IHRoZSBjb2xsYXBzZSB0aGUgY2FsbGVyIHJ1bnNcXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cXG4rICpcXG4rICogRmFpbGluZyB0byBnZXQgdGhlIHBhZ2VzIG91dCBpcyB0aGUgbWFjaGluZSdzIGFuc3dlciwgbm90IHRoZSBrZXJuZWwncyAtLVxcbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cXG4rICogY2FsbGVycyBza2lwIHJhdGhlciB0aGFuIGZhaWwuICBBbiBlcnJvciBmcm9tIG1hZHZpc2UoKSBpcyBkaWZmZXJlbnQsIGFuZFxcbisgKiBlbmRzIHRoZSBydW4gaGVyZS5cXG4rICovXFxuK3N0YXRpYyBib29sIHN3YXBvdXRfcmFuZ2Uodm9pZCAqcCwgdW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKG1hZHZpc2UocCwgc2l6ZSwgTUFEVl9OT0hVR0VQQUdFKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcXFwiKTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyA0MDsgaSsrKSB7XFxuK1xcdFxcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX1BBR0VPVVQpXFxcIik7XFxuK1xcdFxcdGlmIChjaGVja19zd2FwKHAsIHNpemUpKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0dXNsZWVwKDUwICogMTAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgdm9pZCAqYWxsb2NfbWFwcGluZyhpbnQgbnIpXFxuIHtcXG4gXFx0dm9pZCAqcDtcXG5AQCAtNTE1LDggKzU1NSw4IEBAIHN0YXRpYyBib29sIGlzX2Fub24oc3RydWN0IG1lbV9vcHMgKm9wcylcXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcXG4gXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBtZW1fb3BzICpvcHMsIGJvb2wgZXhwZWN0KVxcbiB7XFxuLVxcdGludCByZXQ7XFxuIFxcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0aW50IHJldCwgaTtcXG4gXFxuIFxcdGtzZnRfcHJpbnRfbXNnKFxcXCIlcy4uLlxcXCIsIG1zZyk7XFxuIFxcbkBAIC01MjksOSArNTY5LDIwIEBAIHN0YXRpYyB2b2lkIF9fbWFkdmlzZV9jb2xsYXBzZShjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIGludCBucl9ocGFnZXMsXFxuIFxcdC8qXFxuIFxcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxcbiBcXHQgKiBpZ25vcmVzIC9zeXMva2VybmVsL21tL3RyYW5zcGFyZW50X2h1Z2VwYWdlL2VuYWJsZWRcXG4rXFx0ICpcXG4rXFx0ICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGFcXG4rXFx0ICogc291cmNlIG9yZGVyIGxlZnQgYXQgXFxcImFsd2F5c1xcXCIgLS0gd2hpY2ggLXMgZG9lcyAtLSBsZXRzIGtodWdlcGFnZWRcXG4rXFx0ICogY29sbGFwc2UgdGhlIHZlcnkgcmFuZ2UgdGhlIGNhc2UgaXMgd29ya2luZyBvbi4gIFNldCB0aGVtIHRvXFxuK1xcdCAqIFxcXCJpbmhlcml0XFxcIiwgbm90IFxcXCJuZXZlclxcXCIuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmRcXG4rXFx0ICogc3RheXMgb3V0LiAgQSBmb3JjZWQgc2htZW0gY29sbGFwc2UgdGFrZXMgdGhlIG9yZGVyIGl0IGJ1aWxkcyBmcm9tXFxuK1xcdCAqIHRoZXNlIHZlcnkgY29udHJvbHMsIGFuZCBzdGlsbCBmaW5kcyBvbmUuXFxuIFxcdCAqL1xcbiBcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9ORVZFUjtcXG4gXFx0c2V0dGluZ3Muc2htZW1fZW5hYmxlZCA9IFNITUVNX05FVkVSO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspIHtcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0c2V0dGluZ3Muc2htZW1faHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBTSE1FTV9JTkhFUklUO1xcbitcXHR9XFxuIFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuIFxcbiBcXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXFxuQEAgLTU2MSw4ICs2MTIsMTAgQEAgc3RhdGljIGJvb2wgd2FpdF9mb3Jfc2Nhbihjb25zdCBjaGFyICptc2csIGNoYXIgKnAsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBucl9ocGFnZXMsIGludCBjb2xsYXBfb3JkZXIsIHN0cnVjdCBtZW1fb3BzICpvcHMpXFxuIHtcXG4gXFx0dW5zaWduZWQgbG9uZyBocGFnZV9zaXplID0gcGFnZV9zaXplIFxcdTAwM2NcXHUwMDNjIGNvbGxhcF9vcmRlcjtcXG4rXFx0LyogVGhyZWUgc2Vjb25kcyBhcyBhIGZsb29yLCBwbHVzIGEgc2Vjb25kIHBlciAxMjhNIHRvIGNvbGxhcHNlICovXFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAodW5zaWduZWQgbG9uZylucl9ocGFnZXMgKiBocGFnZV9zaXplO1xcbitcXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFxcdTAwM2NcXHUwMDNjIDIwKSk7XFxuIFxcdGludCBmdWxsX3NjYW5zO1xcbi1cXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xcbiBcXG4gXFx0LyogU2FuaXR5IGNoZWNrICovXFxuIFxcdGlmICghb3BzLVxcdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXFxuQEAgLTgyNSwxMiArODc4LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX3N3YXBpbl9zaW5nbGVfcHRlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wXFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgb25lIHBhZ2UuLi5cXFwiKTtcXG4tXFx0aWYgKG1hZHZpc2UocCwgcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRpZiAoY2hlY2tfc3dhcChwLCBwYWdlX3NpemUpKSB7XFxuK1xcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg1MSwxMiArOTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXG4gXFx0a3NmdF9wcmludF9tc2coXFxcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cXFwiLCBtYXhfcHRlc19zd2FwICsgMSwgaHBhZ2VfcG1kX25yKTtcXG4tXFx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcXG4tXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtYWR2aXNlKE1BRFZfUEFHRU9VVClcXFwiKTtcXG4tXFx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4rXFx0aWYgKHN3YXBvdXRfcmFuZ2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcXG4gXFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXHRcXHRza2lwKFxcXCJDb3VsZCBub3Qgc3dhcCBvdXRcXFwiKTtcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdH1cXG4gXFxuQEAgLTg2OCwxMiArOTE3LDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXFxuIFxcdFxcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbiBcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiU3dhcG91dCAlZCBvZiAlZCBwYWdlcy4uLlxcXCIsIG1heF9wdGVzX3N3YXAsXFxuIFxcdFxcdCAgICAgICBocGFnZV9wbWRfbnIpO1xcbi1cXHRcXHRpZiAobWFkdmlzZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplLCBNQURWX1BBR0VPVVQpKVxcbi1cXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVxcXCIpO1xcbi1cXHRcXHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbitcXHRcXHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xcbiBcXHRcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRmYWlsKFxcXCJGYWlsXFxcIik7XFxuK1xcdFxcdFxcdHNraXAoXFxcIkNvdWxkIG5vdCBzd2FwIG91dFxcXCIpO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXG5AQCAtOTQwLDYgKzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xcbiBcXHR2b2lkICpwO1xcbiBcXHRpbnQgaTtcXG4gXFxuK1xcdC8qXFxuK1xcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xcbitcXHQgKiBmYWlsIGZvciBsYXJnZSBQTUQgc2l6ZXMuICBTa2lwIGlmIHRoZSBQTUQgc2l6ZSBpcyBvdmVyIDMyTS5cXG4rXFx0ICovXFxuK1xcdGlmIChocGFnZV9wbWRfc2l6ZSBcXHUwMDNlICgzMlVMIFxcdTAwM2NcXHUwMDNjIDIwKSkge1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzOiBQTUQgdG9vIGxhcmdlIGZvciBmYXVsdC10aW1lIFRIUCBjb25zdHJ1Y3Rpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbiBcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbiBcXHRrc2Z0X3ByaW50X21zZyhcXFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXFxcblxcXCIpO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHBhZ2VfcG1kX25yOyBpKyspIHtcXG5AQCAtMTEzMCw2ICsxMTg3LDk3IEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZChzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHNcXG4gXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbiB9XFxuIFxcbisvKlxcbisgKiBDb250ZW50IHN0YXlzIGlzb2xhdGVkIHdoaWxlIGEgY28tc2hhcmVyIHdyaXRlcyBjb25jdXJyZW50bHkuIEEgc2hhcmVkXFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXFxuKyAqIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvcHk7IGEgY28tc2hhcmVyJ3Mgd3JpdGUgZ29lcyB0byBhIENvVyBjb3B5LiBUaGVcXG4rICogY29sbGFwc2luZyBjaGlsZCBtdXN0IHNlZSB0aGUgcHJlLWZvcmsgY29udGVudCwgdGhlIHdyaXRpbmcgcGFyZW50IG9ubHlcXG4rICogaXRzIG93biB3cml0ZXMuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9mb3JrX2Nvd19yYWNlKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgc2hhcmVkID0gNjQgKiBwYWdlX3NpemU7XFxuK1xcdGNvbnN0IGludCBzdHJpZGUgPSBwYWdlX3NpemUgLyBzaXplb2YoaW50KTtcXG4rXFx0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcXG4rXFx0Lyogdm9sYXRpbGU6IHRoZSBsb29wIGJlbG93IG11c3QgcmVhbGx5IHN0b3JlLCBvbiBldmVyeSBpdGVyYXRpb24gKi9cXG4rXFx0dm9sYXRpbGUgaW50ICppcDtcXG4rXFx0cGlkX3QgY2hpbGQ7XFxuK1xcdGludCBzeW5jWzJdO1xcbitcXHRjaGFyIGdvID0gMTtcXG4rXFx0dm9pZCAqcDtcXG4rXFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdGlwID0gcDtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1xcdFxcdC8qIHNoYXJlZCBwcmVmaXgsIHByZS1mb3JrIHBhdHRlcm4gKi9cXG4rXFx0aWYgKHBpcGUoc3luYykpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwicGlwZSgpXFxcIik7XFxuK1xcbitcXHRrc2Z0X3ByaW50X21zZyhcXFwiRm9yaywgY29sbGFwc2UgaW4gdGhlIGNoaWxkIHdoaWxlIHRoZSBwYXJlbnQgcmV3cml0ZXMuLi5cXFwiKTtcXG4rXFx0Y2hpbGQgPSBmb3JrKCk7XFxuK1xcdGlmICghY2hpbGQpIHtcXG4rXFx0XFx0aW50IGNvbGxhcHNlX3N0YXR1cztcXG4rXFxuK1xcdFxcdGNsb3NlKHN5bmNbMF0pO1xcbitcXHRcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1xcdC8qIHByaXZhdGUgcmVtYWluZGVyICovXFxuK1xcdFxcdC8qIFN0YXJ0IHRoZSBwYXJlbnQgdW5zaGFyaW5nLCBhbmQgZ2l2ZSBpdCBhIGhlYWQgc3RhcnQuICovXFxuK1xcdFxcdGlmICh3cml0ZShzeW5jWzFdLCBcXHUwMDI2Z28sIDEpICE9IDEpXFxuK1xcdFxcdFxcdF9leGl0KEtTRlRfRkFJTCk7XFxuK1xcdFxcdHVzbGVlcCg1MDAwKTtcXG4rXFx0XFx0Yy1cXHUwMDNlY29sbGFwc2UoXFxcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclxcXCIsXFxuK1xcdFxcdFxcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xcbitcXHRcXHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG47IGkrKylcXG4rXFx0XFx0XFx0aWYgKGlwW2kgKiBzdHJpZGVdICE9IGkgKyAweGRlYWQwMDAwKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0aWYgKGkgPT0gbilcXG4rXFx0XFx0XFx0c3VjY2VzcyhcXFwiT0tcXFwiKTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRmYWlsKFxcXCJGYWlsOiBjaGlsZCBjb250ZW50XFxcIik7XFxuK1xcdFxcdC8qIFRoZSBjb250ZW50IGNoZWNrIG11c3Qgbm90IGJ1cnkgYSBmYWlsZWQgY29sbGFwc2UuICovXFxuK1xcdFxcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdFxcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xcbitcXHRcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdFxcdF9leGl0KGV4aXRfc3RhdHVzKTtcXG4rXFx0fVxcbitcXG4rXFx0Y2xvc2Uoc3luY1sxXSk7XFxuK1xcdGlmIChyZWFkKHN5bmNbMF0sIFxcdTAwMjZnbywgMSkgIT0gMSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJjaGlsZCBuZXZlciByZWFjaGVkIHRoZSBjb2xsYXBzZVxcXFxuXFxcIik7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBVbnNoYXJlIG9uZSBwYWdlIGF0IGEgdGltZS4gIEEgYnVyc3Qgd291bGQgYnJlYWsgQ29XIG9uIGFsbCBvZiB0aGVtXFxuK1xcdCAqIGluIG1pY3Jvc2Vjb25kcyAtLSB3YWl0X2Zvcl9zY2FuKCkgZG9lcyBub3QgZXZlbiBwb2xsIGZvciBUSUNLIC0tXFxuK1xcdCAqIGFuZCB0aGUgY2hpbGQgd291bGQgY29sbGFwc2UgcGFnZXMgYWxyZWFkeSBleGNsdXNpdmUgdG8gaXQuXFxuK1xcdCAqL1xcbitcXHRpID0gMDtcXG4rXFx0ZG8ge1xcbitcXHRcXHRpZiAoaSBcXHUwMDNjIG4pXFxuK1xcdFxcdFxcdGlwW2kgKiBzdHJpZGVdID0gaSArIDB4YmVlZjAwMDA7XFxuK1xcdFxcdGkrKztcXG4rXFx0XFx0dXNsZWVwKDEwICogMTAwMCk7XFxuK1xcdH0gd2hpbGUgKHdhaXRwaWQoY2hpbGQsIFxcdTAwMjZ3c3RhdHVzLCBXTk9IQU5HKSA9PSAwKTtcXG4rXFxuK1xcdC8qIFdoYXRldmVyIHRoZSBwYWNlZCBzd2VlcCBkaWQgbm90IHJlYWNoLCBzbyB0aGUgY2hlY2sgYmVsb3cgaXMgZXhhY3QuICovXFxuK1xcdGZvciAoOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xcbitcXHQvKiBBIGNoaWxkIHRoYXQgZGllZCByZWFkaW5nIHRoZSByYWNpbmcgcGFnZXMgaXMgYSBmYWlsdXJlLCBub3QgYSB6ZXJvLiAqL1xcbitcXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDaGVjayB0aGUgcGFyZW50IHNlZXMgb25seSBpdHMgb3duIHdyaXRlcy4uLlxcXCIpO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKVxcbitcXHRcXHRpZiAoaXBbaSAqIHN0cmlkZV0gIT0gaSArIDB4YmVlZjAwMDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRpZiAoaSA9PSBuKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWw6IHBhcmVudCBjb250ZW50XFxcIik7XFxuK1xcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0LyogU2FtZSBhZ2Fpbjogb3VyIG93biBjaGVjayBtdXN0IG5vdCBidXJ5IHRoZSBjaGlsZCdzIHZlcmRpY3QuICovXFxuK1xcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXFxuK1xcdFxcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4ge1xcbkBAIC0xMTc1LDYgKzEzMjMsMjE5IEBAIHN0YXRpYyB2b2lkIG1hZHZpc2VfcmV0cmFjdGVkX3BhZ2VfdGFibGVzKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbiBcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuIH1cXG4gXFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZS4gKi9cXG4rI2RlZmluZSBNSU5fTVRIUF9PUkRFUiAyXFxuK1xcbisvKlxcbisgKiBPcmRlci1wYXJhbWV0ZXJpemVkIGNvbGxhcHNlIGNhc2VzIGZvciB0aGUgbXRocF9raHVnZXBhZ2VkIGNvbnRleHQuICBXaGF0XFxuKyAqIHRoZXkgYWRkIG92ZXIgdGhlIGdlbmVyaWMgY2FzZXMgcnVuIHVuZGVyIHRoYXQgY29udGV4dCBpcyBwZXItd2luZG93XFxuKyAqIGRldGVjdGlvbjogd2hpY2ggYWxpZ25lZCB3aW5kb3cgY29sbGFwc2VkLCBhbmQgd2hpY2ggb2YgaXRzIG5laWdoYm91cnMgZGlkXFxuKyAqIG5vdC4gIGNoZWNrX2h1Z2UoKSBhbnN3ZXJzIGhvdyBtYW55IGZvbGlvcyBvZiB0aGUgb3JkZXIgdGhlIHJhbmdlIGhvbGRzLFxcbisgKiB3aGljaCBjYW5ub3QgdGVsbCBvbmUgd2luZG93IGZyb20gYW5vdGhlci5cXG4rICpcXG4rICogVGhlIHJlZ2lvbiBpcyBmYXVsdGVkIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBhbmQgdGhlIHRhcmdldCBvcmRlciBpcyBvbmx5XFxuKyAqIGVuYWJsZWQgZm9yIG1hZHZpc2UsIHNvIHRoZSBzb3VyY2VzIGFyZSBhbHdheXMgb3JkZXIgMCBhbmQgdGhlIGNvbGxhcHNlXFxuKyAqIHByb2R1Y3QgY2FuIG9ubHkgaGF2ZSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cXG4rICovXFxuK3N0YXRpYyBzaXplX3QgbXRocF93aW5kb3dfc2l6ZSh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBwYWdlX3NpemUgXFx1MDAzY1xcdTAwM2MgY29sbGFwc2Vfb3JkZXI7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIG10aHBfcHVzaF90YXJnZXRfb3JkZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRhcmdldCBvcmRlciwgZm9yIG1hZHZpc2Ugb25seSwgYW5kIG5vdGhpbmcgZWxzZSBlbmFibGVkOiB0aGVcXG4rXFx0ICogY2FzZXMgZmF1bHQgdGhlaXIgcmVnaW9uIGJlZm9yZSBNQURWX0hVR0VQQUdFLCBzbyB0aGUgc291cmNlcyBhcmVcXG4rXFx0ICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZVxcbitcXHQgKiBjYXNlcyBidWlsdCBhcm91bmQgYSBob2xlIC0tIGEgbGFyZ2Ugc291cmNlIGZvbGlvIHdvdWxkIGZpbGwgaXQgaW5cXG4rXFx0ICogYW5kIHRoZSB3aW5kb3cgd291bGQgY29sbGFwc2UgYWZ0ZXIgYWxsLlxcbitcXHQgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvblxcbitcXHQgKiB0b3Agb2YgdGhpcy5cXG4rXFx0ICovXFxuK1xcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgTlJfT1JERVJTOyBpKyspXFxuK1xcdFxcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xcbitcXHRzZXR0aW5ncy5odWdlcGFnZXNbY29sbGFwc2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0dGhwX3B1c2hfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgd2luZG93X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHJldHVybiBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGxlbiwgY29sbGFwc2Vfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rfVxcbitcXG4rLyogTm8gYWxpZ25lZCB3aW5kb3cgaW4gW3AsIHAgKyBsZW4pIGlzIGJhY2tlZCBhdCB0aGUgdGFyZ2V0IG9yZGVyLiAqL1xcbitzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XFxuK1xcdGNoYXIgKmFkZHIgPSBwO1xcbitcXG4rXFx0Zm9yICg7IGxlbiBcXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XFxuK1xcdFxcdGlmICh3aW5kb3dfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wga2h1Z2VwYWdlZF93YWl0X2Z1bGxfcGFzcyh2b2lkKVxcbit7XFxuK1xcdC8qIFdhaXQgdXAgdG8gMzAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXFxuK1xcdHJldHVybiBraHVnZXBhZ2VkX2Z1bGxfcGFzcygzMCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3coc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIHdpbmRvdywgMiAqIHdpbmRvdyk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSBvbmUgZnVsbHkgcG9wdWxhdGVkIHdpbmRvdy4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAsIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyAyICogd2luZG93LFxcbitcXHRcXHRcXHRcXHQgICAgICBocGFnZV9wbWRfc2l6ZSAtIDIgKiB3aW5kb3cpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9wYXJ0aWFsX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdHZvaWQgKnA7XFxuK1xcbitcXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XFxuK1xcbitcXHRwID0gb3BzLVxcdTAwM2VzZXR1cF9hcmVhKDEpO1xcbitcXHRvcHMtXFx1MDAzZWZhdWx0KHAsIDAsIHBhZ2Vfc2l6ZSk7XFxuK1xcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXFxcblxcXCIpO1xcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSB3aW5kb3cgd2l0aCBzaW5nbGUgUFRFIGVudHJ5IHByZXNlbnQuLi5cXFwiKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxcbitcXHRcXHRzdWNjZXNzKFxcXCJPS1xcXCIpO1xcbitcXHRlbHNlXFxuK1xcdFxcdGZhaWwoXFxcIkZhaWxcXFwiKTtcXG4rXFxuK1xcdHZhbGlkYXRlX21lbW9yeShwLCAwLCBwYWdlX3NpemUpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFxcXCIlc1xcXFxuXFxcIiwgX19mdW5jX18pO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBjb2xsYXBzZV9vcmRlcl9tYXhfcHRlc19ub25lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxcbitcXHRcXHRcXHRcXHRcXHQgc3RydWN0IG1lbV9vcHMgKm9wcylcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRzaXplX3Qgd2luZG93ID0gbXRocF93aW5kb3dfc2l6ZSgpO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXHRzZXR0aW5ncyA9ICp0aHBfY3VycmVudF9zZXR0aW5ncygpO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSAwO1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0cCA9IG9wcy1cXHUwMDNlc2V0dXBfYXJlYSgxKTtcXG4rXFx0b3BzLVxcdTAwM2VmYXVsdChwLCAwLCAyICogd2luZG93IC0gcGFnZV9zaXplKTtcXG4rXFx0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcXFxuXFxcIik7XFxuK1xcbitcXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcXG4rXFx0a3NmdF9wcmludF9tc2coXFxcIkNvbGxhcHNlIGZ1bGwgd2luZG93LCBub3QgdGhlIG9uZSBtaXNzaW5nIGEgcGFnZS4uLlxcXCIpO1xcbitcXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcXG4rXFx0XFx0ZmFpbChcXFwiVGltZW91dFxcXCIpO1xcbitcXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIHdpbmRvdykgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyB3aW5kb3csIHdpbmRvdykpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xcbitcXHRvcHMtXFx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XFxuK1xcdHRocF9wb3Bfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxcbit7XFxuK1xcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR2b2lkICpwO1xcbitcXG4rXFx0LyogU291cmNlcyBtdXN0IGJlIGEgc3VwcG9ydGVkIG1USFAgb3JkZXIgc3RyaWN0bHkgYmVsb3cgdGhlIHRhcmdldC4gKi9cXG4rXFx0aWYgKHNvdXJjZV9vcmRlciBcXHUwMDNlPSBjb2xsYXBzZV9vcmRlciB8fFxcbitcXHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXFxcIiVzOiBubyBzb3VyY2Ugb3JkZXIgYmVsb3cgdGFyZ2V0XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xcbitcXG4rXFx0LyogRmF1bHQgdGhlIHdob2xlIHJlZ2lvbiBhcyBvcmRlci1Ac291cmNlX29yZGVyIGZvbGlvcy4gKi9cXG4rXFx0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcXG4rXFx0c2V0dGluZ3MuaHVnZXBhZ2VzW3NvdXJjZV9vcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XFxuK1xcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcdHAgPSBvcHMtXFx1MDAzZXNldHVwX2FyZWEoMSk7XFxuK1xcdG9wcy1cXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgb3JkZXIgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkLCBidXQgdGhlIGFsbG9jYXRvciBjYW4gc3RpbGwgZmFsbFxcbitcXHQgKiBiYWNrIHVuZGVyIGZyYWdtZW50YXRpb24uICBUaGF0IGxlYXZlcyBub3RoaW5nIHRvIGNvbGxhcHNlIGZyb20sXFxuK1xcdCAqIHdoaWNoIGlzIHRoZSBtYWNoaW5lJ3MgYW5zd2VyIHJhdGhlciB0aGFuIGEgcmVhc29uIHRvIGVuZCB0aGUgcnVuLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIGhwYWdlX3BtZF9zaXplLCBzb3VyY2Vfb3JkZXIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCkpIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIG9yZGVyLSVkIHNvdXJjZXMgdG8gY29sbGFwc2UuLi5cXFwiLCBzb3VyY2Vfb3JkZXIpO1xcbitcXHRcXHRza2lwKFxcXCJTa2lwXFxcIik7XFxuK1xcdFxcdG9wcy1cXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0XFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRcXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXFxcIiVzXFxcXG5cXFwiLCBfX2Z1bmNfXyk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XFxuK1xcdGtzZnRfcHJpbnRfbXNnKFxcXCJDb2xsYXBzZSByZWdpb24gYmFja2VkIGJ5IG9yZGVyLSVkIHNvdXJjZXMuLi5cXFwiLFxcbitcXHRcXHQgICAgICAgc291cmNlX29yZGVyKTtcXG4rXFx0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXFxuK1xcdFxcdGZhaWwoXFxcIlRpbWVvdXRcXFwiKTtcXG4rXFx0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXFxuK1xcdFxcdHN1Y2Nlc3MoXFxcIk9LXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZmFpbChcXFwiRmFpbFxcXCIpO1xcbitcXG4rXFx0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcXG4rXFx0b3BzLVxcdTAwM2VjbGVhbnVwX2FyZWEocCwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHR0aHBfcG9wX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcXFwiJXNcXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4ge1xcbiBcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIlxcXFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXFx1MDAzY3Rlc3QgdHlwZVxcdTAwM2UgW2Rpcl1cXFxcblxcXFxuXFxcIik7XFxuQEAgLTExOTIsMTEgKzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4gXFx0ZnByaW50ZihzdGRlcnIsXFx0XFxcIlxcXFx0XFxcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbiBcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byAwLiBVc2UgdGhpcyBzaXplIGZvciBhbm9uIG9yIHNobWVtIGFsbG9jYXRpb25zLlxcXFxuXFxcIik7XFxuIFxcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0LWM6IGNvbGxhcHNlIG9yZGVyIGZvciBtVEhQIGNvbGxhcHNlLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXFxcblxcXCIpO1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXHRcXFwiXFxcXHRcXFxcdCAgICBXaXRoIC1zLCAtcyBuYW1lcyB0aGUgbVRIUCBzb3VyY2Ugb3JkZXIgZm9yIHRoZVxcXFxuXFxcIik7XFxuK1xcdGZwcmludGYoc3RkZXJyLFxcdFxcXCJcXFxcdFxcXFx0ICAgIG1peGVkLXNvdXJjZSBjYXNlIChzb3VyY2Ugb3JkZXIgYmVsb3cgdGhlIHRhcmdldCkuXFxcXG5cXFwiKTtcXG4gXFx0ZXhpdCgxKTtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4ge1xcbitcXHRib29sIG10aHBfY29udGV4dF9pbXBsaWVkID0gZmFsc2U7XFxuIFxcdGludCBvcHQ7XFxuIFxcdGNoYXIgKmJ1ZjtcXG4gXFx0Y29uc3QgY2hhciAqdG9rZW47XFxuQEAgLTEyMDgsNiArMTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdjJzpcXG4gXFx0XFx0XFx0Y29sbGFwc2Vfb3JkZXIgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ2gnOlxcbiBcXHRcXHRkZWZhdWx0OlxcbkBAIC0xMjE1LDEyICsxNTgxLDI1IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdH1cXG4gXFx0fVxcbiBcXG4rXFx0LypcXG4rXFx0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxcbitcXHQgKiBjYW4gYmUgbmVnYXRpdmUsIGFuZCBhIHplcm8gY29sbGFwc2Ugb3JkZXIgYXNrcyBmb3IgYmFzZSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGlmIChhbm9uX29yZGVyIFxcdTAwM2MgMCB8fCBhbm9uX29yZGVyIFxcdTAwM2UgaHBhZ2VfcG1kX29yZGVyKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIi1zIHRha2VzIGFuIG9yZGVyIGluIDAuLiVkLCBub3QgJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIGhwYWdlX3BtZF9vcmRlciwgYW5vbl9vcmRlcik7XFxuK1xcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKGNvbGxhcHNlX29yZGVyIFxcdTAwM2M9IDAgfHwgY29sbGFwc2Vfb3JkZXIgXFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCItYyB0YWtlcyBhbiBvcmRlciBpbiAxLi4lZCwgbm90ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHQgICBocGFnZV9wbWRfb3JkZXIgLSAxLCBjb2xsYXBzZV9vcmRlcik7XFxuK1xcbiBcXHRhcmd2ICs9IG9wdGluZDtcXG4gXFx0YXJnYyAtPSBvcHRpbmQ7XFxuIFxcbiBcXHRpZiAoYXJnYyA9PSAwKSB7XFxuLVxcdFxcdC8qIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovXFxuK1xcdFxcdC8qIEV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyBubyBhcmd1bWVudCBvZiBpdHMgb3duOiBhbm9uLCBldmVyeSBjb250ZXh0ICovXFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuK1xcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHRcXHRhbm9uX29wcyA9IFxcdTAwMjZfX2Fub25fb3BzO1xcbiBcXHRcXHRyZXR1cm47XFxuQEAgLTEyMzEsMTMgKzE2MTAsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFxuIFxcdGlmICghc3RyY21wKHRva2VuLCBcXFwiYWxsXFxcIikpIHtcXG4gXFx0XFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdFxcdG1hZHZpc2VfY29udGV4dCA9ICBcXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBcXFwiYWxsXFxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cXG4rXFx0XFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cXG4rXFx0XFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcXFwia2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm10aHBfa2h1Z2VwYWdlZFxcXCIpKSB7XFxuIFxcdFxcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFxcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xcbi1cXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcXHUwMDNlPSBocGFnZV9wbWRfb3JkZXIpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXFxcIm1hZHZpc2VcXFwiKSkge1xcbiBcXHRcXHRtYWR2aXNlX2NvbnRleHQgPSAgXFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xcbiBcXHR9IGVsc2Uge1xcbkBAIC0xMjUzLDIwICsxNjM4LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFxcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3dyaXRlX29wcztcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0XFx0c2htZW1fb3BzID0gXFx1MDAyNl9fc2htZW1fb3BzO1xcbi1cXHRcXHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXFxuLVxcdFxcdFxcdHVzYWdlKCk7XFxuIFxcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFxcXCJhbm9uXFxcIikpIHtcXG4gXFx0XFx0YW5vbl9vcHMgPSBcXHUwMDI2X19hbm9uX29wcztcXG4gXFx0fSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgXFxcImZpbGVcXFwiKSkge1xcbiBcXHRcXHRyZWFkX29ubHlfZmlsZV9vcHMgPSAgXFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXFx1MDAyNl9fcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzO1xcbiBcXHRcXHRyZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzID0gIFxcdTAwMjZfX3JlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcXFwic2htZW1cXFwiKSkge1xcbiBcXHRcXHRzaG1lbV9vcHMgPSBcXHUwMDI2X19zaG1lbV9vcHM7XFxuLVxcdFxcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcXG4rXFx0XFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFxcdTAwMjZcXHUwMDI2ICFtdGhwX2NvbnRleHRfaW1wbGllZClcXG4gXFx0XFx0XFx0dXNhZ2UoKTtcXG4rXFx0XFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHR1c2FnZSgpO1xcbiBcXHR9XFxuQEAgLTEyODgsOSArMTY3MywxMCBAQCBzdHJ1Y3QgdGVzdF9jYXNlIHtcXG4gXFx0c3RydWN0IG1lbV9vcHMgKm9wcztcXG4gXFx0Y29uc3QgY2hhciAqZGVzYztcXG4gXFx0dGVzdF9mbiBmbjtcXG4rXFx0aW50IG9yZGVyO1xcdFxcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xcbiB9O1xcbiBcXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxcbisjZGVmaW5lIE1BWF9URVNUX0NBU0VTIDI1NlxcbiBzdGF0aWMgc3RydWN0IHRlc3RfY2FzZSB0ZXN0X2Nhc2VzW01BWF9URVNUX0NBU0VTXTtcXG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXG5AQCAtMTMwMyw2ICsxNjg5LDcgQEAgc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xcbiBcXHRcXHRcXHQub3BzXFx0PSBvLFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmRlc2NcXHQ9ICN0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0XFx0LmZuXFx0PSB0LFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4rXFx0XFx0XFx0Lm9yZGVyXFx0PSBjb2xsYXBzZV9vcmRlcixcXHRcXHRcXHRcXFxcXFxuIFxcdFxcdH07XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiBcXHR9IHdoaWxlICgwKVxcbkBAIC0xMzQzLDggKzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXG4gXFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xcbiBcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcXG4rXFxuK1xcdFxcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbikge1xcbitcXHRcXHRcXHQvKiAtYyBwaW5zIG9uZSBvcmRlcjsgaXQgaGFzIHRvIGJlIG9uZSB3ZSBjYW4gYnVpbGQgKi9cXG4rXFx0XFx0XFx0aWYgKCEob3JkZXJzIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfc2tpcChcXFwiT3JkZXIgJWQgaXMgbm90IGEgc3VwcG9ydGVkIGFub24gVEhQIG9yZGVyXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIpO1xcbitcXHRcXHRcXHRpZiAoY29sbGFwc2Vfb3JkZXIgXFx1MDAzYz0gYW5vbl9vcmRlcilcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIi1jICVkIG5lZWRzIGEgc291cmNlIG9yZGVyIGJlbG93IGl0LCAtcyBzYXlzICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gY29sbGFwc2Vfb3JkZXI7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdC8qXFxuK1xcdFxcdFxcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xcbitcXHRcXHRcXHQgKiBtYWtlcyB0aGUgZmF1bHQgcGF0aCBoYW5kIG91dCBmb2xpb3Mgb2YgdGhhdCBvcmRlcixcXG4rXFx0XFx0XFx0ICogc28gYSB0YXJnZXQgYXQgb3IgYmVsb3cgaXQgaGFzIG5vdGhpbmcgdG8gY29sbGFwc2U6XFxuK1xcdFxcdFxcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cXG4rXFx0XFx0XFx0ICovXFxuK1xcdFxcdFxcdGludCBmaXJzdCA9IGFub25fb3JkZXIgKyAxO1xcbitcXG4rXFx0XFx0XFx0aWYgKGZpcnN0IFxcdTAwM2MgTUlOX01USFBfT1JERVIpXFxuK1xcdFxcdFxcdFxcdGZpcnN0ID0gTUlOX01USFBfT1JERVI7XFxuK1xcdFxcdFxcdGZvciAoaW50IGkgPSBmaXJzdDsgaSBcXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdGlmIChvcmRlcnMgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKVxcbitcXHRcXHRcXHRcXHRcXHRjb2xsYXBzZV9vcmRlcnNbbnJfY29sbGFwc2Vfb3JkZXJzKytdID0gaTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRpZiAoIW5yX2NvbGxhcHNlX29yZGVycylcXG4rXFx0XFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm1USFAgY2FzZXMgc2tpcHBlZDogbm8gb3JkZXIgYWJvdmUgdGhlIHNvdXJjZVxcXFxuXFxcIik7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XFxuK1xcdFxcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0XFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdFxcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL2twYWdlZmxhZ3MpXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xcbiBcXG4rXFx0LypcXG4rXFx0ICogVGhlIHBhZ2UgY2FjaGUgY2FwcyBmb2xpbyBvcmRlciBhdCBNQVhfUEFHRUNBQ0hFX09SREVSLCB3aGljaCBpc1xcbitcXHQgKiBiZWxvdyB0aGUgUE1EIG9yZGVyIG9uIGFybTY0IHdpdGggNjRLIHBhZ2VzLiAgQSBQTUQtc2l6ZWQgcGFnZSBjYWNoZVxcbitcXHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XFxuK1xcdCAqIGRlc2lnbiBhbmQgdGhlcmUgaXMgbm90aGluZyB0byB0ZXN0LiAgVGhlIGNhcCBpcyBub3Qgc2htZW0tc3BlY2lmaWM6XFxuK1xcdCAqIGl0IHJ1bGVzIG91dCByZWd1bGFyIGZpbGVzIHRvbywgYW5kIHRoZSBwZXItb3JkZXIgc2htZW1fZW5hYmxlZFxcbitcXHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xcbitcXHQgKiB0aGVtIHJlYWRhYmxlIGhlcmUuXFxuK1xcdCAqL1xcbitcXHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xcbitcXHRcXHRpZiAoc2htZW1fb3BzKSB7XFxuK1xcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRzaG1lbV9vcHMgPSBOVUxMO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChyZWFkX29ubHlfZmlsZV9vcHMpIHtcXG4rXFx0XFx0XFx0a3NmdF9wcmludF9tc2coXFxcIm5vIFBNRC1vcmRlciBwYWdlIGNhY2hlIGZvbGlvOiBza2lwcGluZyBmaWxlXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gTlVMTDtcXG4rXFx0XFx0XFx0cmVhZF93cml0ZV9maWxlX3JlYWRfb3BzID0gTlVMTDtcXG4rXFx0XFx0XFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKCFhbm9uX29wcyBcXHUwMDI2XFx1MDAyNiAhc2htZW1fb3BzIFxcdTAwMjZcXHUwMDI2ICFyZWFkX29ubHlfZmlsZV9vcHMpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJOb3RoaW5nIGxlZnQgdG8gY29sbGFwc2UgaW50b1xcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuIFxcdGRlZmF1bHRfc2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaHBhZ2VfcG1kX25yIC0gMTtcXG4gXFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xcbiBcXHRkZWZhdWx0X3NldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfc2hhcmVkID0gaHBhZ2VfcG1kX25yIC8gMjtcXG5AQCAtMTM2Miw3ICsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XFxuLVxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBucl9jb2xsYXBzZV9vcmRlcnM7IGkrKykge1xcbitcXHRcXHRjb2xsYXBzZV9vcmRlciA9IGNvbGxhcHNlX29yZGVyc1tpXTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX2VtcHR5LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9tdGhwLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHRcXHRURVNUKGNvbGxhcHNlX29yZGVyX3NpbmdsZV93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfcGFydGlhbF93aW5kb3csIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFxcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4rXFx0XFx0VEVTVChjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzLCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xcbitcXHR9XFxuK1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcXG4gXFx0VEVTVChjb2xsYXBzZV9mdWxsLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuQEAgLTEzNzAsMTEgKzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBzaG1lbV9vcHMpO1xcbiBcXG4gXFx0VEVTVChjb2xsYXBzZV9lbXB0eSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuLVxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xcbiBcXG4tXFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcXG4tXFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX29ubHlfZmlsZV9vcHMpO1xcbiBcXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF93cml0ZV9maWxlX3JlYWRfb3BzKTtcXG5AQCAtMTQyOSw2ICsxODg4LDkgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxcbiBcXHRURVNUKGNvbGxhcHNlX21heF9wdGVzX3NoYXJlZCwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcXG4gXFxuK1xcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuK1xcbiBcXHRURVNUKG1hZHZpc2VfY29sbGFwc2VfZXhpc3RpbmdfdGhwcywgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfb25seV9maWxlX29wcyk7XFxuIFxcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XFxuQEAgLTE0NDQsNyArMTkwNiwxNSBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuIFxcdGZvciAoaW50IGkgPSAwOyBpIFxcdTAwM2MgbnJfdGVzdF9jYXNlczsgaSsrKSB7XFxuIFxcdFxcdHN0cnVjdCB0ZXN0X2Nhc2UgKnQgPSBcXHUwMDI2dGVzdF9jYXNlc1tpXTtcXG4gXFxuLVxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJcXFxcbiMgUnVuIHRlc3Q6ICVzICglczolcylcXFxcblxcXCIsIHQtXFx1MDAzZWRlc2MsIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0aWYgKHQtXFx1MDAzZWN0eCA9PSBcXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xcbitcXHRcXHRcXHRjb2xsYXBzZV9vcmRlciA9IHQtXFx1MDAzZW9yZGVyO1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMsIG9yZGVyICVkKVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0ICAgICAgIHQtXFx1MDAzZWRlc2MsIHQtXFx1MDAzZWN0eC1cXHUwMDNlbmFtZSwgdC1cXHUwMDNlb3BzLVxcdTAwM2VuYW1lLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlb3JkZXIpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRrc2Z0X3ByaW50X21zZyhcXFwiXFxcXG4jIFJ1biB0ZXN0OiAlcyAoJXM6JXMpXFxcXG5cXFwiLCB0LVxcdTAwM2VkZXNjLFxcbitcXHRcXHRcXHRcXHQgICAgICAgdC1cXHUwMDNlY3R4LVxcdTAwM2VuYW1lLCB0LVxcdTAwM2VvcHMtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHR9XFxuIFxcdFxcdHQtXFx1MDAzZWZuKHQtXFx1MDAzZWN0eCwgdC1cXHUwMDNlb3BzKTtcXG4gXFx0fVxcbiBcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjY4MmJiYWUwYThmOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xcbkBAIC0wLDAgKzEsNTg5IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIGtodWdlcGFnZWQgcmFjZSBoYXJuZXNzLlxcbisgKlxcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xcbisgKiAoZ3VwX3Rlc3QpLCBmb3JrLCBtcmVtYXAgYW5kIE1BRFZfRE9OVE5FRUQgb3ZlciB0aGUgc2FtZSByYW5nZXMsIGluXFxuKyAqIG9uZSBvZiB0aHJlZSBkcml2ZXIgbW9kZXM6XFxuKyAqXFxuKyAqICAgc3RlcHBlZFxcdGtodWdlcGFnZWQsIG9uZSBmdWxsIHBhc3MgYXQgYSB0aW1lIHRocm91Z2hcXG4rICpcXHRcXHRraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLCBzbyBhIHN0ZXAgY292ZXJzIGEga25vd24gZXh0ZW50O1xcbisgKiAgIGZyZWVcXHRraHVnZXBhZ2VkIGxlZnQgdG8gcnVuIChzY2FuX3NsZWVwX21pbGxpc2Vjcz0wKSwgZm9yIHNvYWs7XFxuKyAqICAgbWFkdmlzZVxcdE1BRFZfQ09MTEFQU0UgYW5kIE1BRFZfRE9OVE5FRUQgaW4gYSBsb29wLlxcbisgKlxcbisgKiBBbGwgYW5vbiBUSFAgb3JkZXJzIGFyZSBlbmFibGVkIChpbmhlcml0KS4gIE9jY3VwYW5jeSBydW5zIGF0IGJvdGggZW5kc1xcbisgKiBvZiB3aGF0IG1USFAgY29sbGFwc2Ugc3VwcG9ydHM6IG1heF9wdGVzX25vbmUgMCwgd2hlcmUgYSB3aW5kb3cgbXVzdCBiZVxcbisgKiBmdWxseSBwb3B1bGF0ZWQsIGFuZCBIUEFHRV9QTURfTlIgLSAxLCB3aGVyZSBhIHdpbmRvdyBmdWxsIG9mIGhvbGVzXFxuKyAqIGNvbGxhcHNlcyB0b28uICBBIGhvbGUgaXMgemVyby1maWxsZWQgaW50byB0aGUgbmV3IGZvbGlvIHJhdGhlciB0aGFuXFxuKyAqIGNvcGllZCwgYW5kIHRoZSByYWNpbmcgTUFEVl9ET05UTkVFRCBrZWVwcyBtb3Zpbmcgd2hpY2ggc2xvdHMgYXJlIGhvbGVzLlxcbisgKlxcbisgKiBFdmVyeSBjb21iaW5hdGlvbiBhbHNvIHJ1bnMgdW5kZXIgbWVtb3J5IHByZXNzdXJlOiBNQURWX1BBR0VPVVQgY3ljbGluZ1xcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvdXIgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgbGVmdCBvdXRcXG4rICogd2l0aCBhIG5vdGUgd2hlbiB0aGUgaG9zdCBoYXMgbm8gc3dhcCkgYW5kIGEgY29tcGFjdF9tZW1vcnkgdHJpZ2dlclxcbisgKiBsb29wIChjb21wYWN0aW9uIG1pZ3JhdGVzIHNvdXJjZSBmb2xpb3MsIHJhY2luZyBjb2xsYXBzZSdzIGZyZWV6ZVxcbisgKiB3aXRoIHJlZmNvdW50IGVsZXZhdGlvbiBhbmQgbWlncmF0aW9uIGVudHJpZXMgb2YgaXRzIG93bikuXFxuKyAqXFxuKyAqIENvcnJlY3RuZXNzIHNpZ25hbHM6IGV2ZXJ5IHJhY2luZyBwYWdlIG11c3QgcmVhZCBhcyBpdHMgcGF0dGVybiBvclxcbisgKiB6ZXJvIChNQURWX0RPTlRORUVEKSwgbmV2ZXIgYW55dGhpbmcgZWxzZS4gIFRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmtcXG4rICogY2hpbGRyZW4gY2hlY2sgdGhhdCBjb250aW51b3VzbHksIGEgZmluYWwgc3dlZXAgY2hlY2tzIGl0IG9uY2UgbW9yZSwgcGx1c1xcbisgKiB3aGF0ZXZlciBERUJVR19WTSAvIHBhZ2VfdGFibGVfY2hlY2sgLyBLQVNBTiAvIGxvY2tkZXAgcmVwb3J0IGluXFxuKyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXFxuKyAqL1xcbisjZGVmaW5lIF9HTlVfU09VUkNFXFxuKyNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3B0aHJlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL2lvY3RsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvbW1hbi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy93YWl0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2N1bmlzdGQuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJrc2VsZnRlc3QuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInZtX3V0aWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcImh1Z2VwYWdlX3NldHRpbmdzLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCIuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXFxcIlxcbitcXG4rI2RlZmluZSBCQVNFX0FERFJcXHQoKHZvaWQgKikoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKSlcXG4rXFxuKy8qXFxuKyAqIFNoYXJlZCBwbGF5Z3JvdW5kIGZvciBmYXVsdHMvcGlucy9mb3JrL2RvbnRuZWVkOiBzZXZlcmFsIFBNRC1zaXplZFxcbisgKiBhcmVhcyB0aGUgcmFjaW5nIHRocmVhZHMgc3ByZWFkIGFjcm9zcywgcGx1cyBvbmUgYXJlYSBvd25lZCBieSB0aGVcXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xcbisgKiBhdCBvbmNlOyB0aGUgZGVmYXVsdCBzdWl0cyBhIG5vcm1hbCBtYWNoaW5lLiBPbiBhIG1lbW9yeS1jb25zdHJhaW5lZFxcbisgKiBob3N0IC0tIG9yIHVuZGVyIGVtdWxhdGlvbiwgd2hlcmUgYSA1MTJNIFBNRCAoYXJtNjQvNjRLKSBtYWtlcyB0aGVcXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxcbisgKi9cXG4rI2RlZmluZSBERUZBVUxUX1NIQVJFRF9BUkVBU1xcdDNcXG4rc3RhdGljIGludCBucl9zaGFyZWRfYXJlYXM7XFxuK3N0YXRpYyBpbnQgbnJfYXJlYXM7XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplO1xcbitzdGF0aWMgY2hhciAqcmVnaW9uO1xcdFxcdC8qIE5SX0FSRUFTICogaHBhZ2VfcG1kX3NpemUgKi9cXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1xcdC8qIHJlZ2lvbiArIE5SX1NIQVJFRF9BUkVBUyBhcmVhcyAqL1xcbitzdGF0aWMgY2hhciAqbXJlbWFwX3NjcmF0Y2g7XFx0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXFxuK3N0YXRpYyBjaGFyICpwYWdlb3V0X2FyZWE7XFx0LyogZGVkaWNhdGVkIHByZXNzdXJlIHJlZ2lvbiAqL1xcbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcXG4rc3RhdGljIGludCBndXBfZmQgPSAtMTtcXG4rc3RhdGljIHZvbGF0aWxlIGludCBzdG9wO1xcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGF0dGVybih1bnNpZ25lZCBsb25nIHBhZ2VfaWR4KVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCB2YWwgPSAodW5zaWduZWQgaW50KXBhZ2VfaWR4ICogMjY1NDQzNTc2MVU7XFxuK1xcbitcXHRyZXR1cm4gdmFsID8gdmFsIDogMTtcXHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cXG4rfVxcbitcXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xcbitzdGF0aWMgYm9vbCBwYWdlX2lzX2NvcnJ1cHQodW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgaW50ICp2YWwpXFxuK3tcXG4rXFx0KnZhbCA9ICoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplKTtcXG4rXFxuK1xcdHJldHVybiAqdmFsIFxcdTAwMjZcXHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgdmFsO1xcbitcXG4rXFx0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXFx1MDAyNnZhbCkpIHtcXG4rXFx0XFx0Y29ycnVwdGVkID0gMTtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBwYWdlX2lkeCwgdmFsLCBwYXR0ZXJuKHBhZ2VfaWR4KSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hhcmVkX3BhZ2VzKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplIC8gcGFnZV9zaXplO1xcbit9XFxuK1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kX3BhZ2UodW5zaWduZWQgaW50ICpzZWVkKVxcbit7XFxuK1xcdHJldHVybiAodW5zaWduZWQgbG9uZylyYW5kX3Ioc2VlZCkgJSBzaGFyZWRfcGFnZXMoKTtcXG4rfVxcbitcXG4rLyogUGFnZXMgbGVmdCBmcm9tIEBwYWdlX2lkeCwgc28gYSByYW5nZSBuZXZlciByZWFjaGVzIHRoZSBtcmVtYXAgdGhyZWFkJ3MgYXJlYSAqL1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyByb29tX2Zyb20odW5zaWduZWQgbG9uZyBwYWdlX2lkeCwgdW5zaWduZWQgbG9uZyB3YW50KVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbGVmdCA9IHNoYXJlZF9wYWdlcygpIC0gcGFnZV9pZHg7XFxuK1xcbitcXHRyZXR1cm4gd2FudCBcXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0aWYgKHJhbmRfcihcXHUwMDI2c2VlZCkgXFx1MDAyNiAxKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSkgPVxcbitcXHRcXHRcXHRcXHRwYXR0ZXJuKHBhZ2VfaWR4KTtcXG4rXFx0XFx0ZWxzZVxcbitcXHRcXHRcXHRjaGVja19wYWdlKHBhZ2VfaWR4KTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFxcdTAwMjZzZWVkKTtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IDFVTCBcXHUwMDNjXFx1MDAzYyAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDYpO1xcdC8qIDEuLjMyIHBhZ2VzICovXFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxcbitcXHRcXHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxcbitcXHRcXHQgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYVxcbitcXHRcXHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcXG4rXFx0XFx0ICogcmVhY2ggdGhhdCBwYXRoLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCEocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDY0KSkge1xcbitcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFyZWEgPSBwYWdlX2lkeCAvXFxuK1xcdFxcdFxcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSk7XFxuK1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIGFyZWEgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRtYWR2aXNlKHJlZ2lvbiArIHBhZ2VfaWR4ICogcGFnZV9zaXplLFxcbitcXHRcXHRcXHRcXHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0TUFEVl9ET05UTkVFRCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSA1MDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqcGlubmVyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRzdHJ1Y3QgZ3VwX3Rlc3QgZ3VwID0ge307XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXFx1MDAyNnNlZWQpO1xcbitcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xcbitcXG4rXFx0XFx0Z3VwLmFkZHIgPSAodW5zaWduZWQgbG9uZykocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xcbitcXHRcXHRndXAuc2l6ZSA9IG5yICogcGFnZV9zaXplO1xcbitcXHRcXHRndXAubnJfcGFnZXNfcGVyX2NhbGwgPSBucjtcXG4rXFx0XFx0Z3VwLmd1cF9mbGFncyA9IDE7XFx0LyogRk9MTF9XUklURSAqL1xcbitcXHRcXHQvKiBSYWNpbmcgTUFEVl9ET05UTkVFRCBtYWtlcyB0cmFuc2llbnQgZmFpbHVyZXMgZXhwZWN0ZWQuICovXFxuK1xcdFxcdGlvY3RsKGd1cF9mZCwgUElOX0ZBU1RfQkVOQ0hNQVJLLCBcXHUwMDI2Z3VwKTtcXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqZm9ya2VyX2ZuKHZvaWQgKmFyZylcXG4re1xcbitcXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcXG4rXFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRcXHRpZiAocGlkID09IDApIHtcXG4rXFx0XFx0XFx0dW5zaWduZWQgaW50IHZhbDtcXG4rXFx0XFx0XFx0aW50IGJhZCA9IDA7XFxuK1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBObyBzdGRpbyBpbiB0aGUgY2hpbGQ6IGEgdGhyZWFkIG1heSBoYXZlIGhlbGRcXG4rXFx0XFx0XFx0ICogc3Rkb3V0J3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXFxuK1xcdFxcdFxcdCAqIGluaGVyaXRlZCBsb2NrIGhhbmdzLiAgVGhlIHBhcmVudCByZXBvcnRzIHdoYXQgdGhlXFxuK1xcdFxcdFxcdCAqIGV4aXQgc3RhdHVzIHNheXMuXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIDE2OyBpKyspXFxuK1xcdFxcdFxcdFxcdGJhZCB8PSBwYWdlX2lzX2NvcnJ1cHQocmFuZF9wYWdlKFxcdTAwMjZzZWVkKSwgXFx1MDAyNnZhbCk7XFxuK1xcdFxcdFxcdF9leGl0KGJhZCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHBpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0aW50IHdzdGF0dXM7XFxuK1xcbitcXHRcXHRcXHRpZiAod2FpdHBpZChwaWQsIFxcdTAwMjZ3c3RhdHVzLCAwKSBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwid2FpdHBpZCgpXFxcIik7XFxuK1xcdFxcdFxcdC8qIEEgY2hpbGQga2lsbGVkIG9uIHRoZSByZWFkIGNvdW50cyB0b28sIG5vdCBqdXN0IGl0cyBleGl0IGNvZGUuICovXFxuK1xcdFxcdFxcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxcbitcXHRcXHRcXHRcXHRjb3JydXB0ZWQgPSAxO1xcbitcXHRcXHR9XFxuK1xcdFxcdHVzbGVlcChyYW5kX3IoXFx1MDAyNnNlZWQpICUgMjAwMCk7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICptcmVtYXBwZXJfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdHZvaWQgKnA7XFxuK1xcbitcXHRcXHRwID0gbXJlbWFwKG1yZW1hcF9hcmVhLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XFxuK1xcdFxcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibXJlbWFwKCkgYXdheVxcXCIpO1xcbitcXHRcXHRmb3IgKGludCBpID0gMDsgaSBcXHUwMDNjIDg7IGkrKylcXG4rXFx0XFx0XFx0bXJlbWFwX3NjcmF0Y2hbKHJhbmRfcihcXHUwMDI2c2VlZCkgJVxcbitcXHRcXHRcXHRcXHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpKSAqIHBhZ2Vfc2l6ZV0gPSAxO1xcbitcXHRcXHRwID0gbXJlbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgaHBhZ2VfcG1kX3NpemUsXFxuK1xcdFxcdFxcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfYXJlYSk7XFxuK1xcdFxcdGlmIChwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibXJlbWFwKCkgYmFja1xcXCIpO1xcbitcXHRcXHR1c2xlZXAocmFuZF9yKFxcdTAwMjZzZWVkKSAlIDIwMDApO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbisvKlxcbisgKiBTd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybiBvbiBhIHJlZ2lvbiBvZiBvdXIgb3duLiBUaGUgY29udGVudFxcbisgKiBjaGVjayBpcyBleGFjdDogYSBwYWdlIG91dCBhbmQgYmFjayB0aHJvdWdoIHN3YXAgbXVzdCBwcmVzZXJ2ZSB0aGVcXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgKnBhZ2VvdXRfZm4odm9pZCAqYXJnKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yID0gcGFnZW91dF9zaXplIC8gcGFnZV9zaXplO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnI7IGkrKylcXG4rXFx0XFx0Kih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICsgaSAqIHBhZ2Vfc2l6ZSkgPSBwYXR0ZXJuKGkpO1xcbitcXG4rXFx0d2hpbGUgKCFzdG9wKSB7XFxuK1xcdFxcdG1hZHZpc2UocGFnZW91dF9hcmVhLCBwYWdlb3V0X3NpemUsIE1BRFZfUEFHRU9VVCk7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBuciBcXHUwMDI2XFx1MDAyNiAhc3RvcDsgaSsrKSB7XFxuK1xcdFxcdFxcdHVuc2lnbmVkIGludCB2YWwgPSAqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgK1xcbitcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgIGkgKiBwYWdlX3NpemUpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XFxuK1xcdFxcdFxcdFxcdGNvcnJ1cHRlZCA9IDE7XFxuK1xcdFxcdFxcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBpLCB2YWwsIHBhdHRlcm4oaSkpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4rXFx0XFx0dXNsZWVwKHJhbmRfcihcXHUwMDI2c2VlZCkgJSAyMDAwKTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rLyogQ29tcGFjdGlvbiBtaWdyYXRlcyB0aGUgY29sbGFwc2Ugc291cmNlcyBvdXQgZnJvbSB1bmRlciB1cy4gKi9cXG4rc3RhdGljIHZvaWQgKmNvbXBhY3Rvcl9mbih2b2lkICphcmcpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XFxuK1xcdGludCBmZCA9IG9wZW4oXFxcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVxcXCIsIE9fV1JPTkxZKTtcXG4rXFxuK1xcdGlmIChmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0a3NmdF9wcmludF9tc2coXFxcIk5vIGNvbXBhY3RfbWVtb3J5OyBjb21wYWN0b3IgaWRsZVxcXFxuXFxcIik7XFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHR9XFxuK1xcdHdoaWxlICghc3RvcCkge1xcbitcXHRcXHRpZiAod3JpdGUoZmQsIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKDEwMDAwICsgcmFuZF9yKFxcdTAwMjZzZWVkKSAlIDEwMDAwMCk7XFxuK1xcdH1cXG4rXFx0Y2xvc2UoZmQpO1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc3dhcF9hdmFpbGFibGUodm9pZClcXG4re1xcbitcXHRjaGFyIGxpbmVbMjU2XTtcXG4rXFx0aW50IGxpbmVzID0gMDtcXG4rXFx0RklMRSAqZnAgPSBmb3BlbihcXFwiL3Byb2Mvc3dhcHNcXFwiLCBcXFwiclxcXCIpO1xcbitcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpXFxuK1xcdFxcdGxpbmVzKys7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcdHJldHVybiBsaW5lcyBcXHUwMDNlIDE7XFxuK31cXG4rXFxuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1ldmFsIHR2O1xcbitcXG4rXFx0Z2V0dGltZW9mZGF5KFxcdTAwMjZ0diwgTlVMTCk7XFxuK1xcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcXG4re1xcbitcXHRmcHJpbnRmKHN0ZGVycixcXG4rXFx0XFx0XFxcIlVzYWdlOiBraHVnZXBhZ2VkX3JhY2UgWy1kIHNlY29uZHNdIFstbSBzdGVwcGVkfGZyZWV8bWFkdmlzZV0gWy1hIGFyZWFzXVxcXFxuXFxcIlxcbitcXHRcXHRcXFwiXFxcXHRXaXRob3V0IC1tLCBldmVyeSBtb2RlIHJ1bnMgaW4gdHVybi5cXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXFxcblxcXCJcXG4rXFx0XFx0XFxcIlxcXFx0LWE6IG51bWJlciBvZiBzaGFyZWQgUE1ELXNpemVkIHBsYXlncm91bmQgYXJlYXMgKGRlZmF1bHQgMylcXFxcblxcXCIpO1xcbitcXHRleGl0KDEpO1xcbit9XFxuK1xcbitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXFxuK3tcXG4rXFx0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aHJlYWRfbmFtZXNbXSA9IHtcXG4rXFx0XFx0XFxcImZhdWx0ZXJcXFwiLCBcXFwiZmF1bHRlcjJcXFwiLCBcXFwiZG9udG5lZWRcXFwiLCBcXFwicGlubmVyXFxcIiwgXFxcImZvcmtlclxcXCIsXFxuK1xcdFxcdFxcXCJtcmVtYXBwZXJcXFwiLCBcXFwicGFnZW91dFxcXCIsIFxcXCJjb21wYWN0b3JcXFwiLFxcbitcXHR9O1xcbitcXHR2b2lkICooKmNvbnN0IHRocmVhZF9mbnNbXSkodm9pZCAqKSA9IHtcXG4rXFx0XFx0ZmF1bHRlcl9mbiwgZmF1bHRlcl9mbiwgZG9udG5lZWRfZm4sIHBpbm5lcl9mbiwgZm9ya2VyX2ZuLFxcbitcXHRcXHRtcmVtYXBwZXJfZm4sIHBhZ2VvdXRfZm4sIGNvbXBhY3Rvcl9mbixcXG4rXFx0fTtcXG4rXFx0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxcbitcXHQgICAgICAgVF9NUkVNQVBQRVIsIFRfUEFHRU9VVCwgVF9DT01QQUNUT1IgfTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwYWdlb3V0X2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX1BBR0VPVVQ7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgY29tcGFjdG9yX2JpdCA9IDFVTCBcXHUwMDNjXFx1MDAzYyBUX0NPTVBBQ1RPUjtcXG4rXFx0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XFxuK1xcdHB0aHJlYWRfdCB0aHJlYWRzW0FSUkFZX1NJWkUodGhyZWFkX25hbWVzKV07XFxuK1xcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWxsX21vZGVzW10gPSB7IFxcXCJzdGVwcGVkXFxcIiwgXFxcImZyZWVcXFwiLCBcXFwibWFkdmlzZVxcXCIgfTtcXG4rXFx0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcXHQvKiBzdHJpY3QsIGhvbGVzICovXFxuK1xcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1xcdC8qIHF1aWV0LCB1bmRlciBwcmVzc3VyZSAqL1xcbitcXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcXG4rXFx0Y29uc3QgaW50IG5yX3ByZXNzdXJlcyA9IEFSUkFZX1NJWkUocHJlc3N1cmVzKTtcXG4rXFx0Y29uc3QgY2hhciAqb25lX21vZGVbMV07XFxuK1xcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XFxuK1xcdGludCBucl9tb2RlcyA9IEFSUkFZX1NJWkUoYWxsX21vZGVzKTtcXG4rXFx0Y29uc3QgY2hhciAqbW9kZV9hcmcgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHR1bnNpZ25lZCBsb25nIGVuZF9tcztcXG4rXFx0aW50IGR1cmF0aW9uX3MgPSA1O1xcbitcXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcXG4rXFx0dW5zaWduZWQgbG9uZyBiYXNlX21hc2s7XFxuK1xcdGludCBucl9hcmVhc19hcmcgPSAwO1xcbitcXHR1bnNpZ25lZCBsb25nIGk7XFxuK1xcdGludCBzdGVwcyA9IDA7XFxuK1xcdGludCBvcHQ7XFxuK1xcbitcXHR3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCBcXFwiYTpkOm06dDpoXFxcIikpICE9IC0xKSB7XFxuK1xcdFxcdHN3aXRjaCAob3B0KSB7XFxuK1xcdFxcdGNhc2UgJ2EnOlxcbitcXHRcXHRcXHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHRjYXNlICdkJzpcXG4rXFx0XFx0XFx0ZHVyYXRpb25fcyA9IGF0b2kob3B0YXJnKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ20nOlxcbitcXHRcXHRcXHRtb2RlX2FyZyA9IG9wdGFyZztcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGNhc2UgJ3QnOlxcbitcXHRcXHRcXHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xcbitcXHRcXHRcXHR0aHJlYWRfbWFzayA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAwKTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdGRlZmF1bHQ6XFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbitcXG4rXFx0aWYgKG1vZGVfYXJnKSB7XFxuK1xcdFxcdGlmIChzdHJjbXAobW9kZV9hcmcsIFxcXCJzdGVwcGVkXFxcIikgXFx1MDAyNlxcdTAwMjYgc3RyY21wKG1vZGVfYXJnLCBcXFwiZnJlZVxcXCIpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICBzdHJjbXAobW9kZV9hcmcsIFxcXCJtYWR2aXNlXFxcIikpXFxuK1xcdFxcdFxcdHVzYWdlKCk7XFxuK1xcdFxcdG9uZV9tb2RlWzBdID0gbW9kZV9hcmc7XFxuK1xcdFxcdG1vZGVzID0gb25lX21vZGU7XFxuK1xcdFxcdG5yX21vZGVzID0gMTtcXG4rXFx0fVxcbitcXG4rXFx0a3NmdF9wcmludF9oZWFkZXIoKTtcXG4rXFx0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpO1xcbitcXHRocGFnZV9wbWRfc2l6ZSA9IHJlYWRfcG1kX3BhZ2VzaXplKCk7XFxuK1xcdGlmICghaHBhZ2VfcG1kX3NpemUpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiUmVhZGluZyBQTUQgcGFnZXNpemUgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGd1cF9mZCA9IG9wZW4oXFxcIi9zeXMva2VybmVsL2RlYnVnL2d1cF90ZXN0XFxcIiwgT19SRFdSKTtcXG4rXFx0aWYgKGd1cF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXG4rXFx0bnJfc2hhcmVkX2FyZWFzID0gbnJfYXJlYXNfYXJnIFxcdTAwM2UgMCA/IG5yX2FyZWFzX2FyZyA6IERFRkFVTFRfU0hBUkVEX0FSRUFTO1xcbitcXHRucl9hcmVhcyA9IG5yX3NoYXJlZF9hcmVhcyArIDE7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxcbitcXHQgKiBNUkVNQVBfRklYRUQgdW5tYXBzIHdoYXRldmVyIGlzIGluIHRoZSB3YXkgd2l0aG91dCBzYXlpbmcgc28uICBDbGFpbVxcbitcXHQgKiB0aGUgYWRkcmVzcyBoZXJlLCBzbyBhIGxheW91dCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoaXMgYXNzdW1wdGlvblxcbitcXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxcbitcXHQgKiBwcm9jZXNzIG1hcHMgdGhpcyBsb3c6IHRocmVhZCBzdGFja3MgYW5kIG1hbGxvYyBhcmVuYXMgY29tZSBmcm9tIHRoZVxcbitcXHQgKiB0b3AtZG93biBtbWFwIGFyZWEsIHdlbGwgYWJvdmUuXFxuK1xcdCAqL1xcbitcXHRtcmVtYXBfc2NyYXRjaCA9IChjaGFyICopQkFTRV9BRERSICsgMiAqIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdGlmIChtbWFwKG1yZW1hcF9zY3JhdGNoLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9OT05FLFxcbitcXHRcXHQgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSxcXG4rXFx0XFx0IC0xLCAwKSAhPSAodm9pZCAqKW1yZW1hcF9zY3JhdGNoKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFxcXCIpO1xcbitcXG4rXFx0YmFzZV9tYXNrID0gdGhyZWFkX21hc2s7XFxuK1xcdGlmICghc3dhcF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0LyogTm8gc3dhcCwgbm8gYW5vbiByZWNsYWltOiBjb21wYWN0aW9uLW9ubHkgcHJlc3N1cmUuICovXFxuK1xcdFxcdGtzZnRfcHJpbnRfbXNnKFxcXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcXFxuXFxcIik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcXG4rXFx0ICogYWx3YXlzIGhhcyBzb21ldGhpbmcgdG8gd3JpdGUgYmFjazogdGhwX3BvcF9zZXR0aW5ncygpIG9uIGFuIGVtcHR5XFxuK1xcdCAqIHN0YWNrIGhhcyBubyBzZXR0aW5ncyB0byBhcHBseSBhbmQgZ2l2ZXMgdXAuXFxuK1xcdCAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlczsgcnVuKyspIHtcXG4rXFx0XFx0aW50IHJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XFxuK1xcdFxcdGNvbnN0IGNoYXIgKm1vZGUgPSBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXTtcXG4rXFx0XFx0Ym9vbCBob2xlcyA9IG9jY3VwYW5jaWVzW3JlbSAvIG5yX3ByZXNzdXJlc107XFxuK1xcdFxcdGJvb2wgcHJlc3N1cmUgPSBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXTtcXG4rXFxuK1xcdFxcdHRocmVhZF9tYXNrID0gYmFzZV9tYXNrO1xcbitcXHRcXHRpZiAoIXByZXNzdXJlKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+KHBhZ2VvdXRfYml0IHwgY29tcGFjdG9yX2JpdCk7XFxuK1xcdFxcdGVsc2UgaWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxcbitcXHRcXHRcXHR0aHJlYWRfbWFzayBcXHUwMDI2PSB+cGFnZW91dF9iaXQ7XFxuK1xcbitcXHRcXHR0aHBfcmVhZF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZW5hYmxlZCA9IFRIUF9NQURWSVNFO1xcbitcXHRcXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XFxuK1xcdFxcdHNldHRpbmdzLnNobWVtX2VuYWJsZWQgPSBTSE1FTV9ORVZFUjtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5kZWZyYWcgPSAxO1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID1cXG4rXFx0XFx0XFx0c3RyY21wKG1vZGUsIFxcXCJmcmVlXFxcIikgPyAxMDAwIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSAxMDtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIG1USFAgY29sbGFwc2Ugb25seSBzdXBwb3J0cyB0aGUgdHdvIGVuZHMgb2YgdGhlIG9jY3VwYW5jeVxcbitcXHRcXHQgKiBzY2FsZTogMCBvciBIUEFHRV9QTURfTlIgLSAxIChhbnl0aGluZyBlbHNlIGNvZXJjZXMgdG8gMCkuXFxuK1xcdFxcdCAqIFN0cmljdCBuZWVkcyBhIGZ1bGx5IHBvcHVsYXRlZCB3aW5kb3csIHdoaWNoIGlzIHJhcmUgdW5kZXJcXG4rXFx0XFx0ICogcmFjaW5nIE1BRFZfRE9OVE5FRUQ7IGhvbGUtaGVhdnkgd2luZG93cyBjb2xsYXBzZSBpbnN0ZWFkLFxcbitcXHRcXHQgKiBzbyB0aGUgdHdvIGVuZHMgcmFjZSBkaWZmZXJlbnQgcGF0aHMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBob2xlcyA/XFxuK1xcdFxcdFxcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcXG4rXFx0XFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cXG4rXFx0XFx0XFx0bnJfYXJlYXMgKiAoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpICogODtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX09SREVSUzsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFxcdTAwMjYgKDFVTCBcXHUwMDNjXFx1MDAzYyBpKSlcXG4rXFx0XFx0XFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBQb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZGUsIGJlZm9yZSB0aGUgbmV4dCBvbmUuICovXFxuK1xcdFxcdHRocF9wdXNoX3NldHRpbmdzKFxcdTAwMjZzZXR0aW5ncyk7XFxuK1xcbitcXHRcXHRyZWdpb24gPSBtbWFwKEJBU0VfQUREUiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX0FOT05ZTU9VUyB8XFxuK1xcdFxcdFxcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xcbitcXHRcXHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGxheWdyb3VuZFxcXCIpO1xcbitcXHRcXHRtcmVtYXBfYXJlYSA9IHJlZ2lvbiArIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xcbitcXG4rXFx0XFx0aWYgKHRocmVhZF9tYXNrIFxcdTAwMjYgcGFnZW91dF9iaXQpIHtcXG4rXFx0XFx0XFx0LypcXG4rXFx0XFx0XFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcXG4rXFx0XFx0XFx0ICogdG8gZG9taW5hdGUgYSBUQ0cgZ3Vlc3Q6IDQgUE1EIGFyZWFzLCBjbGFtcGVkIHRvXFxuK1xcdFxcdFxcdCAqIFsxNk0sIDY0TV0uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSA0ICogaHBhZ2VfcG1kX3NpemU7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X3NpemUgXFx1MDAzYyAxNlVMIFxcdTAwM2NcXHUwMDNjIDIwKVxcbitcXHRcXHRcXHRcXHRwYWdlb3V0X3NpemUgPSAxNlVMIFxcdTAwM2NcXHUwMDNjIDIwO1xcbitcXHRcXHRcXHRpZiAocGFnZW91dF9zaXplIFxcdTAwM2UgNjRVTCBcXHUwMDNjXFx1MDAzYyAyMClcXG4rXFx0XFx0XFx0XFx0cGFnZW91dF9zaXplID0gNjRVTCBcXHUwMDNjXFx1MDAzYyAyMDtcXG4rXFx0XFx0XFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XFxuK1xcdFxcdFxcdGlmIChwYWdlb3V0X2FyZWEgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgcGFnZW91dCBhcmVhXFxcIik7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIFBvcHVsYXRlIHNvIHRoZSBmaXJzdCBwYXNzIGhhcyBzb21ldGhpbmcgdG8gY29sbGFwc2UuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHQqKHVuc2lnbmVkIGludCAqKShyZWdpb24gKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XFxuK1xcdFxcdG1lbXNldChtcmVtYXBfYXJlYSwgMSwgaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRpZiAobWFkdmlzZShyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxcbitcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXFxcIm1hZHZpc2UoTUFEVl9IVUdFUEFHRSlcXFwiKTtcXG4rXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl90aHJlYWRzOyBpKyspIHtcXG4rXFx0XFx0XFx0aWYgKCEodGhyZWFkX21hc2sgXFx1MDAyNiAoMVVMIFxcdTAwM2NcXHUwMDNjIGkpKSkge1xcbitcXHRcXHRcXHRcXHR0aHJlYWRzW2ldID0gMDtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aWYgKHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWRzW2ldLCBOVUxMLCB0aHJlYWRfZm5zW2ldLFxcbitcXHRcXHRcXHRcXHRcXHQgICAodm9pZCAqKShpICsgMSkpKVxcbitcXHRcXHRcXHRcXHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0ZW5kX21zID0gbm93X21zKCkgKyBkdXJhdGlvbl9zICogMTAwMFVMO1xcbitcXHRcXHRpZiAoIXN0cmNtcChtb2RlLCBcXFwic3RlcHBlZFxcXCIpKSB7XFxuK1xcdFxcdFxcdHdoaWxlIChub3dfbXMoKSBcXHUwMDNjIGVuZF9tcyBcXHUwMDI2XFx1MDAyNiAhY29ycnVwdGVkKSB7XFxuK1xcdFxcdFxcdFxcdGlmICgha2h1Z2VwYWdlZF9mdWxsX3Bhc3MoNjAwKSlcXG4rXFx0XFx0XFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJraHVnZXBhZ2VkIHBhc3MgdGltZWQgb3V0XFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9IGVsc2UgaWYgKCFzdHJjbXAobW9kZSwgXFxcImZyZWVcXFwiKSkge1xcbitcXHRcXHRcXHR3aGlsZSAobm93X21zKCkgXFx1MDAzYyBlbmRfbXMgXFx1MDAyNlxcdTAwMjYgIWNvcnJ1cHRlZClcXG4rXFx0XFx0XFx0XFx0dXNsZWVwKDEwMCAqIDEwMDApO1xcbitcXHRcXHR9IGVsc2Uge1xcdC8qIG1hZHZpc2UgKi9cXG4rXFx0XFx0XFx0d2hpbGUgKG5vd19tcygpIFxcdTAwM2MgZW5kX21zIFxcdTAwMjZcXHUwMDI2ICFjb3JydXB0ZWQpIHtcXG4rXFx0XFx0XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3NoYXJlZF9hcmVhczsgaSsrKSB7XFxuK1xcdFxcdFxcdFxcdFxcdG1hZHZpc2UocmVnaW9uICsgaSAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0XFx0bWFkdmlzZShyZWdpb24sIG5yX3NoYXJlZF9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRNQURWX0RPTlRORUVEKTtcXG4rXFx0XFx0XFx0XFx0c3RlcHMrKztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRzdG9wID0gMTtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAodGhyZWFkc1tpXSlcXG4rXFx0XFx0XFx0XFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHQvKiBGaW5hbCBpbnRlZ3JpdHkgc3dlZXAuICovXFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxcbitcXHRcXHRcXHRjaGVja19wYWdlKGkpO1xcbitcXG4rXFx0XFx0a3NmdF90ZXN0X3Jlc3VsdCghY29ycnVwdGVkLFxcbitcXHRcXHRcXHRcXHQgXFxcIiVzLyVzJXM6ICVkcywgJWQgc3RlcHMsIG5vIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdCBtb2RlLCBob2xlcyA/IFxcXCJob2xlc1xcXCIgOiBcXFwic3RyaWN0XFxcIixcXG4rXFx0XFx0XFx0XFx0IHByZXNzdXJlID8gXFxcIi9wcmVzc3VyZVxcXCIgOiBcXFwiXFxcIixcXG4rXFx0XFx0XFx0XFx0IGR1cmF0aW9uX3MsIHN0ZXBzKTtcXG4rXFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIEhhbmQgdGhlIGFkZHJlc3Mgc3BhY2UgYW5kIHRoZSBzZXR0aW5ncyBiYWNrIGJlZm9yZSB0aGVcXG4rXFx0XFx0ICogbmV4dCBtb2RlOiBpdCBtYXBzIHRoZSByZWdpb24gYXQgdGhlIHNhbWUgZml4ZWQgYWRkcmVzcyxcXG4rXFx0XFx0ICogYW5kIGl0cyBzY2FuIGNhZGVuY2UgZGlmZmVycy5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdG11bm1hcChyZWdpb24sIG5yX2FyZWFzICogaHBhZ2VfcG1kX3NpemUpO1xcbitcXHRcXHRpZiAocGFnZW91dF9hcmVhKSB7XFxuK1xcdFxcdFxcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XFxuK1xcdFxcdFxcdHBhZ2VvdXRfYXJlYSA9IE5VTEw7XFxuK1xcdFxcdH1cXG4rXFx0XFx0dGhwX3BvcF9zZXR0aW5ncygpO1xcbitcXHRcXHRzdG9wID0gMDtcXG4rXFx0XFx0c3RlcHMgPSAwO1xcbitcXG4rXFx0XFx0aWYgKGNvcnJ1cHRlZCkge1xcbitcXHRcXHRcXHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cXG4rXFx0XFx0XFx0d2hpbGUgKCsrcnVuIFxcdTAwM2MgbnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcykge1xcbitcXHRcXHRcXHRcXHRyZW0gPSBydW4gJSAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpO1xcbitcXG4rXFx0XFx0XFx0XFx0a3NmdF90ZXN0X3Jlc3VsdF9za2lwKFxcXCIlcy8lcyVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBvY2N1cGFuY2llc1tyZW0gLyBucl9wcmVzc3VyZXNdID9cXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFxcImhvbGVzXFxcIiA6IFxcXCJzdHJpY3RcXFwiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBwcmVzc3VyZXNbcmVtICUgbnJfcHJlc3N1cmVzXSA/XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIFxcXCIvcHJlc3N1cmVcXFwiIDogXFxcIlxcXCIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdHRocF9yZXN0b3JlX3NldHRpbmdzKCk7XFxuK1xcdGtzZnRfZmluaXNoZWQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi40NTAwMTk5NmI1N2FhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXFxuQEAgLTAsMCArMSwxOTYgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rLypcXG4rICogU3luY2hyb25vdXMga2h1Z2VwYWdlZCBkcml2aW5nIGNoZWNrLlxcbisgKlxcbisgKiBSYWNlIHRlc3RzIGRyaXZlIGtodWdlcGFnZWQgdGhyb3VnaCB0aGUgZXhpc3Rpbmcgc3lzZnMgY29udHJvbHM6IGFcXG4rICogc3RvcmUgdG8gc2Nhbl9zbGVlcF9taWxsaXNlY3Mgd2FrZXMgdGhlIGRhZW1vbiwgYW5kIGZ1bGxfc2NhbnNcXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgc2V0dXAgKGtodWdlcGFnZWRfZnVsbF9wYXNzKCkpLiBWZXJpZnkgdGhlIHBhaXIgZ2l2ZXNcXG4rICogZGV0ZXJtaW5pc3RpYywgYXR0cmlidXRhYmxlIHJlc3VsdHM6IG9uZSBiYXJyaWVyIHN0ZXAgb3ZlciBvbmVcXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxcbisgKiB3aW5kb3cncyBzb3VyY2UgcGFnZXMgKG1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlIGV2ZW50cyBmaWx0ZXJlZFxcbisgKiBieSBzb3VyY2UgUEZOIGFuZCBvcmRlcikgYW5kIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkXFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXFxuKyAqXFxuKyAqIHNjYW5fc2xlZXBfbWlsbGlzZWNzIGlzIHNldCB0byA2MHMgdG8gcHJvdmUgdGhlIHdha2UgcGF0aDogd2l0aG91dFxcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xcbisgKiB0aGUgdGltZW91dC4gSXQgYWxzbyBrZWVwcyB0aGUgZGFlbW9uIGZyb20gZnJlZS1ydW5uaW5nIGJldHdlZW5cXG4rICogc3RlcHMsIHBlciB0aGUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSBkaXNjaXBsaW5lLlxcbisgKi9cXG4rI2RlZmluZSBfR05VX1NPVVJDRVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGlvLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRsaWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcImtzZWxmdGVzdC5oXFxcIlxcbisjaW5jbHVkZSBcXFwidm1fdXRpbC5oXFxcIlxcbisjaW5jbHVkZSBcXFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFxcXCJcXG4rXFxuKyNkZWZpbmUgQkFTRV9BRERSICgodm9pZCAqKSgxVUwgXFx1MDAzY1xcdTAwM2MgMzApKVxcbisjZGVmaW5lIFRBUkdFVF9PUkRFUiAyXFx0Lyogc21hbGxlc3Qgb3JkZXIga2h1Z2VwYWdlZCBjb25zaWRlcnMgKi9cXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcXG4rXFxuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcXG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xcbitzdGF0aWMgaW50IHRyYWNlX2V2ZW50c19mZCA9IC0xO1xcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGFnZV9wbWRfc2l6ZTtcXG4rXFxuKy8qXFxuKyAqIEVhY2ggc3RlcCBzd2l0Y2hlcyB0aGUgZXZlbnRzIG9mZiBhZ2FpbiwgYnV0IGEgaGVscGVyIGNhbiBzdGlsbCBnaXZlIHVwXFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXFxuKyAqIHRocF93cml0ZV9udW0oKSksIGFuZCBodWdlX21lbW9yeSBldmVudHMgbGVmdCBvbiBhcmUgdGhlIHdob2xlIG1hY2hpbmUnc1xcbisgKiBwcm9ibGVtLCBub3QgdGhpcyB0ZXN0J3MuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB0cmFjZV9ldmVudHNfb2ZmKHZvaWQpXFxuK3tcXG4rXFx0aWYgKHRyYWNlX2V2ZW50c19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHR0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxcbisgKiBzY2FuX3BmbiBpcyBvbmUgb2YgdGhlIHdpbmRvdydzIHNvdXJjZSBQRk5zLCByZXBvcnRlZCBvbmNlIHBlciBhdHRlbXB0LlxcbisgKi9cXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxcbitcXHRcXHRcXHQgICAgdW5zaWduZWQgaW50IG9yZGVyKVxcbit7XFxuK1xcdGNoYXIgbGluZVsxMDI0XTtcXG4rXFx0aW50IGNvdW50ID0gMDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IHRyYWNpbmdfb3Blbl90cmFjZSgpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkNhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcbitcXHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHtcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyB2YWw7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBvcmQ7XFxuK1xcdFxcdGNoYXIgKnMsICpvO1xcbitcXHRcXHRpbnQgaTtcXG4rXFxuK1xcdFxcdHMgPSBzdHJzdHIobGluZSwgXFxcIm1tX2NvbGxhcHNlX2h1Z2VfcGFnZV9pc29sYXRlOlxcXCIpO1xcbitcXHRcXHRpZiAoIXMpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAoc3NjYW5mKHMsIFxcXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcXFwiLFxcbitcXHRcXHRcXHQgICBcXHUwMDI2dmFsKSAhPSAxKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0byA9IHN0cnN0cihzLCBcXFwib3JkZXI9XFxcIik7XFxuK1xcdFxcdGlmICghbyB8fCBzc2NhbmYobywgXFxcIm9yZGVyPSV1XFxcIiwgXFx1MDAyNm9yZCkgIT0gMSB8fCBvcmQgIT0gb3JkZXIpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbnJfcGZuczsgaSsrKSB7XFxuK1xcdFxcdFxcdGlmICh2YWwgPT0gcGZuc1tpXSkge1xcbitcXHRcXHRcXHRcXHRjb3VudCsrO1xcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0ZmNsb3NlKGZwKTtcXG4rXFx0cmV0dXJuIGNvdW50O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBvbmVfc3RlcChpbnQgaXRlcmF0aW9uKVxcbit7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBnZXRwYWdlc2l6ZSgpIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUjtcXG4rXFx0Y29uc3QgaW50IG5yX3BhZ2VzID0gMSBcXHUwMDNjXFx1MDAzYyBUQVJHRVRfT1JERVI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFxcdTAwM2NcXHUwMDNjIFRBUkdFVF9PUkRFUl07XFxuK1xcdGJvb2wgY29sbGFwc2VkLCBwYXNzZWQ7XFxuK1xcdGludCBhdHRyaWJ1dGVkO1xcbitcXHRjaGFyICpwO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdHAgPSBtbWFwKEJBU0VfQUREUiwgaHBhZ2VfcG1kX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLCAtMSwgMCk7XFxuK1xcdGlmIChwICE9IEJBU0VfQUREUilcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJtbWFwKCkgd2luZG93XFxcIik7XFxuK1xcbitcXHQvKiBQcmVwYXJlIG9uZSB3aW5kb3c7IHJlY29yZCBpdHMgc291cmNlIFBGTnMuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdHBbaSAqIGdldHBhZ2VzaXplKCldID0gaSArIDE7XFxuK1xcdFxcdHBmbnNbaV0gPSBwYWdlbWFwX2dldF9wZm4ocGFnZW1hcF9mZCwgcCArIGkgKiBnZXRwYWdlc2l6ZSgpKTtcXG4rXFx0XFx0aWYgKHBmbnNbaV0gPT0gLTFVTClcXG4rXFx0XFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJTb3VyY2UgcGFnZSBub3QgcHJlc2VudFxcXFxuXFxcIik7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIENsZWFyIGZpcnN0OiB3aXRoIHRoZSBldmVudHMgc3RpbGwgb2ZmIHRoZXJlIGlzIG5vdGhpbmcgdG8gdW5kby4gKi9cXG4rXFx0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgY2xlYXIgdGhlIHRyYWNlIGJ1ZmZlclxcXFxuXFxcIik7XFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCB0cnVlKSlcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfbXNnKFxcXCJDYW5ub3QgZW5hYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcXFxuXFxcIik7XFxuK1xcbitcXHRpZiAobWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcXFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVxcXCIpO1xcbitcXHQvKiBXYWl0IHVwIHRvIDEyMCBzZWNvbmRzIGZvciB0aGUgcGFzcyB0byBjb21wbGV0ZS4gKi9cXG4rXFx0cGFzc2VkID0ga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoMTIwKTtcXG4rXFxuK1xcdC8qIE9mZiBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZ2l2ZSB1cDogdGhlIGV2ZW50cyBhcmUgc3lzdGVtLXdpZGUuICovXFxuK1xcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwiQ2Fubm90IGRpc2FibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCFwYXNzZWQpXFxuK1xcdFxcdGtzZnRfZXhpdF9mYWlsX21zZyhcXFwia2h1Z2VwYWdlZCBkaWQgbm90IGNvbXBsZXRlIGEgZnVsbCBwYXNzXFxcXG5cXFwiKTtcXG4rXFxuK1xcdGNvbGxhcHNlZCA9IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgd2luZG93LCBUQVJHRVRfT1JERVIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcXG4rXFx0YXR0cmlidXRlZCA9IGNvdW50X2F0dHJpYnV0ZWQocGZucywgbnJfcGFnZXMsIFRBUkdFVF9PUkRFUik7XFxuK1xcbitcXHRrc2Z0X3Rlc3RfcmVzdWx0KGNvbGxhcHNlZCBcXHUwMDI2XFx1MDAyNiBhdHRyaWJ1dGVkID09IDEsXFxuK1xcdFxcdFxcdCBcXFwic3RlcCAlZDogd2luZG93IGNvbGxhcHNlZCwgJWQgYXR0cmlidXRlZCByZXN1bHQocylcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xcbitcXG4rXFx0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcXG4rfVxcbitcXG4raW50IG1haW4odm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XFxuK1xcbitcXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxcXG5cXFwiKTtcXG4rXFx0aWYgKCEodGhwX3N1cHBvcnRlZF9vcmRlcnMoKSBcXHUwMDI2ICgxVUwgXFx1MDAzY1xcdTAwM2MgVEFSR0VUX09SREVSKSkpXFxuK1xcdFxcdGtzZnRfZXhpdF9za2lwKFxcXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgICBUQVJHRVRfT1JERVIpO1xcbitcXG4rXFx0aHBhZ2VfcG1kX3NpemUgPSByZWFkX3BtZF9wYWdlc2l6ZSgpO1xcbitcXHRpZiAoIWhwYWdlX3BtZF9zaXplKVxcbitcXHRcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcXFxuXFxcIik7XFxuK1xcdHBhZ2VtYXBfZmQgPSBvcGVuKFxcXCIvcHJvYy9zZWxmL3BhZ2VtYXBcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChwYWdlbWFwX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFxcXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcXFwiKTtcXG4rXFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiLCBPX1JET05MWSk7XFxuK1xcdGlmIChrcGFnZWZsYWdzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcIm9wZW4oXFxcXFxcXCIvcHJvYy9rcGFnZWZsYWdzXFxcXFxcXCIpIHJlcXVpcmVzIHJvb3RcXFxcblxcXCIpO1xcbitcXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFxcXCJodWdlX21lbW9yeVxcXCIpO1xcbitcXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFxcdTAwM2MgMClcXG4rXFx0XFx0a3NmdF9leGl0X3NraXAoXFxcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXFxcblxcXCIpO1xcbitcXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XFxuK1xcbitcXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xcbitcXG4rXFx0dGhwX3NhdmVfc2V0dGluZ3MoKTtcXG4rXFx0dGhwX3JlYWRfc2V0dGluZ3MoXFx1MDAyNnNldHRpbmdzKTtcXG4rXFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcXG4rXFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XFxuK1xcdHNldHRpbmdzLmtodWdlcGFnZWQuc2Nhbl9zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5hbGxvY19zbGVlcF9taWxsaXNlY3MgPSA2MDAwMDtcXG4rXFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xcbitcXHQvKiBPbmUgd2FrZSBtdXN0IGNvbXBsZXRlIG9uZSBmdWxsIHBhc3M7IHNlZSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygpLiAqL1xcbitcXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnBhZ2VzX3RvX3NjYW4gPSAxVUwgXFx1MDAzY1xcdTAwM2MgMjQ7XFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcXG4rXFx0XFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XFxuK1xcdHNldHRpbmdzLmh1Z2VwYWdlc1tUQVJHRVRfT1JERVJdLmVuYWJsZWQgPSBUSFBfSU5IRVJJVDtcXG4rXFx0LyogQmFzZSBvZiB0aGUgc2V0dGluZ3Mgc3RhY2s7IHRoZSBib3R0b20gZW50cnkgaXMgbmV2ZXIgcG9wcGVkLiAqL1xcbitcXHR0aHBfcHVzaF9zZXR0aW5ncyhcXHUwMDI2c2V0dGluZ3MpO1xcbitcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIE5SX0lURVJBVElPTlM7IGkrKylcXG4rXFx0XFx0b25lX3N0ZXAoaSk7XFxuK1xcbitcXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xcbitcXG4rXFx0a3NmdF9maW5pc2hlZCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG5pbmRleCBmMTlkNTNjNjk1NzY0Li5mZDM1ZjhhN2I1YjgzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmNcXG5AQCAtMjAsNyArMjAsNiBAQFxcbiBcXG4gI2RlZmluZSBUV09NRUdcXHRcXHQoMlxcdTAwM2NcXHUwMDNjMjApXFxuICNkZWZpbmUgUlVOVElNRVxcdFxcdCgyMClcXG4tI2RlZmluZSBBTElHTih4LCBhKVxcdCgoKHgpICsgKGEgLSAxKSkgXFx1MDAyNiAofigoYSkgLSAxKSkpXFxuIFxcbiBIVUdFVExCX1NFVFVQX0RFRkFVTFRfUEFHRVMoMSlcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5pbmRleCBkMDlmOWY2YTM4NGVlLi5mYzYxOTA3YWEzYjJhIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcXG5AQCAtNDAyLDYgKzQwMiwxMiBAQCBDQVRFR09SWT1cXFwicGZubWFwXFxcIiBydW5fdGVzdCAuL3Bmbm1hcFxcbiAjIENPVyB0ZXN0c1xcbiBDQVRFR09SWT1cXFwiY293XFxcIiBydW5fdGVzdCAuL2Nvd1xcbiBcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9mb2xpb19vcmRlcl9jaGVja1xcbitcXG4rQ0FURUdPUlk9XFxcInRocFxcXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkX3N5bmNfY2hlY2tcXG4rXFxuK0NBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9yYWNlXFxuK1xcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWRcXG4gXFxuIENBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyAyXFxuQEAgLTQxMCw4ICs0MTYsNiBAQCBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgYWxsOnNobWVtXFxuIFxcbiBDQVRFR09SWT1cXFwidGhwXFxcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgNCBhbGw6c2htZW1cXG4gXFxuLUNBVEVHT1JZPVxcXCJ0aHBcXFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtYyA0IG10aHBfa2h1Z2VwYWdlZDphbm9uXFxuLVxcbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxcbiBpZiBbIC16IFxcXCIke1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfVxcXCIgXTsgdGhlblxcbiAgICAgaWYgdGVzdF9zZWxlY3RlZCBcXFwidGhwXFxcIjsgdGhlblxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcXG5AQCAtNDIsNjggKzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gXFxcIi9wcm9jL2twYWdlZmxhZ3NcXFwiO1xcbiBpbnQgcGFnZW1hcF9mZDtcXG4gaW50IGtwYWdlZmxhZ3NfZmQ7XFxuIFxcbi1zdGF0aWMgYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuLVxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbi17XFxuLVxcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuLVxcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuLVxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuLVxcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuLVxcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4tXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuLVxcdHVuc2lnbmVkIGxvbmcgaTtcXG4tXFxuLVxcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuLVxcbi1cXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuLVxcdGlmIChwZm4gPT0gLTFVTClcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4tXFx0XFx0Z290byBmYWlsO1xcbi1cXG4tXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4tXFx0aWYgKCFvcmRlcikge1xcbi1cXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4tXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tXFx0fVxcbi1cXG4tXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbi1cXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuLVxcbi1cXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdGdvdG8gZmFpbDtcXG4tXFxuLVxcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuLVxcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4tXFx0XFx0cmV0dXJuIGZhbHNlO1xcbi1cXG4tXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuLVxcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuLVxcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuLVxcdFxcdFxcdGdvdG8gZmFpbDtcXG4tXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbi1cXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuLVxcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4tXFx0ICovXFxuLVxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbi1cXHRcXHRyZXR1cm4gdHJ1ZTtcXG4tXFxuLVxcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4tXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbi1mYWlsOlxcbi1cXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuLVxcdHJldHVybiBmYWxzZTtcXG4tfVxcbi1cXG4gc3RhdGljIGludCBjaGVja19hZnRlcl9zcGxpdF9mb2xpb19vcmRlcnMoY2hhciAqdmFkZHJfc3RhcnQsIHNpemVfdCBsZW4sXFxuIFxcdFxcdGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCwgaW50IG9yZGVyc1tdLCBpbnQgbnJfb3JkZXJzKVxcbiB7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuY1xcbmluZGV4IDgwYmM5ZjU5N2I1MjEuLmVlMTMzNDc3ODM5MWYgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXFxuQEAgLTQ5NCw2ICs0OTQsMTUxIEBAIGludCBwYWdlZmxhZ3NfZ2V0KHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQga3BhZ2VmbGFnc19mZCwgdWludDY0X3QgKmZsYWdzKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXFxuK1xcdFxcdFxcdGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX2hlYWRfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX0hFQUQ7XFxuK1xcdGNvbnN0IHVpbnQ2NF90IGZvbGlvX3RhaWxfZmxhZ3MgPSBLUEZfVEhQIHwgS1BGX0NPTVBPVU5EX1RBSUw7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdHVuc2lnbmVkIGxvbmcgcGZuX2hlYWQ7XFxuK1xcdHVpbnQ2NF90IHBmbl9mbGFncztcXG4rXFx0dW5zaWduZWQgbG9uZyBwZm47XFxuK1xcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcbitcXHQvKiBub24gcHJlc2VudCBwYWdlICovXFxuK1xcdGlmIChwZm4gPT0gLTFVTClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcXHUwMDI2cGZuX2ZsYWdzKSlcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXG4rXFx0LyogY2hlY2sgZm9yIG9yZGVyLTAgcGFnZXMgKi9cXG4rXFx0aWYgKCFvcmRlcikge1xcbitcXHRcXHRpZiAocGZuX2ZsYWdzIFxcdTAwMjYgKGZvbGlvX2hlYWRfZmxhZ3MgfCBmb2xpb190YWlsX2ZsYWdzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0fVxcbitcXG4rXFx0Lyogbm9uIFRIUCBmb2xpbyAqL1xcbitcXHRpZiAoIShwZm5fZmxhZ3MgXFx1MDAyNiBLUEZfVEhQKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0cGZuX2hlYWQgPSBwZm4gXFx1MDAyNiB+KG5yX3BhZ2VzIC0gMSk7XFxuK1xcbitcXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXFxuK1xcdGlmICgocGZuX2ZsYWdzIFxcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXFxuK1xcdGZvciAoaSA9IDE7IGkgXFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XFxuK1xcdFxcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXFx1MDAyNnBmbl9mbGFncykpXFxuK1xcdFxcdFxcdGdvdG8gZmFpbDtcXG4rXFx0XFx0aWYgKChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGNoZWNrIHRoZSBQRk4gYWZ0ZXIgdGhpcyBmb2xpbywgYnV0IGlmIGl0cyBmbGFncyBjYW5ub3QgYmUgb2J0YWluZWQsXFxuK1xcdCAqIGFzc3VtZSB0aGlzIGZvbGlvIGhhcyB0aGUgZXhwZWN0ZWQgb3JkZXJcXG4rXFx0ICovXFxuK1xcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgbnJfcGFnZXMsIGtwYWdlZmxhZ3NfZmQsIFxcdTAwMjZwZm5fZmxhZ3MpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFxuK1xcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cXG4rXFx0cmV0dXJuIChwZm5fZmxhZ3MgXFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xcbitmYWlsOlxcbitcXHRrc2Z0X2V4aXRfZmFpbF9tc2coXFxcIkZhaWxlZCB0byBnZXQgZm9saW8gaW5mb1xcXFxuXFxcIik7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rLypcXG4rICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXFxuKyAqIGZvbGlvIG9mIHRoYXQgb3JkZXIsIGhlYWQgdG8gdGFpbC4gIFRoZSBhZGRyZXNzIHJhbmdlIG11c3QgYmUgbmF0dXJhbGx5XFxuKyAqIGFsaWduZWQsIGVhY2ggd2luZG93J3MgUEZOIHJ1biBtdXN0IGJlIGNvbnRpZ3VvdXMsIGFuZCBhIHdpbmRvdydzIGZpcnN0XFxuKyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLlxcbisgKlxcbisgKiBUaGlzIGlzIHRoZSBjaGVjayBcXFwiZGlkIHRoaXMgcmFuZ2UgY29sbGFwc2UgaW50byBvcmRlci1Ab3JkZXIgZm9saW9zXFxcIjogYVxcbisgKiB3aW5kb3cgYXNzZW1ibGVkIGZyb20gcGFydHMgb2Ygc2V2ZXJhbCBmb2xpb3MsIG9yIG1hcHBpbmcgYSBmb2xpbyBzaGlmdGVkXFxuKyAqIGZyb20gaXRzIG5hdHVyYWwgcG9zaXRpb24sIGZhaWxzLlxcbisgKi9cXG4rYm9vbCBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKGNoYXIgKnN0YXJ0LCBzaXplX3QgbGVuLCBpbnQgb3JkZXIsXFxuK1xcdFxcdFxcdFxcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxcbit7XFxuK1xcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXFx1MDAzY1xcdTAwM2Mgb3JkZXI7XFxuK1xcdGNvbnN0IHNpemVfdCB3aW5kb3cgPSBucl9wYWdlcyAqIHBzaXplKCk7XFxuK1xcdGNoYXIgKnZhZGRyO1xcbitcXG4rXFx0aWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFxcdTAwM2Mgc3RhcnQgKyBsZW47IHZhZGRyICs9IHdpbmRvdykge1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCB2YWRkcik7XFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgaTtcXG4rXFxuK1xcdFxcdC8qIE5vdCBwcmVzZW50LCBvciBub3QgbWFwcGluZyB0aGUgZm9saW8gaGVhZC4gKi9cXG4rXFx0XFx0aWYgKHBmbiA9PSAtMVVMIHx8IHBmbiAlIG5yX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRmb3IgKGkgPSAxOyBpIFxcdTAwM2MgbnJfcGFnZXM7IGkrKykge1xcbitcXHRcXHRcXHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICsgaSAqIHBzaXplKCkpICE9XFxuK1xcdFxcdFxcdCAgICBwZm4gKyBpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmICghaXNfYmFja2VkX2J5X2ZvbGlvKHZhZGRyLCBvcmRlciwgcGFnZW1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0a3BhZ2VmbGFnc19mZCkpXFxuK1xcdFxcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHRydWU7XFxuK31cXG4rXFxuKyNkZWZpbmUgVFJBQ0VGU19ST09UIFxcXCIvc3lzL2tlcm5lbC90cmFjaW5nXFxcIlxcbitcXG4rLypcXG4rICogT3BlbiB0aGUgZW5hYmxlIGZpbGUgb2Ygb25lIGZ0cmFjZSBldmVudCBzdWJzeXN0ZW0gKGUuZy4gXFxcImh1Z2VfbWVtb3J5XFxcIikuXFxuKyAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0cmFjaW5nX2V2ZW50c19lbmFibGUoKSwgb3IgLTEgaWYgdHJhY2VmcyBvciB0aGVcXG4rICogc3Vic3lzdGVtIGlzIG5vdCB0aGVyZS4gIFRoZSBldmVudHMgYXJlIHN5c3RlbS13aWRlIHN0YXRlOiB3aG9ldmVyXFxuKyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlXFxuKyAqIHBhdGhzIHdoZXJlIHRoZSB0ZXN0IGdpdmVzIHVwLlxcbisgKi9cXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKVxcbit7XFxuK1xcdGNoYXIgcGF0aFsyNTZdO1xcbitcXG4rXFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXFxcIi9ldmVudHMvJXMvZW5hYmxlXFxcIixcXG4rXFx0XFx0IHN1YnN5cyk7XFxuK1xcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcXG4rfVxcbitcXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxcbit7XFxuK1xcdGlmIChwd3JpdGUoZmQsIGVuYWJsZSA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIiwgMSwgMCkgIT0gMSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogRHJvcCB3aGF0IHRoZSB0cmFjZSBidWZmZXIgaG9sZHMgc28gZmFyLiAqL1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKVxcbit7XFxuK1xcdGludCBmZCA9IG9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xcbitcXG4rXFx0aWYgKGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitGSUxFICp0cmFjaW5nX29wZW5fdHJhY2Uodm9pZClcXG4re1xcbitcXHRyZXR1cm4gZm9wZW4oVFJBQ0VGU19ST09UIFxcXCIvdHJhY2VcXFwiLCBcXFwiclxcXCIpO1xcbit9XFxuK1xcbiAvKiBJZiBgaW9jdGxzJyBub24tTlVMTCwgdGhlIGFsbG93ZWQgaW9jdGxzIHdpbGwgYmUgcmV0dXJuZWQgaW50byB0aGUgdmFyICovXFxuIGludCB1ZmZkX3JlZ2lzdGVyX3dpdGhfaW9jdGxzKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXFxuIFxcdFxcdFxcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5oXFxuaW5kZXggOWE0OWFmODg3MDJlNC4uMTBjN2JlNDZlNDRjYSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcXG5AQCAtMTAsNiArMTAsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnMuaFxcdTAwM2VcXG4gXFxuICNkZWZpbmUgQklUX1VMTChucikgICAgICAgICAgICAgICAgICAgKDFVTEwgXFx1MDAzY1xcdTAwM2MgKG5yKSlcXG4rI2RlZmluZSBBTElHTih4LCBhKSAgICAgICAgICAgICAgICAgICAoKCh4KSArIChhKSAtIDEpIFxcdTAwMjYgfigoYSkgLSAxKSlcXG4rXFxuICNkZWZpbmUgUE1fU09GVF9ESVJUWSAgICAgICAgICAgICAgICAgQklUX1VMTCg1NSlcXG4gI2RlZmluZSBQTV9NTUFQX0VYQ0xVU0lWRSAgICAgICAgICAgICBCSVRfVUxMKDU2KVxcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXFxuQEAgLTk3LDYgKzk5LDEwIEBAIGludDY0X3QgYWxsb2NhdGVfdHJhbnNodWdlKHZvaWQgKnB0ciwgaW50IHBhZ2VtYXBfZmQpO1xcbiBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncyk7XFxuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxcbiBcXHRcXHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XFxuK2Jvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxcbitcXHRcXHRcXHRpbnQga3BhZ2VmbGFnc19mZCk7XFxuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxcbitcXHRcXHRcXHRcXHQgICAgIGludCBwYWdlbWFwX2ZkLCBpbnQga3BhZ2VmbGFnc19mZCk7XFxuIFxcbiBpbnQgdWZmZF9yZWdpc3RlcihpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxcbiBcXHRcXHQgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vcik7XFxuQEAgLTExMyw2ICsxMTksMTAgQEAgaW50IGNsb3NlX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXApO1xcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XFxuIGludCByZWFkX3N5c2ZzKGNvbnN0IGNoYXIgKmZpbGVfcGF0aCwgdW5zaWduZWQgbG9uZyAqdmFsKTtcXG4gYm9vbCBzb2Z0ZGlydHlfc3VwcG9ydGVkKHZvaWQpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xcbitpbnQgdHJhY2luZ19ldmVudHNfZW5hYmxlKGludCBmZCwgYm9vbCBlbmFibGUpO1xcbitpbnQgdHJhY2luZ19jbGVhcl90cmFjZSh2b2lkKTtcXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xcbiBcXG4gc3RhdGljIGlubGluZSBpbnQgb3Blbl9zZWxmX3Byb2NtYXAoc3RydWN0IHByb2NtYXBfZmQgKnByb2NtYXBfb3V0KVxcbiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjMxLjkxMTY0MDY4NloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjE1NDUxNTY5NDM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IGFkZHMgYW5kIG1vZGlmaWVzIHVzZXItc3BhY2UgdGVzdHMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCBjb2RlIGl0c2VsZiwgc28gdGhlcmUgaXMgbm90aGluZyBuZXcgdG8gZnV6eiBpbiB0aGUga2VybmVsLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG4tIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLFxuICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSlcbiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4gICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnNcbiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBBbHNvIGNoZWNrIFwiZGVwZW5kcyBvblwiIGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlnc1xuICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzXG4gICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNzdhZWE0MDllZTg3ZWVmNzljMDgxNTg4MDI0MDY1ZDNjMWU3ZjkwZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgQXVnIDE1IDAyOjE4OjI4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuaW5kZXggMmQ1MzY2MTk2ZTMwOS4uMzA4YmJhZDczYzExYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9NYWtlZmlsZVxuQEAgLTEwNCw2ICsxMDQsOSBAQCBURVNUX0dFTl9GSUxFUyArPSBndWFyZC1yZWdpb25zXG4gVEVTVF9HRU5fRklMRVMgKz0gbWVyZ2VcbiBURVNUX0dFTl9GSUxFUyArPSBybWFwXG4gVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fc3BsaXRfcmFjZV90ZXN0XG4rVEVTVF9HRU5fRklMRVMgKz0gZm9saW9fb3JkZXJfY2hlY2tcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3N5bmNfY2hlY2tcbitURVNUX0dFTl9GSUxFUyArPSBraHVnZXBhZ2VkX3JhY2VcbiBcbiBpZm5lcSAoJChBUkNIKSxhcm02NClcbiBURVNUX0dFTl9GSUxFUyArPSBzb2Z0LWRpcnR5XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vZm9saW9fb3JkZXJfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2ZvbGlvX29yZGVyX2NoZWNrLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi45MzAzMGE0MmMzY2NkXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9mb2xpb19vcmRlcl9jaGVjay5jXG5AQCAtMCwwICsxLDEzNyBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBTZWxmLWNoZWNrIGZvciB0aGUgdm1fdXRpbCBmb2xpby1vcmRlciBkZXRlY3Rpb24gaGVscGVycyxcbisgKiBpc19iYWNrZWRfYnlfZm9saW8oKSBhbmQgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycygpLlxuKyAqXG4rICogRm9yIGV2ZXJ5IGFub24gVEhQIG9yZGVyIHRoZSBrZXJuZWwgc3VwcG9ydHMsIGZhdWx0IG1lbW9yeSBpbiB3aXRoIG9ubHlcbisgKiB0aGF0IG9yZGVyIGVuYWJsZWQgYW5kIHZlcmlmeSB0aGUgaGVscGVycyByZXBvcnQgZXhhY3RseSB0aGF0IG9yZGVyOlxuKyAqIG5vdCBhIG5laWdoYm91cmluZyBvcmRlciwgYW5kIHBsYWluIDRLIG1lbW9yeSBhcyBvcmRlciAwLiBUaGUgaGVscGVyc1xuKyAqIGFyZSB3aGF0IHRoZSBraHVnZXBhZ2VkIG1USFAgdGVzdHMgdXNlIHRvIGRldGVjdCBjb2xsYXBzZSByZXN1bHRzLCBzb1xuKyAqIHRoZXkgbXVzdCBhZ3JlZSB3aXRoIHRoZSBrZXJuZWwncyBvd24gaWRlYSBvZiB0aGUgYmFja2luZyBiZWZvcmUgYW55XG4rICogY29sbGFwc2UgdGVzdCByZWxpZXMgb24gdGhlbS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwia3NlbGZ0ZXN0LmhcIlxuKyNpbmNsdWRlIFwidm1fdXRpbC5oXCJcbisjaW5jbHVkZSBcImh1Z2VwYWdlX3NldHRpbmdzLmhcIlxuK1xuK3N0YXRpYyBpbnQgcGFnZW1hcF9mZDtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQ7XG4rXG4rLyogbW1hcCBhbiBhbm9uIFZNQSBvZiBleGFjdGx5IEBzaXplIGJ5dGVzIGF0IGEgQHNpemUtYWxpZ25lZCBhZGRyZXNzLiAqL1xuK3N0YXRpYyBjaGFyICphbGxvY19hbGlnbmVkKHNpemVfdCBzaXplKVxuK3tcbitcdHNpemVfdCBsZW4gPSBzaXplICogMjtcbitcdHVpbnRwdHJfdCBhbGlnbmVkO1xuK1x0Y2hhciAqcDtcbitcbitcdHAgPSBtbWFwKE5VTEwsIGxlbiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgLTEsIDApO1xuK1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpXCIpO1xuK1xuK1x0YWxpZ25lZCA9IEFMSUdOKCh1aW50cHRyX3QpcCwgc2l6ZSk7XG4rXHRpZiAoYWxpZ25lZCAhPSAodWludHB0cl90KXApXG4rXHRcdG11bm1hcChwLCBhbGlnbmVkIC0gKHVpbnRwdHJfdClwKTtcbitcdGlmIChhbGlnbmVkICsgc2l6ZSAhPSAodWludHB0cl90KXAgKyBsZW4pXG4rXHRcdG11bm1hcCgoY2hhciAqKWFsaWduZWQgKyBzaXplLFxuK1x0XHQgICAgICAgKHVpbnRwdHJfdClwICsgbGVuIC0gYWxpZ25lZCAtIHNpemUpO1xuK1xuK1x0cmV0dXJuIChjaGFyICopYWxpZ25lZDtcbit9XG4rXG4rLypcbisgKiBFbmFibGUgb25seSBAb3JkZXIgKG9yZGVyIDA6IG5vdGhpbmcpLCBmYXVsdCBvbmUgYWxpZ25lZCB3aW5kb3cgaW4gYW5kXG4rICogY2hlY2sgdGhlIGhlbHBlcnMgc2VlIGV4YWN0bHkgQG9yZGVyLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGNoZWNrX29yZGVyKGludCBvcmRlcilcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzID0gKnRocF9jdXJyZW50X3NldHRpbmdzKCk7XG4rXHRzaXplX3Qgc2l6ZSA9IHBzaXplKCkgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Ym9vbCBvayA9IHRydWU7XG4rXHRjaGFyICpwO1xuK1x0aW50IGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRpZiAob3JkZXIpXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tvcmRlcl0uZW5hYmxlZCA9IFRIUF9BTFdBWVM7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gYWxsb2NfYWxpZ25lZChzaXplKTtcbitcdCpwID0gMTtcbitcbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBzaXplLCBvcmRlcixcbitcdFx0XHRcdFx0ICAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIG5vdCBkZXRlY3RlZCBhZnRlciBmYXVsdFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHQvKiBBIGxvd2VyIG9yZGVyIG11c3QgYmUgcmVqZWN0ZWQ6IHRoZSBmb2xpbyBpcyBsYXJnZXIuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgb3JkZXIgLSAxLFxuK1x0XHRcdFx0XHRcdCAgICAgcGFnZW1hcF9mZCxcbitcdFx0XHRcdFx0XHQgICAgIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwib3JkZXIgJWQgYWxzbyByZXBvcnRlZCBhcyBvcmRlciAlZFxcblwiLFxuK1x0XHRcdCAgICAgICBvcmRlciwgb3JkZXIgLSAxKTtcbitcdFx0b2sgPSBmYWxzZTtcbitcdH1cbitcbitcdC8qIE9yZGVyIDAgcGFnZXMgbXVzdCBub3QgbG9vayBsaWtlIGFueSBsYXJnZSBmb2xpbywgYW5kIHZpY2UgdmVyc2EuICovXG4rXHRpZiAob3JkZXIgXHUwMDI2XHUwMDI2IGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMocCwgc2l6ZSwgMCxcbitcdFx0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsXG4rXHRcdFx0XHRcdFx0ICAgICBrcGFnZWZsYWdzX2ZkKSkge1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIm9yZGVyICVkIGFsc28gcmVwb3J0ZWQgYXMgb3JkZXIgMFxcblwiLCBvcmRlcik7XG4rXHRcdG9rID0gZmFsc2U7XG4rXHR9XG4rXG4rXHRtdW5tYXAocCwgc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXG4rXHRrc2Z0X3Rlc3RfcmVzdWx0KG9rLCBcIm9yZGVyICVkIGNsYXNzaWZpZWRcXG5cIiwgb3JkZXIpO1xuK31cbitcbitpbnQgbWFpbih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3M7XG4rXHR1bnNpZ25lZCBsb25nIG9yZGVycztcbitcdGludCBvcmRlcjtcbitcbitcdGtzZnRfcHJpbnRfaGVhZGVyKCk7XG4rXG4rXHRpZiAoIXRocF9hdmFpbGFibGUoKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJUcmFuc3BhcmVudCBIdWdlcGFnZXMgbm90IGF2YWlsYWJsZVxcblwiKTtcbitcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwib3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXG4rXHRvcmRlcnMgPSB0aHBfc3VwcG9ydGVkX29yZGVycygpO1xuK1x0aWYgKCFvcmRlcnMpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiTm8gc3VwcG9ydGVkIFRIUCBvcmRlcnNcXG5cIik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKF9fYnVpbHRpbl9wb3Bjb3VudGwob3JkZXJzKSArIDEpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdC8qIEJhc2Ugb2YgdGhlIHNldHRpbmdzIHN0YWNrOyB0aGUgYm90dG9tIGVudHJ5IGlzIG5ldmVyIHBvcHBlZC4gKi9cbitcdHRocF9wdXNoX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcbitcdGNoZWNrX29yZGVyKDApO1xuK1x0Zm9yIChvcmRlciA9IDE7IG9yZGVyIFx1MDAzYyBOUl9PUkRFUlM7IG9yZGVyKyspIHtcbitcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBvcmRlcikpKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRjaGVja19vcmRlcihvcmRlcik7XG4rXHR9XG4rXG4rXG4rXHRrc2Z0X2ZpbmlzaGVkKCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2htbS10ZXN0cy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbmluZGV4IGUyNjQyZWNhMGQwMmIuLmRmNDI2ZjkyMThlNzEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9obW0tdGVzdHMuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaG1tLXRlc3RzLmNcbkBAIC02NSw3ICs2NSw2IEBAIGVudW0ge1xuICNkZWZpbmUgSE1NX1BBVEhfTUFYICAgIDY0XG4gI2RlZmluZSBOVElNRVNcdFx0MTBcbiBcbi0jZGVmaW5lIEFMSUdOKHgsIGEpICgoKHgpICsgKGEgLSAxKSkgXHUwMDI2ICh+KChhKSAtIDEpKSlcbiAvKiBKdXN0IHRoZSBmbGFncyB3ZSBuZWVkLCBjb3BpZWQgZnJvbSBtbS5oOiAqL1xuIFxuICNpZm5kZWYgRk9MTF9XUklURVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5jXG5pbmRleCBkNzkxN2RjZTNhYmFjLi45OTJlZmVlMTdiNzE2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuY1xuQEAgLTE4Myw2ICsxODMsMTkgQEAgdm9pZCB0aHBfcmVhZF9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiBcdH1cbiB9XG4gXG4rLypcbisgKiBXcml0ZSBvbmx5IG9uIGNoYW5nZTogYSBzdG9yZSB0byBlaXRoZXIgc2xlZXAga25vYiB3YWtlcyBraHVnZXBhZ2VkIC0tXG4rICogX19zbGVlcF9taWxsaXNlY3Nfc3RvcmUoKSBjbGVhcnMga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgYW5kIHdha2VzIHRoZVxuKyAqIHF1ZXVlIC0tIGFuZCBzZXR0aW5ncyBwdXNoZXMvcG9wcyBtdXN0IG5vdCBzdGFydCBzY2FuIHBhc3NlcyBub2JvZHlcbisgKiBhc2tlZCBmb3I7IGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgaXMgdGhlIG9ubHkgc2FuY3Rpb25lZCB3YWtlLiAgVGhlXG4rICogb3RoZXIga25vYnMgZG8gbm90IHdha2UsIGJ1dCB3cml0aW5nIHRoZW0gdGhlIHNhbWUgd2F5IGNvc3RzIG5vdGhpbmcuXG4rICovXG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSlcbit7XG4rXHRpZiAodGhwX3JlYWRfbnVtKG5hbWUpICE9IG51bSlcbitcdFx0dGhwX3dyaXRlX251bShuYW1lLCBudW0pO1xuK31cbitcbiB2b2lkIHRocF93cml0ZV9zZXR0aW5ncyhzdHJ1Y3QgdGhwX3NldHRpbmdzICpzZXR0aW5ncylcbiB7XG4gXHRzdHJ1Y3Qga2h1Z2VwYWdlZF9zZXR0aW5ncyAqa2h1Z2VwYWdlZCA9IFx1MDAyNnNldHRpbmdzLVx1MDAzZWtodWdlcGFnZWQ7XG5AQCAtMTk4LDE1ICsyMTEsMTUgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHRcdFx0c2htZW1fZW5hYmxlZF9zdHJpbmdzW3NldHRpbmdzLVx1MDAzZXNobWVtX2VuYWJsZWRdKTtcbiBcdHRocF93cml0ZV9udW0oXCJ1c2VfemVyb19wYWdlXCIsIHNldHRpbmdzLVx1MDAzZXVzZV96ZXJvX3BhZ2UpO1xuIFxuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvZGVmcmFnXCIsIGtodWdlcGFnZWQtXHUwMDNlZGVmcmFnKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL2FsbG9jX3NsZWVwX21pbGxpc2Vjc1wiLFxuLVx0XHRcdGtodWdlcGFnZWQtXHUwMDNlYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKTtcbi1cdHRocF93cml0ZV9udW0oXCJraHVnZXBhZ2VkL3NjYW5fc2xlZXBfbWlsbGlzZWNzXCIsXG4tXHRcdFx0a2h1Z2VwYWdlZC1cdTAwM2VzY2FuX3NsZWVwX21pbGxpc2Vjcyk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19ub25lXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfbm9uZSk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4tXHR0aHBfd3JpdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zaGFyZWRcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19zaGFyZWQpO1xuLVx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvcGFnZXNfdG9fc2NhblwiLCBraHVnZXBhZ2VkLVx1MDAzZXBhZ2VzX3RvX3NjYW4pO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL2RlZnJhZ1wiLCBraHVnZXBhZ2VkLVx1MDAzZWRlZnJhZyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvYWxsb2Nfc2xlZXBfbWlsbGlzZWNzXCIsXG4rXHRcdCAgICAgICBraHVnZXBhZ2VkLVx1MDAzZWFsbG9jX3NsZWVwX21pbGxpc2Vjcyk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0ICAgICAgIGtodWdlcGFnZWQtXHUwMDNlc2Nhbl9zbGVlcF9taWxsaXNlY3MpO1xuK1x0dGhwX3VwZGF0ZV9udW0oXCJraHVnZXBhZ2VkL21heF9wdGVzX25vbmVcIiwga2h1Z2VwYWdlZC1cdTAwM2VtYXhfcHRlc19ub25lKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9tYXhfcHRlc19zd2FwXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc3dhcCk7XG4rXHR0aHBfdXBkYXRlX251bShcImtodWdlcGFnZWQvbWF4X3B0ZXNfc2hhcmVkXCIsIGtodWdlcGFnZWQtXHUwMDNlbWF4X3B0ZXNfc2hhcmVkKTtcbitcdHRocF91cGRhdGVfbnVtKFwia2h1Z2VwYWdlZC9wYWdlc190b19zY2FuXCIsIGtodWdlcGFnZWQtXHUwMDNlcGFnZXNfdG9fc2Nhbik7XG4gXG4gXHRpZiAoZGV2X3F1ZXVlX3JlYWRfYWhlYWRfcGF0aFswXSlcbiBcdFx0d3JpdGVfbnVtKGRldl9xdWV1ZV9yZWFkX2FoZWFkX3BhdGgsIHNldHRpbmdzLVx1MDAzZXJlYWRfYWhlYWRfa2IpO1xuQEAgLTIzMCw2ICsyNDMsNDkgQEAgdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpXG4gXHR9XG4gfVxuIFxuKy8qXG4rICogQ29tcGxldGlvbiBiYXJyaWVyIGZvciBraHVnZXBhZ2VkOiB3YWl0IHVudGlsIGEgZnVsbCBzY2FuIHBhc3MgdGhhdFxuKyAqIHN0YXJ0ZWQgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBmaW5pc2hlZC4gZnVsbF9zY2FucyBtdXN0IGFkdmFuY2UgYnkgdHdvO1xuKyAqIGEgKzEgc3RlcCBtYXkgY29tcGxldGUgYSBwYXNzIHRoYXQgZXhhbWluZWQgdGhpcyBtbSBiZWZvcmUgdGhlXG4rICogY2FsbGVyJ3Mgc2V0dXAgd2FzIGluIHBsYWNlLlxuKyAqXG4rICogQW55IHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIHNvIHRoZSBiYXJyaWVyIHdvcmtzXG4rICogd2hhdGV2ZXIgdGhlIGNvbmZpZ3VyZWQgc2NhbiBjYWRlbmNlIC0tIGJ1dCBhIHN0b3JlIGNhbiBiZSBsb3N0LlxuKyAqIF9fc2xlZXBfbWlsbGlzZWNzX3N0b3JlKCkgY2xlYXJzIGtodWdlcGFnZWRfc2xlZXBfZXhwaXJlIGFuZCB3YWtlcyB0aGVcbisgKiBxdWV1ZTsgaWYgdGhlIGRhZW1vbiBpcyBiZXR3ZWVuIHNjYW5zIHJhdGhlciB0aGFuIHNsZWVwaW5nLCBpdCBzZXRzXG4rICoga2h1Z2VwYWdlZF9zbGVlcF9leHBpcmUgaXRzZWxmIG9uIHRoZSB3YXkgaW50byBraHVnZXBhZ2VkX3dhaXRfd29yaygpIGFuZFxuKyAqIHRoZW4gc2xlZXBzIGZvciB0aGUgZnVsbCBpbnRlcnZhbCwgaGF2aW5nIG5ldmVyIHNlZW4gdGhlIHN0b3JlLiAgU28ga2VlcFxuKyAqIHN0b3JpbmcgdW50aWwgdGhlIHBhc3MgbGFuZHM7IGEgc3RvcmUgd2hpbGUgdGhlIGRhZW1vbiBpcyBhd2FrZSBjb3N0c1xuKyAqIG5vdGhpbmcgYW5kIGRvZXMgbm90IHF1ZXVlIGFuIGV4dHJhIHBhc3MuXG4rICpcbisgKiBPbmUgd2FrZSBjb21wbGV0ZXMgb25lIGZ1bGwgcGFzcyBvbmx5IGlmIHRoZSB3aG9sZSBtbSBsaXN0IGZpdHMgaW5cbisgKiBvbmUgc2NhbiBiYXRjaCwgc28gY2FsbGVycyBtdXN0IHBhaXIgdGhpcyB3aXRoIGEgbGFyZ2VcbisgKiBwYWdlc190b19zY2FuLlxuKyAqL1xuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcylcbit7XG4rXHR1bnNpZ25lZCBsb25nIGRlYWRsaW5lX21zID0gdGltZW91dF9zICogMTAwMFVMO1xuK1x0dW5zaWduZWQgbG9uZyBzbGVlcF9tcyA9XG4rXHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIik7XG4rXHR1bnNpZ25lZCBsb25nIGVsYXBzZWRfbXMgPSAwO1xuK1x0aW50IHBhc3M7XG4rXG4rXHRmb3IgKHBhc3MgPSAwOyBwYXNzIFx1MDAzYyAyOyBwYXNzKyspIHtcbitcdFx0dW5zaWduZWQgbG9uZyB0YXJnZXQgPVxuK1x0XHRcdHRocF9yZWFkX251bShcImtodWdlcGFnZWQvZnVsbF9zY2Fuc1wiKSArIDE7XG4rXG4rXHRcdHdoaWxlICh0aHBfcmVhZF9udW0oXCJraHVnZXBhZ2VkL2Z1bGxfc2NhbnNcIikgXHUwMDNjIHRhcmdldCkge1xuK1x0XHRcdGlmIChlbGFwc2VkX21zIFx1MDAzZT0gZGVhZGxpbmVfbXMpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdFx0dGhwX3dyaXRlX251bShcImtodWdlcGFnZWQvc2Nhbl9zbGVlcF9taWxsaXNlY3NcIixcbitcdFx0XHRcdCAgICAgIHNsZWVwX21zKTtcbitcdFx0XHR1c2xlZXAoMTAgKiAxMDAwKTtcbitcdFx0XHRlbGFwc2VkX21zICs9IDEwO1xuK1x0XHR9XG4rXHR9XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4gc3RydWN0IHRocF9zZXR0aW5ncyAqdGhwX2N1cnJlbnRfc2V0dGluZ3Modm9pZClcbiB7XG4gXHRpZiAoIXNldHRpbmdzX2luZGV4KSB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vaHVnZXBhZ2Vfc2V0dGluZ3MuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2h1Z2VwYWdlX3NldHRpbmdzLmhcbmluZGV4IDcyNmM3M2M0M2MwNWIuLmJhN2QzODM3MGQ0MzMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9odWdlcGFnZV9zZXR0aW5ncy5oXG5AQCAtNzAsNiArNzAsNyBAQCBpbnQgdGhwX3JlYWRfc3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10pO1xuIHZvaWQgdGhwX3dyaXRlX3N0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3JlYWRfbnVtKGNvbnN0IGNoYXIgKm5hbWUpO1xuIHZvaWQgdGhwX3dyaXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4rdm9pZCB0aHBfdXBkYXRlX251bShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG51bSk7XG4gXG4gdm9pZCB0aHBfd3JpdGVfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuIHZvaWQgdGhwX3JlYWRfc2V0dGluZ3Moc3RydWN0IHRocF9zZXR0aW5ncyAqc2V0dGluZ3MpO1xuQEAgLTgzLDYgKzg0LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHRocF9zYXZlX3NldHRpbmdzKHZvaWQpXG4gXHRodWdlcGFnZV9zYXZlX3NldHRpbmdzKC8qIHRocCA9ICovIHRydWUsIC8qIGh1Z2V0bGIgPSAqLyBmYWxzZSk7XG4gfVxuIFxuK2Jvb2wga2h1Z2VwYWdlZF9mdWxsX3Bhc3ModW5zaWduZWQgaW50IHRpbWVvdXRfcyk7XG4rXG4gdm9pZCB0aHBfc2V0X3JlYWRfYWhlYWRfcGF0aChjaGFyICpwYXRoKTtcbiB1bnNpZ25lZCBsb25nIHRocF9zdXBwb3J0ZWRfb3JkZXJzKHZvaWQpO1xuIHVuc2lnbmVkIGxvbmcgdGhwX3NobWVtX3N1cHBvcnRlZF9vcmRlcnModm9pZCk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG5pbmRleCBkM2E1MzY3M2UxZjlhLi4xNzJlNzMwN2VlZWViIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkLmNcbkBAIC0zMSw2ICszMSwxMSBAQCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWdlX3NpemU7XG4gc3RhdGljIGludCBocGFnZV9wbWRfbnI7XG4gc3RhdGljIGludCBhbm9uX29yZGVyO1xuIHN0YXRpYyBpbnQgY29sbGFwc2Vfb3JkZXI7XG4rc3RhdGljIGJvb2wgY29sbGFwc2Vfb3JkZXJfZ2l2ZW47XG4rc3RhdGljIGludCBjb2xsYXBzZV9vcmRlcnNbTlJfT1JERVJTXTtcbitzdGF0aWMgaW50IG5yX2NvbGxhcHNlX29yZGVycztcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQgPSAtMTtcbitzdGF0aWMgaW50IGtwYWdlZmxhZ3NfZmQgPSAtMTtcbiBcbiAjZGVmaW5lIFBJRF9TTUFQUyBcIi9wcm9jL3NlbGYvc21hcHNcIlxuICNkZWZpbmUgVEVTVF9GSUxFIFwiY29sbGFwc2VfdGVzdF9maWxlXCJcbkBAIC0yMTksNiArMjI0LDQxIEBAIHN0YXRpYyBib29sIGNoZWNrX3N3YXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKVxuIFx0cmV0dXJuIHN3YXA7XG4gfVxuIFxuKy8qXG4rICogUGFnZSB0aGUgcmFuZ2Ugb3V0IGFuZCB3YWl0IGZvciB0aGUgc3dhcCBjb3VudCB0byBzYXkgc28uXG4rICpcbisgKiBUd28gdGhpbmdzIGdldCBpbiB0aGUgd2F5LiAgTUFEVl9QQUdFT1VUIGlzIGJlc3QgZWZmb3J0OlxuKyAqIHNocmlua19mb2xpb19saXN0KCkgbGVhdmVzIGEgZm9saW8gYWxvbmUgd2hlbiBpdCBjYW5ub3QgcmVjbGFpbSBpdCByaWdodFxuKyAqIGF3YXksIGFuZCBvbmUgc3RpbGwgdW5kZXIgd3JpdGViYWNrIGZyb20gYW4gZWFybGllciBwYWdlb3V0IGlzIHRoZSBjb21tb25cbisgKiBjYXNlLCBzbyB0aGUgY291bnQgdGhlIGNhbGxlciBhc2tzIGZvciBhcnJpdmVzIGEgbW9tZW50IGxhdGVyLiAgQW5kIGEgcmFuZ2VcbisgKiBhbiBlYXJsaWVyIGNvbGxhcHNlIGxlZnQgTUFEVl9IVUdFUEFHRSBpcyBvbmUga2h1Z2VwYWdlZCBpcyBzdGlsbCB3b3JraW5nXG4rICogb246IGNvbGxhcHNpbmcgYSByYW5nZSB3aXRoIHVwIHRvIG1heF9wdGVzX3N3YXAgcGFnZXMgc3dhcHBlZCBvdXQgbWVhbnNcbisgKiByZWFkaW5nIHRob3NlIHBhZ2VzIGJhY2sgaW4sIHNvIHRoZSBkYWVtb24gdW5kb2VzIHRoZSBwYWdlb3V0IGFzIGZhc3QgYXMgaXRcbisgKiBpcyBhc2tlZCBmb3IuICBLZWVwIHRoZSByYW5nZSBvdXQgb2YgaXRzIHJlYWNoOyB0aGUgY29sbGFwc2UgdGhlIGNhbGxlciBydW5zXG4rICogbmV4dCBwdXRzIE1BRFZfSFVHRVBBR0UgYmFjay5cbisgKlxuKyAqIEZhaWxpbmcgdG8gZ2V0IHRoZSBwYWdlcyBvdXQgaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIsIG5vdCB0aGUga2VybmVsJ3MgLS1cbisgKiBzd2FwIHRvbyBzbWFsbCwgc3dhcCBmdWxsLCBhIG1lbWNnIGNhcCwgYSBmb2xpbyBzdGlsbCB1bmRlciB3cml0ZWJhY2sgLS0gc29cbisgKiBjYWxsZXJzIHNraXAgcmF0aGVyIHRoYW4gZmFpbC4gIEFuIGVycm9yIGZyb20gbWFkdmlzZSgpIGlzIGRpZmZlcmVudCwgYW5kXG4rICogZW5kcyB0aGUgcnVuIGhlcmUuXG4rICovXG4rc3RhdGljIGJvb2wgc3dhcG91dF9yYW5nZSh2b2lkICpwLCB1bnNpZ25lZCBsb25nIHNpemUpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAobWFkdmlzZShwLCBzaXplLCBNQURWX05PSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfTk9IVUdFUEFHRSlcIik7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyA0MDsgaSsrKSB7XG4rXHRcdGlmIChtYWR2aXNlKHAsIHNpemUsIE1BRFZfUEFHRU9VVCkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuK1x0XHRpZiAoY2hlY2tfc3dhcChwLCBzaXplKSlcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0dXNsZWVwKDUwICogMTAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuIHN0YXRpYyB2b2lkICphbGxvY19tYXBwaW5nKGludCBucilcbiB7XG4gXHR2b2lkICpwO1xuQEAgLTUxNSw4ICs1NTUsOCBAQCBzdGF0aWMgYm9vbCBpc19hbm9uKHN0cnVjdCBtZW1fb3BzICpvcHMpXG4gc3RhdGljIHZvaWQgX19tYWR2aXNlX2NvbGxhcHNlKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgaW50IG5yX2hwYWdlcyxcbiBcdFx0XHQgICAgICAgc3RydWN0IG1lbV9vcHMgKm9wcywgYm9vbCBleHBlY3QpXG4ge1xuLVx0aW50IHJldDtcbiBcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCByZXQsIGk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIiVzLi4uXCIsIG1zZyk7XG4gXG5AQCAtNTI5LDkgKzU2OSwyMCBAQCBzdGF0aWMgdm9pZCBfX21hZHZpc2VfY29sbGFwc2UoY29uc3QgY2hhciAqbXNnLCBjaGFyICpwLCBpbnQgbnJfaHBhZ2VzLFxuIFx0LypcbiBcdCAqIFByZXZlbnQga2h1Z2VwYWdlZCBpbnRlcmZlcmVuY2UgYW5kIHRlc3RzIHRoYXQgTUFEVl9DT0xMQVBTRVxuIFx0ICogaWdub3JlcyAvc3lzL2tlcm5lbC9tbS90cmFuc3BhcmVudF9odWdlcGFnZS9lbmFibGVkXG4rXHQgKlxuK1x0ICogVGhlIHBlci1vcmRlciBjb250cm9scyBoYXZlIHRvIGdvIHRvbywgbm90IGp1c3QgdGhlIGdsb2JhbCBvbmU6IGFcbitcdCAqIHNvdXJjZSBvcmRlciBsZWZ0IGF0IFwiYWx3YXlzXCIgLS0gd2hpY2ggLXMgZG9lcyAtLSBsZXRzIGtodWdlcGFnZWRcbitcdCAqIGNvbGxhcHNlIHRoZSB2ZXJ5IHJhbmdlIHRoZSBjYXNlIGlzIHdvcmtpbmcgb24uICBTZXQgdGhlbSB0b1xuK1x0ICogXCJpbmhlcml0XCIsIG5vdCBcIm5ldmVyXCIuICBraHVnZXBhZ2VkIGhvbm91cnMgdGhlIGdsb2JhbCBuZXZlciBhbmRcbitcdCAqIHN0YXlzIG91dC4gIEEgZm9yY2VkIHNobWVtIGNvbGxhcHNlIHRha2VzIHRoZSBvcmRlciBpdCBidWlsZHMgZnJvbVxuK1x0ICogdGhlc2UgdmVyeSBjb250cm9scywgYW5kIHN0aWxsIGZpbmRzIG9uZS5cbiBcdCAqL1xuIFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTkVWRVI7XG4gXHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRzZXR0aW5ncy5odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFRIUF9JTkhFUklUO1xuK1x0XHRzZXR0aW5ncy5zaG1lbV9odWdlcGFnZXNbaV0uZW5hYmxlZCA9IFNITUVNX0lOSEVSSVQ7XG4rXHR9XG4gXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4gXG4gXHQvKiBDbGVhciBWTV9OT0hVR0VQQUdFICovXG5AQCAtNTYxLDggKzYxMiwxMCBAQCBzdGF0aWMgYm9vbCB3YWl0X2Zvcl9zY2FuKGNvbnN0IGNoYXIgKm1zZywgY2hhciAqcCwgc2l6ZV90IGxlbixcbiBcdFx0aW50IG5yX2hwYWdlcywgaW50IGNvbGxhcF9vcmRlciwgc3RydWN0IG1lbV9vcHMgKm9wcylcbiB7XG4gXHR1bnNpZ25lZCBsb25nIGhwYWdlX3NpemUgPSBwYWdlX3NpemUgXHUwMDNjXHUwMDNjIGNvbGxhcF9vcmRlcjtcbitcdC8qIFRocmVlIHNlY29uZHMgYXMgYSBmbG9vciwgcGx1cyBhIHNlY29uZCBwZXIgMTI4TSB0byBjb2xsYXBzZSAqL1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBieXRlcyA9ICh1bnNpZ25lZCBsb25nKW5yX2hwYWdlcyAqIGhwYWdlX3NpemU7XG4rXHRpbnQgdGltZW91dCA9IDYgKyAyICogKGJ5dGVzIC8gKDEyOFVMIFx1MDAzY1x1MDAzYyAyMCkpO1xuIFx0aW50IGZ1bGxfc2NhbnM7XG4tXHRpbnQgdGltZW91dCA9IDY7IC8qIDMgc2Vjb25kcyAqL1xuIFxuIFx0LyogU2FuaXR5IGNoZWNrICovXG4gXHRpZiAoIW9wcy1cdTAwM2VjaGVja19odWdlKHAsIGxlbiwgMCwgaHBhZ2Vfc2l6ZSkpXG5AQCAtODI1LDEyICs4NzgsMTAgQEAgc3RhdGljIHZvaWQgY29sbGFwc2Vfc3dhcGluX3NpbmdsZV9wdGUoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BcbiBcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBocGFnZV9wbWRfc2l6ZSk7XG4gXG4gXHRrc2Z0X3ByaW50X21zZyhcIlN3YXBvdXQgb25lIHBhZ2UuLi5cIik7XG4tXHRpZiAobWFkdmlzZShwLCBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1hZHZpc2UoTUFEVl9QQUdFT1VUKVwiKTtcbi1cdGlmIChjaGVja19zd2FwKHAsIHBhZ2Vfc2l6ZSkpIHtcbitcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIHBhZ2Vfc2l6ZSkpIHtcbiBcdFx0c3VjY2VzcyhcIk9LXCIpO1xuIFx0fSBlbHNlIHtcbi1cdFx0ZmFpbChcIkZhaWxcIik7XG4rXHRcdHNraXAoXCJDb3VsZCBub3Qgc3dhcCBvdXRcIik7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuQEAgLTg1MSwxMiArOTAyLDEwIEBAIHN0YXRpYyB2b2lkIGNvbGxhcHNlX21heF9wdGVzX3N3YXAoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzICpvXG4gXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFxuIFx0a3NmdF9wcmludF9tc2coXCJTd2Fwb3V0ICVkIG9mICVkIHBhZ2VzLi4uXCIsIG1heF9wdGVzX3N3YXAgKyAxLCBocGFnZV9wbWRfbnIpO1xuLVx0aWYgKG1hZHZpc2UocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSwgTUFEVl9QQUdFT1VUKSlcbi1cdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuLVx0aWYgKGNoZWNrX3N3YXAocCwgKG1heF9wdGVzX3N3YXAgKyAxKSAqIHBhZ2Vfc2l6ZSkpIHtcbitcdGlmIChzd2Fwb3V0X3JhbmdlKHAsIChtYXhfcHRlc19zd2FwICsgMSkgKiBwYWdlX3NpemUpKSB7XG4gXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1x0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbkBAIC04NjgsMTIgKzkxNywxMCBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zd2FwKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wcyAqb1xuIFx0XHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuIFx0XHRrc2Z0X3ByaW50X21zZyhcIlN3YXBvdXQgJWQgb2YgJWQgcGFnZXMuLi5cIiwgbWF4X3B0ZXNfc3dhcCxcbiBcdFx0ICAgICAgIGhwYWdlX3BtZF9ucik7XG4tXHRcdGlmIChtYWR2aXNlKHAsIG1heF9wdGVzX3N3YXAgKiBwYWdlX3NpemUsIE1BRFZfUEFHRU9VVCkpXG4tXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX1BBR0VPVVQpXCIpO1xuLVx0XHRpZiAoY2hlY2tfc3dhcChwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuK1x0XHRpZiAoc3dhcG91dF9yYW5nZShwLCBtYXhfcHRlc19zd2FwICogcGFnZV9zaXplKSkge1xuIFx0XHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRmYWlsKFwiRmFpbFwiKTtcbitcdFx0XHRza2lwKFwiQ291bGQgbm90IHN3YXAgb3V0XCIpO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXG5AQCAtOTQwLDYgKzk4NywxNiBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9jb21wb3VuZF9leHRyZW1lKHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLCBzdHJ1Y3QgbWVtX29wc1xuIFx0dm9pZCAqcDtcbiBcdGludCBpO1xuIFxuK1x0LypcbitcdCAqIFRoZSB0ZXN0IG5lZWRzIGhwYWdlX3BtZF9uciBQTUQtb3JkZXIgYWxsb2NhdGlvbnMsIHdoaWNoIGlzIGxpa2VseSB0b1xuK1x0ICogZmFpbCBmb3IgbGFyZ2UgUE1EIHNpemVzLiAgU2tpcCBpZiB0aGUgUE1EIHNpemUgaXMgb3ZlciAzMk0uXG4rXHQgKi9cbitcdGlmIChocGFnZV9wbWRfc2l6ZSBcdTAwM2UgKDMyVUwgXHUwMDNjXHUwMDNjIDIwKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogUE1EIHRvbyBsYXJnZSBmb3IgZmF1bHQtdGltZSBUSFAgY29uc3RydWN0aW9uXFxuXCIsXG4rXHRcdFx0XHQgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbiBcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbiBcdGtzZnRfcHJpbnRfbXNnKFwiQ29uc3RydWN0IFBURSBwYWdlIHRhYmxlIGZ1bGwgb2YgZGlmZmVyZW50IFBURS1tYXBwZWQgY29tcG91bmQgcGFnZXNcXG5cIik7XG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBocGFnZV9wbWRfbnI7IGkrKykge1xuQEAgLTExMzAsNiArMTE4Nyw5NyBAQCBzdGF0aWMgdm9pZCBjb2xsYXBzZV9tYXhfcHRlc19zaGFyZWQoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsIHN0cnVjdCBtZW1fb3BzXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qXG4rICogQ29udGVudCBzdGF5cyBpc29sYXRlZCB3aGlsZSBhIGNvLXNoYXJlciB3cml0ZXMgY29uY3VycmVudGx5LiBBIHNoYXJlZFxuKyAqIHNvdXJjZSBpcyBjb3BpZWQgbGl2ZSAobm90IGZyb3plbiksIHJlbHlpbmcgb24gaXQgYmVpbmcgQ29XIC0gaW1tdXRhYmxlXG4rICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29weTsgYSBjby1zaGFyZXIncyB3cml0ZSBnb2VzIHRvIGEgQ29XIGNvcHkuIFRoZVxuKyAqIGNvbGxhcHNpbmcgY2hpbGQgbXVzdCBzZWUgdGhlIHByZS1mb3JrIGNvbnRlbnQsIHRoZSB3cml0aW5nIHBhcmVudCBvbmx5XG4rICogaXRzIG93biB3cml0ZXMuXG4rICovXG4rc3RhdGljIHZvaWQgY29sbGFwc2VfZm9ya19jb3dfcmFjZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYywgc3RydWN0IG1lbV9vcHMgKm9wcylcbit7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHNoYXJlZCA9IDY0ICogcGFnZV9zaXplO1xuK1x0Y29uc3QgaW50IHN0cmlkZSA9IHBhZ2Vfc2l6ZSAvIHNpemVvZihpbnQpO1xuK1x0aW50IHdzdGF0dXMsIGNoaWxkX3N0YXR1cywgaSwgbiA9IHNoYXJlZCAvIHBhZ2Vfc2l6ZTtcbitcdC8qIHZvbGF0aWxlOiB0aGUgbG9vcCBiZWxvdyBtdXN0IHJlYWxseSBzdG9yZSwgb24gZXZlcnkgaXRlcmF0aW9uICovXG4rXHR2b2xhdGlsZSBpbnQgKmlwO1xuK1x0cGlkX3QgY2hpbGQ7XG4rXHRpbnQgc3luY1syXTtcbitcdGNoYXIgZ28gPSAxO1xuK1x0dm9pZCAqcDtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdGlwID0gcDtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBzaGFyZWQpO1x0XHQvKiBzaGFyZWQgcHJlZml4LCBwcmUtZm9yayBwYXR0ZXJuICovXG4rXHRpZiAocGlwZShzeW5jKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwicGlwZSgpXCIpO1xuK1xuK1x0a3NmdF9wcmludF9tc2coXCJGb3JrLCBjb2xsYXBzZSBpbiB0aGUgY2hpbGQgd2hpbGUgdGhlIHBhcmVudCByZXdyaXRlcy4uLlwiKTtcbitcdGNoaWxkID0gZm9yaygpO1xuK1x0aWYgKCFjaGlsZCkge1xuK1x0XHRpbnQgY29sbGFwc2Vfc3RhdHVzO1xuK1xuK1x0XHRjbG9zZShzeW5jWzBdKTtcbitcdFx0b3BzLVx1MDAzZWZhdWx0KHAsIHNoYXJlZCwgaHBhZ2VfcG1kX3NpemUpO1x0LyogcHJpdmF0ZSByZW1haW5kZXIgKi9cbitcdFx0LyogU3RhcnQgdGhlIHBhcmVudCB1bnNoYXJpbmcsIGFuZCBnaXZlIGl0IGEgaGVhZCBzdGFydC4gKi9cbitcdFx0aWYgKHdyaXRlKHN5bmNbMV0sIFx1MDAyNmdvLCAxKSAhPSAxKVxuK1x0XHRcdF9leGl0KEtTRlRfRkFJTCk7XG4rXHRcdHVzbGVlcCg1MDAwKTtcbitcdFx0Yy1cdTAwM2Vjb2xsYXBzZShcIkNvbGxhcHNlIGEgcmFuZ2Ugc2hhcmVkIHdpdGggYSB3cml0aW5nIGNvLXNoYXJlclwiLFxuK1x0XHRcdCAgICBwLCAxLCBvcHMsIHRydWUpO1xuK1x0XHRjb2xsYXBzZV9zdGF0dXMgPSBleGl0X3N0YXR1cztcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbjsgaSsrKVxuK1x0XHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhkZWFkMDAwMClcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRpZiAoaSA9PSBuKVxuK1x0XHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGZhaWwoXCJGYWlsOiBjaGlsZCBjb250ZW50XCIpO1xuK1x0XHQvKiBUaGUgY29udGVudCBjaGVjayBtdXN0IG5vdCBidXJ5IGEgZmFpbGVkIGNvbGxhcHNlLiAqL1xuK1x0XHRpZiAoZXhpdF9zdGF0dXMgIT0gS1NGVF9GQUlMKVxuK1x0XHRcdGV4aXRfc3RhdHVzID0gY29sbGFwc2Vfc3RhdHVzO1xuK1x0XHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0X2V4aXQoZXhpdF9zdGF0dXMpO1xuK1x0fVxuK1xuK1x0Y2xvc2Uoc3luY1sxXSk7XG4rXHRpZiAocmVhZChzeW5jWzBdLCBcdTAwMjZnbywgMSkgIT0gMSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiY2hpbGQgbmV2ZXIgcmVhY2hlZCB0aGUgY29sbGFwc2VcXG5cIik7XG4rXG4rXHQvKlxuK1x0ICogVW5zaGFyZSBvbmUgcGFnZSBhdCBhIHRpbWUuICBBIGJ1cnN0IHdvdWxkIGJyZWFrIENvVyBvbiBhbGwgb2YgdGhlbVxuK1x0ICogaW4gbWljcm9zZWNvbmRzIC0tIHdhaXRfZm9yX3NjYW4oKSBkb2VzIG5vdCBldmVuIHBvbGwgZm9yIFRJQ0sgLS1cbitcdCAqIGFuZCB0aGUgY2hpbGQgd291bGQgY29sbGFwc2UgcGFnZXMgYWxyZWFkeSBleGNsdXNpdmUgdG8gaXQuXG4rXHQgKi9cbitcdGkgPSAwO1xuK1x0ZG8ge1xuK1x0XHRpZiAoaSBcdTAwM2MgbilcbitcdFx0XHRpcFtpICogc3RyaWRlXSA9IGkgKyAweGJlZWYwMDAwO1xuK1x0XHRpKys7XG4rXHRcdHVzbGVlcCgxMCAqIDEwMDApO1xuK1x0fSB3aGlsZSAod2FpdHBpZChjaGlsZCwgXHUwMDI2d3N0YXR1cywgV05PSEFORykgPT0gMCk7XG4rXG4rXHQvKiBXaGF0ZXZlciB0aGUgcGFjZWQgc3dlZXAgZGlkIG5vdCByZWFjaCwgc28gdGhlIGNoZWNrIGJlbG93IGlzIGV4YWN0LiAqL1xuK1x0Zm9yICg7IGkgXHUwMDNjIG47IGkrKylcbitcdFx0aXBbaSAqIHN0cmlkZV0gPSBpICsgMHhiZWVmMDAwMDtcbitcdC8qIEEgY2hpbGQgdGhhdCBkaWVkIHJlYWRpbmcgdGhlIHJhY2luZyBwYWdlcyBpcyBhIGZhaWx1cmUsIG5vdCBhIHplcm8uICovXG4rXHRjaGlsZF9zdGF0dXMgPSBXSUZFWElURUQod3N0YXR1cykgPyBXRVhJVFNUQVRVUyh3c3RhdHVzKSA6IEtTRlRfRkFJTDtcbitcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ2hlY2sgdGhlIHBhcmVudCBzZWVzIG9ubHkgaXRzIG93biB3cml0ZXMuLi5cIik7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuOyBpKyspXG4rXHRcdGlmIChpcFtpICogc3RyaWRlXSAhPSBpICsgMHhiZWVmMDAwMClcbitcdFx0XHRicmVhaztcbitcdGlmIChpID09IG4pXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWw6IHBhcmVudCBjb250ZW50XCIpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHQvKiBTYW1lIGFnYWluOiBvdXIgb3duIGNoZWNrIG11c3Qgbm90IGJ1cnkgdGhlIGNoaWxkJ3MgdmVyZGljdC4gKi9cbitcdGlmIChleGl0X3N0YXR1cyAhPSBLU0ZUX0ZBSUwpXG4rXHRcdGV4aXRfc3RhdHVzID0gY2hpbGRfc3RhdHVzO1xuK1x0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK31cbitcbiBzdGF0aWMgdm9pZCBtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRcdFx0XHRcdCAgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4ge1xuQEAgLTExNzUsNiArMTMyMywyMTkgQEAgc3RhdGljIHZvaWQgbWFkdmlzZV9yZXRyYWN0ZWRfcGFnZV90YWJsZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4gXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4gfVxuIFxuKy8qIFNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgd2lsbCBjb25zaWRlciBmb3IgbVRIUCBjb2xsYXBzZS4gKi9cbisjZGVmaW5lIE1JTl9NVEhQX09SREVSIDJcbitcbisvKlxuKyAqIE9yZGVyLXBhcmFtZXRlcml6ZWQgY29sbGFwc2UgY2FzZXMgZm9yIHRoZSBtdGhwX2todWdlcGFnZWQgY29udGV4dC4gIFdoYXRcbisgKiB0aGV5IGFkZCBvdmVyIHRoZSBnZW5lcmljIGNhc2VzIHJ1biB1bmRlciB0aGF0IGNvbnRleHQgaXMgcGVyLXdpbmRvd1xuKyAqIGRldGVjdGlvbjogd2hpY2ggYWxpZ25lZCB3aW5kb3cgY29sbGFwc2VkLCBhbmQgd2hpY2ggb2YgaXRzIG5laWdoYm91cnMgZGlkXG4rICogbm90LiAgY2hlY2tfaHVnZSgpIGFuc3dlcnMgaG93IG1hbnkgZm9saW9zIG9mIHRoZSBvcmRlciB0aGUgcmFuZ2UgaG9sZHMsXG4rICogd2hpY2ggY2Fubm90IHRlbGwgb25lIHdpbmRvdyBmcm9tIGFub3RoZXIuXG4rICpcbisgKiBUaGUgcmVnaW9uIGlzIGZhdWx0ZWQgYmVmb3JlIE1BRFZfSFVHRVBBR0UsIGFuZCB0aGUgdGFyZ2V0IG9yZGVyIGlzIG9ubHlcbisgKiBlbmFibGVkIGZvciBtYWR2aXNlLCBzbyB0aGUgc291cmNlcyBhcmUgYWx3YXlzIG9yZGVyIDAgYW5kIHRoZSBjb2xsYXBzZVxuKyAqIHByb2R1Y3QgY2FuIG9ubHkgaGF2ZSBjb21lIGZyb20ga2h1Z2VwYWdlZC5cbisgKi9cbitzdGF0aWMgc2l6ZV90IG10aHBfd2luZG93X3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gcGFnZV9zaXplIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcjtcbit9XG4rXG4rc3RhdGljIHZvaWQgbXRocF9wdXNoX3RhcmdldF9vcmRlcih2b2lkKVxuK3tcbitcdHN0cnVjdCB0aHBfc2V0dGluZ3Mgc2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdGludCBpO1xuK1xuK1x0LypcbitcdCAqIFRoZSB0YXJnZXQgb3JkZXIsIGZvciBtYWR2aXNlIG9ubHksIGFuZCBub3RoaW5nIGVsc2UgZW5hYmxlZDogdGhlXG4rXHQgKiBjYXNlcyBmYXVsdCB0aGVpciByZWdpb24gYmVmb3JlIE1BRFZfSFVHRVBBR0UsIHNvIHRoZSBzb3VyY2VzIGFyZVxuK1x0ICogb3JkZXIgMCB3aGF0ZXZlciAtcyBhc2tlZCB0aGUgZmF1bHQgcGF0aCBmb3IuICBUaGF0IG1hdHRlcnMgZm9yIHRoZVxuK1x0ICogY2FzZXMgYnVpbHQgYXJvdW5kIGEgaG9sZSAtLSBhIGxhcmdlIHNvdXJjZSBmb2xpbyB3b3VsZCBmaWxsIGl0IGluXG4rXHQgKiBhbmQgdGhlIHdpbmRvdyB3b3VsZCBjb2xsYXBzZSBhZnRlciBhbGwuXG4rXHQgKiBjb2xsYXBzZV9vcmRlcl9taXhlZF9zb3VyY2VzIGVuYWJsZXMgdGhlIHNvdXJjZSBvcmRlciBpdCB3YW50cyBvblxuK1x0ICogdG9wIG9mIHRoaXMuXG4rXHQgKi9cbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlJfT1JERVJTOyBpKyspXG4rXHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX05FVkVSO1xuK1x0c2V0dGluZ3MuaHVnZXBhZ2VzW2NvbGxhcHNlX29yZGVyXS5lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rfVxuK1xuK3N0YXRpYyBib29sIHdpbmRvd19jb2xsYXBzZWQodm9pZCAqcCwgc2l6ZV90IGxlbilcbit7XG4rXHRyZXR1cm4gaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBsZW4sIGNvbGxhcHNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgICAgcGFnZW1hcF9mZCwga3BhZ2VmbGFnc19mZCk7XG4rfVxuK1xuKy8qIE5vIGFsaWduZWQgd2luZG93IGluIFtwLCBwICsgbGVuKSBpcyBiYWNrZWQgYXQgdGhlIHRhcmdldCBvcmRlci4gKi9cbitzdGF0aWMgYm9vbCB3aW5kb3dfbm90X2NvbGxhcHNlZCh2b2lkICpwLCBzaXplX3QgbGVuKVxuK3tcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHRjaGFyICphZGRyID0gcDtcbitcbitcdGZvciAoOyBsZW4gXHUwMDNlPSB3aW5kb3c7IGFkZHIgKz0gd2luZG93LCBsZW4gLT0gd2luZG93KSB7XG4rXHRcdGlmICh3aW5kb3dfY29sbGFwc2VkKGFkZHIsIHdpbmRvdykpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIGtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3Modm9pZClcbit7XG4rXHQvKiBXYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIHRoZSBwYXNzIHRvIGNvbXBsZXRlLiAqL1xuK1x0cmV0dXJuIGtodWdlcGFnZWRfZnVsbF9wYXNzKDMwKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfc2luZ2xlX3dpbmRvdyhzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c2l6ZV90IHdpbmRvdyA9IG10aHBfd2luZG93X3NpemUoKTtcbitcdHZvaWQgKnA7XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgd2luZG93LCAyICogd2luZG93KTtcbitcdGlmICghd2luZG93X25vdF9jb2xsYXBzZWQocCwgaHBhZ2VfcG1kX3NpemUpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJVbmV4cGVjdGVkIGxhcmdlIGZvbGlvIGFmdGVyIGZhdWx0XFxuXCIpO1xuK1xuK1x0bWFkdmlzZShwLCBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSk7XG4rXHRrc2Z0X3ByaW50X21zZyhcIkNvbGxhcHNlIG9uZSBmdWxseSBwb3B1bGF0ZWQgd2luZG93Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpIFx1MDAyNlx1MDAyNlxuK1x0XHQgd2luZG93X25vdF9jb2xsYXBzZWQocCwgd2luZG93KSBcdTAwMjZcdTAwMjZcbitcdFx0IHdpbmRvd19ub3RfY29sbGFwc2VkKHAgKyAyICogd2luZG93LFxuK1x0XHRcdFx0ICAgICAgaHBhZ2VfcG1kX3NpemUgLSAyICogd2luZG93KSlcbitcdFx0c3VjY2VzcyhcIk9LXCIpO1xuK1x0ZWxzZVxuK1x0XHRmYWlsKFwiRmFpbFwiKTtcbitcbitcdHZhbGlkYXRlX21lbW9yeShwLCB3aW5kb3csIDIgKiB3aW5kb3cpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93KHN0cnVjdCBjb2xsYXBzZV9jb250ZXh0ICpjLFxuK1x0XHRcdFx0XHQgIHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0dm9pZCAqcDtcbitcbitcdG10aHBfcHVzaF90YXJnZXRfb3JkZXIoKTtcbitcbitcdHAgPSBvcHMtXHUwMDNlc2V0dXBfYXJlYSgxKTtcbitcdG9wcy1cdTAwM2VmYXVsdChwLCAwLCBwYWdlX3NpemUpO1xuK1x0aWYgKCF3aW5kb3dfbm90X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlVuZXhwZWN0ZWQgbGFyZ2UgZm9saW8gYWZ0ZXIgZmF1bHRcXG5cIik7XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2Ugd2luZG93IHdpdGggc2luZ2xlIFBURSBlbnRyeSBwcmVzZW50Li4uXCIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBtdGhwX3dpbmRvd19zaXplKCkpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIHBhZ2Vfc2l6ZSk7XG4rXHRvcHMtXHUwMDNlY2xlYW51cF9hcmVhKHAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdGtzZnRfdGVzdF9yZXN1bHRfcmVwb3J0KGV4aXRfc3RhdHVzLCBcIiVzXFxuXCIsIF9fZnVuY19fKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgY29sbGFwc2Vfb3JkZXJfbWF4X3B0ZXNfbm9uZShzdHJ1Y3QgY29sbGFwc2VfY29udGV4dCAqYyxcbitcdFx0XHRcdFx0IHN0cnVjdCBtZW1fb3BzICpvcHMpXG4re1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHNpemVfdCB3aW5kb3cgPSBtdGhwX3dpbmRvd19zaXplKCk7XG4rXHR2b2lkICpwO1xuK1xuK1x0bXRocF9wdXNoX3RhcmdldF9vcmRlcigpO1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmtodWdlcGFnZWQubWF4X3B0ZXNfbm9uZSA9IDA7XG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRwID0gb3BzLVx1MDAzZXNldHVwX2FyZWEoMSk7XG4rXHRvcHMtXHUwMDNlZmF1bHQocCwgMCwgMiAqIHdpbmRvdyAtIHBhZ2Vfc2l6ZSk7XG4rXHRpZiAoIXdpbmRvd19ub3RfY29sbGFwc2VkKHAsIGhwYWdlX3BtZF9zaXplKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiVW5leHBlY3RlZCBsYXJnZSBmb2xpbyBhZnRlciBmYXVsdFxcblwiKTtcbitcbitcdG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpO1xuK1x0a3NmdF9wcmludF9tc2coXCJDb2xsYXBzZSBmdWxsIHdpbmRvdywgbm90IHRoZSBvbmUgbWlzc2luZyBhIHBhZ2UuLi5cIik7XG4rXHRpZiAoIWtodWdlcGFnZWRfd2FpdF9mdWxsX3Bhc3MoKSlcbitcdFx0ZmFpbChcIlRpbWVvdXRcIik7XG4rXHRlbHNlIGlmICh3aW5kb3dfY29sbGFwc2VkKHAsIHdpbmRvdykgXHUwMDI2XHUwMDI2XG4rXHRcdCB3aW5kb3dfbm90X2NvbGxhcHNlZChwICsgd2luZG93LCB3aW5kb3cpKVxuK1x0XHRzdWNjZXNzKFwiT0tcIik7XG4rXHRlbHNlXG4rXHRcdGZhaWwoXCJGYWlsXCIpO1xuK1xuK1x0dmFsaWRhdGVfbWVtb3J5KHAsIDAsIDIgKiB3aW5kb3cgLSBwYWdlX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNvbGxhcHNlX29yZGVyX21peGVkX3NvdXJjZXMoc3RydWN0IGNvbGxhcHNlX2NvbnRleHQgKmMsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgbWVtX29wcyAqb3BzKVxuK3tcbitcdGludCBzb3VyY2Vfb3JkZXIgPSBhbm9uX29yZGVyID8gYW5vbl9vcmRlciA6IE1JTl9NVEhQX09SREVSO1xuK1x0c3RydWN0IHRocF9zZXR0aW5ncyBzZXR0aW5ncztcbitcdHZvaWQgKnA7XG4rXG4rXHQvKiBTb3VyY2VzIG11c3QgYmUgYSBzdXBwb3J0ZWQgbVRIUCBvcmRlciBzdHJpY3RseSBiZWxvdyB0aGUgdGFyZ2V0LiAqL1xuK1x0aWYgKHNvdXJjZV9vcmRlciBcdTAwM2U9IGNvbGxhcHNlX29yZGVyIHx8XG4rXHQgICAgISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBzb3VyY2Vfb3JkZXIpKSkge1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlczogbm8gc291cmNlIG9yZGVyIGJlbG93IHRhcmdldFxcblwiLFxuK1x0XHRcdFx0ICAgICAgX19mdW5jX18pO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtdGhwX3B1c2hfdGFyZ2V0X29yZGVyKCk7XG4rXG4rXHQvKiBGYXVsdCB0aGUgd2hvbGUgcmVnaW9uIGFzIG9yZGVyLUBzb3VyY2Vfb3JkZXIgZm9saW9zLiAqL1xuK1x0c2V0dGluZ3MgPSAqdGhwX2N1cnJlbnRfc2V0dGluZ3MoKTtcbitcdHNldHRpbmdzLmh1Z2VwYWdlc1tzb3VyY2Vfb3JkZXJdLmVuYWJsZWQgPSBUSFBfQUxXQVlTO1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1x0cCA9IG9wcy1cdTAwM2VzZXR1cF9hcmVhKDEpO1xuK1x0b3BzLVx1MDAzZWZhdWx0KHAsIDAsIGhwYWdlX3BtZF9zaXplKTtcbitcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcbitcdC8qXG4rXHQgKiBUaGUgb3JkZXIgaXMgZW5hYmxlZCBhbmQgc3VwcG9ydGVkLCBidXQgdGhlIGFsbG9jYXRvciBjYW4gc3RpbGwgZmFsbFxuK1x0ICogYmFjayB1bmRlciBmcmFnbWVudGF0aW9uLiAgVGhhdCBsZWF2ZXMgbm90aGluZyB0byBjb2xsYXBzZSBmcm9tLFxuK1x0ICogd2hpY2ggaXMgdGhlIG1hY2hpbmUncyBhbnN3ZXIgcmF0aGVyIHRoYW4gYSByZWFzb24gdG8gZW5kIHRoZSBydW4uXG4rXHQgKi9cbitcdGlmICghaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhwLCBocGFnZV9wbWRfc2l6ZSwgc291cmNlX29yZGVyLFxuK1x0XHRcdFx0XHQgICAgIHBhZ2VtYXBfZmQsIGtwYWdlZmxhZ3NfZmQpKSB7XG4rXHRcdGtzZnRfcHJpbnRfbXNnKFwiTm8gb3JkZXItJWQgc291cmNlcyB0byBjb2xsYXBzZS4uLlwiLCBzb3VyY2Vfb3JkZXIpO1xuK1x0XHRza2lwKFwiU2tpcFwiKTtcbitcdFx0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRcdHRocF9wb3Bfc2V0dGluZ3MoKTtcbitcdFx0a3NmdF90ZXN0X3Jlc3VsdF9yZXBvcnQoZXhpdF9zdGF0dXMsIFwiJXNcXG5cIiwgX19mdW5jX18pO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRtYWR2aXNlKHAsIGhwYWdlX3BtZF9zaXplLCBNQURWX0hVR0VQQUdFKTtcbitcdGtzZnRfcHJpbnRfbXNnKFwiQ29sbGFwc2UgcmVnaW9uIGJhY2tlZCBieSBvcmRlci0lZCBzb3VyY2VzLi4uXCIsXG4rXHRcdCAgICAgICBzb3VyY2Vfb3JkZXIpO1xuK1x0aWYgKCFraHVnZXBhZ2VkX3dhaXRfZnVsbF9wYXNzKCkpXG4rXHRcdGZhaWwoXCJUaW1lb3V0XCIpO1xuK1x0ZWxzZSBpZiAod2luZG93X2NvbGxhcHNlZChwLCBocGFnZV9wbWRfc2l6ZSkpXG4rXHRcdHN1Y2Nlc3MoXCJPS1wiKTtcbitcdGVsc2VcbitcdFx0ZmFpbChcIkZhaWxcIik7XG4rXG4rXHR2YWxpZGF0ZV9tZW1vcnkocCwgMCwgaHBhZ2VfcG1kX3NpemUpO1xuK1x0b3BzLVx1MDAzZWNsZWFudXBfYXJlYShwLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRrc2Z0X3Rlc3RfcmVzdWx0X3JlcG9ydChleGl0X3N0YXR1cywgXCIlc1xcblwiLCBfX2Z1bmNfXyk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpXG4ge1xuIFx0ZnByaW50ZihzdGRlcnIsIFwiXFxuVXNhZ2U6IC4va2h1Z2VwYWdlZCBbT1BUSU9OU10gXHUwMDNjdGVzdCB0eXBlXHUwMDNlIFtkaXJdXFxuXFxuXCIpO1xuQEAgLTExOTIsMTEgKzE1NTMsMTUgQEAgc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbiBcdGZwcmludGYoc3RkZXJyLFx0XCJcXHRcXHQtczogbVRIUCBzaXplLCBleHByZXNzZWQgYXMgcGFnZSBvcmRlci5cXG5cIik7XG4gXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIERlZmF1bHRzIHRvIDAuIFVzZSB0aGlzIHNpemUgZm9yIGFub24gb3Igc2htZW0gYWxsb2NhdGlvbnMuXFxuXCIpO1xuIFx0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdC1jOiBjb2xsYXBzZSBvcmRlciBmb3IgbVRIUCBjb2xsYXBzZSwgZXhwcmVzc2VkIGFzIHBhZ2Ugb3JkZXIuXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBEZWZhdWx0cyB0byBldmVyeSBzdXBwb3J0ZWQgb3JkZXIgYmVsb3cgdGhlIFBNRC5cXG5cIik7XG4rXHRmcHJpbnRmKHN0ZGVycixcdFwiXFx0XFx0ICAgIFdpdGggLXMsIC1zIG5hbWVzIHRoZSBtVEhQIHNvdXJjZSBvcmRlciBmb3IgdGhlXFxuXCIpO1xuK1x0ZnByaW50ZihzdGRlcnIsXHRcIlxcdFxcdCAgICBtaXhlZC1zb3VyY2UgY2FzZSAoc291cmNlIG9yZGVyIGJlbG93IHRoZSB0YXJnZXQpLlxcblwiKTtcbiBcdGV4aXQoMSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4ge1xuK1x0Ym9vbCBtdGhwX2NvbnRleHRfaW1wbGllZCA9IGZhbHNlO1xuIFx0aW50IG9wdDtcbiBcdGNoYXIgKmJ1ZjtcbiBcdGNvbnN0IGNoYXIgKnRva2VuO1xuQEAgLTEyMDgsNiArMTU3Myw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ2MnOlxuIFx0XHRcdGNvbGxhcHNlX29yZGVyID0gYXRvaShvcHRhcmcpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyX2dpdmVuID0gdHJ1ZTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnaCc6XG4gXHRcdGRlZmF1bHQ6XG5AQCAtMTIxNSwxMiArMTU4MSwyNSBAQCBzdGF0aWMgdm9pZCBwYXJzZV90ZXN0X3R5cGUoaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFx0XHR9XG4gXHR9XG4gXG4rXHQvKlxuK1x0ICogQm90aCBvcmRlcnMgZW5kIHVwIGFzIGFycmF5IGluZGljZXMgYW5kIHNoaWZ0IGNvdW50cywgc28gbmVpdGhlclxuK1x0ICogY2FuIGJlIG5lZ2F0aXZlLCBhbmQgYSB6ZXJvIGNvbGxhcHNlIG9yZGVyIGFza3MgZm9yIGJhc2UgcGFnZXMuXG4rXHQgKi9cbitcdGlmIChhbm9uX29yZGVyIFx1MDAzYyAwIHx8IGFub25fb3JkZXIgXHUwMDNlIGhwYWdlX3BtZF9vcmRlcilcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiLXMgdGFrZXMgYW4gb3JkZXIgaW4gMC4uJWQsIG5vdCAlZFxcblwiLFxuK1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyLCBhbm9uX29yZGVyKTtcbitcdGlmIChjb2xsYXBzZV9vcmRlcl9naXZlbiBcdTAwMjZcdTAwMjZcbitcdCAgICAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSAwIHx8IGNvbGxhcHNlX29yZGVyIFx1MDAzZT0gaHBhZ2VfcG1kX29yZGVyKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiLWMgdGFrZXMgYW4gb3JkZXIgaW4gMS4uJWQsIG5vdCAlZFxcblwiLFxuK1x0XHRcdFx0ICAgaHBhZ2VfcG1kX29yZGVyIC0gMSwgY29sbGFwc2Vfb3JkZXIpO1xuK1xuIFx0YXJndiArPSBvcHRpbmQ7XG4gXHRhcmdjIC09IG9wdGluZDtcbiBcbiBcdGlmIChhcmdjID09IDApIHtcbi1cdFx0LyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi9cbitcdFx0LyogRXZlcnl0aGluZyB0aGF0IG5lZWRzIG5vIGFyZ3VtZW50IG9mIGl0cyBvd246IGFub24sIGV2ZXJ5IGNvbnRleHQgKi9cbiBcdFx0a2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fa2h1Z2VwYWdlZF9jb250ZXh0O1xuK1x0XHRtdGhwX2todWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX210aHBfa2h1Z2VwYWdlZF9jb250ZXh0O1xuIFx0XHRtYWR2aXNlX2NvbnRleHQgPSAgXHUwMDI2X19tYWR2aXNlX2NvbnRleHQ7XG4gXHRcdGFub25fb3BzID0gXHUwMDI2X19hbm9uX29wcztcbiBcdFx0cmV0dXJuO1xuQEAgLTEyMzEsMTMgKzE2MTAsMTkgQEAgc3RhdGljIHZvaWQgcGFyc2VfdGVzdF90eXBlKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcbiBcdGlmICghc3RyY21wKHRva2VuLCBcImFsbFwiKSkge1xuIFx0XHRraHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19raHVnZXBhZ2VkX2NvbnRleHQ7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gIFx1MDAyNl9fbXRocF9raHVnZXBhZ2VkX2NvbnRleHQ7XG4gXHRcdG1hZHZpc2VfY29udGV4dCA9ICBcdTAwMjZfX21hZHZpc2VfY29udGV4dDtcbitcbitcdFx0LypcbitcdFx0ICogXCJhbGxcIiBzd2VlcHMgdGhlIG1USFAgY29udGV4dCBpbiwgYnV0IGl0IG9ubHkgaGFzIGFub25cbitcdFx0ICogY2FzZXM6IHN0ZXAgaXQgYXNpZGUgZm9yIHRoZSBvdGhlciBtZW1fdHlwZXMgcmF0aGVyIHRoYW5cbitcdFx0ICogcmVmdXNpbmcgdGhlIHdob2xlIHJ1bi5cbitcdFx0ICovXG4rXHRcdG10aHBfY29udGV4dF9pbXBsaWVkID0gdHJ1ZTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJraHVnZXBhZ2VkXCIpKSB7XG4gXHRcdGtodWdlcGFnZWRfY29udGV4dCA9ICBcdTAwMjZfX2todWdlcGFnZWRfY29udGV4dDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcCh0b2tlbiwgXCJtdGhwX2todWdlcGFnZWRcIikpIHtcbiBcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSAgXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dDtcbi1cdFx0aWYgKGNvbGxhcHNlX29yZGVyIFx1MDAzYz0gMCB8fCBjb2xsYXBzZV9vcmRlciBcdTAwM2U9IGhwYWdlX3BtZF9vcmRlcilcbi1cdFx0XHR1c2FnZSgpO1xuIFx0fSBlbHNlIGlmICghc3RyY21wKHRva2VuLCBcIm1hZHZpc2VcIikpIHtcbiBcdFx0bWFkdmlzZV9jb250ZXh0ID0gIFx1MDAyNl9fbWFkdmlzZV9jb250ZXh0O1xuIFx0fSBlbHNlIHtcbkBAIC0xMjUzLDIwICsxNjM4LDIwIEBAIHN0YXRpYyB2b2lkIHBhcnNlX3Rlc3RfdHlwZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHRcdHNobWVtX29wcyA9IFx1MDAyNl9fc2htZW1fb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4tXHRcdFx0dXNhZ2UoKTtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwiYW5vblwiKSkge1xuIFx0XHRhbm9uX29wcyA9IFx1MDAyNl9fYW5vbl9vcHM7XG4gXHR9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCBcImZpbGVcIikpIHtcbiBcdFx0cmVhZF9vbmx5X2ZpbGVfb3BzID0gIFx1MDAyNl9fcmVhZF9vbmx5X2ZpbGVfb3BzO1xuIFx0XHRyZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHM7XG4gXHRcdHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMgPSAgXHUwMDI2X19yZWFkX3dyaXRlX2ZpbGVfd3JpdGVfb3BzO1xuLVx0XHRpZiAobXRocF9raHVnZXBhZ2VkX2NvbnRleHQpXG4rXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCBcdTAwMjZcdTAwMjYgIW10aHBfY29udGV4dF9pbXBsaWVkKVxuIFx0XHRcdHVzYWdlKCk7XG4rXHRcdG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0ID0gTlVMTDtcbiBcdH0gZWxzZSBpZiAoIXN0cmNtcChidWYsIFwic2htZW1cIikpIHtcbiBcdFx0c2htZW1fb3BzID0gXHUwMDI2X19zaG1lbV9vcHM7XG4tXHRcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dClcbitcdFx0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0IFx1MDAyNlx1MDAyNiAhbXRocF9jb250ZXh0X2ltcGxpZWQpXG4gXHRcdFx0dXNhZ2UoKTtcbitcdFx0bXRocF9raHVnZXBhZ2VkX2NvbnRleHQgPSBOVUxMO1xuIFx0fSBlbHNlIHtcbiBcdFx0dXNhZ2UoKTtcbiBcdH1cbkBAIC0xMjg4LDkgKzE2NzMsMTAgQEAgc3RydWN0IHRlc3RfY2FzZSB7XG4gXHRzdHJ1Y3QgbWVtX29wcyAqb3BzO1xuIFx0Y29uc3QgY2hhciAqZGVzYztcbiBcdHRlc3RfZm4gZm47XG4rXHRpbnQgb3JkZXI7XHRcdC8qIG1USFAgY29udGV4dHM6IHRoZSBjb2xsYXBzZSBvcmRlciAqL1xuIH07XG4gXG4tI2RlZmluZSBNQVhfVEVTVF9DQVNFUyA2NFxuKyNkZWZpbmUgTUFYX1RFU1RfQ0FTRVMgMjU2XG4gc3RhdGljIHN0cnVjdCB0ZXN0X2Nhc2UgdGVzdF9jYXNlc1tNQVhfVEVTVF9DQVNFU107XG4gc3RhdGljIGludCBucl90ZXN0X2Nhc2VzO1xuIFxuQEAgLTEzMDMsNiArMTY4OSw3IEBAIHN0YXRpYyBpbnQgbnJfdGVzdF9jYXNlcztcbiBcdFx0XHQub3BzXHQ9IG8sXHRcdFx0XHRcdFxcXG4gXHRcdFx0LmRlc2NcdD0gI3QsXHRcdFx0XHRcdFxcXG4gXHRcdFx0LmZuXHQ9IHQsXHRcdFx0XHRcdFxcXG4rXHRcdFx0Lm9yZGVyXHQ9IGNvbGxhcHNlX29yZGVyLFx0XHRcdFxcXG4gXHRcdH07XHRcdFx0XHRcdFx0XHRcXFxuIFx0fVx0XHRcdFx0XHRcdFx0XHRcXFxuIFx0fSB3aGlsZSAoMClcbkBAIC0xMzQzLDggKzE3MzAsNzMgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuIFxuIFx0cGFyc2VfdGVzdF90eXBlKGFyZ2MsIGFyZ3YpO1xuIFxuK1x0aWYgKG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgb3JkZXJzID0gdGhwX3N1cHBvcnRlZF9vcmRlcnMoKTtcbitcbitcdFx0aWYgKGNvbGxhcHNlX29yZGVyX2dpdmVuKSB7XG4rXHRcdFx0LyogLWMgcGlucyBvbmUgb3JkZXI7IGl0IGhhcyB0byBiZSBvbmUgd2UgY2FuIGJ1aWxkICovXG4rXHRcdFx0aWYgKCEob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBjb2xsYXBzZV9vcmRlcikpKVxuK1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGNvbGxhcHNlX29yZGVyKTtcbitcdFx0XHRpZiAoY29sbGFwc2Vfb3JkZXIgXHUwMDNjPSBhbm9uX29yZGVyKVxuK1x0XHRcdFx0a3NmdF9leGl0X3NraXAoXCItYyAlZCBuZWVkcyBhIHNvdXJjZSBvcmRlciBiZWxvdyBpdCwgLXMgc2F5cyAlZFxcblwiLFxuK1x0XHRcdFx0XHQgICAgICAgY29sbGFwc2Vfb3JkZXIsIGFub25fb3JkZXIpO1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyc1tucl9jb2xsYXBzZV9vcmRlcnMrK10gPSBjb2xsYXBzZV9vcmRlcjtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIE90aGVyd2lzZSBldmVyeSBvcmRlciBhIGNvbGxhcHNlIGNvdWxkIHByb2R1Y2UuICAtc1xuK1x0XHRcdCAqIG1ha2VzIHRoZSBmYXVsdCBwYXRoIGhhbmQgb3V0IGZvbGlvcyBvZiB0aGF0IG9yZGVyLFxuK1x0XHRcdCAqIHNvIGEgdGFyZ2V0IGF0IG9yIGJlbG93IGl0IGhhcyBub3RoaW5nIHRvIGNvbGxhcHNlOlxuK1x0XHRcdCAqIHRoZSBzb3VyY2VzIGFyZSBhbHJlYWR5IHRoZSBzaXplIGJlaW5nIGFza2VkIGZvci5cbitcdFx0XHQgKi9cbitcdFx0XHRpbnQgZmlyc3QgPSBhbm9uX29yZGVyICsgMTtcbitcbitcdFx0XHRpZiAoZmlyc3QgXHUwMDNjIE1JTl9NVEhQX09SREVSKVxuK1x0XHRcdFx0Zmlyc3QgPSBNSU5fTVRIUF9PUkRFUjtcbitcdFx0XHRmb3IgKGludCBpID0gZmlyc3Q7IGkgXHUwMDNjIGhwYWdlX3BtZF9vcmRlcjsgaSsrKSB7XG4rXHRcdFx0XHRpZiAob3JkZXJzIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdFx0Y29sbGFwc2Vfb3JkZXJzW25yX2NvbGxhcHNlX29yZGVycysrXSA9IGk7XG4rXHRcdFx0fVxuK1x0XHRcdGlmICghbnJfY29sbGFwc2Vfb3JkZXJzKVxuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJtVEhQIGNhc2VzIHNraXBwZWQ6IG5vIG9yZGVyIGFib3ZlIHRoZSBzb3VyY2VcXG5cIik7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRwYWdlbWFwX2ZkID0gb3BlbihcIi9wcm9jL3NlbGYvcGFnZW1hcFwiLCBPX1JET05MWSk7XG4rXHRcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm9wZW4oL3Byb2Mvc2VsZi9wYWdlbWFwKVwiKTtcbitcdFx0a3BhZ2VmbGFnc19mZCA9IG9wZW4oXCIvcHJvYy9rcGFnZWZsYWdzXCIsIE9fUkRPTkxZKTtcbitcdFx0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwib3BlbigvcHJvYy9rcGFnZWZsYWdzKVwiKTtcbitcdH1cbitcbiBcdHNldGJ1ZihzdGRvdXQsIE5VTEwpO1xuIFxuK1x0LypcbitcdCAqIFRoZSBwYWdlIGNhY2hlIGNhcHMgZm9saW8gb3JkZXIgYXQgTUFYX1BBR0VDQUNIRV9PUkRFUiwgd2hpY2ggaXNcbitcdCAqIGJlbG93IHRoZSBQTUQgb3JkZXIgb24gYXJtNjQgd2l0aCA2NEsgcGFnZXMuICBBIFBNRC1zaXplZCBwYWdlIGNhY2hlXG4rXHQgKiBmb2xpbyBpcyBpbXBvc3NpYmxlIHRoZXJlLCBzbyB0aGUga2VybmVsIHJlZnVzZXMgdGhlc2UgY29sbGFwc2VzIGJ5XG4rXHQgKiBkZXNpZ24gYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gdGVzdC4gIFRoZSBjYXAgaXMgbm90IHNobWVtLXNwZWNpZmljOlxuK1x0ICogaXQgcnVsZXMgb3V0IHJlZ3VsYXIgZmlsZXMgdG9vLCBhbmQgdGhlIHBlci1vcmRlciBzaG1lbV9lbmFibGVkXG4rXHQgKiBjb250cm9scyBleGlzdCBmb3IgZXhhY3RseSB0aGUgb3JkZXJzIGl0IGFsbG93cywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuK1x0ICogdGhlbSByZWFkYWJsZSBoZXJlLlxuK1x0ICovXG4rXHRpZiAoISh0aHBfc2htZW1fc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBocGFnZV9wbWRfb3JkZXIpKSkge1xuK1x0XHRpZiAoc2htZW1fb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgc2htZW1cXG5cIik7XG4rXHRcdFx0c2htZW1fb3BzID0gTlVMTDtcbitcdFx0fVxuK1x0XHRpZiAocmVhZF9vbmx5X2ZpbGVfb3BzKSB7XG4rXHRcdFx0a3NmdF9wcmludF9tc2coXCJubyBQTUQtb3JkZXIgcGFnZSBjYWNoZSBmb2xpbzogc2tpcHBpbmcgZmlsZVxcblwiKTtcbitcdFx0XHRyZWFkX29ubHlfZmlsZV9vcHMgPSBOVUxMO1xuK1x0XHRcdHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyA9IE5VTEw7XG4rXHRcdFx0cmVhZF93cml0ZV9maWxlX3dyaXRlX29wcyA9IE5VTEw7XG4rXHRcdH1cbitcdFx0aWYgKCFhbm9uX29wcyBcdTAwMjZcdTAwMjYgIXNobWVtX29wcyBcdTAwMjZcdTAwMjYgIXJlYWRfb25seV9maWxlX29wcylcbitcdFx0XHRrc2Z0X2V4aXRfc2tpcChcIk5vdGhpbmcgbGVmdCB0byBjb2xsYXBzZSBpbnRvXFxuXCIpO1xuK1x0fVxuK1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX25vbmUgPSBocGFnZV9wbWRfbnIgLSAxO1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3N3YXAgPSBocGFnZV9wbWRfbnIgLyA4O1xuIFx0ZGVmYXVsdF9zZXR0aW5ncy5raHVnZXBhZ2VkLm1heF9wdGVzX3NoYXJlZCA9IGhwYWdlX3BtZF9uciAvIDI7XG5AQCAtMTM2Miw3ICsxODE0LDE3IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV93cml0ZV9vcHMpO1xuIFx0VEVTVChjb2xsYXBzZV9mdWxsLCBraHVnZXBhZ2VkX2NvbnRleHQsIHNobWVtX29wcyk7XG4tXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2MgbnJfY29sbGFwc2Vfb3JkZXJzOyBpKyspIHtcbitcdFx0Y29sbGFwc2Vfb3JkZXIgPSBjb2xsYXBzZV9vcmRlcnNbaV07XG4rXHRcdFRFU1QoY29sbGFwc2VfZnVsbCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdFx0VEVTVChjb2xsYXBzZV9vcmRlcl9zaW5nbGVfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX3BhcnRpYWxfd2luZG93LCBtdGhwX2todWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuK1x0XHRURVNUKGNvbGxhcHNlX29yZGVyX21heF9wdGVzX25vbmUsIG10aHBfa2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRcdFRFU1QoY29sbGFwc2Vfb3JkZXJfbWl4ZWRfc291cmNlcywgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbitcdH1cbitcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZnVsbCwgbWFkdmlzZV9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTEzNzAsMTEgKzE4MzIsOCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpXG4gXHRURVNUKGNvbGxhcHNlX2Z1bGwsIG1hZHZpc2VfY29udGV4dCwgc2htZW1fb3BzKTtcbiBcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIGtodWdlcGFnZWRfY29udGV4dCwgYW5vbl9vcHMpO1xuLVx0VEVTVChjb2xsYXBzZV9lbXB0eSwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfZW1wdHksIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFxuLVx0VEVTVChjb2xsYXBzZV9zaW5nbGVfbXRocCwgbXRocF9raHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbi1cbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4gXHRURVNUKGNvbGxhcHNlX3NpbmdsZV9wdGVfZW50cnksIGtodWdlcGFnZWRfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QoY29sbGFwc2Vfc2luZ2xlX3B0ZV9lbnRyeSwga2h1Z2VwYWdlZF9jb250ZXh0LCByZWFkX3dyaXRlX2ZpbGVfcmVhZF9vcHMpO1xuQEAgLTE0MjksNiArMTg4OCw5IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBraHVnZXBhZ2VkX2NvbnRleHQsIGFub25fb3BzKTtcbiBcdFRFU1QoY29sbGFwc2VfbWF4X3B0ZXNfc2hhcmVkLCBtYWR2aXNlX2NvbnRleHQsIGFub25fb3BzKTtcbiBcbitcdFRFU1QoY29sbGFwc2VfZm9ya19jb3dfcmFjZSwga2h1Z2VwYWdlZF9jb250ZXh0LCBhbm9uX29wcyk7XG4rXHRURVNUKGNvbGxhcHNlX2ZvcmtfY293X3JhY2UsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuK1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgYW5vbl9vcHMpO1xuIFx0VEVTVChtYWR2aXNlX2NvbGxhcHNlX2V4aXN0aW5nX3RocHMsIG1hZHZpc2VfY29udGV4dCwgcmVhZF9vbmx5X2ZpbGVfb3BzKTtcbiBcdFRFU1QobWFkdmlzZV9jb2xsYXBzZV9leGlzdGluZ190aHBzLCBtYWR2aXNlX2NvbnRleHQsIHJlYWRfd3JpdGVfZmlsZV9yZWFkX29wcyk7XG5AQCAtMTQ0NCw3ICsxOTA2LDE1IEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndilcbiBcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyBucl90ZXN0X2Nhc2VzOyBpKyspIHtcbiBcdFx0c3RydWN0IHRlc3RfY2FzZSAqdCA9IFx1MDAyNnRlc3RfY2FzZXNbaV07XG4gXG4tXHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsIHQtXHUwMDNlY3R4LVx1MDAzZW5hbWUsIHQtXHUwMDNlb3BzLVx1MDAzZW5hbWUpO1xuK1x0XHRpZiAodC1cdTAwM2VjdHggPT0gXHUwMDI2X19tdGhwX2todWdlcGFnZWRfY29udGV4dCkge1xuK1x0XHRcdGNvbGxhcHNlX29yZGVyID0gdC1cdTAwM2VvcmRlcjtcbitcdFx0XHRrc2Z0X3ByaW50X21zZyhcIlxcbiMgUnVuIHRlc3Q6ICVzICglczolcywgb3JkZXIgJWQpXFxuXCIsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VkZXNjLCB0LVx1MDAzZWN0eC1cdTAwM2VuYW1lLCB0LVx1MDAzZW9wcy1cdTAwM2VuYW1lLFxuK1x0XHRcdFx0ICAgICAgIHQtXHUwMDNlb3JkZXIpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtzZnRfcHJpbnRfbXNnKFwiXFxuIyBSdW4gdGVzdDogJXMgKCVzOiVzKVxcblwiLCB0LVx1MDAzZWRlc2MsXG4rXHRcdFx0XHQgICAgICAgdC1cdTAwM2VjdHgtXHUwMDNlbmFtZSwgdC1cdTAwM2VvcHMtXHUwMDNlbmFtZSk7XG4rXHRcdH1cbiBcdFx0dC1cdTAwM2Vmbih0LVx1MDAzZWN0eCwgdC1cdTAwM2VvcHMpO1xuIFx0fVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfcmFjZS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9yYWNlLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NjgyYmJhZTBhOGY4XG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3JhY2UuY1xuQEAgLTAsMCArMSw1ODkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICoga2h1Z2VwYWdlZCByYWNlIGhhcm5lc3MuXG4rICpcbisgKiBSdW5zIGNvbGxhcHNlIGFnYWluc3QgY29uY3VycmVudCBmYXVsdHMsIHRyYW5zaWVudCBHVVAgcGluc1xuKyAqIChndXBfdGVzdCksIGZvcmssIG1yZW1hcCBhbmQgTUFEVl9ET05UTkVFRCBvdmVyIHRoZSBzYW1lIHJhbmdlcywgaW5cbisgKiBvbmUgb2YgdGhyZWUgZHJpdmVyIG1vZGVzOlxuKyAqXG4rICogICBzdGVwcGVkXHRraHVnZXBhZ2VkLCBvbmUgZnVsbCBwYXNzIGF0IGEgdGltZSB0aHJvdWdoXG4rICpcdFx0a2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSwgc28gYSBzdGVwIGNvdmVycyBhIGtub3duIGV4dGVudDtcbisgKiAgIGZyZWVcdGtodWdlcGFnZWQgbGVmdCB0byBydW4gKHNjYW5fc2xlZXBfbWlsbGlzZWNzPTApLCBmb3Igc29haztcbisgKiAgIG1hZHZpc2VcdE1BRFZfQ09MTEFQU0UgYW5kIE1BRFZfRE9OVE5FRUQgaW4gYSBsb29wLlxuKyAqXG4rICogQWxsIGFub24gVEhQIG9yZGVycyBhcmUgZW5hYmxlZCAoaW5oZXJpdCkuICBPY2N1cGFuY3kgcnVucyBhdCBib3RoIGVuZHNcbisgKiBvZiB3aGF0IG1USFAgY29sbGFwc2Ugc3VwcG9ydHM6IG1heF9wdGVzX25vbmUgMCwgd2hlcmUgYSB3aW5kb3cgbXVzdCBiZVxuKyAqIGZ1bGx5IHBvcHVsYXRlZCwgYW5kIEhQQUdFX1BNRF9OUiAtIDEsIHdoZXJlIGEgd2luZG93IGZ1bGwgb2YgaG9sZXNcbisgKiBjb2xsYXBzZXMgdG9vLiAgQSBob2xlIGlzIHplcm8tZmlsbGVkIGludG8gdGhlIG5ldyBmb2xpbyByYXRoZXIgdGhhblxuKyAqIGNvcGllZCwgYW5kIHRoZSByYWNpbmcgTUFEVl9ET05UTkVFRCBrZWVwcyBtb3Zpbmcgd2hpY2ggc2xvdHMgYXJlIGhvbGVzLlxuKyAqXG4rICogRXZlcnkgY29tYmluYXRpb24gYWxzbyBydW5zIHVuZGVyIG1lbW9yeSBwcmVzc3VyZTogTUFEVl9QQUdFT1VUIGN5Y2xpbmdcbisgKiBvbiBhIGRlZGljYXRlZCBuZWlnaGJvdXIgcmVnaW9uIChzd2FwIHRyYWZmaWMgYW5kIExSVSBjaHVybjsgbGVmdCBvdXRcbisgKiB3aXRoIGEgbm90ZSB3aGVuIHRoZSBob3N0IGhhcyBubyBzd2FwKSBhbmQgYSBjb21wYWN0X21lbW9yeSB0cmlnZ2VyXG4rICogbG9vcCAoY29tcGFjdGlvbiBtaWdyYXRlcyBzb3VyY2UgZm9saW9zLCByYWNpbmcgY29sbGFwc2UncyBmcmVlemVcbisgKiB3aXRoIHJlZmNvdW50IGVsZXZhdGlvbiBhbmQgbWlncmF0aW9uIGVudHJpZXMgb2YgaXRzIG93bikuXG4rICpcbisgKiBDb3JyZWN0bmVzcyBzaWduYWxzOiBldmVyeSByYWNpbmcgcGFnZSBtdXN0IHJlYWQgYXMgaXRzIHBhdHRlcm4gb3JcbisgKiB6ZXJvIChNQURWX0RPTlRORUVEKSwgbmV2ZXIgYW55dGhpbmcgZWxzZS4gIFRoZSBmYXVsdGVycyBhbmQgdGhlIGZvcmtcbisgKiBjaGlsZHJlbiBjaGVjayB0aGF0IGNvbnRpbnVvdXNseSwgYSBmaW5hbCBzd2VlcCBjaGVja3MgaXQgb25jZSBtb3JlLCBwbHVzXG4rICogd2hhdGV2ZXIgREVCVUdfVk0gLyBwYWdlX3RhYmxlX2NoZWNrIC8gS0FTQU4gLyBsb2NrZGVwIHJlcG9ydCBpblxuKyAqIGRtZXNnLCB3aGljaCB0aGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGluc3BlY3QuXG4rICovXG4rI2RlZmluZSBfR05VX1NPVVJDRVxuKyNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NmY250bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjcHRocmVhZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvaW9jdGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvdGltZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rI2luY2x1ZGUgXCIuLi8uLi8uLi8uLi9tbS9ndXBfdGVzdC5oXCJcbitcbisjZGVmaW5lIEJBU0VfQUREUlx0KCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuK1xuKy8qXG4rICogU2hhcmVkIHBsYXlncm91bmQgZm9yIGZhdWx0cy9waW5zL2ZvcmsvZG9udG5lZWQ6IHNldmVyYWwgUE1ELXNpemVkXG4rICogYXJlYXMgdGhlIHJhY2luZyB0aHJlYWRzIHNwcmVhZCBhY3Jvc3MsIHBsdXMgb25lIGFyZWEgb3duZWQgYnkgdGhlXG4rICogbXJlbWFwIHRocmVhZC4gTW9yZSBhcmVhcyBtZWFucyBtb3JlIGluZGVwZW5kZW50IHJlZ2lvbnMgY29sbGFwc2luZ1xuKyAqIGF0IG9uY2U7IHRoZSBkZWZhdWx0IHN1aXRzIGEgbm9ybWFsIG1hY2hpbmUuIE9uIGEgbWVtb3J5LWNvbnN0cmFpbmVkXG4rICogaG9zdCAtLSBvciB1bmRlciBlbXVsYXRpb24sIHdoZXJlIGEgNTEyTSBQTUQgKGFybTY0LzY0SykgbWFrZXMgdGhlXG4rICogZGVmYXVsdCBwbGF5Z3JvdW5kIG11bHRpLWdpZ2FieXRlIC0tIHBhc3MgLWEgdG8gc2hyaW5rIGl0LlxuKyAqL1xuKyNkZWZpbmUgREVGQVVMVF9TSEFSRURfQVJFQVNcdDNcbitzdGF0aWMgaW50IG5yX3NoYXJlZF9hcmVhcztcbitzdGF0aWMgaW50IG5yX2FyZWFzO1xuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwYWdlX3BtZF9zaXplO1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTtcbitzdGF0aWMgY2hhciAqcmVnaW9uO1x0XHQvKiBOUl9BUkVBUyAqIGhwYWdlX3BtZF9zaXplICovXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9hcmVhO1x0LyogcmVnaW9uICsgTlJfU0hBUkVEX0FSRUFTIGFyZWFzICovXG4rc3RhdGljIGNoYXIgKm1yZW1hcF9zY3JhdGNoO1x0Lyogd2VsbCBhYm92ZSB0aGUgcmVnaW9uICovXG4rc3RhdGljIGNoYXIgKnBhZ2VvdXRfYXJlYTtcdC8qIGRlZGljYXRlZCBwcmVzc3VyZSByZWdpb24gKi9cbitzdGF0aWMgc2l6ZV90IHBhZ2VvdXRfc2l6ZTtcbitzdGF0aWMgaW50IGd1cF9mZCA9IC0xO1xuK3N0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcDtcbitzdGF0aWMgdm9sYXRpbGUgaW50IGNvcnJ1cHRlZDtcbitcbitzdGF0aWMgdW5zaWduZWQgaW50IHBhdHRlcm4odW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgdmFsID0gKHVuc2lnbmVkIGludClwYWdlX2lkeCAqIDI2NTQ0MzU3NjFVO1xuK1xuK1x0cmV0dXJuIHZhbCA/IHZhbCA6IDE7XHQvKiBuZXZlciBjb2xsaWRlcyB3aXRoIHRoZSB6ZXJvLWZpbGwgKi9cbit9XG4rXG4rLyogWmVybyBtZWFucyBuZXZlciB3cml0dGVuOyBhbnl0aGluZyBlbHNlIG11c3QgYmUgdGhpcyBwYWdlJ3MgcGF0dGVybiAqL1xuK3N0YXRpYyBib29sIHBhZ2VfaXNfY29ycnVwdCh1bnNpZ25lZCBsb25nIHBhZ2VfaWR4LCB1bnNpZ25lZCBpbnQgKnZhbClcbit7XG4rXHQqdmFsID0gKih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpO1xuK1xuK1x0cmV0dXJuICp2YWwgXHUwMDI2XHUwMDI2ICp2YWwgIT0gcGF0dGVybihwYWdlX2lkeCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGNoZWNrX3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlX2lkeClcbit7XG4rXHR1bnNpZ25lZCBpbnQgdmFsO1xuK1xuK1x0aWYgKHBhZ2VfaXNfY29ycnVwdChwYWdlX2lkeCwgXHUwMDI2dmFsKSkge1xuK1x0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRrc2Z0X3ByaW50X21zZyhcIkNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHQgICAgICAgcGFnZV9pZHgsIHZhbCwgcGF0dGVybihwYWdlX2lkeCkpO1xuK1x0fVxuK31cbitcbitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaGFyZWRfcGFnZXModm9pZClcbit7XG4rXHRyZXR1cm4gbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRfcGFnZSh1bnNpZ25lZCBpbnQgKnNlZWQpXG4re1xuK1x0cmV0dXJuICh1bnNpZ25lZCBsb25nKXJhbmRfcihzZWVkKSAlIHNoYXJlZF9wYWdlcygpO1xuK31cbitcbisvKiBQYWdlcyBsZWZ0IGZyb20gQHBhZ2VfaWR4LCBzbyBhIHJhbmdlIG5ldmVyIHJlYWNoZXMgdGhlIG1yZW1hcCB0aHJlYWQncyBhcmVhICovXG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgcm9vbV9mcm9tKHVuc2lnbmVkIGxvbmcgcGFnZV9pZHgsIHVuc2lnbmVkIGxvbmcgd2FudClcbit7XG4rXHR1bnNpZ25lZCBsb25nIGxlZnQgPSBzaGFyZWRfcGFnZXMoKSAtIHBhZ2VfaWR4O1xuK1xuK1x0cmV0dXJuIHdhbnQgXHUwMDNjIGxlZnQgPyB3YW50IDogbGVmdDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZhdWx0ZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGFnZV9pZHggPSByYW5kX3BhZ2UoXHUwMDI2c2VlZCk7XG4rXG4rXHRcdGlmIChyYW5kX3IoXHUwMDI2c2VlZCkgXHUwMDI2IDEpXG4rXHRcdFx0Kih1bnNpZ25lZCBpbnQgKikocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUpID1cbitcdFx0XHRcdHBhdHRlcm4ocGFnZV9pZHgpO1xuK1x0XHRlbHNlXG4rXHRcdFx0Y2hlY2tfcGFnZShwYWdlX2lkeCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmRvbnRuZWVkX2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcbitcdHdoaWxlICghc3RvcCkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHBhZ2VfaWR4ID0gcmFuZF9wYWdlKFx1MDAyNnNlZWQpO1xuK1x0XHR1bnNpZ25lZCBsb25nIG5yID0gMVVMIFx1MDAzY1x1MDAzYyAocmFuZF9yKFx1MDAyNnNlZWQpICUgNik7XHQvKiAxLi4zMiBwYWdlcyAqL1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBPbmNlIGluIGEgd2hpbGUgemFwIGEgd2hvbGUgUE1ELWFsaWduZWQgYXJlYTogb25seSBhIHphcFxuK1x0XHQgKiBzcGFubmluZyB0aGUgZnVsbCB0YWJsZSB0cmlnZ2VycyB0aGUgZW1wdHktdGFibGUgcmVjbGFpbVxuK1x0XHQgKiAoQ09ORklHX1BUX1JFQ0xBSU0pLCB3aGljaCBjYW4gZnJlZSB0aGUgdGFibGUgdW5kZXIgYVxuK1x0XHQgKiBjb2xsYXBzZSB0aGF0IGlzIG1pZHdheSB0aHJvdWdoIGl0LiAgU3ViLXRhYmxlIHphcHMgbmV2ZXJcbitcdFx0ICogcmVhY2ggdGhhdCBwYXRoLlxuK1x0XHQgKi9cbitcdFx0aWYgKCEocmFuZF9yKFx1MDAyNnNlZWQpICUgNjQpKSB7XG4rXHRcdFx0dW5zaWduZWQgbG9uZyBhcmVhID0gcGFnZV9pZHggL1xuK1x0XHRcdFx0XHQoaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemUpO1xuK1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgYXJlYSAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdFx0aHBhZ2VfcG1kX3NpemUsIE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdG1hZHZpc2UocmVnaW9uICsgcGFnZV9pZHggKiBwYWdlX3NpemUsXG4rXHRcdFx0XHRyb29tX2Zyb20ocGFnZV9pZHgsIG5yKSAqIHBhZ2Vfc2l6ZSxcbitcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSA1MDApO1xuK1x0fVxuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpwaW5uZXJfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1xuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdHN0cnVjdCBndXBfdGVzdCBndXAgPSB7fTtcbitcdFx0dW5zaWduZWQgbG9uZyBwYWdlX2lkeCA9IHJhbmRfcGFnZShcdTAwMjZzZWVkKTtcbitcbitcdFx0dW5zaWduZWQgbG9uZyBuciA9IHJvb21fZnJvbShwYWdlX2lkeCwgMTYpO1xuK1xuK1x0XHRndXAuYWRkciA9ICh1bnNpZ25lZCBsb25nKShyZWdpb24gKyBwYWdlX2lkeCAqIHBhZ2Vfc2l6ZSk7XG4rXHRcdGd1cC5zaXplID0gbnIgKiBwYWdlX3NpemU7XG4rXHRcdGd1cC5ucl9wYWdlc19wZXJfY2FsbCA9IG5yO1xuK1x0XHRndXAuZ3VwX2ZsYWdzID0gMTtcdC8qIEZPTExfV1JJVEUgKi9cbitcdFx0LyogUmFjaW5nIE1BRFZfRE9OVE5FRUQgbWFrZXMgdHJhbnNpZW50IGZhaWx1cmVzIGV4cGVjdGVkLiAqL1xuK1x0XHRpb2N0bChndXBfZmQsIFBJTl9GQVNUX0JFTkNITUFSSywgXHUwMDI2Z3VwKTtcbitcdFx0dXNsZWVwKHJhbmRfcihcdTAwMjZzZWVkKSAlIDIwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKmZvcmtlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0XHRpZiAocGlkID09IDApIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsO1xuK1x0XHRcdGludCBiYWQgPSAwO1xuK1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogTm8gc3RkaW8gaW4gdGhlIGNoaWxkOiBhIHRocmVhZCBtYXkgaGF2ZSBoZWxkXG4rXHRcdFx0ICogc3Rkb3V0J3MgbG9jayB3aGVuIHdlIGZvcmtlZCwgYW5kIHByaW50aW5nIHVuZGVyIGFuXG4rXHRcdFx0ICogaW5oZXJpdGVkIGxvY2sgaGFuZ3MuICBUaGUgcGFyZW50IHJlcG9ydHMgd2hhdCB0aGVcbitcdFx0XHQgKiBleGl0IHN0YXR1cyBzYXlzLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGZvciAoaW50IGkgPSAwOyBpIFx1MDAzYyAxNjsgaSsrKVxuK1x0XHRcdFx0YmFkIHw9IHBhZ2VfaXNfY29ycnVwdChyYW5kX3BhZ2UoXHUwMDI2c2VlZCksIFx1MDAyNnZhbCk7XG4rXHRcdFx0X2V4aXQoYmFkKTtcbitcdFx0fVxuK1x0XHRpZiAocGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0aW50IHdzdGF0dXM7XG4rXG4rXHRcdFx0aWYgKHdhaXRwaWQocGlkLCBcdTAwMjZ3c3RhdHVzLCAwKSBcdTAwM2MgMClcbitcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIndhaXRwaWQoKVwiKTtcbitcdFx0XHQvKiBBIGNoaWxkIGtpbGxlZCBvbiB0aGUgcmVhZCBjb3VudHMgdG9vLCBub3QganVzdCBpdHMgZXhpdCBjb2RlLiAqL1xuK1x0XHRcdGlmICghV0lGRVhJVEVEKHdzdGF0dXMpIHx8IFdFWElUU1RBVFVTKHdzdGF0dXMpKVxuK1x0XHRcdFx0Y29ycnVwdGVkID0gMTtcbitcdFx0fVxuK1x0XHR1c2xlZXAocmFuZF9yKFx1MDAyNnNlZWQpICUgMjAwMCk7XG4rXHR9XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIHZvaWQgKm1yZW1hcHBlcl9mbih2b2lkICphcmcpXG4re1xuK1x0dW5zaWduZWQgaW50IHNlZWQgPSAodW5zaWduZWQgbG9uZylhcmc7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0dm9pZCAqcDtcbitcbitcdFx0cCA9IG1yZW1hcChtcmVtYXBfYXJlYSwgaHBhZ2VfcG1kX3NpemUsIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgIE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVELCBtcmVtYXBfc2NyYXRjaCk7XG4rXHRcdGlmIChwID09IE1BUF9GQUlMRUQpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibXJlbWFwKCkgYXdheVwiKTtcbitcdFx0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIDg7IGkrKylcbitcdFx0XHRtcmVtYXBfc2NyYXRjaFsocmFuZF9yKFx1MDAyNnNlZWQpICVcbitcdFx0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkpICogcGFnZV9zaXplXSA9IDE7XG4rXHRcdHAgPSBtcmVtYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHQgICBNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCwgbXJlbWFwX2FyZWEpO1xuK1x0XHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1yZW1hcCgpIGJhY2tcIik7XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKlxuKyAqIFN3YXAgdHJhZmZpYyBhbmQgTFJVIGNodXJuIG9uIGEgcmVnaW9uIG9mIG91ciBvd24uIFRoZSBjb250ZW50XG4rICogY2hlY2sgaXMgZXhhY3Q6IGEgcGFnZSBvdXQgYW5kIGJhY2sgdGhyb3VnaCBzd2FwIG11c3QgcHJlc2VydmUgdGhlXG4rICogcGF0dGVybiwgYW5kIG5vdGhpbmcgZWxzZSBldmVyIHdyaXRlcyBoZXJlLlxuKyAqL1xuK3N0YXRpYyB2b2lkICpwYWdlb3V0X2ZuKHZvaWQgKmFyZylcbit7XG4rXHR1bnNpZ25lZCBpbnQgc2VlZCA9ICh1bnNpZ25lZCBsb25nKWFyZztcbitcdHVuc2lnbmVkIGxvbmcgbnIgPSBwYWdlb3V0X3NpemUgLyBwYWdlX3NpemU7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucjsgaSsrKVxuK1x0XHQqKHVuc2lnbmVkIGludCAqKShwYWdlb3V0X2FyZWEgKyBpICogcGFnZV9zaXplKSA9IHBhdHRlcm4oaSk7XG4rXG4rXHR3aGlsZSAoIXN0b3ApIHtcbitcdFx0bWFkdmlzZShwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSwgTUFEVl9QQUdFT1VUKTtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnIgXHUwMDI2XHUwMDI2ICFzdG9wOyBpKyspIHtcbitcdFx0XHR1bnNpZ25lZCBpbnQgdmFsID0gKih1bnNpZ25lZCBpbnQgKikocGFnZW91dF9hcmVhICtcbitcdFx0XHRcdFx0XHRcdCAgICAgaSAqIHBhZ2Vfc2l6ZSk7XG4rXG4rXHRcdFx0aWYgKHZhbCAhPSBwYXR0ZXJuKGkpKSB7XG4rXHRcdFx0XHRjb3JydXB0ZWQgPSAxO1xuK1x0XHRcdFx0a3NmdF9wcmludF9tc2coXCJQYWdlb3V0IGNvcnJ1cHRpb24gYXQgcGFnZSAlbHU6ICUjeCAhPSAlI3hcXG5cIixcbitcdFx0XHRcdFx0ICAgICAgIGksIHZhbCwgcGF0dGVybihpKSk7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXHRcdHVzbGVlcChyYW5kX3IoXHUwMDI2c2VlZCkgJSAyMDAwKTtcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbisvKiBDb21wYWN0aW9uIG1pZ3JhdGVzIHRoZSBjb2xsYXBzZSBzb3VyY2VzIG91dCBmcm9tIHVuZGVyIHVzLiAqL1xuK3N0YXRpYyB2b2lkICpjb21wYWN0b3JfZm4odm9pZCAqYXJnKVxuK3tcbitcdHVuc2lnbmVkIGludCBzZWVkID0gKHVuc2lnbmVkIGxvbmcpYXJnO1xuK1x0aW50IGZkID0gb3BlbihcIi9wcm9jL3N5cy92bS9jb21wYWN0X21lbW9yeVwiLCBPX1dST05MWSk7XG4rXG4rXHRpZiAoZmQgXHUwMDNjIDApIHtcbitcdFx0a3NmdF9wcmludF9tc2coXCJObyBjb21wYWN0X21lbW9yeTsgY29tcGFjdG9yIGlkbGVcXG5cIik7XG4rXHRcdHJldHVybiBOVUxMO1xuK1x0fVxuK1x0d2hpbGUgKCFzdG9wKSB7XG4rXHRcdGlmICh3cml0ZShmZCwgXCIxXCIsIDEpIFx1MDAzYyAwKVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR1c2xlZXAoMTAwMDAgKyByYW5kX3IoXHUwMDI2c2VlZCkgJSAxMDAwMDApO1xuK1x0fVxuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBib29sIHN3YXBfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0Y2hhciBsaW5lWzI1Nl07XG4rXHRpbnQgbGluZXMgPSAwO1xuK1x0RklMRSAqZnAgPSBmb3BlbihcIi9wcm9jL3N3YXBzXCIsIFwiclwiKTtcbitcbitcdGlmICghZnApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSlcbitcdFx0bGluZXMrKztcbitcdGZjbG9zZShmcCk7XG4rXHRyZXR1cm4gbGluZXMgXHUwMDNlIDE7XG4rfVxuK1xuK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5vd19tcyh2b2lkKVxuK3tcbitcdHN0cnVjdCB0aW1ldmFsIHR2O1xuK1xuK1x0Z2V0dGltZW9mZGF5KFx1MDAyNnR2LCBOVUxMKTtcbitcdHJldHVybiB0di50dl9zZWMgKiAxMDAwVUwgKyB0di50dl91c2VjIC8gMTAwMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgdXNhZ2Uodm9pZClcbit7XG4rXHRmcHJpbnRmKHN0ZGVycixcbitcdFx0XCJVc2FnZToga2h1Z2VwYWdlZF9yYWNlIFstZCBzZWNvbmRzXSBbLW0gc3RlcHBlZHxmcmVlfG1hZHZpc2VdIFstYSBhcmVhc11cXG5cIlxuK1x0XHRcIlxcdFdpdGhvdXQgLW0sIGV2ZXJ5IG1vZGUgcnVucyBpbiB0dXJuLlxcblwiXG4rXHRcdFwiXFx0LWQ6IHNlY29uZHMgcGVyIG1vZGUgKGRlZmF1bHQgNSlcXG5cIlxuK1x0XHRcIlxcdC1hOiBudW1iZXIgb2Ygc2hhcmVkIFBNRC1zaXplZCBwbGF5Z3JvdW5kIGFyZWFzIChkZWZhdWx0IDMpXFxuXCIpO1xuK1x0ZXhpdCgxKTtcbit9XG4rXG4raW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGhyZWFkX25hbWVzW10gPSB7XG4rXHRcdFwiZmF1bHRlclwiLCBcImZhdWx0ZXIyXCIsIFwiZG9udG5lZWRcIiwgXCJwaW5uZXJcIiwgXCJmb3JrZXJcIixcbitcdFx0XCJtcmVtYXBwZXJcIiwgXCJwYWdlb3V0XCIsIFwiY29tcGFjdG9yXCIsXG4rXHR9O1xuK1x0dm9pZCAqKCpjb25zdCB0aHJlYWRfZm5zW10pKHZvaWQgKikgPSB7XG4rXHRcdGZhdWx0ZXJfZm4sIGZhdWx0ZXJfZm4sIGRvbnRuZWVkX2ZuLCBwaW5uZXJfZm4sIGZvcmtlcl9mbixcbitcdFx0bXJlbWFwcGVyX2ZuLCBwYWdlb3V0X2ZuLCBjb21wYWN0b3JfZm4sXG4rXHR9O1xuK1x0ZW51bSB7IFRfRkFVTFRFUiwgVF9GQVVMVEVSMiwgVF9ET05UTkVFRCwgVF9QSU5ORVIsIFRfRk9SS0VSLFxuK1x0ICAgICAgIFRfTVJFTUFQUEVSLCBUX1BBR0VPVVQsIFRfQ09NUEFDVE9SIH07XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VvdXRfYml0ID0gMVVMIFx1MDAzY1x1MDAzYyBUX1BBR0VPVVQ7XG4rXHRjb25zdCB1bnNpZ25lZCBsb25nIGNvbXBhY3Rvcl9iaXQgPSAxVUwgXHUwMDNjXHUwMDNjIFRfQ09NUEFDVE9SO1xuK1x0Y29uc3QgaW50IG5yX3RocmVhZHMgPSBBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyk7XG4rXHRwdGhyZWFkX3QgdGhyZWFkc1tBUlJBWV9TSVpFKHRocmVhZF9uYW1lcyldO1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhbGxfbW9kZXNbXSA9IHsgXCJzdGVwcGVkXCIsIFwiZnJlZVwiLCBcIm1hZHZpc2VcIiB9O1xuK1x0c3RhdGljIGNvbnN0IGJvb2wgb2NjdXBhbmNpZXNbXSA9IHsgZmFsc2UsIHRydWUgfTtcdC8qIHN0cmljdCwgaG9sZXMgKi9cbitcdHN0YXRpYyBjb25zdCBib29sIHByZXNzdXJlc1tdID0geyBmYWxzZSwgdHJ1ZSB9O1x0LyogcXVpZXQsIHVuZGVyIHByZXNzdXJlICovXG4rXHRjb25zdCBpbnQgbnJfb2NjdXBhbmNpZXMgPSBBUlJBWV9TSVpFKG9jY3VwYW5jaWVzKTtcbitcdGNvbnN0IGludCBucl9wcmVzc3VyZXMgPSBBUlJBWV9TSVpFKHByZXNzdXJlcyk7XG4rXHRjb25zdCBjaGFyICpvbmVfbW9kZVsxXTtcbitcdGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZXMgPSBhbGxfbW9kZXM7XG4rXHRpbnQgbnJfbW9kZXMgPSBBUlJBWV9TSVpFKGFsbF9tb2Rlcyk7XG4rXHRjb25zdCBjaGFyICptb2RlX2FyZyA9IE5VTEw7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0dW5zaWduZWQgbG9uZyBlbmRfbXM7XG4rXHRpbnQgZHVyYXRpb25fcyA9IDU7XG4rXHR1bnNpZ25lZCBsb25nIHRocmVhZF9tYXNrID0gfjBVTDtcbitcdHVuc2lnbmVkIGxvbmcgYmFzZV9tYXNrO1xuK1x0aW50IG5yX2FyZWFzX2FyZyA9IDA7XG4rXHR1bnNpZ25lZCBsb25nIGk7XG4rXHRpbnQgc3RlcHMgPSAwO1xuK1x0aW50IG9wdDtcbitcbitcdHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIFwiYTpkOm06dDpoXCIpKSAhPSAtMSkge1xuK1x0XHRzd2l0Y2ggKG9wdCkge1xuK1x0XHRjYXNlICdhJzpcbitcdFx0XHRucl9hcmVhc19hcmcgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ2QnOlxuK1x0XHRcdGR1cmF0aW9uX3MgPSBhdG9pKG9wdGFyZyk7XG4rXHRcdFx0YnJlYWs7XG4rXHRcdGNhc2UgJ20nOlxuK1x0XHRcdG1vZGVfYXJnID0gb3B0YXJnO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRjYXNlICd0JzpcbitcdFx0XHQvKiBkZWJ1ZzogYml0bWFzayBvZiByYWNpbmcgdGhyZWFkcyB0byBzdGFydCAqL1xuK1x0XHRcdHRocmVhZF9tYXNrID0gc3RydG91bChvcHRhcmcsIE5VTEwsIDApO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHRkZWZhdWx0OlxuK1x0XHRcdHVzYWdlKCk7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtb2RlX2FyZykge1xuK1x0XHRpZiAoc3RyY21wKG1vZGVfYXJnLCBcInN0ZXBwZWRcIikgXHUwMDI2XHUwMDI2IHN0cmNtcChtb2RlX2FyZywgXCJmcmVlXCIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgc3RyY21wKG1vZGVfYXJnLCBcIm1hZHZpc2VcIikpXG4rXHRcdFx0dXNhZ2UoKTtcbitcdFx0b25lX21vZGVbMF0gPSBtb2RlX2FyZztcbitcdFx0bW9kZXMgPSBvbmVfbW9kZTtcbitcdFx0bnJfbW9kZXMgPSAxO1xuK1x0fVxuK1xuK1x0a3NmdF9wcmludF9oZWFkZXIoKTtcbitcdGlmICghdGhwX2F2YWlsYWJsZSgpKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcIlRyYW5zcGFyZW50IEh1Z2VwYWdlcyBub3QgYXZhaWxhYmxlXFxuXCIpO1xuK1xuK1x0cGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTtcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcbitcdGd1cF9mZCA9IG9wZW4oXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdFwiLCBPX1JEV1IpO1xuK1x0aWYgKGd1cF9mZCBcdTAwM2MgMClcbitcdFx0a3NmdF9leGl0X3NraXAoXCIvc3lzL2tlcm5lbC9kZWJ1Zy9ndXBfdGVzdCByZXF1aXJlcyBDT05GSUdfR1VQX1RFU1QgYW5kIHJvb3RcXG5cIik7XG4rXG4rXHRucl9zaGFyZWRfYXJlYXMgPSBucl9hcmVhc19hcmcgXHUwMDNlIDAgPyBucl9hcmVhc19hcmcgOiBERUZBVUxUX1NIQVJFRF9BUkVBUztcbitcdG5yX2FyZWFzID0gbnJfc2hhcmVkX2FyZWFzICsgMTtcbitcbitcdC8qXG4rXHQgKiBUaGUgbXJlbWFwIHRocmVhZCBtb3ZlcyBpdHMgYXJlYSB0byB0aGlzIGFkZHJlc3MgYW5kIGJhY2ssIGFuZFxuK1x0ICogTVJFTUFQX0ZJWEVEIHVubWFwcyB3aGF0ZXZlciBpcyBpbiB0aGUgd2F5IHdpdGhvdXQgc2F5aW5nIHNvLiAgQ2xhaW1cbitcdCAqIHRoZSBhZGRyZXNzIGhlcmUsIHNvIGEgbGF5b3V0IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhpcyBhc3N1bXB0aW9uXG4rXHQgKiBmYWlscyBub3cgaW5zdGVhZCBvZiBsb3NpbmcgYSBtYXBwaW5nIGxhdGVyLiAgTm90aGluZyBlbHNlIGluIHRoZVxuK1x0ICogcHJvY2VzcyBtYXBzIHRoaXMgbG93OiB0aHJlYWQgc3RhY2tzIGFuZCBtYWxsb2MgYXJlbmFzIGNvbWUgZnJvbSB0aGVcbitcdCAqIHRvcC1kb3duIG1tYXAgYXJlYSwgd2VsbCBhYm92ZS5cbitcdCAqL1xuK1x0bXJlbWFwX3NjcmF0Y2ggPSAoY2hhciAqKUJBU0VfQUREUiArIDIgKiBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplO1xuK1x0aWYgKG1tYXAobXJlbWFwX3NjcmF0Y2gsIGhwYWdlX3BtZF9zaXplLCBQUk9UX05PTkUsXG4rXHRcdCBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUgfCBNQVBfRklYRURfTk9SRVBMQUNFLFxuK1x0XHQgLTEsIDApICE9ICh2b2lkICopbXJlbWFwX3NjcmF0Y2gpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX3BlcnJvcihcIm1tYXAoKSBtcmVtYXAgc2NyYXRjaFwiKTtcbitcbitcdGJhc2VfbWFzayA9IHRocmVhZF9tYXNrO1xuK1x0aWYgKCFzd2FwX2F2YWlsYWJsZSgpKVxuK1x0XHQvKiBObyBzd2FwLCBubyBhbm9uIHJlY2xhaW06IGNvbXBhY3Rpb24tb25seSBwcmVzc3VyZS4gKi9cbitcdFx0a3NmdF9wcmludF9tc2coXCJubyBzd2FwOiB0aGUgcGFnZW91dCB0aHJlYWQgc3RheXMgaWRsZVxcblwiKTtcbitcbitcdGtzZnRfc2V0X3BsYW4obnJfbW9kZXMgKiBucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XG4rXG4rXHR0aHBfc2F2ZV9zZXR0aW5ncygpO1xuK1x0dGhwX3JlYWRfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0LypcbitcdCAqIEEgYmFzZSBlbnRyeSBmb3IgdGhlIHN0YWNrLCBzbyB0aGF0IHRoZSBwb3AgYXQgdGhlIGVuZCBvZiBhIG1vZGVcbitcdCAqIGFsd2F5cyBoYXMgc29tZXRoaW5nIHRvIHdyaXRlIGJhY2s6IHRocF9wb3Bfc2V0dGluZ3MoKSBvbiBhbiBlbXB0eVxuK1x0ICogc3RhY2sgaGFzIG5vIHNldHRpbmdzIHRvIGFwcGx5IGFuZCBnaXZlcyB1cC5cbitcdCAqL1xuK1x0dGhwX3B1c2hfc2V0dGluZ3MoXHUwMDI2c2V0dGluZ3MpO1xuK1xuK1x0Zm9yIChpbnQgcnVuID0gMDsgcnVuIFx1MDAzYyBucl9tb2RlcyAqIG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzOyBydW4rKykge1xuK1x0XHRpbnQgcmVtID0gcnVuICUgKG5yX29jY3VwYW5jaWVzICogbnJfcHJlc3N1cmVzKTtcbitcdFx0Y29uc3QgY2hhciAqbW9kZSA9IG1vZGVzW3J1biAvIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyldO1xuK1x0XHRib29sIGhvbGVzID0gb2NjdXBhbmNpZXNbcmVtIC8gbnJfcHJlc3N1cmVzXTtcbitcdFx0Ym9vbCBwcmVzc3VyZSA9IHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdO1xuK1xuK1x0XHR0aHJlYWRfbWFzayA9IGJhc2VfbWFzaztcbitcdFx0aWYgKCFwcmVzc3VyZSlcbitcdFx0XHR0aHJlYWRfbWFzayBcdTAwMjY9IH4ocGFnZW91dF9iaXQgfCBjb21wYWN0b3JfYml0KTtcbitcdFx0ZWxzZSBpZiAoIXN3YXBfYXZhaWxhYmxlKCkpXG4rXHRcdFx0dGhyZWFkX21hc2sgXHUwMDI2PSB+cGFnZW91dF9iaXQ7XG4rXG4rXHRcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdFx0c2V0dGluZ3MudGhwX2VuYWJsZWQgPSBUSFBfTUFEVklTRTtcbitcdFx0c2V0dGluZ3MudGhwX2RlZnJhZyA9IFRIUF9ERUZSQUdfQUxXQVlTO1xuK1x0XHRzZXR0aW5ncy5zaG1lbV9lbmFibGVkID0gU0hNRU1fTkVWRVI7XG4rXHRcdHNldHRpbmdzLmtodWdlcGFnZWQuZGVmcmFnID0gMTtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5zY2FuX3NsZWVwX21pbGxpc2VjcyA9XG4rXHRcdFx0c3RyY21wKG1vZGUsIFwiZnJlZVwiKSA/IDEwMDAgOiAwO1xuK1x0XHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDEwO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBtVEhQIGNvbGxhcHNlIG9ubHkgc3VwcG9ydHMgdGhlIHR3byBlbmRzIG9mIHRoZSBvY2N1cGFuY3lcbitcdFx0ICogc2NhbGU6IDAgb3IgSFBBR0VfUE1EX05SIC0gMSAoYW55dGhpbmcgZWxzZSBjb2VyY2VzIHRvIDApLlxuK1x0XHQgKiBTdHJpY3QgbmVlZHMgYSBmdWxseSBwb3B1bGF0ZWQgd2luZG93LCB3aGljaCBpcyByYXJlIHVuZGVyXG4rXHRcdCAqIHJhY2luZyBNQURWX0RPTlRORUVEOyBob2xlLWhlYXZ5IHdpbmRvd3MgY29sbGFwc2UgaW5zdGVhZCxcbitcdFx0ICogc28gdGhlIHR3byBlbmRzIHJhY2UgZGlmZmVyZW50IHBhdGhzLlxuK1x0XHQgKi9cbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gaG9sZXMgP1xuK1x0XHRcdChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgLSAxIDogMDtcbitcdFx0c2V0dGluZ3Mua2h1Z2VwYWdlZC5wYWdlc190b19zY2FuID1cbitcdFx0XHRucl9hcmVhcyAqIChocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZSkgKiA4O1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKykge1xuK1x0XHRcdGlmICh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBpKSlcbitcdFx0XHRcdHNldHRpbmdzLmh1Z2VwYWdlc1tpXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHRcdH1cbitcdFx0LyogUG9wcGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2RlLCBiZWZvcmUgdGhlIG5leHQgb25lLiAqL1xuK1x0XHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRcdHJlZ2lvbiA9IG1tYXAoQkFTRV9BRERSLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplLFxuK1x0XHRcdCAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9BTk9OWU1PVVMgfFxuK1x0XHRcdCAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVEX05PUkVQTEFDRSwgLTEsIDApO1xuK1x0XHRpZiAocmVnaW9uICE9IEJBU0VfQUREUilcbitcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtbWFwKCkgcGxheWdyb3VuZFwiKTtcbitcdFx0bXJlbWFwX2FyZWEgPSByZWdpb24gKyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZTtcbitcbitcdFx0aWYgKHRocmVhZF9tYXNrIFx1MDAyNiBwYWdlb3V0X2JpdCkge1xuK1x0XHRcdC8qXG4rXHRcdFx0ICogQmlnIGVub3VnaCB0byBjeWNsZSByZWFsIHJlY2xhaW0sIHNtYWxsIGVub3VnaCBub3RcbitcdFx0XHQgKiB0byBkb21pbmF0ZSBhIFRDRyBndWVzdDogNCBQTUQgYXJlYXMsIGNsYW1wZWQgdG9cbitcdFx0XHQgKiBbMTZNLCA2NE1dLlxuK1x0XHRcdCAqL1xuK1x0XHRcdHBhZ2VvdXRfc2l6ZSA9IDQgKiBocGFnZV9wbWRfc2l6ZTtcbitcdFx0XHRpZiAocGFnZW91dF9zaXplIFx1MDAzYyAxNlVMIFx1MDAzY1x1MDAzYyAyMClcbitcdFx0XHRcdHBhZ2VvdXRfc2l6ZSA9IDE2VUwgXHUwMDNjXHUwMDNjIDIwO1xuK1x0XHRcdGlmIChwYWdlb3V0X3NpemUgXHUwMDNlIDY0VUwgXHUwMDNjXHUwMDNjIDIwKVxuK1x0XHRcdFx0cGFnZW91dF9zaXplID0gNjRVTCBcdTAwM2NcdTAwM2MgMjA7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gbW1hcChOVUxMLCBwYWdlb3V0X3NpemUsXG4rXHRcdFx0XHRcdCAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHRcdFx0XHQgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7XG4rXHRcdFx0aWYgKHBhZ2VvdXRfYXJlYSA9PSBNQVBfRkFJTEVEKVxuK1x0XHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHBhZ2VvdXQgYXJlYVwiKTtcbitcdFx0fVxuK1xuK1x0XHQvKiBQb3B1bGF0ZSBzbyB0aGUgZmlyc3QgcGFzcyBoYXMgc29tZXRoaW5nIHRvIGNvbGxhcHNlLiAqL1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSAvIHBhZ2Vfc2l6ZTsgaSsrKVxuK1x0XHRcdCoodW5zaWduZWQgaW50ICopKHJlZ2lvbiArIGkgKiBwYWdlX3NpemUpID0gcGF0dGVybihpKTtcbitcdFx0bWVtc2V0KG1yZW1hcF9hcmVhLCAxLCBocGFnZV9wbWRfc2l6ZSk7XG4rXHRcdGlmIChtYWR2aXNlKHJlZ2lvbiwgbnJfYXJlYXMgKiBocGFnZV9wbWRfc2l6ZSwgTUFEVl9IVUdFUEFHRSkpXG4rXHRcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibWFkdmlzZShNQURWX0hVR0VQQUdFKVwiKTtcbitcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfdGhyZWFkczsgaSsrKSB7XG4rXHRcdFx0aWYgKCEodGhyZWFkX21hc2sgXHUwMDI2ICgxVUwgXHUwMDNjXHUwMDNjIGkpKSkge1xuK1x0XHRcdFx0dGhyZWFkc1tpXSA9IDA7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdFx0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZHNbaV0sIE5VTEwsIHRocmVhZF9mbnNbaV0sXG4rXHRcdFx0XHRcdCAgICh2b2lkICopKGkgKyAxKSkpXG4rXHRcdFx0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IodGhyZWFkX25hbWVzW2ldKTtcbitcdFx0fVxuK1xuK1x0XHRlbmRfbXMgPSBub3dfbXMoKSArIGR1cmF0aW9uX3MgKiAxMDAwVUw7XG4rXHRcdGlmICghc3RyY21wKG1vZGUsIFwic3RlcHBlZFwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRpZiAoIWtodWdlcGFnZWRfZnVsbF9wYXNzKDYwMCkpXG4rXHRcdFx0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcImtodWdlcGFnZWQgcGFzcyB0aW1lZCBvdXRcXG5cIik7XG4rXHRcdFx0XHRzdGVwcysrO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIGlmICghc3RyY21wKG1vZGUsIFwiZnJlZVwiKSkge1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKVxuK1x0XHRcdFx0dXNsZWVwKDEwMCAqIDEwMDApO1xuK1x0XHR9IGVsc2Uge1x0LyogbWFkdmlzZSAqL1xuK1x0XHRcdHdoaWxlIChub3dfbXMoKSBcdTAwM2MgZW5kX21zIFx1MDAyNlx1MDAyNiAhY29ycnVwdGVkKSB7XG4rXHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9zaGFyZWRfYXJlYXM7IGkrKykge1xuK1x0XHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiArIGkgKiBocGFnZV9wbWRfc2l6ZSxcbitcdFx0XHRcdFx0XHRocGFnZV9wbWRfc2l6ZSwgTUFEVl9DT0xMQVBTRSk7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYWR2aXNlKHJlZ2lvbiwgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUsXG4rXHRcdFx0XHRcdE1BRFZfRE9OVE5FRUQpO1xuK1x0XHRcdFx0c3RlcHMrKztcbitcdFx0XHR9XG4rXHRcdH1cbitcbitcdFx0c3RvcCA9IDE7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3RocmVhZHM7IGkrKykge1xuK1x0XHRcdGlmICh0aHJlYWRzW2ldKVxuK1x0XHRcdFx0cHRocmVhZF9qb2luKHRocmVhZHNbaV0sIE5VTEwpO1xuK1x0XHR9XG4rXG4rXHRcdC8qIEZpbmFsIGludGVncml0eSBzd2VlcC4gKi9cbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbnJfc2hhcmVkX2FyZWFzICogaHBhZ2VfcG1kX3NpemUgLyBwYWdlX3NpemU7IGkrKylcbitcdFx0XHRjaGVja19wYWdlKGkpO1xuK1xuK1x0XHRrc2Z0X3Rlc3RfcmVzdWx0KCFjb3JydXB0ZWQsXG4rXHRcdFx0XHQgXCIlcy8lcyVzOiAlZHMsICVkIHN0ZXBzLCBubyBjb3JydXB0aW9uXFxuXCIsXG4rXHRcdFx0XHQgbW9kZSwgaG9sZXMgPyBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0IHByZXNzdXJlID8gXCIvcHJlc3N1cmVcIiA6IFwiXCIsXG4rXHRcdFx0XHQgZHVyYXRpb25fcywgc3RlcHMpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBIYW5kIHRoZSBhZGRyZXNzIHNwYWNlIGFuZCB0aGUgc2V0dGluZ3MgYmFjayBiZWZvcmUgdGhlXG4rXHRcdCAqIG5leHQgbW9kZTogaXQgbWFwcyB0aGUgcmVnaW9uIGF0IHRoZSBzYW1lIGZpeGVkIGFkZHJlc3MsXG4rXHRcdCAqIGFuZCBpdHMgc2NhbiBjYWRlbmNlIGRpZmZlcnMuXG4rXHRcdCAqL1xuK1x0XHRtdW5tYXAocmVnaW9uLCBucl9hcmVhcyAqIGhwYWdlX3BtZF9zaXplKTtcbitcdFx0aWYgKHBhZ2VvdXRfYXJlYSkge1xuK1x0XHRcdG11bm1hcChwYWdlb3V0X2FyZWEsIHBhZ2VvdXRfc2l6ZSk7XG4rXHRcdFx0cGFnZW91dF9hcmVhID0gTlVMTDtcbitcdFx0fVxuK1x0XHR0aHBfcG9wX3NldHRpbmdzKCk7XG4rXHRcdHN0b3AgPSAwO1xuK1x0XHRzdGVwcyA9IDA7XG4rXG4rXHRcdGlmIChjb3JydXB0ZWQpIHtcbitcdFx0XHQvKiBNZW1vcnkgaXMgc3VzcGVjdDsgdGhlIHJlc3Qgd291bGQgcHJvdmUgbm90aGluZy4gKi9cbitcdFx0XHR3aGlsZSAoKytydW4gXHUwMDNjIG5yX21vZGVzICogbnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpIHtcbitcdFx0XHRcdHJlbSA9IHJ1biAlIChucl9vY2N1cGFuY2llcyAqIG5yX3ByZXNzdXJlcyk7XG4rXG4rXHRcdFx0XHRrc2Z0X3Rlc3RfcmVzdWx0X3NraXAoXCIlcy8lcyVzOiBza2lwcGVkIGFmdGVyIGNvcnJ1cHRpb25cXG5cIixcbitcdFx0XHRcdFx0XHQgICAgICBtb2Rlc1tydW4gLyAobnJfb2NjdXBhbmNpZXMgKiBucl9wcmVzc3VyZXMpXSxcbitcdFx0XHRcdFx0XHQgICAgICBvY2N1cGFuY2llc1tyZW0gLyBucl9wcmVzc3VyZXNdID9cbitcdFx0XHRcdFx0XHQgICAgICBcImhvbGVzXCIgOiBcInN0cmljdFwiLFxuK1x0XHRcdFx0XHRcdCAgICAgIHByZXNzdXJlc1tyZW0gJSBucl9wcmVzc3VyZXNdID9cbitcdFx0XHRcdFx0XHQgICAgICBcIi9wcmVzc3VyZVwiIDogXCJcIik7XG4rXHRcdFx0fVxuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHR0aHBfcmVzdG9yZV9zZXR0aW5ncygpO1xuK1x0a3NmdF9maW5pc2hlZCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9raHVnZXBhZ2VkX3N5bmNfY2hlY2suYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2todWdlcGFnZWRfc3luY19jaGVjay5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNDUwMDE5OTZiNTdhYVxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0va2h1Z2VwYWdlZF9zeW5jX2NoZWNrLmNcbkBAIC0wLDAgKzEsMTk2IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisvKlxuKyAqIFN5bmNocm9ub3VzIGtodWdlcGFnZWQgZHJpdmluZyBjaGVjay5cbisgKlxuKyAqIFJhY2UgdGVzdHMgZHJpdmUga2h1Z2VwYWdlZCB0aHJvdWdoIHRoZSBleGlzdGluZyBzeXNmcyBjb250cm9sczogYVxuKyAqIHN0b3JlIHRvIHNjYW5fc2xlZXBfbWlsbGlzZWNzIHdha2VzIHRoZSBkYWVtb24sIGFuZCBmdWxsX3NjYW5zXG4rICogYWR2YW5jaW5nIGJ5IHR3byBpcyBhIGNvbXBsZXRpb24gYmFycmllciBmb3Igb25lIGZ1bGwgcGFzcyB0aGF0XG4rICogc3RhcnRlZCBhZnRlciBzZXR1cCAoa2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKSkuIFZlcmlmeSB0aGUgcGFpciBnaXZlc1xuKyAqIGRldGVybWluaXN0aWMsIGF0dHJpYnV0YWJsZSByZXN1bHRzOiBvbmUgYmFycmllciBzdGVwIG92ZXIgb25lXG4rICogcHJlcGFyZWQgd2luZG93IHByb2R1Y2VzIGV4YWN0bHkgb25lIGNvbGxhcHNlIGF0dGVtcHQgb24gdGhhdFxuKyAqIHdpbmRvdydzIHNvdXJjZSBwYWdlcyAobW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGUgZXZlbnRzIGZpbHRlcmVkXG4rICogYnkgc291cmNlIFBGTiBhbmQgb3JkZXIpIGFuZCB0aGUgd2luZG93IGlzIGNvbGxhcHNlZFxuKyAqIGFmdGVyd2FyZHMsIHJlcGVhdGFibHkuXG4rICpcbisgKiBzY2FuX3NsZWVwX21pbGxpc2VjcyBpcyBzZXQgdG8gNjBzIHRvIHByb3ZlIHRoZSB3YWtlIHBhdGg6IHdpdGhvdXRcbisgKiB0aGUgd2FrZSwgb25lIGJhcnJpZXIgc3RlcCB3b3VsZCBzbGVlcCBtdWx0aXBsZXMgb2YgdGhhdCBhbmQgYmxvd1xuKyAqIHRoZSB0aW1lb3V0LiBJdCBhbHNvIGtlZXBzIHRoZSBkYWVtb24gZnJvbSBmcmVlLXJ1bm5pbmcgYmV0d2VlblxuKyAqIHN0ZXBzLCBwZXIgdGhlIGtodWdlcGFnZWRfZnVsbF9wYXNzKCkgZGlzY2lwbGluZS5cbisgKi9cbisjZGVmaW5lIF9HTlVfU09VUkNFXG4rI2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rXG4rI2luY2x1ZGUgXCJrc2VsZnRlc3QuaFwiXG4rI2luY2x1ZGUgXCJ2bV91dGlsLmhcIlxuKyNpbmNsdWRlIFwiaHVnZXBhZ2Vfc2V0dGluZ3MuaFwiXG4rXG4rI2RlZmluZSBCQVNFX0FERFIgKCh2b2lkICopKDFVTCBcdTAwM2NcdTAwM2MgMzApKVxuKyNkZWZpbmUgVEFSR0VUX09SREVSIDJcdC8qIHNtYWxsZXN0IG9yZGVyIGtodWdlcGFnZWQgY29uc2lkZXJzICovXG4rI2RlZmluZSBOUl9JVEVSQVRJT05TIDVcbitcbitzdGF0aWMgaW50IHBhZ2VtYXBfZmQ7XG4rc3RhdGljIGludCBrcGFnZWZsYWdzX2ZkO1xuK3N0YXRpYyBpbnQgdHJhY2VfZXZlbnRzX2ZkID0gLTE7XG4rc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBhZ2VfcG1kX3NpemU7XG4rXG4rLypcbisgKiBFYWNoIHN0ZXAgc3dpdGNoZXMgdGhlIGV2ZW50cyBvZmYgYWdhaW4sIGJ1dCBhIGhlbHBlciBjYW4gc3RpbGwgZ2l2ZSB1cFxuKyAqIG9uIHVzIGluIGJldHdlZW4gKGEgZmFpbGluZyBzeXNmcyB3cml0ZSBlbmRzIHRoZSB0ZXN0IGZyb20gaW5zaWRlXG4rICogdGhwX3dyaXRlX251bSgpKSwgYW5kIGh1Z2VfbWVtb3J5IGV2ZW50cyBsZWZ0IG9uIGFyZSB0aGUgd2hvbGUgbWFjaGluZSdzXG4rICogcHJvYmxlbSwgbm90IHRoaXMgdGVzdCdzLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHRyYWNlX2V2ZW50c19vZmYodm9pZClcbit7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzZT0gMClcbitcdFx0dHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgZmFsc2UpO1xuK31cbitcbisvKlxuKyAqIENvdW50IGNvbGxhcHNlIGF0dGVtcHRzIGF0dHJpYnV0YWJsZSB0byBvdXIgd2luZG93OiBpc29sYXRlIGV2ZW50cyB3aG9zZVxuKyAqIHNjYW5fcGZuIGlzIG9uZSBvZiB0aGUgd2luZG93J3Mgc291cmNlIFBGTnMsIHJlcG9ydGVkIG9uY2UgcGVyIGF0dGVtcHQuXG4rICovXG4rc3RhdGljIGludCBjb3VudF9hdHRyaWJ1dGVkKHVuc2lnbmVkIGxvbmcgKnBmbnMsIGludCBucl9wZm5zLFxuK1x0XHRcdCAgICB1bnNpZ25lZCBpbnQgb3JkZXIpXG4re1xuK1x0Y2hhciBsaW5lWzEwMjRdO1xuK1x0aW50IGNvdW50ID0gMDtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSB0cmFjaW5nX29wZW5fdHJhY2UoKTtcbitcdGlmICghZnApXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBvcGVuIHRyYWNlIGJ1ZmZlclxcblwiKTtcbitcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkge1xuK1x0XHR1bnNpZ25lZCBsb25nIHZhbDtcbitcdFx0dW5zaWduZWQgaW50IG9yZDtcbitcdFx0Y2hhciAqcywgKm87XG4rXHRcdGludCBpO1xuK1xuK1x0XHRzID0gc3Ryc3RyKGxpbmUsIFwibW1fY29sbGFwc2VfaHVnZV9wYWdlX2lzb2xhdGU6XCIpO1xuK1x0XHRpZiAoIXMpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdGlmIChzc2NhbmYocywgXCJtbV9jb2xsYXBzZV9odWdlX3BhZ2VfaXNvbGF0ZTogc2Nhbl9wZm49MHglbHhcIixcbitcdFx0XHQgICBcdTAwMjZ2YWwpICE9IDEpXG4rXHRcdFx0Y29udGludWU7XG4rXHRcdG8gPSBzdHJzdHIocywgXCJvcmRlcj1cIik7XG4rXHRcdGlmICghbyB8fCBzc2NhbmYobywgXCJvcmRlcj0ldVwiLCBcdTAwMjZvcmQpICE9IDEgfHwgb3JkICE9IG9yZGVyKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBucl9wZm5zOyBpKyspIHtcbitcdFx0XHRpZiAodmFsID09IHBmbnNbaV0pIHtcbitcdFx0XHRcdGNvdW50Kys7XG4rXHRcdFx0XHRicmVhaztcbitcdFx0XHR9XG4rXHRcdH1cbitcdH1cbitcdGZjbG9zZShmcCk7XG4rXHRyZXR1cm4gY291bnQ7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIG9uZV9zdGVwKGludCBpdGVyYXRpb24pXG4re1xuK1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IGdldHBhZ2VzaXplKCkgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbitcdGNvbnN0IGludCBucl9wYWdlcyA9IDEgXHUwMDNjXHUwMDNjIFRBUkdFVF9PUkRFUjtcbitcdHVuc2lnbmVkIGxvbmcgcGZuc1sxIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVJdO1xuK1x0Ym9vbCBjb2xsYXBzZWQsIHBhc3NlZDtcbitcdGludCBhdHRyaWJ1dGVkO1xuK1x0Y2hhciAqcDtcbitcdGludCBpO1xuK1xuK1x0cCA9IG1tYXAoQkFTRV9BRERSLCBocGFnZV9wbWRfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0IE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRF9OT1JFUExBQ0UsIC0xLCAwKTtcbitcdGlmIChwICE9IEJBU0VfQUREUilcbitcdFx0a3NmdF9leGl0X2ZhaWxfcGVycm9yKFwibW1hcCgpIHdpbmRvd1wiKTtcbitcbitcdC8qIFByZXBhcmUgb25lIHdpbmRvdzsgcmVjb3JkIGl0cyBzb3VyY2UgUEZOcy4gKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0cFtpICogZ2V0cGFnZXNpemUoKV0gPSBpICsgMTtcbitcdFx0cGZuc1tpXSA9IHBhZ2VtYXBfZ2V0X3BmbihwYWdlbWFwX2ZkLCBwICsgaSAqIGdldHBhZ2VzaXplKCkpO1xuK1x0XHRpZiAocGZuc1tpXSA9PSAtMVVMKVxuK1x0XHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlNvdXJjZSBwYWdlIG5vdCBwcmVzZW50XFxuXCIpO1xuK1x0fVxuK1xuK1x0LyogQ2xlYXIgZmlyc3Q6IHdpdGggdGhlIGV2ZW50cyBzdGlsbCBvZmYgdGhlcmUgaXMgbm90aGluZyB0byB1bmRvLiAqL1xuK1x0aWYgKHRyYWNpbmdfY2xlYXJfdHJhY2UoKSlcbitcdFx0a3NmdF9leGl0X2ZhaWxfbXNnKFwiQ2Fubm90IGNsZWFyIHRoZSB0cmFjZSBidWZmZXJcXG5cIik7XG4rXHRpZiAodHJhY2luZ19ldmVudHNfZW5hYmxlKHRyYWNlX2V2ZW50c19mZCwgdHJ1ZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBlbmFibGUgaHVnZV9tZW1vcnkgZXZlbnRzXFxuXCIpO1xuK1xuK1x0aWYgKG1hZHZpc2UocCwgaHBhZ2VfcG1kX3NpemUsIE1BRFZfSFVHRVBBR0UpKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJtYWR2aXNlKE1BRFZfSFVHRVBBR0UpXCIpO1xuK1x0LyogV2FpdCB1cCB0byAxMjAgc2Vjb25kcyBmb3IgdGhlIHBhc3MgdG8gY29tcGxldGUuICovXG4rXHRwYXNzZWQgPSBraHVnZXBhZ2VkX2Z1bGxfcGFzcygxMjApO1xuK1xuK1x0LyogT2ZmIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBnaXZlIHVwOiB0aGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZS4gKi9cbitcdGlmICh0cmFjaW5nX2V2ZW50c19lbmFibGUodHJhY2VfZXZlbnRzX2ZkLCBmYWxzZSkpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIkNhbm5vdCBkaXNhYmxlIGh1Z2VfbWVtb3J5IGV2ZW50c1xcblwiKTtcbitcdGlmICghcGFzc2VkKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJraHVnZXBhZ2VkIGRpZCBub3QgY29tcGxldGUgYSBmdWxsIHBhc3NcXG5cIik7XG4rXG4rXHRjb2xsYXBzZWQgPSBpc19yYW5nZV9iYWNrZWRfYnlfZm9saW9fb3JkZXJzKHAsIHdpbmRvdywgVEFSR0VUX09SREVSLFxuK1x0XHRcdFx0XHRcdCAgICBwYWdlbWFwX2ZkLCBrcGFnZWZsYWdzX2ZkKTtcbitcdGF0dHJpYnV0ZWQgPSBjb3VudF9hdHRyaWJ1dGVkKHBmbnMsIG5yX3BhZ2VzLCBUQVJHRVRfT1JERVIpO1xuK1xuK1x0a3NmdF90ZXN0X3Jlc3VsdChjb2xsYXBzZWQgXHUwMDI2XHUwMDI2IGF0dHJpYnV0ZWQgPT0gMSxcbitcdFx0XHQgXCJzdGVwICVkOiB3aW5kb3cgY29sbGFwc2VkLCAlZCBhdHRyaWJ1dGVkIHJlc3VsdChzKVxcblwiLFxuK1x0XHRcdCBpdGVyYXRpb24sIGF0dHJpYnV0ZWQpO1xuK1xuK1x0bXVubWFwKHAsIGhwYWdlX3BtZF9zaXplKTtcbit9XG4rXG4raW50IG1haW4odm9pZClcbit7XG4rXHRzdHJ1Y3QgdGhwX3NldHRpbmdzIHNldHRpbmdzO1xuK1x0aW50IGk7XG4rXG4rXHRrc2Z0X3ByaW50X2hlYWRlcigpO1xuK1xuK1x0aWYgKCF0aHBfYXZhaWxhYmxlKCkpXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2VzIG5vdCBhdmFpbGFibGVcXG5cIik7XG4rXHRpZiAoISh0aHBfc3VwcG9ydGVkX29yZGVycygpIFx1MDAyNiAoMVVMIFx1MDAzY1x1MDAzYyBUQVJHRVRfT1JERVIpKSlcbitcdFx0a3NmdF9leGl0X3NraXAoXCJPcmRlciAlZCBpcyBub3QgYSBzdXBwb3J0ZWQgYW5vbiBUSFAgb3JkZXJcXG5cIixcbitcdFx0XHQgICAgICAgVEFSR0VUX09SREVSKTtcbitcbitcdGhwYWdlX3BtZF9zaXplID0gcmVhZF9wbWRfcGFnZXNpemUoKTtcbitcdGlmICghaHBhZ2VfcG1kX3NpemUpXG4rXHRcdGtzZnRfZXhpdF9mYWlsX21zZyhcIlJlYWRpbmcgUE1EIHBhZ2VzaXplIGZhaWxlZFxcblwiKTtcbitcdHBhZ2VtYXBfZmQgPSBvcGVuKFwiL3Byb2Mvc2VsZi9wYWdlbWFwXCIsIE9fUkRPTkxZKTtcbitcdGlmIChwYWdlbWFwX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfZmFpbF9wZXJyb3IoXCJvcGVuKC9wcm9jL3NlbGYvcGFnZW1hcClcIik7XG4rXHRrcGFnZWZsYWdzX2ZkID0gb3BlbihcIi9wcm9jL2twYWdlZmxhZ3NcIiwgT19SRE9OTFkpO1xuK1x0aWYgKGtwYWdlZmxhZ3NfZmQgXHUwMDNjIDApXG4rXHRcdGtzZnRfZXhpdF9za2lwKFwib3BlbihcXFwiL3Byb2Mva3BhZ2VmbGFnc1xcXCIpIHJlcXVpcmVzIHJvb3RcXG5cIik7XG4rXHR0cmFjZV9ldmVudHNfZmQgPSB0cmFjaW5nX2V2ZW50c19vcGVuKFwiaHVnZV9tZW1vcnlcIik7XG4rXHRpZiAodHJhY2VfZXZlbnRzX2ZkIFx1MDAzYyAwKVxuK1x0XHRrc2Z0X2V4aXRfc2tpcChcImh1Z2VfbWVtb3J5IGV2ZW50cyByZXF1aXJlIHRyYWNlZnMgYW5kIHJvb3RcXG5cIik7XG4rXHRhdGV4aXQodHJhY2VfZXZlbnRzX29mZik7XG4rXG4rXHRrc2Z0X3NldF9wbGFuKE5SX0lURVJBVElPTlMpO1xuK1xuK1x0dGhwX3NhdmVfc2V0dGluZ3MoKTtcbitcdHRocF9yZWFkX3NldHRpbmdzKFx1MDAyNnNldHRpbmdzKTtcbitcdHNldHRpbmdzLnRocF9lbmFibGVkID0gVEhQX01BRFZJU0U7XG4rXHRzZXR0aW5ncy50aHBfZGVmcmFnID0gVEhQX0RFRlJBR19BTFdBWVM7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmRlZnJhZyA9IDE7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLnNjYW5fc2xlZXBfbWlsbGlzZWNzID0gNjAwMDA7XG4rXHRzZXR0aW5ncy5raHVnZXBhZ2VkLmFsbG9jX3NsZWVwX21pbGxpc2VjcyA9IDYwMDAwO1xuK1x0c2V0dGluZ3Mua2h1Z2VwYWdlZC5tYXhfcHRlc19ub25lID0gKGhwYWdlX3BtZF9zaXplIC8gZ2V0cGFnZXNpemUoKSkgLSAxO1xuK1x0LyogT25lIHdha2UgbXVzdCBjb21wbGV0ZSBvbmUgZnVsbCBwYXNzOyBzZWUga2h1Z2VwYWdlZF9mdWxsX3Bhc3MoKS4gKi9cbitcdHNldHRpbmdzLmtodWdlcGFnZWQucGFnZXNfdG9fc2NhbiA9IDFVTCBcdTAwM2NcdTAwM2MgMjQ7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9PUkRFUlM7IGkrKylcbitcdFx0c2V0dGluZ3MuaHVnZXBhZ2VzW2ldLmVuYWJsZWQgPSBUSFBfTkVWRVI7XG4rXHRzZXR0aW5ncy5odWdlcGFnZXNbVEFSR0VUX09SREVSXS5lbmFibGVkID0gVEhQX0lOSEVSSVQ7XG4rXHQvKiBCYXNlIG9mIHRoZSBzZXR0aW5ncyBzdGFjazsgdGhlIGJvdHRvbSBlbnRyeSBpcyBuZXZlciBwb3BwZWQuICovXG4rXHR0aHBfcHVzaF9zZXR0aW5ncyhcdTAwMjZzZXR0aW5ncyk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBOUl9JVEVSQVRJT05TOyBpKyspXG4rXHRcdG9uZV9zdGVwKGkpO1xuK1xuK1x0dGhwX3Jlc3RvcmVfc2V0dGluZ3MoKTtcbitcbitcdGtzZnRfZmluaXNoZWQoKTtcbit9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vbWlncmF0aW9uLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuaW5kZXggZjE5ZDUzYzY5NTc2NC4uZmQzNWY4YTdiNWI4MyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL21pZ3JhdGlvbi5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9taWdyYXRpb24uY1xuQEAgLTIwLDcgKzIwLDYgQEBcbiBcbiAjZGVmaW5lIFRXT01FR1x0XHQoMlx1MDAzY1x1MDAzYzIwKVxuICNkZWZpbmUgUlVOVElNRVx0XHQoMjApXG4tI2RlZmluZSBBTElHTih4LCBhKVx0KCgoeCkgKyAoYSAtIDEpKSBcdTAwMjYgKH4oKGEpIC0gMSkpKVxuIFxuIEhVR0VUTEJfU0VUVVBfREVGQVVMVF9QQUdFUygxKVxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3J1bl92bXRlc3RzLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbmluZGV4IGQwOWY5ZjZhMzg0ZWUuLmZjNjE5MDdhYTNiMmEgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9ydW5fdm10ZXN0cy5zaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vcnVuX3ZtdGVzdHMuc2hcbkBAIC00MDIsNiArNDAyLDEyIEBAIENBVEVHT1JZPVwicGZubWFwXCIgcnVuX3Rlc3QgLi9wZm5tYXBcbiAjIENPVyB0ZXN0c1xuIENBVEVHT1JZPVwiY293XCIgcnVuX3Rlc3QgLi9jb3dcbiBcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4vZm9saW9fb3JkZXJfY2hlY2tcbitcbitDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZF9zeW5jX2NoZWNrXG4rXG4rQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWRfcmFjZVxuK1xuIENBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkXG4gXG4gQ0FURUdPUlk9XCJ0aHBcIiBydW5fdGVzdCAuL2todWdlcGFnZWQgLXMgMlxuQEAgLTQxMCw4ICs0MTYsNiBAQCBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCBhbGw6c2htZW1cbiBcbiBDQVRFR09SWT1cInRocFwiIHJ1bl90ZXN0IC4va2h1Z2VwYWdlZCAtcyA0IGFsbDpzaG1lbVxuIFxuLUNBVEVHT1JZPVwidGhwXCIgcnVuX3Rlc3QgLi9raHVnZXBhZ2VkIC1jIDQgbXRocF9raHVnZXBhZ2VkOmFub25cbi1cbiAjIFRyeSB0byBjcmVhdGUgWEZTIGlmIG5vdCBwcm92aWRlZFxuIGlmIFsgLXogXCIke1NQTElUX0hVR0VfUEFHRV9URVNUX1hGU19QQVRIfVwiIF07IHRoZW5cbiAgICAgaWYgdGVzdF9zZWxlY3RlZCBcInRocFwiOyB0aGVuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vc3BsaXRfaHVnZV9wYWdlX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3NwbGl0X2h1Z2VfcGFnZV90ZXN0LmNcbmluZGV4IDg2YTYwMzY5MjgyNjEuLjBhZGZlN2RkZTdlNTkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9zcGxpdF9odWdlX3BhZ2VfdGVzdC5jXG5AQCAtNDIsNjggKzQyLDYgQEAgY29uc3QgY2hhciAqa3BhZ2VmbGFnc19wcm9jID0gXCIvcHJvYy9rcGFnZWZsYWdzXCI7XG4gaW50IHBhZ2VtYXBfZmQ7XG4gaW50IGtwYWdlZmxhZ3NfZmQ7XG4gXG4tc3RhdGljIGJvb2wgaXNfYmFja2VkX2J5X2ZvbGlvKGNoYXIgKnZhZGRyLCBpbnQgb3JkZXIsIGludCBwYWdlbWFwX2ZkLFxuLVx0XHRpbnQga3BhZ2VmbGFnc19mZClcbi17XG4tXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuLVx0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbi1cdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuLVx0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbi1cdHVpbnQ2NF90IHBmbl9mbGFncztcbi1cdHVuc2lnbmVkIGxvbmcgcGZuO1xuLVx0dW5zaWduZWQgbG9uZyBpO1xuLVxuLVx0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbi1cbi1cdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbi1cdGlmIChwZm4gPT0gLTFVTClcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRnb3RvIGZhaWw7XG4tXG4tXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuLVx0aWYgKCFvcmRlcikge1xuLVx0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuLVx0XHRcdHJldHVybiBmYWxzZTtcbi1cdFx0cmV0dXJuIHRydWU7XG4tXHR9XG4tXG4tXHQvKiBub24gVEhQIGZvbGlvICovXG4tXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuLVx0XHRyZXR1cm4gZmFsc2U7XG4tXG4tXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuLVxuLVx0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4tXHRcdGdvdG8gZmFpbDtcbi1cbi1cdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4tXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbi1cdFx0cmV0dXJuIGZhbHNlO1xuLVxuLVx0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4tXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4tXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbi1cdFx0XHRnb3RvIGZhaWw7XG4tXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuLVx0XHRcdHJldHVybiBmYWxzZTtcbi1cdH1cbi1cbi1cdC8qXG4tXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuLVx0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuLVx0ICovXG4tXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuLVx0XHRyZXR1cm4gdHJ1ZTtcbi1cbi1cdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbi1cdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuLWZhaWw6XG4tXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4tXHRyZXR1cm4gZmFsc2U7XG4tfVxuLVxuIHN0YXRpYyBpbnQgY2hlY2tfYWZ0ZXJfc3BsaXRfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxuIFx0XHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycylcbiB7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG5pbmRleCA4MGJjOWY1OTdiNTIxLi5lZTEzMzQ3NzgzOTFmIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vdm1fdXRpbC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmNcbkBAIC00OTQsNiArNDk0LDE1MSBAQCBpbnQgcGFnZWZsYWdzX2dldCh1bnNpZ25lZCBsb25nIHBmbiwgaW50IGtwYWdlZmxhZ3NfZmQsIHVpbnQ2NF90ICpmbGFncylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitib29sIGlzX2JhY2tlZF9ieV9mb2xpbyhjaGFyICp2YWRkciwgaW50IG9yZGVyLCBpbnQgcGFnZW1hcF9mZCxcbitcdFx0XHRpbnQga3BhZ2VmbGFnc19mZClcbit7XG4rXHRjb25zdCB1aW50NjRfdCBmb2xpb19oZWFkX2ZsYWdzID0gS1BGX1RIUCB8IEtQRl9DT01QT1VORF9IRUFEO1xuK1x0Y29uc3QgdWludDY0X3QgZm9saW9fdGFpbF9mbGFncyA9IEtQRl9USFAgfCBLUEZfQ09NUE9VTkRfVEFJTDtcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0dW5zaWduZWQgbG9uZyBwZm5faGVhZDtcbitcdHVpbnQ2NF90IHBmbl9mbGFncztcbitcdHVuc2lnbmVkIGxvbmcgcGZuO1xuK1x0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0cGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcbitcdC8qIG5vbiBwcmVzZW50IHBhZ2UgKi9cbitcdGlmIChwZm4gPT0gLTFVTClcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBjaGVjayBmb3Igb3JkZXItMCBwYWdlcyAqL1xuK1x0aWYgKCFvcmRlcikge1xuK1x0XHRpZiAocGZuX2ZsYWdzIFx1MDAyNiAoZm9saW9faGVhZF9mbGFncyB8IGZvbGlvX3RhaWxfZmxhZ3MpKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cmV0dXJuIHRydWU7XG4rXHR9XG4rXG4rXHQvKiBub24gVEhQIGZvbGlvICovXG4rXHRpZiAoIShwZm5fZmxhZ3MgXHUwMDI2IEtQRl9USFApKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRwZm5faGVhZCA9IHBmbiBcdTAwMjYgfihucl9wYWdlcyAtIDEpO1xuK1xuK1x0aWYgKHBhZ2VmbGFnc19nZXQocGZuX2hlYWQsIGtwYWdlZmxhZ3NfZmQsIFx1MDAyNnBmbl9mbGFncykpXG4rXHRcdGdvdG8gZmFpbDtcbitcbitcdC8qIGhlYWQgUEZOIGhhcyBubyBjb21wb3VuZF9oZWFkIGZsYWcgc2V0ICovXG4rXHRpZiAoKHBmbl9mbGFncyBcdTAwMjYgZm9saW9faGVhZF9mbGFncykgIT0gZm9saW9faGVhZF9mbGFncylcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0LyogY2hlY2sgYWxsIHRhaWwgUEZOIGZsYWdzICovXG4rXHRmb3IgKGkgPSAxOyBpIFx1MDAzYyBucl9wYWdlczsgaSsrKSB7XG4rXHRcdGlmIChwYWdlZmxhZ3NfZ2V0KHBmbl9oZWFkICsgaSwga3BhZ2VmbGFnc19mZCwgXHUwMDI2cGZuX2ZsYWdzKSlcbitcdFx0XHRnb3RvIGZhaWw7XG4rXHRcdGlmICgocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBjaGVjayB0aGUgUEZOIGFmdGVyIHRoaXMgZm9saW8sIGJ1dCBpZiBpdHMgZmxhZ3MgY2Fubm90IGJlIG9idGFpbmVkLFxuK1x0ICogYXNzdW1lIHRoaXMgZm9saW8gaGFzIHRoZSBleHBlY3RlZCBvcmRlclxuK1x0ICovXG4rXHRpZiAocGFnZWZsYWdzX2dldChwZm5faGVhZCArIG5yX3BhZ2VzLCBrcGFnZWZsYWdzX2ZkLCBcdTAwMjZwZm5fZmxhZ3MpKVxuK1x0XHRyZXR1cm4gdHJ1ZTtcbitcbitcdC8qIElmIHdlIGZpbmQgYW5vdGhlciB0YWlsIHBhZ2UsIHRoZW4gdGhlIGZvbGlvIGlzIGxhcmdlci4gKi9cbitcdHJldHVybiAocGZuX2ZsYWdzIFx1MDAyNiBmb2xpb190YWlsX2ZsYWdzKSAhPSBmb2xpb190YWlsX2ZsYWdzO1xuK2ZhaWw6XG4rXHRrc2Z0X2V4aXRfZmFpbF9tc2coXCJGYWlsZWQgdG8gZ2V0IGZvbGlvIGluZm9cXG5cIik7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuKy8qXG4rICogQ2hlY2sgd2hldGhlciBldmVyeSBvcmRlci1Ab3JkZXIgd2luZG93IG9mIFtzdGFydCwgbGVuKSBtYXBzIGV4YWN0bHkgb25lXG4rICogZm9saW8gb2YgdGhhdCBvcmRlciwgaGVhZCB0byB0YWlsLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBuYXR1cmFsbHlcbisgKiBhbGlnbmVkLCBlYWNoIHdpbmRvdydzIFBGTiBydW4gbXVzdCBiZSBjb250aWd1b3VzLCBhbmQgYSB3aW5kb3cncyBmaXJzdFxuKyAqIFBGTiBtdXN0IGJlIHRoZSBmb2xpbyBoZWFkLlxuKyAqXG4rICogVGhpcyBpcyB0aGUgY2hlY2sgXCJkaWQgdGhpcyByYW5nZSBjb2xsYXBzZSBpbnRvIG9yZGVyLUBvcmRlciBmb2xpb3NcIjogYVxuKyAqIHdpbmRvdyBhc3NlbWJsZWQgZnJvbSBwYXJ0cyBvZiBzZXZlcmFsIGZvbGlvcywgb3IgbWFwcGluZyBhIGZvbGlvIHNoaWZ0ZWRcbisgKiBmcm9tIGl0cyBuYXR1cmFsIHBvc2l0aW9uLCBmYWlscy5cbisgKi9cbitib29sIGlzX3JhbmdlX2JhY2tlZF9ieV9mb2xpb19vcmRlcnMoY2hhciAqc3RhcnQsIHNpemVfdCBsZW4sIGludCBvcmRlcixcbitcdFx0XHRcdCAgICAgaW50IHBhZ2VtYXBfZmQsIGludCBrcGFnZWZsYWdzX2ZkKVxuK3tcbitcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAxVUwgXHUwMDNjXHUwMDNjIG9yZGVyO1xuK1x0Y29uc3Qgc2l6ZV90IHdpbmRvdyA9IG5yX3BhZ2VzICogcHNpemUoKTtcbitcdGNoYXIgKnZhZGRyO1xuK1xuK1x0aWYgKCh1aW50cHRyX3Qpc3RhcnQgJSB3aW5kb3cgfHwgbGVuICUgd2luZG93KVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRmb3IgKHZhZGRyID0gc3RhcnQ7IHZhZGRyIFx1MDAzYyBzdGFydCArIGxlbjsgdmFkZHIgKz0gd2luZG93KSB7XG4rXHRcdHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyKTtcbitcdFx0dW5zaWduZWQgbG9uZyBpO1xuK1xuK1x0XHQvKiBOb3QgcHJlc2VudCwgb3Igbm90IG1hcHBpbmcgdGhlIGZvbGlvIGhlYWQuICovXG4rXHRcdGlmIChwZm4gPT0gLTFVTCB8fCBwZm4gJSBucl9wYWdlcylcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRcdGZvciAoaSA9IDE7IGkgXHUwMDNjIG5yX3BhZ2VzOyBpKyspIHtcbitcdFx0XHRpZiAocGFnZW1hcF9nZXRfcGZuKHBhZ2VtYXBfZmQsIHZhZGRyICsgaSAqIHBzaXplKCkpICE9XG4rXHRcdFx0ICAgIHBmbiArIGkpXG4rXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdH1cbitcbitcdFx0aWYgKCFpc19iYWNrZWRfYnlfZm9saW8odmFkZHIsIG9yZGVyLCBwYWdlbWFwX2ZkLFxuK1x0XHRcdFx0XHRrcGFnZWZsYWdzX2ZkKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rI2RlZmluZSBUUkFDRUZTX1JPT1QgXCIvc3lzL2tlcm5lbC90cmFjaW5nXCJcbitcbisvKlxuKyAqIE9wZW4gdGhlIGVuYWJsZSBmaWxlIG9mIG9uZSBmdHJhY2UgZXZlbnQgc3Vic3lzdGVtIChlLmcuIFwiaHVnZV9tZW1vcnlcIikuXG4rICogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRyYWNpbmdfZXZlbnRzX2VuYWJsZSgpLCBvciAtMSBpZiB0cmFjZWZzIG9yIHRoZVxuKyAqIHN1YnN5c3RlbSBpcyBub3QgdGhlcmUuICBUaGUgZXZlbnRzIGFyZSBzeXN0ZW0td2lkZSBzdGF0ZTogd2hvZXZlclxuKyAqIHN3aXRjaGVzIHRoZW0gb24gb3ducyB0aGVtIHVudGlsIGl0IHN3aXRjaGVzIHRoZW0gb2ZmLCBpbmNsdWRpbmcgb24gdGhlXG4rICogcGF0aHMgd2hlcmUgdGhlIHRlc3QgZ2l2ZXMgdXAuXG4rICovXG4raW50IHRyYWNpbmdfZXZlbnRzX29wZW4oY29uc3QgY2hhciAqc3Vic3lzKVxuK3tcbitcdGNoYXIgcGF0aFsyNTZdO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBUUkFDRUZTX1JPT1QgXCIvZXZlbnRzLyVzL2VuYWJsZVwiLFxuK1x0XHQgc3Vic3lzKTtcbitcdHJldHVybiBvcGVuKHBhdGgsIE9fV1JPTkxZKTtcbit9XG4rXG4raW50IHRyYWNpbmdfZXZlbnRzX2VuYWJsZShpbnQgZmQsIGJvb2wgZW5hYmxlKVxuK3tcbitcdGlmIChwd3JpdGUoZmQsIGVuYWJsZSA/IFwiMVwiIDogXCIwXCIsIDEsIDApICE9IDEpXG4rXHRcdHJldHVybiAtMTtcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBEcm9wIHdoYXQgdGhlIHRyYWNlIGJ1ZmZlciBob2xkcyBzbyBmYXIuICovXG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZClcbit7XG4rXHRpbnQgZmQgPSBvcGVuKFRSQUNFRlNfUk9PVCBcIi90cmFjZVwiLCBPX1dST05MWSB8IE9fVFJVTkMpO1xuK1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpXG4re1xuK1x0cmV0dXJuIGZvcGVuKFRSQUNFRlNfUk9PVCBcIi90cmFjZVwiLCBcInJcIik7XG4rfVxuK1xuIC8qIElmIGBpb2N0bHMnIG5vbi1OVUxMLCB0aGUgYWxsb3dlZCBpb2N0bHMgd2lsbCBiZSByZXR1cm5lZCBpbnRvIHRoZSB2YXIgKi9cbiBpbnQgdWZmZF9yZWdpc3Rlcl93aXRoX2lvY3RscyhpbnQgdWZmZCwgdm9pZCAqYWRkciwgdWludDY0X3QgbGVuLFxuIFx0XHRcdCAgICAgIGJvb2wgbWlzcywgYm9vbCB3cCwgYm9vbCBtaW5vciwgdWludDY0X3QgKmlvY3RscylcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbmluZGV4IDlhNDlhZjg4NzAyZTQuLjEwYzdiZTQ2ZTQ0Y2EgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS92bV91dGlsLmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL3ZtX3V0aWwuaFxuQEAgLTEwLDYgKzEwLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4gXG4gI2RlZmluZSBCSVRfVUxMKG5yKSAgICAgICAgICAgICAgICAgICAoMVVMTCBcdTAwM2NcdTAwM2MgKG5yKSlcbisjZGVmaW5lIEFMSUdOKHgsIGEpICAgICAgICAgICAgICAgICAgICgoKHgpICsgKGEpIC0gMSkgXHUwMDI2IH4oKGEpIC0gMSkpXG4rXG4gI2RlZmluZSBQTV9TT0ZUX0RJUlRZICAgICAgICAgICAgICAgICBCSVRfVUxMKDU1KVxuICNkZWZpbmUgUE1fTU1BUF9FWENMVVNJVkUgICAgICAgICAgICAgQklUX1VMTCg1NilcbiAjZGVmaW5lIFBNX1VGRkRfV1AgICAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTcpXG5AQCAtOTcsNiArOTksMTAgQEAgaW50NjRfdCBhbGxvY2F0ZV90cmFuc2h1Z2Uodm9pZCAqcHRyLCBpbnQgcGFnZW1hcF9mZCk7XG4gaW50IHBhZ2VmbGFnc19nZXQodW5zaWduZWQgbG9uZyBwZm4sIGludCBrcGFnZWZsYWdzX2ZkLCB1aW50NjRfdCAqZmxhZ3MpO1xuIGludCBnYXRoZXJfZm9saW9fb3JkZXJzKGNoYXIgKnZhZGRyX3N0YXJ0LCBzaXplX3QgbGVuLFxuIFx0XHRpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQsIGludCBvcmRlcnNbXSwgaW50IG5yX29yZGVycyk7XG4rYm9vbCBpc19iYWNrZWRfYnlfZm9saW8oY2hhciAqdmFkZHIsIGludCBvcmRlciwgaW50IHBhZ2VtYXBfZmQsXG4rXHRcdFx0aW50IGtwYWdlZmxhZ3NfZmQpO1xuK2Jvb2wgaXNfcmFuZ2VfYmFja2VkX2J5X2ZvbGlvX29yZGVycyhjaGFyICpzdGFydCwgc2l6ZV90IGxlbiwgaW50IG9yZGVyLFxuK1x0XHRcdFx0ICAgICBpbnQgcGFnZW1hcF9mZCwgaW50IGtwYWdlZmxhZ3NfZmQpO1xuIFxuIGludCB1ZmZkX3JlZ2lzdGVyKGludCB1ZmZkLCB2b2lkICphZGRyLCB1aW50NjRfdCBsZW4sXG4gXHRcdCAgYm9vbCBtaXNzLCBib29sIHdwLCBib29sIG1pbm9yKTtcbkBAIC0xMTMsNiArMTE5LDEwIEBAIGludCBjbG9zZV9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwKTtcbiBpbnQgd3JpdGVfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nIHZhbCk7XG4gaW50IHJlYWRfc3lzZnMoY29uc3QgY2hhciAqZmlsZV9wYXRoLCB1bnNpZ25lZCBsb25nICp2YWwpO1xuIGJvb2wgc29mdGRpcnR5X3N1cHBvcnRlZCh2b2lkKTtcbitpbnQgdHJhY2luZ19ldmVudHNfb3Blbihjb25zdCBjaGFyICpzdWJzeXMpO1xuK2ludCB0cmFjaW5nX2V2ZW50c19lbmFibGUoaW50IGZkLCBib29sIGVuYWJsZSk7XG4raW50IHRyYWNpbmdfY2xlYXJfdHJhY2Uodm9pZCk7XG4rRklMRSAqdHJhY2luZ19vcGVuX3RyYWNlKHZvaWQpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IG9wZW5fc2VsZl9wcm9jbWFwKHN0cnVjdCBwcm9jbWFwX2ZkICpwcm9jbWFwX291dClcbiB7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwMjoxODozMS45MTE2NDI5NjZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTQ1MTUyODE0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiB0aGUgUHJvcG9zZWQgUGF0Y2gncyBGdXp6aW5nIFdvcnRoaW5lc3MqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIFdlIGhhdmUgYSBwYXRjaCB0aGF0IGludHJvZHVjZXMgbmV3IHRlc3RzIHJlbGF0ZWQgdG8gYGtodWdlcGFnZWRgIGFuZCBgbVRIUGAsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGRpcmVjdG9yeS4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBhc3Nlc3MgaWYgdGhlc2UgY2hhbmdlcyBuZWNlc3NpdGF0ZSBmdXp6aW5nLiBUaGUga2V5IGhlcmUgaXMgd2hldGhlciB0aGUgcGF0Y2ggYWx0ZXJzIHRoZSBjb3JlIGtlcm5lbCBsb2dpYyBpbiBhIHdheSB0aGF0IGNvdWxkIGludHJvZHVjZSBuZXcgdnVsbmVyYWJpbGl0aWVzIGRldGVjdGFibGUgdGhyb3VnaCBmdXp6aW5nLlxuXG5NeSBwcmltYXJ5IHRhc2sgaXMgdG8gY29uZmlybSBpZiB0aGlzIHBhdGNoIG1vZGlmaWVzIGFueSBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBMb29raW5nIGF0IHRoZSBkaWZmLCBJIGNhbiBzZWUgdGhhdCBhbGwgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW0vYCBkaXJlY3RvcnkuICBUaGUgZmlsZXMgbGlzdGVkLCBpbmNsdWRpbmcgdGhlIGBNYWtlZmlsZWAsIEMgc291cmNlIGZpbGVzLCBhbmQgaGVhZGVyIGZpbGVzLCBhcmUgYWxsIGNsZWFybHkgcGFydCBvZiB0aGUgc2VsZi10ZXN0IHN1aXRlLlxuXG5UaGUgcHJvdmlkZWQgY3JpdGVyaWEgZm9yIGRldGVybWluaW5nIGBXb3J0aEZ1enppbmdgIGFyZTogbW9kaWZpY2F0aW9ucyB0byBkb2N1bWVudGF0aW9uLCBLY29uZmlnLCBjb21tZW50cywgZGVjb3JhdGl2ZSBjaGFuZ2VzIGxpa2UgbG9nZ2luZywgY2hhbmdlcyB0byBub24tZnVuY3Rpb25hbCBjb25zdGFudHMsIHVucmVhY2hhYmxlIGNvZGUsIG9yIGNvZGUgcmVsYXRlZCB0byBzcGVjaWZpYyBoYXJkd2FyZSB0aGF0J3Mgbm90IGVtdWxhdGVkLiBJdCBhbHNvIGV4Y2x1ZGVzIGNlcnRhaW4gZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGlzIHBhdGNoIGlzbid0IGNoYW5naW5nIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzIHRoYXQgYXJlIHJlYWNoYWJsZS4gU2luY2UgdGhpcyBpcyBhbGwgY29uZmluZWQgdG8gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tL2AsIGl0IGRvZXNuJ3QgbWVldCB0aGUgY3JpdGVyaWEgZm9yIGZ1enppbmcuIFRoZXNlIHNlbGYtdGVzdHMgcmVzaWRlIGluIHVzZXJzcGFjZSBhbmQgZG8gbm90IGludHJvZHVjZSBuZXcsIGZ1enplZCBsb2dpYyB0byB0aGUga2VybmVsIGl0c2VsZi5cblxuTm93LCBJIGRvdWJsZS1jaGVjay4gVGhlIGluc3RydWN0aW9ucyBjbGVhcmx5IHN0YXRlIHRoYXQgaWYgdGhlIHBhdGNoICpvbmx5KiBjb250YWlucyBjaGFuZ2VzIHRvIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9gLCBpdCBkb2Vzbid0IHdhcnJhbnQgZnV6emluZy4gVGhlIHBhdGNoIGlzIHNvbGVseSB3aXRoaW4gdGhlIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS9gIGFyZWEuIE15IGNvZGUgc2VhcmNoIGNvbmZpcm1zIHRoZXJlIGFyZSBubyBtb2RpZmljYXRpb25zIHRvIHRoZSBjb3JlIGtlcm5lbCBsb2dpYy4gU2luY2UgdGhlc2UgdGVzdHMgYXJlIHVzZXJzcGFjZSB0ZXN0IHByb2dyYW1zLCB0aGV5IGRvbid0IGhhdmUgZnVuY3Rpb25hbCBpbXBsaWNhdGlvbnMgdG8gYmUgZnV6emVkIGluIHRoZSBrZXJuZWwuIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHNob3VsZCBiZSBgV29ydGhGdXp6aW5nPWZhbHNlYC5cblxuSW4gY29uY2x1c2lvbiwgSSdtIGNvbmZpZGVudCB0aGF0IHRoZXNlIGNoYW5nZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIHNlbGYtdGVzdCBzdWl0ZSBhbmQgZG8gbm90IGludHJvZHVjZSBhbnkgbmV3IGtlcm5lbCBjb2RlIHBhdGhzIHRoYXQgcmVxdWlyZSBmdXp6aW5nLiBIZW5jZSwgSSB3aWxsIGlzc3VlIGEgY2FsbCB0byBgc2V0LXJlc3VsdHNgIHdpdGggYFdvcnRoRnV6emluZz1mYWxzZWAuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5MTUwLCJPdXRwdXRUb2tlbnMiOjc2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUwMywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTE1VDAyOjE4OjQ3LjM2MzE3NTI4M1oiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzA5OTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBhZGRzIGFuZCBtb2RpZmllcyB1c2VyLXNwYWNlIHRlc3RzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21tLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgY29kZSBpdHNlbGYsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbmV3IHRvIGZ1enogaW4gdGhlIGtlcm5lbC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgYWRkcyBhbmQgbW9kaWZpZXMgdXNlci1zcGFjZSB0ZXN0cyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tbS8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGNvZGUgaXRzZWxmLCBzbyB0aGVyZSBpcyBub3RoaW5nIG5ldyB0byBmdXp6IGluIHRoZSBrZXJuZWwuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0xNVQwMjoxODo0Ny4zNjMyMTI2OTNaIiwiU2VxIjo1LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzkzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowjw27z[1] Phase: Running StartedAt: 2026-08-15 02:18:58 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowjw27z[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-08-15 02:18:58 +0000 UTC FinishedAt: 2026-08-15 02:19:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}