Name: series-workflowxnbbx Phase: Running StartedAt: 2026-07-02 17:01:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxnbbx[0] Phase: Running StartedAt: 2026-07-02 17:01:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxnbbx[0].run-triage Phase: Running StartedAt: 2026-07-02 17:01:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxnbbx[0].run-triage(0) Phase: Running StartedAt: 2026-07-02 17:01:35 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "0b58988cacfc91604c4b5be2c3295f8aac0ee3d0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEYS", "SYSTEM_DATA_VERIFICATION", "FS_VERITY", "FS_VERITY_BUILTIN_SIGNATURES" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "0b58988cacfc91604c4b5be2c3295f8aac0ee3d0", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEYS", "SYSTEM_DATA_VERIFICATION", "FS_VERITY", "FS_VERITY_BUILTIN_SIGNATURES" ], "series_id": "d64c117c-73a1-4408-9e47-b5597f1dad51" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "bpf_prog_verify_signature", "process_fd_array", "process_fd_array_continuous", "fd_array_get_btf", "fd_array_get_btf_continuous", "fd_array_get_btf_sparse", "fd_array_get_map_idx", "fd_array_get_map_idx_continuous", "fd_array_get_map_idx_sparse", "add_fd_from_fd_array", "bpf_classify_keyring" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWVMmIzM0OywKICAgICYjMzQ7U1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OJiMzNDssCiAgICAmIzM0O0ZTX1ZFUklUWSYjMzQ7LAogICAgJiMzNDtGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZSYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX3NwYXJzZSYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeCYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZSYjMzQ7LAogICAgJiMzNDthZGRfZmRfZnJvbV9mZF9hcnJheSYjMzQ7LAogICAgJiMzNDticGZfY2xhc3NpZnlfa2V5cmluZyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBJdCBtb3ZlcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmcm9tIGBicGZfcHJvZ19sb2FkYCB0byBgYnBmX2NoZWNrYCBpbnNpZGUgdGhlIHZlcmlmaWVyLCBhbmQgY2hhbmdlcyBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKHN1cHBvcnRpbmcgY29udGludW91cyBhbmQgc3BhcnNlIGFycmF5cykuIEl0IGFkZHMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgYGZkX2FycmF5YCByZXNvbHV0aW9uIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzbyB0aGV5IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjYjg0MzQzZDBkZjYxMTI5M2JmYjAxMzI0NTI3OTVjMjRmODk3MzY0XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBKdWwgMiAxNzoyMjowNSAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcbmluZGV4IDBkNWM2ZjY1OTI2NjdhLi42MzhhMDBkNDJiYzJhMSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0XG5AQCAtMjgsNiAmIzQzOzI4LDcgQEAgdGhhdCBnb2VzIGludG8gZ3JlYXQgdGVjaG5pY2FsIGRlcHRoIGFib3V0IHRoZSBCUEYgQXJjaGl0ZWN0dXJlLlxuICAgIGNsYXNzaWNfdnNfZXh0ZW5kZWQucnN0XG4gICAgYnBmX2l0ZXJhdG9yc1xuICAgIGJwZl9saWNlbnNpbmdcbiYjNDM7ICAgc2lnbmluZ1xuICAgIHRlc3RfZGVidWdcbiAgICBjbGFuZy1ub3Rlc1xuICAgIGxpbnV4LW5vdGVzXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAwLi4wMWZhNGExZWUwMTRmN1xuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RcbkBAIC0wLDAgJiM0MzsxLDQ5MCBAQFxuJiM0MzsuLiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MztcbiYjNDM7PT09PT09PT09PT09XG4mIzQzO0JQRiBzaWduaW5nXG4mIzQzOz09PT09PT09PT09PVxuJiM0MztcbiYjNDM7VGhpcyBkb2N1bWVudCBkZXNjcmliZXMgaG93IEJQRiBwcm9ncmFtcyBhcmUgY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbmVkLCBob3cgdGhlXG4mIzQzO2tlcm5lbCB2ZXJpZmllcyB0aGVtIGF0IGxvYWQgdGltZSwgYW5kIGhvdyBMaW51eCBTZWN1cml0eSBNb2R1bGVzIChMU01zKSAtXG4mIzQzO2luY2x1ZGluZyB0aGUgQlBGIExTTSAtIHVzZSB0aGUgcmVzdWx0aW5nIHZlcmRpY3QgdG8gZW5mb3JjZSBwb2xpY3kuIEl0IGlzXG4mIzQzO3dyaXR0ZW4gZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gcHJvZHVjZSBzaWduZWQgQlBGIG9iamVjdHMsIHVuZGVyc3RhbmQgd2hhdFxuJiM0Mzt0aGUgc2lnbmF0dXJlIGFjdHVhbGx5IGd1YXJhbnRlZXMsIG9yIGJ1aWxkIGEgcG9saWN5IG9uIHRvcCBvZiBpdC5cbiYjNDM7XG4mIzQzO01vdGl2YXRpb25cbiYjNDM7PT09PT09PT09PVxuJiM0MztcbiYjNDM7QSBzaWduZWQgQlBGIHByb2dyYW0gbGV0cyB0aGUga2VybmVsIGVzdGFibGlzaCB0aGF0IHRoZSBieXRlY29kZSBiZWluZyBsb2FkZWRcbiYjNDM7b3JpZ2luYXRlcyBmcm9tIGEgdHJ1c3RlZCBwcm9kdWNlciBhbmQgd2FzIG5vdCBtb2RpZmllZCBpbiB0cmFuc2l0LiBPbiBpdHMgb3duXG4mIzQzO3RoZSBrZXJuZWwgZG9lcyBub3QgKnJlcXVpcmUqIHNpZ25hdHVyZXMgLSBhbiB1bnNpZ25lZCBwcm9ncmFtIGxvYWRzIGV4YWN0bHkgYXNcbiYjNDM7YmVmb3JlIC0gYnV0IGl0IHJlY29yZHMgYSB2ZXJkaWN0IChzZWUgYFRoZSB2ZXJkaWN0YF8pIHRoYXQgYW4gTFNNIGNhbiBnYXRlIG9uLlxuJiM0MztUaGlzIGlzIHRoZSBidWlsZGluZyBibG9jayBmb3IgcG9saWNpZXMgc3VjaCBhcyBcJiMzNDtvbmx5IHJ1biBCUEYgdGhhdCB3YXMgc2lnbmVkIGJ5XG4mIzQzO2Ega2V5IGluIHRoZSB0cnVzdGVkIGtleXJpbmdcJiMzNDssIGFzIGVuZm9yY2VkIGZvciBpbnN0YW5jZSBieSBJUEUuXG4mIzQzO1xuJiM0MztTaWduaW5nIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGV4aXN0aW5nIHBlcm1pc3Npb24gbW9kZWw6IGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlXG4mIzQzO2NhcGFiaWxpdHkgY2hlY2tzIG9yIHRoZSB2ZXJpZmllci4gQSBzaWduZWQgbG9hZCBzdGlsbCByZXF1aXJlcyB0aGUgdXN1YWxcbiYjNDM7cHJpdmlsZWdlcyAoYGBDQVBfQlBGYGAgYW5kIGFueSBwcm9ncmFtLXR5cGUtc3BlY2lmaWMgY2FwYWJpbGl0eSwgc3ViamVjdCB0b1xuJiM0MztgYGtlcm5lbC51bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkYGApLCBhbmQgdGhlIGxvYWRlciYjMzk7cyBpbnN0cnVjdGlvbnMgYXJlIHN0aWxsXG4mIzQzO2NoZWNrZWQgYnkgdGhlIHZlcmlmaWVyIGxpa2UgYW55IG90aGVyIHByb2dyYW0uIEEgdmFsaWQgc2lnbmF0dXJlIGVzdGFibGlzaGVzXG4mIzQzOypvcmlnaW4gYW5kIGludGVncml0eSosIG5vdCBzYWZldHkgLSBpdCBsZXRzIGEgcG9saWN5IHRydXN0IHdoZXJlIHRoZSBieXRlY29kZVxuJiM0MztjYW1lIGZyb20sIGl0IGRvZXMgbm90IGxldCBhIGxvYWQgc2tpcCBhbnkgY2hlY2sgaXQgd291bGQgb3RoZXJ3aXNlIGZhY2UuXG4mIzQzO1xuJiM0MztUaGUgaGFyZCBwYXJ0IGlzICp3aGF0KiBnZXRzIHNpZ25lZC4gQSBuYWl2ZSBzY2hlbWUgd291bGQgc2lnbiBhIHByb2dyYW0mIzM5O3NcbiYjNDM7aW5zdHJ1Y3Rpb24gYnVmZmVyIGF0IGJ1aWxkIHRpbWUgYW5kIHZlcmlmeSB0aGF0IHNpZ25hdHVyZSBhdFxuJiM0MztgYEJQRl9QUk9HX0xPQURgYC4gVGhhdCBkb2VzIG5vdCBzdXJ2aXZlIGNvbnRhY3Qgd2l0aCByZWFsIEJQRiBvYmplY3RzLCBiZWNhdXNlXG4mIzQzO3RoZSBieXRlcyB0aGUga2VybmVsIGZpbmFsbHkgbG9hZHMgYXJlIG5vdCB0aGUgYnl0ZXMgdGhlIGRldmVsb3BlciBidWlsdCBhbmRcbiYjNDM7c2lnbmVkLiBCZXR3ZWVuIHRoZSB0d28sIGxpYmJwZiBhbmQgdGhlIGtlcm5lbCByZXdyaXRlIHRoZSBwcm9ncmFtOlxuJiM0MztcbiYjNDM7LSAqKm1hcCBmaWxlIGRlc2NyaXB0b3JzKiogYXJlIHBhdGNoZWQgaW50byBgYGxkX2ltbTY0YGAgaW5zdHJ1Y3Rpb25zXG4mIzQzOyAgKGBgQlBGX1BTRVVET19NQVBfRkRgYCksIGFuZCBhIG1hcCYjMzk7cyBmZCBpcyBhc3NpZ25lZCBhdCBsb2FkIHRpbWUsIHNvIGl0XG4mIzQzOyAgZGlmZmVycyBvbiBldmVyeSBydW47XG4mIzQzOy0gKipDTy1SRSByZWxvY2F0aW9ucyoqIHJld3JpdGUgZmllbGQgb2Zmc2V0cywgc2l6ZXMgYW5kIGV4aXN0ZW5jZSBmbGFncyBhZ2FpbnN0XG4mIzQzOyAgdGhlICpydW5uaW5nKiBrZXJuZWwmIzM5O3MgQlRGLCBzbyB0aGUgcmVzdWx0IGRpZmZlcnMgZnJvbSBvbmUga2VybmVsIHRvIHRoZSBuZXh0O1xuJiM0MzstICoqa2Z1bmMgYW5kIGtzeW0gcmVmZXJlbmNlcyoqIGFyZSByZXNvbHZlZCB0byBpZHMvYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nXG4mIzQzOyAga2VybmVsO1xuJiM0MzstICoqZ2xvYmFsIGRhdGEqKiAoYGAucm9kYXRhYGAvYGAuZGF0YWBgL2BgLmJzc2BgKSBpcyBjcmVhdGVkIGFuZCBzZWVkZWQgYXMgbWFwc1xuJiM0MzsgIGF0IGxvYWQuXG4mIzQzO1xuJiM0MztTbyBhIHNpZ25hdHVyZSBvdmVyIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgY2Fubm90IG1hdGNoIHRoZSByZWxvY2F0ZWRcbiYjNDM7aW5zdHJ1Y3Rpb25zIHRoZSB2ZXJpZmllciBlbmRzIHVwIGNoZWNraW5nLCBhbmQgdGhlIHJlbG9jYXRlZCBmb3JtIGNhbm5vdCBiZVxuJiM0Mztwcm9kdWNlZCBhaGVhZCBvZiB0aW1lIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgdGFyZ2V0IGtlcm5lbC4gVGhlcmUgaXMgbm9cbiYjNDM7Zml4ZWQgYnl0ZSBzdHJpbmcgdGhhdCBpcyBib3RoIHNpZ25hYmxlIGF0IGJ1aWxkIHRpbWUgYW5kIHdoYXQgdGhlIGtlcm5lbFxuJiM0MzthY3R1YWxseSBsb2FkcyAtIHdoaWNoIGlzIHdoeSBhIHByb2dyYW0gY2Fubm90IHNpbXBseSBiZSBzaWduZWQgYW5kIGxvYWRlZFxuJiM0MztkaXJlY3RseS5cbiYjNDM7XG4mIzQzO1RoZSB0cnVzdGVkIGxvYWRlclxuJiM0Mzs9PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO1RoZSBzb2x1dGlvbiBpcyB0byBtb3ZlIHRoYXQgc2V0dXAgd29yayAqaW50byogYSBzbWFsbCBCUEYgcHJvZ3JhbSAtIHRoZVxuJiM0MzsqKmxvYWRlcioqIC0gYW5kIHNpZ24gdGhlIGxvYWRlciBpbnN0ZWFkIG9mIHRoZSBpbmRpdmlkdWFsIHByb2dyYW1zLiBsaWJicGYmIzM5O3NcbiYjNDM7YGBnZW5fbG9hZGVyYGAgbWFjaGluZXJ5IChgYGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MYGAsIHRoZSBcJiMzNDtsaWdodCBza2VsZXRvblwmIzM0OylcbiYjNDM7ZW1pdHMgYSBgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGBgIHByb2dyYW0gd2hvc2UgYm9keSBwZXJmb3JtcyB0aGUgYnBmKCkgc3lzY2FsbHNcbiYjNDM7dGhhdCBjcmVhdGUgbWFwcywgYXBwbHkgcmVsb2NhdGlvbnMsIGFuZCBsb2FkIHRoZSByZWFsIHByb2dyYW1zLiBUaGUgcGF5bG9hZCBpdFxuJiM0MztpbnN0YWxscyAtIHRoZSBzZXJpYWxpemVkIHByb2dyYW1zLCBtYXAgZGVzY3JpcHRpb25zLCByZWxvY2F0aW9uIGRhdGEgYW5kXG4mIzQzO2luaXRpYWwgdmFsdWVzIC0gbGl2ZXMgaW4gYSBzZXBhcmF0ZSBhcnJheSBtYXAsIHRoZSAqKm1ldGFkYXRhIG1hcCoqXG4mIzQzOyhgYF9fbG9hZGVyLm1hcGBgKS5cbiYjNDM7XG4mIzQzO1NvIHRoZSB1bml0IG9mIHRydXN0IGlzIHRoZSBsb2FkZXIsIGFuZCB0aGUgc2lnbmluZyBjb250cmFjdCBpczo6XG4mIzQzO1xuJiM0MzsgICAgU2lnKElfbG9hZGVyIHx8IERfbWV0YSlcbiYjNDM7XG4mIzQzO3doZXJlIGBgSV9sb2FkZXJgYCBpcyB0aGUgbG9hZGVyJiMzOTtzIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgYGBEX21ldGFgYCBpcyB0aGVcbiYjNDM7Y29udGVudCBvZiB0aGUgbWV0YWRhdGEgbWFwLiBWZXJpZnlpbmcgdGhlIGxvYWRlciYjMzk7cyBzaWduYXR1cmUgZXN0YWJsaXNoZXMgdGhhdFxuJiM0Mztib3RoIHRoZSBsb2FkZXIgKmFuZCogdGhlIHBheWxvYWQgaXQgaXMgYWJvdXQgdG8gaW5zdGFsbCBhcmUgYXV0aGVudGljLiBUaGVcbiYjNDM7bG9hZGVyIGlzIHJlcHJvZHVjaWJsZTogYGBnZW5fbG9hZGVyYGAgYnVpbGRzIGl0IGZyb20gcHJpbWl0aXZlcyBzbyB0aGUgc2FtZVxuJiM0MztvYmplY3QgeWllbGRzIHRoZSBzYW1lIGJ5dGVzIG9uIGFueSBidWlsZCBob3N0LlxuJiM0MztcbiYjNDM7V2h5IHRoZSBsb2FkZXIgaXMgc2lnbmFibGUgd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3RcbiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1RoZSBsb2FkZXIgc2lkZXN0ZXBzIGV2ZXJ5IHJld3JpdGUgbGlzdGVkIGFib3ZlLCBiZWNhdXNlIHRoZSBieXRlcyB0aGF0IGFyZVxuJiM0MztzaWduZWQgYXJlICpyZWxvY2F0aW9uLWludmFyaWFudCo6XG4mIzQzO1xuJiM0MzstIFRoZSBsb2FkZXImIzM5O3Mgb3duIGluc3RydWN0aW9ucyBhcmUgYSBmaXhlZCBzZXF1ZW5jZSBvZiBicGYoKSBzeXNjYWxscyBlbWl0dGVkXG4mIzQzOyAgYnkgYGBnZW5fbG9hZGVyYGA7IHRoZXkgY2Fycnkgbm8gQ08tUkUgcmVsb2NhdGlvbnMgYW5kIHJlc29sdmUgbm8ga3N5bXMsIHNvXG4mIzQzOyAgdGhleSBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IGtlcm5lbC4gVGhlIG1ldGFkYXRhIG1hcCBpcyByZWZlcmVuY2VkIGJ5ICppbmRleCpcbiYjNDM7ICBpbnRvIGBgZmRfYXJyYXlgYCAoYGBCUEZfUFNFVURPX01BUF9JRFhgYCksIG5vdCBieSBhIGJha2VkLWluIGZpbGUgZGVzY3JpcHRvcixcbiYjNDM7ICBzbyBldmVuIHRoYXQgcmVmZXJlbmNlIGRvZXMgbm90IGNoYW5nZSBiZXR3ZWVuIGJ1aWxkIGFuZCBsb2FkLiBUaGUgbG9hZGVyXG4mIzQzOyAgaW5zdHJ1Y3Rpb24gYnl0ZXMgdGhlIGtlcm5lbCB2ZXJpZmllcyBhcmUgZXhhY3RseSB0aGUgYnl0ZXMgdGhhdCB3ZXJlIHNpZ25lZC5cbiYjNDM7LSBUaGUgbWV0YWRhdGEgbWFwIGlzIG9wYXF1ZSwgZnJvemVuIGRhdGEgLSB0aGUgc2VyaWFsaXplZCB0YXJnZXQgcHJvZ3JhbXMsXG4mIzQzOyAgdGhlaXIgcmVsb2NhdGlvbiByZWNvcmRzLCBtYXAgZGVzY3JpcHRpb25zIGFuZCBpbml0aWFsIHZhbHVlcy4gSXRzIGJ5dGVzIGFyZVxuJiM0MzsgIGlkZW50aWNhbCBhdCBidWlsZCB0aW1lIGFuZCBhdCBsb2FkIHRpbWUsIHNvIHRoZXkgYXJlIHNpbXBseSBhcHBlbmRlZCB0byB0aGVcbiYjNDM7ICBpbnN0cnVjdGlvbnMgYW5kIGNvdmVyZWQgYnkgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGVyZSBpcyBubyBzZXBhcmF0ZSBtZXRhZGF0YVxuJiM0MzsgIGhhc2ggdG8gY29tcHV0ZSBvciBjb21wYXJlKS5cbiYjNDM7XG4mIzQzO0FsbCB0aGUgaG9zdC1zcGVjaWZpYyByZXdyaXRpbmcgLSBjcmVhdGluZyBtYXBzLCBwYXRjaGluZyB0aGVpciBmZHMgaW50byB0aGVcbiYjNDM7dGFyZ2V0IHByb2dyYW1zLCBhcHBseWluZyBDTy1SRSwgcmVzb2x2aW5nIGtzeW1zLCBzZWVkaW5nIGdsb2JhbCBkYXRhIC0gc3RpbGxcbiYjNDM7aGFwcGVucywgYnV0IGl0IGhhcHBlbnMgKmluc2lkZSB0aGUgbG9hZGVyIGF0IHJ1bnRpbWUqLCBvbiB0aGUgdmVyaWZpZWRcbiYjNDM7bWV0YWRhdGEsICoqYWZ0ZXIqKiB0aGUga2VybmVsIGhhcyB2ZXJpZmllZCB0aGUgYGBpbnNucyB8fCBtZXRhZGF0YWBgIHNpZ25hdHVyZS5cbiYjNDM7VGhlIGtlcm5lbCBuZXZlciBoYXMgdG8gdmVyaWZ5IHRoZSByZWxvY2F0ZWQgdGFyZ2V0IHByb2dyYW1zOiBpdCB2ZXJpZmllcyB0aGVcbiYjNDM7bG9hZGVyIGFuZCBpdHMgaW5wdXRzIG9uY2UsIGFuZCB0cnVzdCB0cmFuc2ZlcnMgdG8gd2hhdGV2ZXIgdGhhdCBub3ctdHJ1c3RlZCxcbiYjNDM7ZGV0ZXJtaW5pc3RpYyBsb2FkZXIgaW5zdGFsbHMuIFRoZSByZWxvY2F0aW9uIHN0ZXAgaXMgbW92ZWQgZnJvbSBcJiMzNDtiZWZvcmUgdGhlXG4mIzQzO3NpZ25hdHVyZSBjYW4gYmUgY2hlY2tlZFwmIzM0OyB0byBcJiMzNDthZnRlciBhIHRydXN0ZWQgcHJvZ3JhbSBydW5zXCYjMzQ7IC0gd2hpY2ggaXMgZXhhY3RseVxuJiM0Mzt3aGF0IG1ha2VzIGl0IHNpZ25hYmxlLlxuJiM0MztcbiYjNDM7QmVjYXVzZSB0aGUgbWV0YWRhdGEgbWFwIGlzIHRoZSBsb2FkZXImIzM5O3Mgb25seSB1bnRydXN0ZWQgaW5wdXQsIHR3byBleGlzdGluZyBtYXBcbiYjNDM7cHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOlxuJiM0MztcbiYjNDM7RXhjbHVzaXZlIG1hcHNcbiYjNDM7ICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlXG4mIzQzOyAgICBhY2Nlc3NlZCBieSBhIHByb2dyYW0gd2hvc2UgZGlnZXN0IG1hdGNoZXMgdGhhdCBoYXNoLiBUaGUgdmVyaWZpZXIgZW5mb3JjZXNcbiYjNDM7ICAgIGBgbWFwLVx1MDAzZWV4Y2xfcHJvZ19zaGEgPT0gcHJvZy1cdTAwM2VkaWdlc3RgYCBmb3IgZXZlcnkgbWFwIGEgcHJvZ3JhbSB1c2VzLCBzbyB0aGVcbiYjNDM7ICAgIG1ldGFkYXRhIG1hcCBpcyBib3VuZCB0byBleGFjdGx5IHRoZSBzaWduZWQgbG9hZGVyIGFuZCBjYW5ub3QgYmUgc2hhcmVkIHdpdGhcbiYjNDM7ICAgIG9yIG11dGF0ZWQgYnkgYW5vdGhlciBwcm9ncmFtLlxuJiM0MztcbiYjNDM7RnJvemVuIG1hcHNcbiYjNDM7ICAgIFRoZSBtZXRhZGF0YSBtYXAgaXMgZnJvemVuIChgYEJQRl9NQVBfRlJFRVpFYGApIGJlZm9yZSB0aGUgbG9hZGVyIGlzIGxvYWRlZC5cbiYjNDM7ICAgIEZyZWV6aW5nIGJsb2NrcyBmdXJ0aGVyIHVzZXJzcGFjZSB3cml0ZXMsIHNvIHRoZSBieXRlcyBmb2xkZWQgaW50byB0aGVcbiYjNDM7ICAgIHNpZ25hdHVyZSBjYW5ub3QgY2hhbmdlIGJlZm9yZSB0aGUgbG9hZGVyIHJ1bnMuIChGcmVlemluZyBkb2VzIG5vdCBtYWtlIHRoZVxuJiM0MzsgICAgbWFwIHJlYWQtb25seSB0byB0aGUgbG9hZGVyIHByb2dyYW0gaXRzZWxmLCB3aGljaCBzdGlsbCB3cml0ZXMgY3JlYXRlZCBmaWxlXG4mIzQzOyAgICBkZXNjcmlwdG9ycyBiYWNrIGludG8gdGhlIGJsb2ImIzM5O3Mgc2NyYXRjaCBhcmVhLilcbiYjNDM7XG4mIzQzO0xvYWQtdGltZSB2ZXJpZmljYXRpb25cbiYjNDM7PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO1JhdGhlciB0aGFuIGhhdmUgdGhlIGxvYWRlciBjaGVjayBpdHMgb3duIG1ldGFkYXRhIGZyb20gd2l0aGluIEJQRiwgdGhlIGtlcm5lbFxuJiM0Mzt2ZXJpZmllcyBpdCBkaXJlY3RseSBhdCBgYEJQRl9QUk9HX0xPQURgYCwgd2l0aCBubyBuZXcgVUFQSS4gVGhlIG1lY2hhbmlzbVxuJiM0MztyZXVzZXMgdGhlIGV4aXN0aW5nIGBgZmRfYXJyYXlgYDpcbiYjNDM7XG4mIzQzOyMuIFVzZXJzcGFjZSBjcmVhdGVzIHRoZSBtZXRhZGF0YSBtYXAgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgc2V0IHRvIHRoZVxuJiM0MzsgICBsb2FkZXImIzM5O3MgZGlnZXN0LCBwb3B1bGF0ZXMgaXQsIGFuZCBmcmVlemVzIGl0LlxuJiM0MzsjLiBUaGUgbG9hZGVyIGlzIGxvYWRlZCB3aXRoIGBgc2lnbmF0dXJlYGAvYGBzaWduYXR1cmVfc2l6ZWBgL2Bga2V5cmluZ19pZGBgXG4mIzQzOyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYFxuJiM0MzsgICBzZXQgc28gdGhlIGtlcm5lbCBrbm93cyB0aGUgYXJyYXkmIzM5O3MgbGVuZ3RoLlxuJiM0MzsjLiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIHJ1bnMgaW5zaWRlIHRoZSB2ZXJpZmllciAoYGBicGZfY2hlY2soKWBgKSwgb25jZSBpdFxuJiM0MzsgICBoYXMgcmVzb2x2ZWQgdGhlIGBgZmRfYXJyYXlgYCBlbnRyaWVzIGludG8gdGhlIHByb2dyYW0mIzM5O3MgYGB1c2VkX21hcHNgYC4gVGhlXG4mIzQzOyAgIG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlcmVmb3JlIHRoZSB2ZXJ5IG9iamVjdHMgdGhlIHByb2dyYW1cbiYjNDM7ICAgYmluZHMgLSBhIHNpbmdsZSByZXNvbHV0aW9uIG9mIGBgZmRfYXJyYXlgYCwgbm90IGEgc2VwYXJhdGUgcmVhZCwgc28gdGhlXG4mIzQzOyAgIHZlcmlmaWVkIGJ5dGVzIGNhbm5vdCBiZSBzd2FwcGVkIGZvciBhIGRpZmZlcmVudCBtYXAgYWZ0ZXIgdGhlIGNoZWNrIChub1xuJiM0MzsgICB0aW1lLW9mLWNoZWNrL3RpbWUtb2YtdXNlIHdpbmRvdykuIEVhY2ggZm9sZGVkIG1hcCBtdXN0IGJlIGV4Y2x1c2l2ZSAoY2FycnlcbiYjNDM7ICAgYGBleGNsX3Byb2dfc2hhYGApIGFuZCBhIHBsYWluIGFycmF5IG1hcCAoYGBCUEZfTUFQX1RZUEVfQVJSQVlgYCk7IG9ubHkgYW5cbiYjNDM7ICAgYXJyYXkgbWFwIGV4cG9zZXMgaXRzIHZhbHVlIGJ1ZmZlciB0aHJvdWdoIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyKClgYCBhcyBhXG4mIzQzOyAgIGtlcm5lbCBhZGRyZXNzIHNwYW5uaW5nIGBgdmFsdWVfc2l6ZWBgIGJ5dGVzLiBBIG1hcCB0aGF0IGlzIG5vdCBleGNsdXNpdmUsIG5vdFxuJiM0MzsgICBmcm96ZW4sIG9yIG5vdCBhIHBsYWluIGFycmF5IGlzIHJlamVjdGVkLCB3aXRoIGEgdmVyaWZpZXIgbG9nIG1lc3NhZ2UgbmFtaW5nXG4mIzQzOyAgIHRoZSBvZmZlbmRpbmcgbWFwLiBUaGUga2VybmVsIGFwcGVuZHMgZWFjaCBtYXAmIzM5O3MgZnJvemVuXG4mIzQzOyAgIGNvbnRlbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIgYW5kIHZlcmlmaWVzIHRoZSBQS0NTIzcgc2lnbmF0dXJlIG92ZXIgdGhlXG4mIzQzOyAgIGNvbmNhdGVuYXRpb24gYGBpbnNucyB8fCBtZXRhZGF0YV8wIHx8IG1ldGFkYXRhXzEgfHwgLi4uYGAgaW4gYGB1c2VkX21hcHNgYFxuJiM0MzsgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuXG4mIzQzO1xuJiM0MztBIHNpZ25lZCBwcm9ncmFtIHRoZXJlZm9yZSB0YWtlcyBvbmUgb2YgZXhhY3RseSB0d28gc2hhcGVzLCBib3RoIGZ1bGx5XG4mIzQzO3N1cHBvcnRlZDpcbiYjNDM7XG4mIzQzOy0gKipObyBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250ID09IDBgYCk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gYXBwZW5kLCBzbyB0aGVcbiYjNDM7ICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlXG4mIzQzOyAgeWllbGRzIGBgQlBGX1NJR19WRVJJRklFRGBgIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gVGhpcyBpcyB0aGUgb3JkaW5hcnkgY2FzZVxuJiM0MzsgIGZvciBhIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIHNlcGFyYXRlIHBheWxvYWQ7IGl0IGlzICpub3QqXG4mIzQzOyAgcmVqZWN0ZWQgZm9yIFwmIzM0O21pc3NpbmdcJiMzNDsgbWV0YWRhdGEsIGJlY2F1c2UgaXQgaGFzIG5vbmUgdG8gY292ZXIuXG4mIzQzOy0gKipFeGNsdXNpdmUgYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCBcdTAwM2UgMGBgKTogZXZlcnkgZW50cnkgaXMgZXhjbHVzaXZlIGFuZFxuJiM0MzsgIGZvbGRlZCwgc28gdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLlxuJiM0MztcbiYjNDM7VGhlcmUgaXMgbm8gdGhpcmQgc2hhcGU6IGEgbm9uLWV4Y2x1c2l2ZSBtYXAgaW4gYSBzaWduZWQgcHJvZ3JhbSYjMzk7cyBgYGZkX2FycmF5YGBcbiYjNDM7aXMgcmVqZWN0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgbGVmdCBvdXQgb2YgdGhlIHNpZ25hdHVyZSwgc28gYSBwcm9ncmFtIGJvdW5kXG4mIzQzO3RvIGEgc2lnbmVkIGxvYWRlciBuZXZlciBoYXMgYSBtYXAgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3Zlci5cbiYjNDM7XG4mIzQzO1RoZSBkaWdlc3QgYmluZGluZyAoYGBleGNsX3Byb2dfc2hhID09IHByb2ctXHUwMDNlZGlnZXN0YGApIGlzIGVuZm9yY2VkIGJ5IHRoZVxuJiM0Mzt2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC1cbiYjNDM7YmVmb3JlIHRoZSB2ZXJpZmllciB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZSB0aGUgdGFnIC0gYGBwcm9nLVx1MDAzZWRpZ2VzdGBgIGlzXG4mIzQzO2NvbXB1dGVkIHVwIGZyb250IGluIHRoZSB2ZXJpZmllciwgb3ZlciB0aGUgdW5tb2RpZmllZCAoc2lnbmF0dXJlLWNvdmVyZWQpXG4mIzQzO2luc3RydWN0aW9ucywgZm9yIGFueSBzaWduZWQgbG9hZC5cbiYjNDM7XG4mIzQzO0NvdmVyYWdlIGlzIHRoZW4gZW5mb3JjZWQgYXMgdGhlIHZlcmlmaWVyIHJlc29sdmVzIGluc3RydWN0aW9ucywgYXQgdGhlIHBvaW50XG4mIzQzO2VhY2ggb2JqZWN0IGlzIGJvdW5kIHJhdGhlciB0aGFuIGJ5IGEgY291bnQgdGFrZW4gYWZ0ZXJ3YXJkcy4gT25jZSB0aGUgc2lnbmF0dXJlXG4mIzQzO2hhcyBiZWVuIHZlcmlmaWVkLCBiaW5kaW5nIGFueSBmdXJ0aGVyIG1hcCBpcyByZWZ1c2VkOiBhIG1hcCByZWFjaGVkIGJ5IGFcbiYjNDM7ZGlyZWN0bHktcmVmZXJlbmNlZCBmZCwgb3IgYSBtYXAgc3dhcHBlZCBpbnRvIGFuIGBgZmRfYXJyYXlgYCBzbG90IHRoZSBsb2FkZXJcbiYjNDM7cmVhZHMsIGlzIG5vdCBhbW9uZyB0aG9zZSBhbHJlYWR5IGZvbGRlZCwgc28gaXQgaXMgcmVqZWN0ZWQgdGhlIG1vbWVudCB0aGVcbiYjNDM7dmVyaWZpZXIgdHJpZXMgdG8gYmluZCBpdC4gQSBCVEYgaXMgcmVmdXNlZCBvdXRyaWdodCBmb3IgYSBzaWduZWQgcHJvZ3JhbSAtIGFcbiYjNDM7a3N5bSBvciBhIEJURiBmZCBpbiBgYGZkX2FycmF5YGAsIHdoZXRoZXIgcmVzb2x2ZWQgdXAgZnJvbnQgb3IgbGF6aWx5IGZvciBhXG4mIzQzO21vZHVsZSBrZnVuYywgaXMgcmVqZWN0ZWQgd2hlbiBpdCB3b3VsZCBiZSBib3VuZC4gVG9nZXRoZXIgd2l0aCB0aGUgZm9sZCBydWxlXG4mIzQzO2Fib3ZlIHRoaXMga2VlcHMgdGhlIHZlcmRpY3QgYmluYXJ5OiBhIHNpZ25lZCBwcm9ncmFtIGNhbm5vdCB1c2UgYSBtYXAgaXRzXG4mIzQzO3NpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciwgYW5kIGEgZGlmZmVyZW50IGJ1dCBlcXVhbGx5IGRpZ2VzdC1ib3VuZCBtYXAgY2Fubm90IGJlXG4mIzQzO3N1YnN0aXR1dGVkIGF0IGFuIGBgZmRfYXJyYXlgYCBzbG90LiBOb24tZXhjbHVzaXZlIG1hcHMgYXJlIG5ldmVyIGZvbGRlZCwgc28gYVxuJiM0MztzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIG9uZSBhdCBhbGwuXG4mIzQzO1xuJiM0MztUaGUgdmVyZGljdFxuJiM0Mzs9PT09PT09PT09PVxuJiM0MztcbiYjNDM7QSBwcm9ncmFtIGlzIGVpdGhlciB1bnNpZ25lZCBvciBmdWxseSB2ZXJpZmllZCAtIHRoZXJlIGlzIG5vIGludGVybWVkaWF0ZVxuJiM0MztzdGF0ZS4gVGhlIG91dGNvbWUgaXMgcmVjb3JkZWQgaW4gYGBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdGBgOlxuJiM0MztcbiYjNDM7Li4gY29kZS1ibG9jazo6IGNcbiYjNDM7XG4mIzQzOyAgICBlbnVtIGJwZl9zaWdfdmVyZGljdCB7XG4mIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLFxuJiM0MzsgICAgICAgICAgICBCUEZfU0lHX1ZFUklGSUVELFxuJiM0MzsgICAgfTtcbiYjNDM7XG4mIzQzO2BgQlBGX1NJR19WRVJJRklFRGBgIG1lYW5zIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgYW5kIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zXG4mIzQzOyphbmQqIHRoZSBmcm96ZW4gY29udGVudHMgb2YgZXZlcnkgZXhjbHVzaXZlIG1hcCB0aGUgcHJvZ3JhbSB1c2VzOlxuJiM0MztcbiYjNDM7LSBGb3IgYW4gb3JkaW5hcnksIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgd2hvbGVcbiYjNDM7ICBhcnRpZmFjdCBhbmQgaXQgdXNlcyBubyBleGNsdXNpdmUgbWFwcywgc28gYSB2YWxpZCBpbnN0cnVjdGlvbiBzaWduYXR1cmUgaXNcbiYjNDM7ICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLlxuJiM0MzstIEZvciBhIHNpZ25lZCBsb2FkZXIgdGhlIG1ldGFkYXRhIG1hcCBpcyBleGNsdXNpdmUsIHNvIGl0cyBjb250ZW50cyBhcmUgZm9sZGVkXG4mIzQzOyAgaW4gYW5kIHRoZSBzaWduYXR1cmUgY292ZXJzIGBgaW5zbnMgfHwgbWV0YWRhdGFgYC5cbiYjNDM7XG4mIzQzO1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBcJiMzNDtpbnN0cnVjdGlvbnMgdmVyaWZpZWQgYnV0IG1ldGFkYXRhIG5vdFwmIzM0OyB2ZXJkaWN0OiBhXG4mIzQzO3NpZ25lZCBsb2FkZXIgdGhhdCBmYWlscyB0byBjb3ZlciBpdHMgbWV0YWRhdGEgaXMgKnJlamVjdGVkKiAoc2VlIGFib3ZlKSwgbm90XG4mIzQzO3JlY29yZGVkIHdpdGggYSB3ZWFrZXIgdmVyZGljdC4gYGBCUEZfU0lHX1ZFUklGSUVEYGAgdGhlcmVmb3JlIGFsd2F5cyBtZWFucyB0aGVcbiYjNDM7cHJvZ3JhbSBhbmQgZXZlcnl0aGluZyB0aGUgc2lnbmF0dXJlIGlzIHJlc3BvbnNpYmxlIGZvciBhcmUgYXV0aGVudGljLCB3aGljaCBpc1xuJiM0Mzt3aGF0IGEgcG9saWN5IGNhbiByZWx5IG9uLlxuJiM0MztcbiYjNDM7QWxvbmdzaWRlIHRoZSB2ZXJkaWN0IHRoZSBrZXJuZWwgcmVjb3JkcyB3aGljaCBrZXlyaW5nIHZhbGlkYXRlZCB0aGUgc2lnbmF0dXJlO1xuJiM0MztzZWUgYEtleXJpbmdzYF8uXG4mIzQzO1xuJiM0MztFbmZvcmNlbWVudCB2aWEgTFNNc1xuJiM0Mzs9PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7U2lnbmluZyBvbmx5ICpyZWNvcmRzKiBhIHZlcmRpY3Q7IGFuIExTTSB0dXJucyBpdCBpbnRvIHBvbGljeS4gVGhlIHZlcmRpY3QgYW5kXG4mIzQzO2tleXJpbmcgZmllbGRzIGxpdmUgaW4gYGBzdHJ1Y3QgYnBmX3Byb2dfYXV4YGAsIHNvIGEgQlBGIExTTSBwcm9ncmFtIGNhbiByZWFkXG4mIzQzO3RoZW0gZGlyZWN0bHkgKHNlZSBEb2N1bWVudGF0aW9uL2JwZi9wcm9nX2xzbS5yc3QgZm9yIHdyaXRpbmcgYW5kIGF0dGFjaGluZyBCUEZcbiYjNDM7TFNNIHByb2dyYW1zKTsgdGhlIHNhbWUgZmllbGRzIGFyZSBlcXVhbGx5IGF2YWlsYWJsZSB0byBpbi10cmVlIExTTXMgc3VjaCBhc1xuJiM0MztJUEUuIFR3byBob29rcyBhcmUgdXNlZnVsIGF0IGRpZmZlcmVudCBwb2ludHMgb2YgdGhlIGxvYWQ6IHRoZSBkZWRpY2F0ZWRcbiYjNDM7YGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYCBnYXRlcyBhZG1pc3Npb24gYmVmb3JlIHRoZSBtYWluIHZlcmlmaWNhdGlvbiB3b3JrLFxuJiM0MzthbmQgdGhlIGV4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIG9ic2VydmVzIGEgcHJvZ3JhbSB0aGF0IGhhcyBmdWxseVxuJiM0Mztsb2FkZWQuXG4mIzQzO1xuJiM0MztBZG1pc3Npb246IGBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGBcbiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4mIzQzO1xuJiM0MztUaGlzIGhvb2sgZ2F0ZXMgYWRtaXNzaW9uICoqZm9yIGV2ZXJ5IGxvYWQqKiwgZnJvbSBhIHNpbmdsZSBjYWxsIHNpdGUgaW5zaWRlIHRoZVxuJiM0Mzt2ZXJpZmllciAoYGBicGZfY2hlY2soKWBgKSwgYmVmb3JlIHRoZSBtYWluIHZlcmlmaWNhdGlvbiB3b3JrLiBJdCBydW5zIGFmdGVyIHRoZVxuJiM0MztvcHRpb25hbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBzbyB0aGUgdmVyZGljdCBhbmQga2V5cmluZyBmaWVsZHMgYXJlIGZpbmFsIC0gdGhlXG4mIzQzO2hvb2sgY2FuIHNlZSB3aGV0aGVyLCBhbmQgaG93IHN0cm9uZ2x5LCB0aGUgcHJvZ3JhbSB3YXMgc2lnbmVkLCB3aGljaCBrZXlyaW5nXG4mIzQzO3ZhbGlkYXRlZCBpdCwgdGhlIGxvYWQgYGBhdHRyYGAsIHRoZSBCUEYgdG9rZW4gYW5kIHdoZXRoZXIgdGhlIGxvYWQgY2FtZSBmcm9tIHRoZVxuJiM0MztrZXJuZWwuIEZvciBhIHNpZ25lZCBsb2FkIHRoZSB2ZXJkaWN0IGlzIGBgQlBGX1NJR19WRVJJRklFRGBgIGhlcmUgKHRoZSBzaWduYXR1cmVcbiYjNDM7aGFzIGp1c3QgYmVlbiBjaGVja2VkKTsgZm9yIGFuIHVuc2lnbmVkIGxvYWQgaXQgaXMgYGBCUEZfU0lHX1VOU0lHTkVEYGAuXG4mIzQzO1xuJiM0MztUaGlzIGlzIHRoZSBwbGFjZSBmb3IgKmNvYXJzZSBhZG1pc3Npb24qIHRoYXQgbXVzdCBhbHNvIHNlZSB1bnNpZ25lZCBhbmRcbiYjNDM7bm90LXlldC12ZXJpZmllZCBsb2FkczogcmVxdWlyZSBhIHNpZ25hdHVyZSBhdCBhbGwsIHJlc3RyaWN0IHRoZSBhY2NlcHRhYmxlXG4mIzQzO2tleXJpbmcsIHJlc3RyaWN0IHdoaWNoIHRva2VuL2NyZWRlbnRpYWxzIG1heSBsb2FkIEJQRiwgYXBwbHkgcGVyLXByb2dyYW0tdHlwZVxuJiM0MztydWxlcywgb3IgYXVkaXQgZXZlcnkgYXR0ZW1wdC4gSXQgaXMgdGhlIHByaW1hcnkgZGVueSBwb2ludC5cbiYjNDM7XG4mIzQzO09uZSBzdWJ0bGV0eTogdGhpcyBob29rIHJ1bnMgKmJlZm9yZSogdGhlIHZlcmlmaWVyIGZpbmlzaGVzIGl0cyB3b3JrLCBzb1xuJiM0MztgYEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgb25seSBcJiMzNDt2YWxpZGx5IHNpZ25lZFwmIzM0OyAtIG5vdCBcJiMzNDtsb2FkZWRcJiMzNDsuIEFsbG93aW5nXG4mIzQzO2EgbG9hZCBhdCB0aGlzIHBvaW50IGxldHMgaXQgKnByb2NlZWQqOyBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIHByb2dyYW0gd2lsbFxuJiM0Mztsb2FkLiBBIHZhbGlkbHkgc2lnbmVkIHByb2dyYW0gY2FuIHN0aWxsIGJlIHJlamVjdGVkIGFmdGVyd2FyZHMgb24gdHdvXG4mIzQzO2luZGVwZW5kZW50IGdyb3VuZHM6IHRoZSB2ZXJpZmllciBtYXkgcmVqZWN0IGl0IGxpa2UgYW55IG90aGVyIHByb2dyYW0gKHVuc2FmZVxuJiM0MzttZW1vcnkgYWNjZXNzLCBiYWQgY29udHJvbCBmbG93LCByZXNvdXJjZSBsaW1pdHMsIC4uLiksIGFuZCB0aGUga2VybmVsIHNlcGFyYXRlbHlcbiYjNDM7cmVmdXNlcyAtIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMgYW5kIGJpbmRzIGVhY2ggb2JqZWN0IC0gYW55IG1hcFxuJiM0Mzt0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIG9yIGFueSBCVEYgYXQgYWxsLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBob29rXG4mIzQzO3JldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcbiYjNDM7KGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxuJiM0Mzt2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC5cbiYjNDM7XG4mIzQzO0EgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFwmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGxcJiMzNDs6IGFjY2VwdCBwcm9ncmFtc1xuJiM0MztzaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZVxuJiM0MztrZXkva2V5cmluZyBpdCB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGFcbiYjNDM7dGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXG4mIzQzO2F1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4mIzQzO1xuJiM0MzsuLiBjb2RlLWJsb2NrOjogY1xuJiM0MztcbiYjNDM7ICAgIC8qIFNlcmlhbHMgb2YgdXNlciBrZXlzL2tleXJpbmdzIHdlIGFkZGl0aW9uYWxseSB0cnVzdC4gKi9cbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4mIzQzOyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi9cbiYjNDM7ICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTtcbiYjNDM7ICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4mIzQzOyAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MzsgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi9cbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4mIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgMSBcdTAwM2NcdTAwM2MgMTYpO1xuJiM0MzsgICAgfSBhdWRpdCBTRUMoXCYjMzQ7Lm1hcHNcJiMzNDspO1xuJiM0MztcbiYjNDM7ICAgIHN0cnVjdCBkZWNpc2lvbiB7IF9fdTMyIHByb2dfdHlwZSwgdmVyZGljdCwga3R5cGU7IF9fczMyIHNlcmlhbCwgcmV0OyB9O1xuJiM0MztcbiYjNDM7ICAgIFNFQyhcJiMzNDtsc20vYnBmX3Byb2dfbG9hZFwmIzM0OylcbiYjNDM7ICAgIGludCBCUEZfUFJPRyhhZG1pdCwgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0cixcbiYjNDM7ICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbiwgYm9vbCBrZXJuZWwpXG4mIzQzOyAgICB7XG4mIzQzOyAgICAgICAgICAgIF9fdTMyIHZlcmRpY3QgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdDtcbiYjNDM7ICAgICAgICAgICAgX191MzIga3R5cGUgICA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGU7XG4mIzQzOyAgICAgICAgICAgIF9fczMyIHNlcmlhbCAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ19zZXJpYWw7XG4mIzQzOyAgICAgICAgICAgIHN0cnVjdCBkZWNpc2lvbiAqZDtcbiYjNDM7ICAgICAgICAgICAgaW50IHJldCA9IDA7XG4mIzQzO1xuJiM0MzsgICAgICAgICAgICBpZiAoa2VybmVsKVxuJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXG4mIzQzO1xuJiM0MzsgICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKVxuJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSB2YWxpZGx5IHNpZ25lZCAqL1xuJiM0MzsgICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiBcdTAwMjZcdTAwMjZcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dHJ1c3RlZF91c2VyX2tleXMsIFx1MDAyNnNlcmlhbCkpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi9cbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIGQgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFx1MDAyNmF1ZGl0LCBzaXplb2YoKmQpLCAwKTtcbiYjNDM7ICAgICAgICAgICAgaWYgKGQpIHtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICBkLVx1MDAzZXByb2dfdHlwZSA9IGF0dHItXHUwMDNlcHJvZ190eXBlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNldmVyZGljdCA9IHZlcmRpY3Q7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2VrdHlwZSA9IGt0eXBlO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlc2VyaWFsID0gc2VyaWFsO1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlcmV0ID0gcmV0O1xuJiM0MzsgICAgICAgICAgICAgICAgICAgIGJwZl9yaW5nYnVmX3N1Ym1pdChkLCAwKTsgICAgICAgLyogcmVjb3JkIGFsbG93ICphbmQqIGRlbnkgKi9cbiYjNDM7ICAgICAgICAgICAgfVxuJiM0MzsgICAgICAgICAgICByZXR1cm4gcmV0O1xuJiM0MzsgICAgfVxuJiM0MztcbiYjNDM7T2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGBcbiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZXBhcmF0ZSBcJiMzNDttZXRhZGF0YSBhdHRlc3RlZFwmIzM0OyBob29rLiBUaGUgY292ZXJhZ2UgY2hlY2tcbiYjNDM7YWJvdmUgaXMgZW5mb3JjZWQgYnkgdGhlIGtlcm5lbCB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzXG4mIzQzO3RvIGNvdmVyIGl0cyBtZXRhZGF0YSBuZXZlciBsb2FkcyBhbmQgYW4gTFNNIG5ldmVyIGhhcyB0byByZS1lc3RhYmxpc2ggdGhhdFxuJiM0MztmYWN0LiBUbyAqYWN0IG9uKiBhIHByb2dyYW0gdGhhdCBoYXMgc3VjY2Vzc2Z1bGx5IGFuZCBmdWxseSBsb2FkZWQsIHVzZSB0aGVcbiYjNDM7ZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgaG9vayAoYGBsc20vYnBmX3Byb2dgYCksIHdoaWNoIGZpcmVzIGZyb21cbiYjNDM7YGBicGZfcHJvZ19uZXdfZmQoKWBgIC0gYWZ0ZXIgdGhlIHZlcmlmaWVyLCBhZnRlciB0aGUgY292ZXJhZ2UgY2hlY2ssIGFuZCBhZnRlclxuJiM0MztgYGJwZl9wcm9nX2FsbG9jX2lkKClgYC4gUmVsYXRpdmUgdG8gdGhlIGFkbWlzc2lvbiBob29rIHRoaXMgcG9pbnQgaXMgc3RyaWN0bHlcbiYjNDM7bGF0ZXIgYW5kIHN0cm9uZ2VyOlxuJiM0MztcbiYjNDM7LSB0aGUgcHJvZ3JhbSBoYXMgYW4gaWQgKGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlaWRgYCksIHNvIGl0IGNhbiBiZSByZWNvcmRlZCBvciBjb3JyZWxhdGVkXG4mIzQzOyAgd2l0aCBsYXRlciBldmVudHM7XG4mIzQzOy0gYGB2ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgKipmdWxseSoqIHZlcmlmaWVkIC0gYSBwcm9ncmFtXG4mIzQzOyAgdGhhdCB1c2VkIGEgbWFwIHRoZSBzaWduYXR1cmUgZG9lcyBub3QgY292ZXIgd2FzIGFscmVhZHkgcmVqZWN0ZWQsIHNvIGl0IGNhbm5vdFxuJiM0MzsgIHJlYWNoIHRoaXMgcG9pbnQ7XG4mIzQzOy0gaXQgb2JzZXJ2ZXMgb25seSBwcm9ncmFtcyB0aGF0IGFjdHVhbGx5IGxvYWRlZDsgYSBmYWlsZWQgbG9hZCBuZXZlciBtaW50cyBhblxuJiM0MzsgIGZkLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoaXMgaG9vay5cbiYjNDM7XG4mIzQzO0l0IHRha2VzIG9ubHkgdGhlIGBgcHJvZ2BgIGFuZCBhIG5vbi16ZXJvIHJldHVybiBzdGlsbCBhYm9ydHMgKHRoZSBmZCBpcyBub3RcbiYjNDM7aGFuZGVkIG91dCksIHNvIGl0IGNhbiB2ZXRvIGFzIHdlbGwgYXMgb2JzZXJ2ZS4gT25lIHdyaW5rbGU6IGl0IGFsc28gZmlyZXMgb25cbiYjNDM7b3RoZXIgcGF0aHMgdGhhdCBtaW50IGEgbmV3IHByb2dyYW0gZmQgLSBub3RhYmx5IGBgYnBmX3Byb2dfZ2V0X2ZkX2J5X2lkKClgYCAtXG4mIzQzO25vdCBqdXN0IG9uIGEgZnJlc2ggbG9hZC4gQmVjYXVzZSB0aGUgcHJvZ3JhbSBhbHJlYWR5IGhhcyBpdHMgaWQgaGVyZSwgYW4gTFNNXG4mIzQzO2NhbiB0ZWxsIHRoZSB0d28gYXBhcnQgd2l0aCBhIHNtYWxsIGhhc2ggbWFwOiB0aGUgKmZpcnN0KiB0aW1lIGFuIGlkIGlzIHNlZW4gaXNcbiYjNDM7dGhlIGxvYWQ7IGEgbGF0ZXIgc2lnaHRpbmcgb2YgdGhlIHNhbWUgaWQgaXMganVzdCBhbm90aGVyIGZkIHRvIGEgcHJvZ3JhbSB0aGF0XG4mIzQzO2FscmVhZHkgZXhpc3RzLlxuJiM0MztcbiYjNDM7VG8gYm91bmQgdGhlIG1hcCBhbmQgbGV0IGEgcmV1c2VkIGlkIHJlYWQgYXMgYSBmcmVzaCBsb2FkLCB0aGlzIGNhbiBiZSBwYWlyZWRcbiYjNDM7d2l0aCBgYHNlY3VyaXR5X2JwZl9wcm9nX2ZyZWUoKWBgIChgYGxzbS9icGZfcHJvZ19mcmVlYGApLCB3aGljaCBkZWxldGVzIHRoZVxuJiM0MztlbnRyeSBvbiB0ZWFyZG93biAtIGtleWVkIGJ5IHRoZSBzYW1lIGBgcHJvZ2BgIHBvaW50ZXIsIHNpbmNlXG4mIzQzO2BgYnBmX3Byb2dfZnJlZV9pZCgpYGAgaGFzIGFscmVhZHkgY2xlYXJlZCBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZWlkYGAgdG8gYGAwYGAgYnkgdGhlIHRpbWVcbiYjNDM7dGhhdCBob29rIHJ1bnMuIChJbGx1c3RyYXRpdmUgLSBwcml2aWxlZ2VkIExTTSwgZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiYjNDM7XG4mIzQzOy4uIGNvZGUtYmxvY2s6OiBjXG4mIzQzO1xuJiM0MzsgICAgc3RydWN0IHJlYyB7IF9fdTMyIGlkLCBrdHlwZTsgX19zMzIgc2VyaWFsOyB9O1xuJiM0MztcbiYjNDM7ICAgIHN0cnVjdCB7XG4mIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4mIzQzOyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fdTY0KTsgICAgICAgICAgICAgLyogc3RydWN0IGJwZl9wcm9nICogLS0gc3RhYmxlIGlkICovXG4mIzQzOyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgc3RydWN0IHJlYyk7XG4mIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNDA5Nik7XG4mIzQzOyAgICB9IGxpdmUgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzOyAgICBTRUMoXCYjMzQ7bHNtL2JwZl9wcm9nXCYjMzQ7KSAgICAgICAgICAgIC8qIGZpcmVzIGFmdGVyIGxvYWQgYW5kIG9uIGV2ZXJ5IGxhdGVyIGZkICovXG4mIzQzOyAgICBpbnQgQlBGX1BST0cob2JzZXJ2ZSwgc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuJiM0MzsgICAge1xuJiM0MzsgICAgICAgICAgICBfX3U2NCBrZXkgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpcHJvZztcbiYjNDM7ICAgICAgICAgICAgc3RydWN0IHJlYyByO1xuJiM0MztcbiYjNDM7ICAgICAgICAgICAgaWYgKHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4mIzQzOyAgICAgICAgICAgIGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNmxpdmUsIFx1MDAyNmtleSkpXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgLyogc2VlbiBiZWZvcmU6IGEgbGF0ZXIgZmQsIG5vdCBhIGxvYWQgKi9cbiYjNDM7XG4mIzQzOyAgICAgICAgICAgIC8qIEZpcnN0IHNpZ2h0aW5nID09IHRoaXMgcHJvZ3JhbSBqdXN0IGxvYWRlZDsgaWQgaXMgdmFsaWQgaGVyZS4gKi9cbiYjNDM7ICAgICAgICAgICAgci5pZCAgICAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VpZDtcbiYjNDM7ICAgICAgICAgICAgci5rdHlwZSAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlO1xuJiM0MzsgICAgICAgICAgICByLnNlcmlhbCA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcbiYjNDM7ICAgICAgICAgICAgYnBmX21hcF91cGRhdGVfZWxlbShcdTAwMjZsaXZlLCBcdTAwMjZrZXksIFx1MDAyNnIsIEJQRl9OT0VYSVNUKTtcbiYjNDM7ICAgICAgICAgICAgLyogLi4uIG5ld2x5LWxvYWRlZCB2ZXJpZmllZC1wcm9ncmFtIGFjdGlvbiwgZS5nLiByZWNvcmQgci5pZCAuLi4gKi9cbiYjNDM7ICAgICAgICAgICAgcmV0dXJuIDA7XG4mIzQzOyAgICB9XG4mIzQzO1xuJiM0MztQdXR0aW5nIHRoZW0gdG9nZXRoZXI6IHRvICpyZXF1aXJlKiB2ZXJpZmllZCBCUEYsIGRlbnkgYXQgdGhlIGFkbWlzc2lvbiBob29rXG4mIzQzO3VubGVzcyB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCAoYW5kLCBpZiBkZXNpcmVkLCByZXN0cmljdCB0aGVcbiYjNDM7a2V5cmluZykuIFRoZSBrZXJuZWwgdGhlbiBndWFyYW50ZWVzIHRoYXQgYW55IHByb2dyYW0gd2hpY2ggYWN0dWFsbHkgbG9hZHMgd2l0aFxuJiM0Mzt0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvXG4mIzQzO2EgZGVueS1ieS1kZWZhdWx0IGFkbWlzc2lvbiBwb2xpY3kgbmVlZHMgbm8gc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LiBVc2VcbiYjNDM7YGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxuJiM0Mzt0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHNcbiYjNDM7bGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoLCBmb3IgZXhhbXBsZSwgXCYjMzQ7dmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5XCYjMzQ7XG4mIzQzO2Zyb20gXCYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleVwmIzM0Oy4gUG9saWN5IExTTXMgc3VjaCBhcyBJUEUgY29uc3VtZSB0aGUgc2FtZSBob29rcyB0b1xuJiM0MztlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYuXG4mIzQzO1xuJiM0MztLZXlyaW5nc1xuJiM0Mzs9PT09PT09PVxuJiM0MztcbiYjNDM7YGBrZXlyaW5nX2lkYGAgc2VsZWN0cyB0aGUgdHJ1c3RlZCBrZXlyaW5nIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkXG4mIzQzO2FnYWluc3QuIFRoZSB3ZWxsLWtub3duIGlkcyBgYDBgYCAoYnVpbHRpbiksIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4mIzQzO2FuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XG4mIzQzO2FueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBzZXJpYWwgb2YgYSB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcuXG4mIzQzO1RoZSBrZXlyaW5nIGlzIGxvb2tlZCB1cCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXG4mIzQzO3NpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXG4mIzQzO3ZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBzbyBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aCBhXG4mIzQzO3NpZ25hdHVyZSBhbHdheXMgaGFzIGNvbnNpc3RlbnQga2V5cmluZyBmaWVsZHMgcmVjb3JkZWQuXG4mIzQzO1xuJiM0MztUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDpcbiYjNDM7XG4mIzQzO2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbiYjNDM7ICAgIENsYXNzaWZpZWQgcHVyZWx5IGZyb20gYGBrZXlyaW5nX2lkYGAgd2hlbmV2ZXIgdGhlIHByb2dyYW0gaXMgc2lnbmVkOlxuJiM0MzsgICAgYGBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTmBgLCBgYF9TRUNPTkRBUllgYCwgYGBfUExBVEZPUk1gYCBmb3IgdGhlIHN5c3RlbVxuJiM0MzsgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbiYjNDM7ICAgIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWQgcHJvZ3JhbS5cbiYjNDM7XG4mIzQzO2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbiYjNDM7ICAgIFNldCAqKm9ubHkqKiBvbiBhIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uLCB0byB0aGUgc2VyaWFsIG9mIHRoZVxuJiM0MzsgICAgKip1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXG4mIzQzOyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcbiYjNDM7ICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmdcbiYjNDM7ICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcmIzM5O3NcbiYjNDM7ICAgIHNlcmlhbC4gVGhlIHN5c3RlbSBrZXlyaW5ncyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZCBleHBvc2Ugbm8gc2VyaWFsXG4mIzQzOyAgICBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciBidWlsdGluLCBzZWNvbmRhcnkgYW5kIHBsYXRmb3JtXG4mIzQzOyAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVyb1xuJiM0MzsgICAgYGBrZXlyaW5nX3NlcmlhbGBgIGlzIGV4YWN0bHkgXCYjMzQ7dmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoXG4mIzQzOyAgICB0aGlzIHNlcmlhbFwmIzM0Oy5cbiYjNDM7XG4mIzQzOy4uIGxpc3QtdGFibGU6OlxuJiM0MzsgICA6aGVhZGVyLXJvd3M6IDFcbiYjNDM7XG4mIzQzOyAgICogLSBgYGtleXJpbmdfaWRgYFxuJiM0MzsgICAgIC0gYGBrZXlyaW5nX3R5cGVgYFxuJiM0MzsgICAgIC0gYGBrZXlyaW5nX3NlcmlhbGBgXG4mIzQzOyAgICogLSAobm8gc2lnbmF0dXJlKVxuJiM0MzsgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgXG4mIzQzOyAgICAgLSBgYDBgYFxuJiM0MzsgICAqIC0gYGAwYGBcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYFxuJiM0MzsgICAgIC0gYGAwYGBcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4mIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUllgYFxuJiM0MzsgICAgIC0gYGAwYGBcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNYGBcbiYjNDM7ICAgICAtIGBgMGBgXG4mIzQzOyAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYFxuJiM0MzsgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZ1xuJiM0MztcbiYjNDM7UHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdFxuJiM0Mzs9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7YGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjpcbiYjNDM7XG4mIzQzOyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBcdTAwM2Nwcml2YXRlX2tleS5wZW1cdTAwM2UgLWkgXHUwMDNjY2VydGlmaWNhdGUueDUwOVx1MDAzZSBcXFxuJiM0MzsgICAgICAgICAgICBvYmouYnBmLm8gXHUwMDNlIG9iai5sc2tlbC5oXG4mIzQzO1xuJiM0MztgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlc1xuJiM0MztzaWduaW5nOyBgYC1rYGAgYW5kIGBgLWlgYCBzdXBwbHkgdGhlIHNpZ25pbmcga2V5IGFuZCBpdHMgWC41MDkgY2VydGlmaWNhdGUuXG4mIzQzO2BgYnBmdG9vbGBgIHNpZ25zIGBgaW5zbnMgfHwgbWV0YWRhdGFgYCAtIHRoZSBleGFjdCBieXRlcyB0aGUga2VybmVsXG4mIzQzO3JlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXJcbiYjNDM7aW5zdHJ1Y3Rpb25zIHNvIHRoZSBtZXRhZGF0YSBtYXAgY2FuIGJlIGJvdW5kIHRvIHRoZSBsb2FkZXIuIFRoZSBzaWduYXR1cmUsXG4mIzQzO2NlcnRpZmljYXRlIGFuZCBoYXNoIGFyZSBlbWJlZGRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlcjsgbG9hZGluZyB0aGUgc2tlbGV0b25cbiYjNDM7cGVyZm9ybXMgdGhlIGNyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXG4mIzQzO1xuJiM0MztBdCBydW50aW1lIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjaG9zZW4ga2V5cmluZyAoZm9yXG4mIzQzO2V4YW1wbGUgYWRkZWQgdG8gdGhlIHNlc3Npb24ga2V5cmluZywgb3IgYnVpbHQgaW50byB0aGUga2VybmVsJiMzOTtzIGJ1aWx0aW4gdHJ1c3RlZFxuJiM0MztrZXlyaW5nKSBmb3IgdmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuXG4mIzQzO1xuJiM0MztVQVBJIHJlZmVyZW5jZVxuJiM0Mzs9PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7YGBCUEZfUFJPR19MT0FEYGAgKGBgdW5pb24gYnBmX2F0dHJgYCk6XG4mIzQzO1xuJiM0MztgYHNpZ25hdHVyZWBgLCBgYHNpZ25hdHVyZV9zaXplYGBcbiYjNDM7ICAgIFBvaW50ZXIgdG8gYW5kIGxlbmd0aCBvZiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iLlxuJiM0MztcbiYjNDM7YGBrZXlyaW5nX2lkYGBcbiYjNDM7ICAgIFRydXN0ZWQga2V5cmluZyBzZWxlY3RvciAoc2VlIGBLZXlyaW5nc2BfKS5cbiYjNDM7XG4mIzQzO2BgZmRfYXJyYXlgYCwgYGBmZF9hcnJheV9jbnRgYFxuJiM0MzsgICAgQXJyYXkgb2YgbWFwIGZpbGUgZGVzY3JpcHRvcnMgYm91bmQgdG8gdGhlIHByb2dyYW0uIGBgZmRfYXJyYXlfY250YGAgbXVzdCBiZVxuJiM0MzsgICAgc2V0IGZvciB0aGUga2VybmVsIHRvIHNjYW4gdGhlIGFycmF5LiBXaGVuIGEgc2lnbmF0dXJlIGlzIHByZXNlbnQsIGV2ZXJ5IG1hcFxuJiM0MzsgICAgaW4gdGhlIGFycmF5IG11c3QgYmUgZXhjbHVzaXZlOyBpdHMgZnJvemVuIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGVcbiYjNDM7ICAgIHZlcmlmaWVkIGJ1ZmZlciwgYW5kIGEgbm9uLWV4Y2x1c2l2ZSBlbnRyeSBpcyByZWplY3RlZC5cbiYjNDM7XG4mIzQzO2BgQlBGX01BUF9DUkVBVEVgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcbiYjNDM7XG4mIzQzO2BgZXhjbF9wcm9nX2hhc2hgYCwgYGBleGNsX3Byb2dfaGFzaF9zaXplYGBcbiYjNDM7ICAgIFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBwcm9ncmFtIHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyAoZXhjbHVzaXZlKSBtYXAuIFRoaXNcbiYjNDM7ICAgIGJpbmRzIHRoZSBtZXRhZGF0YSBtYXAgdG8gdGhlIGxvYWRlcjsgaXQgaXMgbm90IGEgaGFzaCBvZiB0aGUgbWFwICpjb250ZW50Ki5cbiYjNDM7ICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsXG4mIzQzOyAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXG4mIzQzO1xuJiM0MztOb3RlcyBhbmQgbGltaXRhdGlvbnNcbiYjNDM7PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztcbiYjNDM7LSBUaGUgaW5zdHJ1Y3Rpb25zIHBsdXMgZm9sZGVkIG1ldGFkYXRhIGFyZSB2ZXJpZmllZCBhcyBvbmUgYGBicGZfZHlucHRyYGAsXG4mIzQzOyAgd2hpY2ggYm91bmRzIHRoZSBjb21iaW5lZCBzaXplIChjdXJyZW50bHkgfjE2IE1pQik7IHZlcnkgbGFyZ2Ugb2JqZWN0cyBjYW5cbiYjNDM7ICBleGNlZWQgaXQuXG4mIzQzOy0gVGhlIG1ldGFkYXRhIGNvbnRhaW5lciBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5IG1hcCwgYWNjZXNzZWQgdGhyb3VnaFxuJiM0MzsgIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYGAuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaCBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbmluZGV4IDc2YjhiNzYyN2ExMDg1Li45NjFlZmI5MDMxNDFjYyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbkBAIC04OTgsNiAmIzQzOzg5OCwxNCBAQCBzdHJ1Y3QgYnBmX3NjY19pbmZvIHtcbiBcbiBzdHJ1Y3QgYnBmX2xpdmVuZXNzO1xuIFxuJiM0MztzdHJ1Y3QgYnBmX2ZkX2FycmF5IHtcbiYjNDM7XHR1bmlvbiB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuJiM0MztcdFx0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4mIzQzO1x0fTtcbiYjNDM7fTtcbiYjNDM7XG4gLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHNcbiAgKiBvbmUgdmVyaWZpZXJfZW52IHBlciBicGZfY2hlY2soKSBjYWxsXG4gICovXG5AQCAtOTM5LDYgJiM0Mzs5NDcsNyBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XG4gXHRib29sIGJ5cGFzc19zcGVjX3Y0O1xuIFx0Ym9vbCBzZWVuX2RpcmVjdF93cml0ZTtcbiBcdGJvb2wgc2Vlbl9leGNlcHRpb247XG4mIzQzO1x0Ym9vbCBzaWduYXR1cmU7XG4gXHRzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEgKmluc25fYXV4X2RhdGE7IC8qIGFycmF5IG9mIHBlci1pbnNuIHN0YXRlICovXG4gXHRjb25zdCBzdHJ1Y3QgYnBmX2xpbmVfaW5mbyAqcHJldl9saW5mbztcbiBcdHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nIGxvZztcbkBAIC05ODksNyAmIzQzOzk5OCwxOSBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XG4gXHR1MzIgZnJlZV9saXN0X3NpemU7XG4gXHR1MzIgZXhwbG9yZWRfc3RhdGVzX3NpemU7XG4gXHR1MzIgbnVtX2JhY2tlZGdlcztcbi1cdGJwZnB0cl90IGZkX2FycmF5O1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHByb2dyYW0mIzM5O3MgZmRfYXJyYXkgY29tZXMgaW4gdHdvIHNoYXBlcywgdG9sZCBhcGFydCBieSB3aGV0aGVyXG4mIzQzO1x0ICogdGhlIGNhbGxlciBwYXNzZWQgZmRfYXJyYXlfY250LiBUaGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmU6XG4mIzQzO1x0ICogIC0gY29udGludW91cyAoZmRfYXJyYXlfY250IGdpdmVuKTogLVx1MDAzZWZkX2FycmF5IGhvbGRzIGV2ZXJ5IGVudHJ5XG4mIzQzO1x0ICogICAgcmVzb2x2ZWQgdG8gaXRzIG9iamVjdCB1cCBmcm9udCwgaW5kZXhlZCBieSBmZF9hcnJheSBwb3NpdGlvbixcbiYjNDM7XHQgKiAgICB3aXRoIC1cdTAwM2VmZF9hcnJheV9jbnQgc2xvdHM7IC1cdTAwM2VmZF9hcnJheV9yYXcgaXMgdW51c2VkLlxuJiM0MztcdCAqICAtIHNwYXJzZSAobm8gZmRfYXJyYXlfY250KTogLVx1MDAzZWZkX2FycmF5IGlzIE5VTEwsIGFuZCBlbnRyaWVzIGFyZVxuJiM0MztcdCAqICAgIHJlYWQgZnJvbSAtXHUwMDNlZmRfYXJyYXlfcmF3ICh0aGUgY2FsbGVyJiMzOTtzIGZkX2FycmF5KSBhbmQgcmVzb2x2ZWRcbiYjNDM7XHQgKiAgICBsYXppbHkgb24gZmlyc3QgcmVmZXJlbmNlLlxuJiM0MztcdCAqL1xuJiM0MztcdHN0cnVjdCBicGZfZmRfYXJyYXkgKmZkX2FycmF5O1xuJiM0MztcdHUzMiBmZF9hcnJheV9jbnQ7XG4mIzQzO1x0YnBmcHRyX3QgZmRfYXJyYXlfcmF3O1xuIFxuIFx0LyogYml0IG1hc2sgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGEgcmVnaXN0ZXIgaGFzIGJlZW4gYWNjZXNzZWRcbiBcdCAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGZ1bmN0aW9uIHN0YXRlIHdhcyBwcmludGVkXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggNmRiMzA2ZDIzYjQ3OWYuLmM0OTZjNzNhODQ4MzJjIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jXG5AQCAtNDAsNyAmIzQzOzQwLDYgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90cmFjZXBvaW50LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9vdmVyZmxvdy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY29va2llLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC92ZXJpZmljYXRpb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFx1MDAzY25ldC9uZXRmaWx0ZXIvbmZfYnBmX2xpbmsuaFx1MDAzZVxuQEAgLTE2MDAsMTEgJiM0MzsxNTk5LDYgQEAgc3RhdGljIGludCBtYXBfY3JlYXRlX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl92ZXJcbiBcdFx0XHRnb3RvIGZyZWVfbWFwO1xuIFx0XHR9XG4gXG4tXHRcdC8qIFNlZSBsaWJicGY6IGVtaXRfc2lnbmF0dXJlX21hdGNoKCkgKi9cbi1cdFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBicGZfbWFwLCBleGNsKSAhPSBTSEEyNTZfRElHRVNUX1NJWkUpO1xuLVx0XHRCVUlMRF9CVUdfT04oIV9fc2FtZV90eXBlKG1hcC1cdTAwM2VleGNsLCB1MzIpKTtcbi1cdFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBicGZfbWFwLCBzaGEpICAhPSAwKTtcbi1cdFx0QlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtXHUwMDNlc2hhLCB1OFtTSEEyNTZfRElHRVNUX1NJWkVdKSk7XG4gXHRcdG1hcC1cdTAwM2VleGNsID0gMTtcbiBcdH0gZWxzZSBpZiAoYXR0ci1cdTAwM2VleGNsX3Byb2dfaGFzaF9zaXplKSB7XG4gXHRcdGJwZl9sb2cobG9nLCBcJiMzNDtJbnZhbGlkIGV4Y2xfcHJvZ19oYXNoX3NpemUuXFxuXCYjMzQ7KTtcbkBAIC0yODg2LDY0ICYjNDM7Mjg4MCw2IEBAIHN0YXRpYyBib29sIGlzX3BlcmZtb25fcHJvZ190eXBlKGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUpXG4gXHR9XG4gfVxuIFxuLXN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbi17XG4tXHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcbi1cdGNhc2UgMDpcbi1cdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xuLVx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xuLVx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcbi1cdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcbi1cdGRlZmF1bHQ6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbi1cdH1cbi19XG4tXG4tc3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsXG4tXHRcdFx0XHQgICAgIGJvb2wgaXNfa2VybmVsLCBzMzIgKmtleXJpbmdfc2VyaWFsKVxuLXtcbi1cdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcbi1cdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gc2lnX3B0ciwgaW5zbnNfcHRyO1xuLVx0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XG4tXHR2b2lkICpzaWc7XG4tXHRpbnQgZXJyID0gMDtcbi1cbi1cdC8qXG4tXHQgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuLVx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4tXHQgKi9cbi1cdGlmIChhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpID09IDApXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0ZWxzZVxuLVx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4tXG4tXHRpZiAoIWtleSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4tXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4tXHRpZiAoSVNfRVJSKHNpZykpIHtcbi1cdFx0YnBmX2tleV9wdXQoa2V5KTtcbi1cdFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcbi1cdH1cbi1cbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZzaWdfcHRyLCBzaWcsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCxcbi1cdFx0XHRhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZpbnNuc19wdHIsIHByb2ctXHUwMDNlaW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4tXHRcdFx0cHJvZy1cdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXG4tXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZpbnNuc19wdHIsXG4tXHRcdFx0XHRcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZzaWdfcHRyLCBrZXkpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdCprZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XG4tXHRicGZfa2V5X3B1dChrZXkpO1xuLVx0a3ZmcmVlKHNpZyk7XG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbiBzdGF0aWMgaW50IGJwZl9wcm9nX21hcmtfaW5zbl9hcnJheXNfcmVhZHkoc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuIHtcbiBcdGludCBlcnI7XG5AQCAtMzEzMywxNyAmIzQzOzMwNjksOCBAQCBzdGF0aWMgaW50IGJwZl9wcm9nX2xvYWQodW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdFxuIFxuIFx0LyogZUJQRiBwcm9ncmFtcyBtdXN0IGJlIEdQTCBjb21wYXRpYmxlIHRvIHVzZSBHUEwtZWQgZnVuY3Rpb25zICovXG4gXHRwcm9nLVx1MDAzZWdwbF9jb21wYXRpYmxlID0gbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSA/IDEgOiAwO1xuLVx0aWYgKGF0dHItXHUwMDNlc2lnbmF0dXJlKSB7XG4tXHRcdGVyciA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUocHJvZywgYXR0ciwgdWF0dHIuaXNfa2VybmVsLFxuLVx0XHRcdFx0XHRcdFx1MDAyNnByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbCk7XG4tXHRcdGlmIChlcnIpXG4tXHRcdFx0Z290byBmcmVlX3Byb2c7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7XG4tXHR9IGVsc2Uge1xuLVx0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19VTlNJR05FRDtcbi1cdH1cbiYjNDM7XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7XG4mIzQzO1x0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuIFx0cHJvZy1cdTAwM2VvcmlnX3Byb2cgPSBOVUxMO1xuIFx0cHJvZy1cdTAwM2VqaXRlZCA9IDA7XG4gXG5AQCAtMzE4OSwxMCAmIzQzOzMxMTYsNiBAQCBzdGF0aWMgaW50IGJwZl9wcm9nX2xvYWQodW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdFxuIFx0aWYgKGVyciBcdTAwM2MgMClcbiBcdFx0Z290byBmcmVlX3Byb2c7XG4gXG4tXHRlcnIgPSBzZWN1cml0eV9icGZfcHJvZ19sb2FkKHByb2csIGF0dHIsIHRva2VuLCB1YXR0ci5pc19rZXJuZWwpO1xuLVx0aWYgKGVycilcbi1cdFx0Z290byBmcmVlX3Byb2c7XG4tXG4gXHQvKiBydW4gZUJQRiB2ZXJpZmllciAqL1xuIFx0ZXJyID0gYnBmX2NoZWNrKFx1MDAyNnByb2csIGF0dHIsIHVhdHRyLCBhdHRyX2xvZyk7XG4gXHRpZiAoZXJyIFx1MDAzYyAwKVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuaW5kZXggMjVhZWE0MjcxY2QwODkuLjE2MDkwNTNhMGVlYmYyIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbkBAIC0yMiw2ICYjNDM7MjIsOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2N0eXBlLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9lcnJvci1pbmplY3Rpb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZl9sc20uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zZWN1cml0eS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZlcmlmaWNhdGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcG9pc29uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuQEAgLTI0OTAsNiAmIzQzOzI0OTIsODMgQEAgaW50IGJwZl9nZXRfa2Z1bmNfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBmdW5jX2lkLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsjZGVmaW5lIEJQRl9GRF9TTE9UX0JURlx0MVVMXG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBmZF9zbG90X3NldF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSAqc2xvdCwgc3RydWN0IGJwZl9tYXAgKm1hcClcbiYjNDM7e1xuJiM0MztcdHNsb3QtXHUwMDNldmFsID0gKHVuc2lnbmVkIGxvbmcpbWFwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBmZF9zbG90X3NldF9idGYoc3RydWN0IGJwZl9mZF9hcnJheSAqc2xvdCwgc3RydWN0IGJ0ZiAqYnRmKVxuJiM0Mzt7XG4mIzQzO1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKHNsb3QudmFsIFx1MDAyNiBCUEZfRkRfU0xPVF9CVEYpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRyZXR1cm4gKHN0cnVjdCBicGZfbWFwICopc2xvdC52YWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9zbG90X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5IHNsb3QpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIShzbG90LnZhbCBcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiAoc3RydWN0IGJ0ZiAqKShzbG90LnZhbCBcdTAwMjYgfkJQRl9GRF9TTE9UX0JURik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpcbiYjNDM7ZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGY7XG4mIzQzO1xuJiM0MztcdGlmIChpZHggXHUwMDNlPSBlbnYtXHUwMDNlZmRfYXJyYXlfY250KSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7a2Z1bmMgZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0aWR4LCBlbnYtXHUwMDNlZmRfYXJyYXlfY250KTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdH1cbiYjNDM7XHRidGYgPSBmZF9zbG90X2J0ZihlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSk7XG4mIzQzO1x0aWYgKCFidGYpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtrZnVuYyBmZF9pZHggJXUgaXMgbm90IGEgbW9kdWxlIEJURlxcblwmIzM0OywgaWR4KTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdH1cbiYjNDM7XHRidGZfZ2V0KGJ0Zik7XG4mIzQzO1x0cmV0dXJuIGJ0ZjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKlxuJiM0MztmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJ0ZiAqYnRmO1xuJiM0MztcdGludCBidGZfZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZidGZfZmQsIGVudi1cdTAwM2VmZF9hcnJheV9yYXcsXG4mIzQzO1x0XHRcdFx0ICAgIChzaXplX3QpaWR4ICogc2l6ZW9mKGJ0Zl9mZCksIHNpemVvZihidGZfZmQpKSlcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuJiM0MztcdGJ0ZiA9IGJ0Zl9nZXRfYnlfZmQoYnRmX2ZkKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGJ0ZikpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiBidGY7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBidGY7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9hcnJheV9nZXRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4mIzQzO3tcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChlbnYtXHUwMDNlZmRfYXJyYXkpXG4mIzQzO1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKGVudiwgaWR4KTtcbiYjNDM7XHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheV9yYXcpKVxuJiM0MztcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfc3BhcnNlKGVudiwgaWR4KTtcbiYjNDM7XG4mIzQzO1x0dmVyYm9zZShlbnYsIFwmIzM0O2tmdW5jIG9mZnNldCBcdTAwM2UgMCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRcdFx0IHMxNiBvZmZzZXQpXG4ge1xuQEAgLTI0OTgsNyAmIzQzOzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRzdHJ1Y3QgYnBmX2tmdW5jX2J0ZiAqYjtcbiBcdHN0cnVjdCBtb2R1bGUgKm1vZDtcbiBcdHN0cnVjdCBidGYgKmJ0Zjtcbi1cdGludCBidGZfZmQ7XG4gXG4gXHR0YWIgPSBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNla2Z1bmNfYnRmX3RhYjtcbiBcdGIgPSBic2VhcmNoKFx1MDAyNmtmX2J0ZiwgdGFiLVx1MDAzZWRlc2NzLCB0YWItXHUwMDNlbnJfZGVzY3MsXG5AQCAtMjUwOSwyMiAmIzQzOzI1ODcsOSBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdFx0cmV0dXJuIEVSUl9QVFIoLUUyQklHKTtcbiBcdFx0fVxuIFxuLVx0XHRpZiAoYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5KSkge1xuLVx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtrZnVuYyBvZmZzZXQgXHUwMDNlIDAgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxuXCYjMzQ7KTtcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRVBST1RPKTtcbi1cdFx0fVxuLVxuLVx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2YnRmX2ZkLCBlbnYtXHUwMDNlZmRfYXJyYXksXG4tXHRcdFx0XHRcdCAgICBvZmZzZXQgKiBzaXplb2YoYnRmX2ZkKSxcbi1cdFx0XHRcdFx0ICAgIHNpemVvZihidGZfZmQpKSlcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1cbi1cdFx0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuLVx0XHRpZiAoSVNfRVJSKGJ0ZikpIHtcbi1cdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7aW52YWxpZCBtb2R1bGUgQlRGIGZkIHNwZWNpZmllZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRidGYgPSBmZF9hcnJheV9nZXRfYnRmKGVudiwgb2Zmc2V0KTtcbiYjNDM7XHRcdGlmIChJU19FUlIoYnRmKSlcbiBcdFx0XHRyZXR1cm4gYnRmO1xuLVx0XHR9XG4tXG4gXHRcdGlmICghYnRmX2lzX21vZHVsZShidGYpKSB7XG4gXHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O0JURiBmZCBmb3Iga2Z1bmMgaXMgbm90IGEgbW9kdWxlIEJURlxcblwmIzM0Oyk7XG4gXHRcdFx0YnRmX3B1dChidGYpO1xuQEAgLTE3NTc3LDYgJiM0MzsxNzY0MiwxMSBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBidGYgKmJ0ZilcbiBcdFx0aWYgKGVudi1cdTAwM2V1c2VkX2J0ZnNbaV0uYnRmID09IGJ0ZilcbiBcdFx0XHRnb3RvIHJldF9wdXQ7XG4gXG4mIzQzO1x0aWYgKGVudi1cdTAwM2VzaWduYXR1cmUpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBhbnkgQlRGXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdHJldCA9IC1FQUNDRVM7XG4mIzQzO1x0XHRnb3RvIHJldF9wdXQ7XG4mIzQzO1x0fVxuIFx0aWYgKGVudi1cdTAwM2V1c2VkX2J0Zl9jbnQgXHUwMDNlPSBNQVhfVVNFRF9CVEZTKSB7XG4gXHRcdHZlcmJvc2UoZW52LCBcJiMzNDtUaGUgdG90YWwgbnVtYmVyIG9mIGJ0ZnMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCYjMzQ7LFxuIFx0XHRcdE1BWF9VU0VEX0JURlMpO1xuQEAgLTE3ODU5LDYgJiM0MzsxNzkyOSwxMiBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRcdGlmIChlbnYtXHUwMDNldXNlZF9tYXBzW2ldID09IG1hcClcbiBcdFx0XHRyZXR1cm4gaTtcbiBcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRUQpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBtYXAgJiMzOTslcyYjMzk7IG5vdCBjb3ZlcmVkIGJ5IHRoZSBzaWduYXR1cmVcXG5cJiMzNDssXG4mIzQzO1x0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdHJldHVybiAtRUFDQ0VTO1xuJiM0MztcdH1cbiBcdGlmIChlbnYtXHUwMDNldXNlZF9tYXBfY250IFx1MDAzZT0gTUFYX1VTRURfTUFQUykge1xuIFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7VGhlIHRvdGFsIG51bWJlciBvZiBtYXBzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxcblwmIzM0OyxcbiBcdFx0XHRNQVhfVVNFRF9NQVBTKTtcbkBAIC0xNzkxMSw2ICYjNDM7MTc5ODcsNDggQEAgc3RhdGljIGludCBhZGRfdXNlZF9tYXAoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuIFx0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiYjNDM7XG4mIzQzO1x0aWYgKGlkeCBcdTAwM2U9IGVudi1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRpZHgsIGVudi1cdTAwM2VmZF9hcnJheV9jbnQpO1xuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0fVxuJiM0MztcdG1hcCA9IGZkX3Nsb3RfbWFwKGVudi1cdTAwM2VmZF9hcnJheVtpZHhdKTtcbiYjNDM7XHRpZiAoIW1hcCkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2lkeCAldSBpcyBub3QgYSBtYXBcXG5cJiMzNDssIGlkeCk7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1x0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbiYjNDM7e1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmZkLCBlbnYtXHUwMDNlZmRfYXJyYXlfcmF3LFxuJiM0MztcdFx0XHRcdCAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1x0cmV0dXJuIGFkZF91c2VkX21hcChlbnYsIGZkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGVudi1cdTAwM2VmZF9hcnJheSlcbiYjNDM7XHRcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKGVudiwgaWR4KTtcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuJiM0MztcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIG11c3QgYmluZCBtYXBzIHZpYSBhIGNvbnRpbnVvdXMgZmRfYXJyYXkgKGZkX2FycmF5X2NudClcXG5cJiMzNDspO1xuJiM0MztcdFx0cmV0dXJuIC1FQUNDRVM7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5X3JhdykpXG4mIzQzO1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKGVudiwgaWR4KTtcbiYjNDM7XG4mIzQzO1x0dmVyYm9zZShlbnYsIFwmIzM0O2ZkX2lkeCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcXG5cJiMzNDspO1xuJiM0MztcdHJldHVybiAtRVBST1RPO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgY2hlY2tfYWx1X2ZpZWxkcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pXG4ge1xuIFx0dTggY2xhc3MgPSBCUEZfQ0xBU1MoaW5zbi1cdTAwM2Vjb2RlKTtcbkBAIC0xODEyOCw3ICYjNDM7MTgyNDYsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdFx0XHRpbnQgbWFwX2lkeDtcbiBcdFx0XHR1NjQgYWRkcjtcbi1cdFx0XHR1MzIgZmQ7XG4gXG4gXHRcdFx0aWYgKGkgPT0gaW5zbl9jbnQgLSAxIHx8IGluc25bMV0uY29kZSAhPSAwIHx8XG4gXHRcdFx0ICAgIGluc25bMV0uZHN0X3JlZyAhPSAwIHx8IGluc25bMV0uc3JjX3JlZyAhPSAwIHx8XG5AQCAtMTgxODAsMjEgJiM0MzsxODI5NywxNyBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdFx0c3dpdGNoIChpbnNuWzBdLnNyY19yZWcpIHtcbiBcdFx0XHRjYXNlIEJQRl9QU0VVRE9fTUFQX0lEWF9WQUxVRTpcbiBcdFx0XHRjYXNlIEJQRl9QU0VVRE9fTUFQX0lEWDpcbi1cdFx0XHRcdGlmIChicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXkpKSB7XG4tXHRcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmZF9pZHggd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxuXCYjMzQ7KTtcbi1cdFx0XHRcdFx0cmV0dXJuIC1FUFJPVE87XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheSxcbi1cdFx0XHRcdFx0XHRcdCAgICBpbnNuWzBdLmltbSAqIHNpemVvZihmZCksXG4tXHRcdFx0XHRcdFx0XHQgICAgc2l6ZW9mKGZkKSkpXG4tXHRcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcdFx0XHRcdG1hcF9pZHggPSBmZF9hcnJheV9nZXRfbWFwX2lkeChlbnYsIGluc25bMF0uaW1tKTtcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdGRlZmF1bHQ6XG4tXHRcdFx0XHRmZCA9IGluc25bMF0uaW1tO1xuJiM0MztcdFx0XHRcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4mIzQzO1x0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gY2Fubm90IHJlZmVyZW5jZSBhIG1hcCBieSBmZCwgb25seSB2aWEgZmRfYXJyYXkgaW5kZXhcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHRcdG1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBpbnNuWzBdLmltbSk7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG4gXG4tXHRcdFx0bWFwX2lkeCA9IGFkZF91c2VkX21hcChlbnYsIGZkKTtcbiBcdFx0XHRpZiAobWFwX2lkeCBcdTAwM2MgMClcbiBcdFx0XHRcdHJldHVybiBtYXBfaWR4O1xuIFx0XHRcdG1hcCA9IGVudi1cdTAwM2V1c2VkX21hcHNbbWFwX2lkeF07XG5AQCAtMTk0NjksNyAmIzQzOzE5NTgyLDcgQEAgc3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxuICAqIHRoaXMgY2FzZSBleHBlY3QgdGhhdCBldmVyeSBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIGVpdGhlciBhIG1hcCBvclxuICAqIGEgQlRGLiBFdmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCB0byBiZSB0cmFzaC5cbiAgKi9cbi1zdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbiYjNDM7c3RhdGljIGludCBhZGRfZmRfZnJvbV9mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4LCBpbnQgZmQpXG4ge1xuIFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdHN0cnVjdCBidGYgKmJ0ZjtcbkBAIC0xOTQ4MSw1MSAmIzQzOzE5NTk0LDY5IEBAIHN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuIFx0XHRlcnIgPSBfX2FkZF91c2VkX21hcChlbnYsIG1hcCk7XG4gXHRcdGlmIChlcnIgXHUwMDNjIDApXG4gXHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHRcdGZkX3Nsb3Rfc2V0X21hcChcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgbWFwKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4gXHRidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7XG4gXHRpZiAoIUlTX0VSUihidGYpKSB7XG4gXHRcdGJ0Zl9nZXQoYnRmKTtcbi1cdFx0cmV0dXJuIF9fYWRkX3VzZWRfYnRmKGVudiwgYnRmKTtcbiYjNDM7XHRcdGVyciA9IF9fYWRkX3VzZWRfYnRmKGVudiwgYnRmKTtcbiYjNDM7XHRcdGlmIChlcnIgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1x0XHRmZF9zbG90X3NldF9idGYoXHUwMDI2ZW52LVx1MDAzZWZkX2FycmF5W2lkeF0sIGJ0Zik7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbiBcdHZlcmJvc2UoZW52LCBcJiMzNDtmZCAlZCBpcyBub3QgcG9pbnRpbmcgdG8gdmFsaWQgYnBmX21hcCBvciBidGZcXG5cJiMzNDssIGZkKTtcbiBcdHJldHVybiBQVFJfRVJSKG1hcCk7XG4gfVxuIFxuLXN0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIpXG4mIzQzOyNkZWZpbmUgTUFYX0ZEX0FSUkFZX0NOVCAoTUFYX1VTRURfTUFQUyAmIzQzOyBNQVhfS0ZVTkNfQlRGUylcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4mIzQzO1x0XHRcdFx0ICAgICAgIGJwZnB0cl90IGZkX2FycmF5LCB1MzIgY250KVxuIHtcbi1cdHNpemVfdCBzaXplID0gc2l6ZW9mKGludCk7XG4tXHRpbnQgcmV0O1xuLVx0aW50IGZkO1xuJiM0MztcdGludCBmZCwgcmV0O1xuIFx0dTMyIGk7XG4gXG4tXHRlbnYtXHUwMDNlZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZWZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpO1xuLVxuLVx0Lypcbi1cdCAqIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBvbGQgKG5vIGZkX2FycmF5X2NudCBpcyBnaXZlbikgYW5kIG5ld1xuLVx0ICogQVBJcyBpcyB0aGF0IGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgZmRfYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmVcbi1cdCAqIGNvbnRpbnVvdXMgYW5kIGlzIHNjYW5uZWQgZm9yIG1hcCBmZHMgcmlnaHQgYXdheVxuLVx0ICovXG4tXHRpZiAoIWF0dHItXHUwMDNlZmRfYXJyYXlfY250KVxuLVx0XHRyZXR1cm4gMDtcbi1cbi1cdC8qIENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovXG4tXHRpZiAoYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQgXHUwMDNlPSAoVTMyX01BWCAvIHNpemUpKSB7XG4tXHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmZF9hcnJheV9jbnQgaXMgdG9vIGJpZyAoJXUpXFxuXCYjMzQ7LCBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdGlmIChjbnQgXHUwMDNlIE1BWF9GRF9BUlJBWV9DTlQpIHtcbiYjNDM7XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmZF9hcnJheSBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXUsIG1heCAldSlcXG5cJiMzNDssXG4mIzQzO1x0XHRcdGNudCwgTUFYX0ZEX0FSUkFZX0NOVCk7XG4mIzQzO1x0XHRyZXR1cm4gLUUyQklHO1xuIFx0fVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZmZCwgZW52LVx1MDAzZWZkX2FycmF5LCBpICogc2l6ZSwgc2l6ZSkpXG4mIzQzO1x0ZW52LVx1MDAzZWZkX2FycmF5ID0ga3ZjYWxsb2MoY250LCBzaXplb2YoKmVudi1cdTAwM2VmZF9hcnJheSksIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghZW52LVx1MDAzZWZkX2FycmF5KVxuJiM0MztcdFx0cmV0dXJuIC1FTk9NRU07XG4mIzQzO1x0ZW52LVx1MDAzZWZkX2FycmF5X2NudCA9IGNudDtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBjbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGZkX2FycmF5LFxuJiM0MztcdFx0XHRcdFx0ICAgIChzaXplX3QpaSAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKVxuIFx0XHRcdHJldHVybiAtRUZBVUxUO1xuLVxuLVx0XHRyZXQgPSBhZGRfZmRfZnJvbV9mZF9hcnJheShlbnYsIGZkKTtcbiYjNDM7XHRcdHJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgaSwgZmQpO1xuIFx0XHRpZiAocmV0KVxuIFx0XHRcdHJldHVybiByZXQ7XG4gXHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuJiM0MztcdFx0XHQgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxuJiM0Mzt7XG4mIzQzO1x0YnBmcHRyX3QgZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZWZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpO1xuIFxuJiM0MztcdGlmIChicGZwdHJfaXNfbnVsbChmZF9hcnJheSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE5ldyBBUEk6IHRoZSBjYWxsZXIgcGFzc2VzIGZkX2FycmF5X2NudCBhbmQgYSBjb250aW51b3VzIGFycmF5IHRoYXRcbiYjNDM7XHQgKiBpcyByZXNvbHZlZCBhbmQgYm91bmQgdXAgZnJvbnQuIExlZ2FjeSBBUEkgKG5vIGZkX2FycmF5X2NudCk6IGtlZXBcbiYjNDM7XHQgKiB0aGUgY2FsbGVyJiMzOTtzIGFycmF5IGFuZCByZXNvbHZlIGVudHJpZXMgbGF6aWx5LCBvbiBmaXJzdCByZWZlcmVuY2UuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGF0dHItXHUwMDNlZmRfYXJyYXlfY250KVxuJiM0MztcdFx0cmV0dXJuIHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhlbnYsIGZkX2FycmF5LFxuJiM0MztcdFx0XHRcdFx0XHQgICBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4mIzQzO1x0ZW52LVx1MDAzZWZkX2FycmF5X3JhdyA9IGZkX2FycmF5O1xuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTE5NzQwLDYgJiM0MzsxOTg3MSwxMzkgQEAgaW50IGJwZl9maXh1cF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3dpdGNoIChrZXlyaW5nX2lkKSB7XG4mIzQzO1x0Y2FzZSAwOlxuJiM0MztcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xuJiM0MztcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HOlxuJiM0MztcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XG4mIzQzO1x0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcbiYjNDM7XHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbiYjNDM7XHR9XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFZlcmlmeSB0aGUgUEtDUyM3IHNpZ25hdHVyZSBvZiBhIGxvYWRlZCBwcm9ncmFtLiBDYWxsZWQgZnJvbSBicGZfY2hlY2soKVxuJiM0MzsgKiBvbmNlIHRoZSBwcm9ncmFtJiMzOTtzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzb1xuJiM0MzsgKiB0aGUgZXhhY3QgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGUgb25lcyB0aGUgcHJvZ3JhbSBiaW5kcy5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mXG4mIzQzOyAqIGVhY2ggbWFwLCBpbiBAbWFwcyBvcmRlcjogaW5zbnMgfHwgbWFwXzAgfHwgbWFwXzEgfHwgWy4uLl0uIE9uIHN1Y2Nlc3MgdGhlXG4mIzQzOyAqIHZlcmRpY3QgYW5kIGtleXJpbmcgaW5mbyBhcmUgcmVjb3JkZWQgb24gcHJvZy1cdTAwM2VhdXguXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiYjNDM7XHRcdFx0XHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcbiYjNDM7e1xuJiM0MztcdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGVudi1cdTAwM2Vwcm9nO1xuJiM0MztcdHN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi1cdTAwM2V1c2VkX21hcHM7XG4mIzQzO1x0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XG4mIzQzO1x0dm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7XG4mIzQzO1x0dTMyIG1hcF9jbnQgPSBlbnYtXHUwMDNldXNlZF9tYXBfY250O1xuJiM0MztcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xuJiM0MztcdHU2NCBkYXRhX3N6O1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIERvbiYjMzk7dCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXG4mIzQzO1x0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxuJiM0MztcdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQsIDApO1xuJiM0MztcdGlmICgha2V5KSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0YXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuJiM0MztcdGlmIChJU19FUlIoc2lnKSkge1xuJiM0MztcdFx0YnBmX2tleV9wdXQoa2V5KTtcbiYjNDM7XHRcdHJldHVybiBQVFJfRVJSKHNpZyk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpbnNuc19zeiA9IHByb2ctXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4mIzQzO1x0ZGF0YV9zeiA9IGluc25zX3N6O1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxuJiM0MztcdFx0ICAgICFtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcikge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGFuIGFycmF5XFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIVJFQURfT05DRShtYXAtXHUwMDNlZnJvemVuKSkge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGZyb3plblxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4mIzQzO1x0XHRcdGVyciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAoIW1hcC1cdTAwM2VleGNsX3Byb2dfc2hhKSB7XG4mIzQzO1x0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgZXhjbHVzaXZlXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbiYjNDM7XHRcdFx0ZXJyID0gLUVQRVJNO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGRhdGFfc3ogJiM0Mzs9IG1hcC1cdTAwM2V2YWx1ZV9zaXplO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoYnBmX2R5bnB0cl9jaGVja19zaXplKGRhdGFfc3opKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxuXCYjMzQ7LCBkYXRhX3N6KTtcbiYjNDM7XHRcdGVyciA9IC1FMkJJRztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRkYXRhID0ga3ZtYWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xuJiM0MztcdGlmICghZGF0YSkge1xuJiM0MztcdFx0ZXJyID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRtZW1jcHkoZGF0YSwgcHJvZy1cdTAwM2VpbnNuc2ksIGluc25zX3N6KTtcbiYjNDM7XHRvZmYgPSBpbnNuc19zejtcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXBfY250OyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0c3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07XG4mIzQzO1x0XHR1NjQgYWRkcjtcbiYjNDM7XG4mIzQzO1x0XHRlcnIgPSBtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcihtYXAsIFx1MDAyNmFkZHIsIDApO1xuJiM0MztcdFx0aWYgKGVycikge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7ZmFpbGVkIHRvIHJlYWQgc2lnbmVkIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTs6ICVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0XHRcdG1hcC1cdTAwM2VuYW1lLCBlcnIpO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdG1lbWNweShkYXRhICYjNDM7IG9mZiwgKHZvaWQgKikodW5zaWduZWQgbG9uZylhZGRyLFxuJiM0MztcdFx0ICAgICAgIG1hcC1cdTAwM2V2YWx1ZV9zaXplKTtcbiYjNDM7XHRcdG9mZiAmIzQzOz0gbWFwLVx1MDAzZXZhbHVlX3NpemU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRicGZfZHlucHRyX2luaXQoXHUwMDI2ZGF0YV9wdHIsIGRhdGEsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwgZGF0YV9zeik7XG4mIzQzO1x0YnBmX2R5bnB0cl9pbml0KFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxuJiM0MztcdFx0XHRhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKHN0cnVjdCBicGZfZHlucHRyICopXHUwMDI2ZGF0YV9wdHIsXG4mIzQzO1x0XHRcdFx0XHQgKHN0cnVjdCBicGZfZHlucHRyICopXHUwMDI2c2lnX3B0ciwga2V5KTtcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICVkXFxuXCYjMzQ7LCBlcnIpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwYXNzZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTtcbiYjNDM7XHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuJiM0MztcdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1ZFUklGSUVEO1xuJiM0MztcdH1cbiYjNDM7b3V0OlxuJiM0MztcdGt2ZnJlZShkYXRhKTtcbiYjNDM7XHRicGZfa2V5X3B1dChrZXkpO1xuJiM0MztcdGt2ZnJlZShzaWcpO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHQgICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbiB7XG5AQCAtMTk3ODIsNiAmIzQzOzIwMDQ2LDcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRlbnYtXHUwMDNlYnlwYXNzX3NwZWNfdjEgPSBicGZfYnlwYXNzX3NwZWNfdjEoZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuKTtcbiBcdGVudi1cdTAwM2VieXBhc3Nfc3BlY192NCA9IGJwZl9ieXBhc3Nfc3BlY192NChlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNldG9rZW4pO1xuIFx0ZW52LVx1MDAzZWJwZl9jYXBhYmxlID0gaXNfcHJpdiA9IGJwZl90b2tlbl9jYXBhYmxlKGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbiwgQ0FQX0JQRik7XG4mIzQzO1x0ZW52LVx1MDAzZXNpZ25hdHVyZSA9IGF0dHItXHUwMDNlc2lnbmF0dXJlO1xuIFxuIFx0YnBmX2dldF9idGZfdm1saW51eCgpO1xuIFxuQEAgLTE5Nzk1LDExICYjNDM7MjAwNjAsMjcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRyZXQgPSBicGZfdmxvZ19pbml0KFx1MDAyNmVudi1cdTAwM2Vsb2csIGF0dHJfbG9nLVx1MDAzZWxldmVsLCBhdHRyX2xvZy1cdTAwM2V1YnVmLCBhdHRyX2xvZy1cdTAwM2VzaXplKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyX3VubG9jaztcbiYjNDM7XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuJiM0MztcdFx0cmV0ID0gYnBmX3Byb2dfY2FsY190YWcoZW52LVx1MDAzZXByb2cpO1xuJiM0MztcdFx0aWYgKHJldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0Z290byBza2lwX2Z1bGxfY2hlY2s7XG4mIzQzO1x0fVxuIFxuIFx0cmV0ID0gcHJvY2Vzc19mZF9hcnJheShlbnYsIGF0dHIsIHVhdHRyKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xuIFxuJiM0MztcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4mIzQzO1x0XHRyZXQgPSBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKGVudiwgYXR0ciwgdWF0dHIuaXNfa2VybmVsKTtcbiYjNDM7XHRcdGlmIChyZXQpXG4mIzQzO1x0XHRcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChlbnYtXHUwMDNlcHJvZywgYXR0ciwgZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuLFxuJiM0MztcdFx0XHRcdCAgICAgdWF0dHIuaXNfa2VybmVsKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0Z290byBza2lwX2Z1bGxfY2hlY2s7XG4mIzQzO1xuIFx0bWFya192ZXJpZmllcl9zdGF0ZV9jbGVhbihlbnYpO1xuIFxuIFx0aWYgKElTX0VSUihidGZfdm1saW51eCkpIHtcbkBAIC0yMDAyNyw2ICYjNDM7MjAzMDgsNyBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdGJwZl9jbGVhcl9pbnNuX2F1eF9kYXRhKGVudiwgMCwgZW52LVx1MDAzZXByb2ctXHUwMDNlbGVuKTtcbiBcdHZmcmVlKGVudi1cdTAwM2VpbnNuX2F1eF9kYXRhKTtcbiBlcnJfZnJlZV9lbnY6XG4mIzQzO1x0a3ZmcmVlKGVudi1cdTAwM2VmZF9hcnJheSk7XG4gXHRicGZfc3RhY2tfbGl2ZW5lc3NfZnJlZShlbnYpO1xuIFx0a3ZmcmVlKGVudi1cdTAwM2VjZmcuaW5zbl9wb3N0b3JkZXIpO1xuIFx0a3ZmcmVlKGVudi1cdTAwM2VzY2NfaW5mbyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuaW5kZXggNmFlNzI2MmViZTBjMWQuLmEwMWQwNmQyMmQxYTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5AQCAtNzkzLDYgJiM0Mzs3OTMsOCBAQCBzdGF0aWMgaW50IGdlbl90cmFjZShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBjb25zdCBjaGFyICpvYmpfbmFtZSwgY29uc3QgY2hhciAqaFxuIFx0aWYgKHNpZ25fcHJvZ3MpIHtcbiBcdFx0c29wdHMuaW5zbnMgPSBvcHRzLmluc25zO1xuIFx0XHRzb3B0cy5pbnNuc19zeiA9IG9wdHMuaW5zbnNfc3o7XG4mIzQzO1x0XHRzb3B0cy5kYXRhID0gb3B0cy5kYXRhO1xuJiM0MztcdFx0c29wdHMuZGF0YV9zeiA9IG9wdHMuZGF0YV9zejtcbiBcdFx0c29wdHMuZXhjbF9wcm9nX2hhc2ggPSBwcm9nX3NoYTtcbiBcdFx0c29wdHMuZXhjbF9wcm9nX2hhc2hfc3ogPSBzaXplb2YocHJvZ19zaGEpO1xuIFx0XHRzb3B0cy5zaWduYXR1cmUgPSBzaWdfYnVmO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuaW5kZXggZjliNzQyZjRiYjEwNGIuLjdjYzk5MWM2OWRjMmM4IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbkBAIC0xMzUsOSAmIzQzOzEzNSwyMSBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiBcdENNU19Db250ZW50SW5mbyAqY21zID0gTlVMTDtcbiBcdGxvbmcgYWN0dWFsX3NpZ19sZW4gPSAwO1xuIFx0WDUwOSAqeDUwOSA9IE5VTEw7XG4mIzQzO1x0dm9pZCAqZGF0YSA9IE5VTEw7XG4mIzQzO1x0c2l6ZV90IGRhdGFfc3o7XG4gXHRpbnQgZXJyID0gMDtcbiBcbi1cdGJkX2luID0gQklPX25ld19tZW1fYnVmKG9wdHMtXHUwMDNlaW5zbnMsIG9wdHMtXHUwMDNlaW5zbnNfc3opO1xuJiM0MztcdGRhdGFfc3ogPSAoc2l6ZV90KW9wdHMtXHUwMDNlaW5zbnNfc3ogJiM0Mzsgb3B0cy1cdTAwM2VkYXRhX3N6O1xuJiM0MztcdGRhdGEgPSBtYWxsb2MoZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFkYXRhKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XHRtZW1jcHkoZGF0YSwgb3B0cy1cdTAwM2VpbnNucywgb3B0cy1cdTAwM2VpbnNuc19zeik7XG4mIzQzO1x0aWYgKG9wdHMtXHUwMDNlZGF0YV9zeilcbiYjNDM7XHRcdG1lbWNweSgoY2hhciAqKWRhdGEgJiM0Mzsgb3B0cy1cdTAwM2VpbnNuc19zeiwgb3B0cy1cdTAwM2VkYXRhLCBvcHRzLVx1MDAzZWRhdGFfc3opO1xuJiM0MztcbiYjNDM7XHRiZF9pbiA9IEJJT19uZXdfbWVtX2J1ZihkYXRhLCBkYXRhX3N6KTtcbiBcdGlmICghYmRfaW4pIHtcbiBcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBjbGVhbnVwO1xuQEAgLTE3OCw3ICYjNDM7MTkwLDcgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gXHRFVlBfRGlnZXN0KG9wdHMtXHUwMDNlaW5zbnMsIG9wdHMtXHUwMDNlaW5zbnNfc3osIG9wdHMtXHUwMDNlZXhjbF9wcm9nX2hhc2gsXG4gXHRcdCAgIFx1MDAyNm9wdHMtXHUwMDNlZXhjbF9wcm9nX2hhc2hfc3osIEVWUF9zaGEyNTYoKSwgTlVMTCk7XG4gXG4tXHRcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xuJiM0MztcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xuIFx0aWYgKCFiZF9vdXQpIHtcbiBcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBjbGVhbnVwO1xuQEAgLTIxMiw2ICYjNDM7MjI0LDcgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gXHRYNTA5X2ZyZWUoeDUwOSk7XG4gXHRFVlBfUEtFWV9mcmVlKHByaXZhdGVfa2V5KTtcbiBcdEJJT19mcmVlKGJkX2luKTtcbiYjNDM7XHRmcmVlKGRhdGEpO1xuIFx0RElTUExBWV9PU1NMX0VSUihlcnIgXHUwMDNjIDApO1xuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmggYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuaW5kZXggNDlhZjQyNjBiOGU2YjcuLjA0MjU2OTE4Nzc1MjE3IDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG5AQCAtNTEsNyAmIzQzOzUxLDYgQEAgc3RydWN0IGJwZl9nZW4ge1xuIFx0X191MzIgbnJfa3N5bXM7XG4gXHRpbnQgZmRfYXJyYXk7XG4gXHRpbnQgbnJfZmRfYXJyYXk7XG4tXHRpbnQgaGFzaF9pbnNuX29mZnNldFtTSEEyNTZfRFdPUkRfU0laRV07XG4gfTtcbiBcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuaW5kZXggYzdmMmQyYWM3YmIzNWYuLjZlM2RkNTI0Mjc2MTgzIDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG5AQCAtMTExLDcgJiM0MzsxMTEsNiBAQCBzdGF0aWMgdm9pZCBlbWl0MihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBzdHJ1Y3QgYnBmX2luc24gaW5zbjEsIHN0cnVjdCBicGZfaW5zbiBpblxuIFxuIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSk7XG4gc3RhdGljIHZvaWQgZW1pdF9zeXNfY2xvc2VfYmxvYihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgYmxvYl9vZmYpO1xuLXN0YXRpYyB2b2lkIGVtaXRfc2lnbmF0dXJlX21hdGNoKHN0cnVjdCBicGZfZ2VuICpnZW4pO1xuIFxuIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKVxuIHtcbkBAIC0xNTQsOCAmIzQzOzE1Myw2IEBAIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzXG4gXHQvKiBSNyBjb250YWlucyB0aGUgZXJyb3IgY29kZSBmcm9tIHN5c19icGYuIENvcHkgaXQgaW50byBSMCBhbmQgZXhpdC4gKi9cbiBcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR183KSk7XG4gXHRlbWl0KGdlbiwgQlBGX0VYSVRfSU5TTigpKTtcbi1cdGlmIChPUFRTX0dFVChnZW4tXHUwMDNlb3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcbi1cdFx0ZW1pdF9zaWduYXR1cmVfbWF0Y2goZ2VuKTtcbiB9XG4gXG4gc3RhdGljIGludCBhZGRfZGF0YShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBzaXplKVxuQEAgLTM3Nyw4ICYjNDM7Mzc0LDYgQEAgc3RhdGljIHZvaWQgZW1pdF9zeXNfY2xvc2VfYmxvYihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgYmxvYl9vZmYpXG4gXHRfX2VtaXRfc3lzX2Nsb3NlKGdlbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGNvbXB1dGVfc2hhX3VwZGF0ZV9vZmZzZXRzKHN0cnVjdCBicGZfZ2VuICpnZW4pO1xuLVxuIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcbiB7XG4gXHRpbnQgaTtcbkBAIC00MDgsOSAmIzQzOzQwMyw2IEBAIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcbiBcdGlmICghZ2VuLVx1MDAzZWVycm9yKSB7XG4gXHRcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgKm9wdHMgPSBnZW4tXHUwMDNlb3B0cztcbiBcbi1cdFx0aWYgKE9QVFNfR0VUKG9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXG4tXHRcdFx0Y29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoZ2VuKTtcbi1cbiBcdFx0b3B0cy1cdTAwM2VpbnNucyA9IGdlbi1cdTAwM2VpbnNuX3N0YXJ0O1xuIFx0XHRvcHRzLVx1MDAzZWluc25zX3N6ID0gZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQ7XG4gXHRcdG9wdHMtXHUwMDNlZGF0YSA9IGdlbi1cdTAwM2VkYXRhX3N0YXJ0O1xuQEAgLTQ2MCwyMiAmIzQzOzQ1Miw2IEBAIHZvaWQgYnBmX2dlbl9fZnJlZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxuIFx0X3ZhbDtcdFx0XHRcdFx0XHRcdFxcXG4gfSlcbiBcbi1zdGF0aWMgdm9pZCBjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxuLXtcbi1cdF9fdTY0IHNoYVtTSEEyNTZfRFdPUkRfU0laRV07XG4tXHRfX3U2NCBzaGFfZHc7XG4tXHRpbnQgaTtcbi1cbi1cdGxpYmJwZl9zaGEyNTYoZ2VuLVx1MDAzZWRhdGFfc3RhcnQsIGdlbi1cdTAwM2VkYXRhX2N1ciAtIGdlbi1cdTAwM2VkYXRhX3N0YXJ0LCAoX191OCAqKXNoYSk7XG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBTSEEyNTZfRFdPUkRfU0laRTsgaSYjNDM7JiM0MzspIHtcbi1cdFx0c3RydWN0IGJwZl9pbnNuICppbnNuID1cbi1cdFx0XHQoc3RydWN0IGJwZl9pbnNuICopKGdlbi1cdTAwM2VpbnNuX3N0YXJ0ICYjNDM7IGdlbi1cdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldKTtcbi1cdFx0c2hhX2R3ID0gdGd0X2VuZGlhbihzaGFbaV0pO1xuLVx0XHRpbnNuWzBdLmltbSA9IChfX3UzMilzaGFfZHc7XG4tXHRcdGluc25bMV0uaW1tID0gc2hhX2R3IFx1MDAzZVx1MDAzZSAzMjtcbi1cdH1cbi19XG4tXG4gdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsXG4gXHRcdCAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpXG4ge1xuQEAgLTU1Nyw4ICYjNDM7NTMzLDkgQEAgdm9pZCBicGZfZ2VuX19tYXBfY3JlYXRlKHN0cnVjdCBicGZfZ2VuICpnZW4sXG4gXHQgKiBDb25kaXRpb25hbGx5IHVwZGF0ZSBtYXhfZW50cmllcyBmcm9tIHRoZSBob3N0LXN1cHBsaWVkIGxvYWRlclxuIFx0ICogY3R4LiBUaGlzIHNpemVzIHRoZSBtYXAgYXQgcnVudGltZSwgYnV0IGZvciBhIHNpZ25lZCBsb2FkZXJcbiBcdCAqIChnZW5faGFzaCkgaXQgd291bGQgbGV0IGFuIHVudHJ1c3RlZCBob3N0IHJlLWRpbWVuc2lvbiB0aGVcbi1cdCAqIHByb2dyYW0mIzM5O3MgbWFwcyBhZnRlciBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpLCBvdXRzaWRlIHdoYXQgdGhlXG4tXHQgKiBzaWduYXR1cmUgYXR0ZXN0cyB0by4gS2VlcCB0aGUgc2lnbmVyLXByb3ZpZGVkIG1heF9lbnRyaWVzXG4mIzQzO1x0ICogcHJvZ3JhbSYjMzk7cyBtYXBzLCBvdXRzaWRlIHdoYXQgdGhlIHNpZ25hdHVyZSBhdHRlc3RzIHRvOiB0aGVcbiYjNDM7XHQgKiBtZXRhZGF0YSBibG9iIGlzIGNvdmVyZWQgYnkgdGhlIHByb2dyYW0gc2lnbmF0dXJlIGFuZCB2ZXJpZmllZFxuJiM0MztcdCAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXNcbiBcdCAqIGJha2VkIGludG8gdGhlIGJsb2IgaW4gdGhhdCBjYXNlLlxuIFx0ICovXG4gXHRpZiAobWFwX2lkeCBcdTAwM2U9IDAgXHUwMDI2XHUwMDI2ICFPUFRTX0dFVChnZW4tXHUwMDNlb3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcbkBAIC01OTYsNDUgJiM0Mzs1NzMsNiBAQCB2b2lkIGJwZl9nZW5fX21hcF9jcmVhdGUoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0ZW1pdF9zeXNfY2xvc2Vfc3RhY2soZ2VuLCBzdGFja19vZmYoaW5uZXJfbWFwX2ZkKSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGVtaXRfc2lnbmF0dXJlX21hdGNoKHN0cnVjdCBicGZfZ2VuICpnZW4pXG4te1xuLVx0X19zNjQgb2ZmO1xuLVx0aW50IGk7XG4tXG4tXHQvKlxuLVx0ICogUmVqZWN0IGlmIHRoZSBtZXRhZGF0YSBtYXAgaXMgbm90IGV4Y2x1c2l2ZS4gV2l0aG91dCBleGNsdXNpdml0eVxuLVx0ICogdGhlIGNhY2hlZCBtYXAtXHUwMDNlc2hhW10gdmVyaWZpZWQgYWJvdmUgY2FuIGJlIHN0YWxlOiBhbm90aGVyIEJQRlxuLVx0ICogcHJvZ3JhbSB3aXRoIG1hcCBhY2Nlc3MgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBjb250ZW50cyBiZXR3ZWVuXG4tXHQgKiBCUEZfT0JKX0dFVF9JTkZPX0JZX0ZEIGFuZCBsb2FkZXIgZXhlY3V0aW9uLlxuLVx0ICovXG4tXHRlbWl0MihnZW4sIEJQRl9MRF9JTU02NF9SQVdfRlVMTChCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCxcbi1cdFx0XHRcdFx0IDAsIDAsIDAsIDApKTtcbi1cdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7XG4tXHRvZmYgPSAtKGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0IC0gZ2VuLVx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XG4tXHRpZiAoaXNfc2ltbTE2KG9mZikpIHtcbi1cdFx0ZW1pdChnZW4sIEJQRl9NT1Y2NF9JTU0oQlBGX1JFR183LCAtRUlOVkFMKSk7XG4tXHRcdGVtaXQoZ2VuLCBCUEZfSk1QX0lNTShCUEZfSk5FLCBCUEZfUkVHXzIsIDEsIG9mZikpO1xuLVx0fSBlbHNlIHtcbi1cdFx0Z2VuLVx1MDAzZWVycm9yID0gLUVSQU5HRTtcbi1cdH1cbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNIQTI1Nl9EV09SRF9TSVpFOyBpJiM0MzsmIzQzOykge1xuLVx0XHRlbWl0MihnZW4sIEJQRl9MRF9JTU02NF9SQVdfRlVMTChCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCxcbi1cdFx0XHRcdFx0XHQgMCwgMCwgMCwgMCkpO1xuLVx0XHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgaSAqIHNpemVvZihfX3U2NCkpKTtcbi1cdFx0Z2VuLVx1MDAzZWhhc2hfaW5zbl9vZmZzZXRbaV0gPSBnZW4tXHUwMDNlaW5zbl9jdXIgLSBnZW4tXHUwMDNlaW5zbl9zdGFydDtcbi1cdFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18zLCAwLCAwLCAwLCAwLCAwKSk7XG4tXG4tXHRcdG9mZiA9IC0oZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQgLSBnZW4tXHUwMDNlY2xlYW51cF9sYWJlbCkgLyA4IC0gMjtcbi1cdFx0aWYgKGlzX3NpbW0xNihvZmYpKSB7XG4tXHRcdFx0ZW1pdChnZW4sIEJQRl9NT1Y2NF9JTU0oQlBGX1JFR183LCAtRUlOVkFMKSk7XG4tXHRcdFx0ZW1pdChnZW4sIEJQRl9KTVBfUkVHKEJQRl9KTkUsIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBvZmYpKTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRnZW4tXHUwMDNlZXJyb3IgPSAtRVJBTkdFO1xuLVx0XHR9XG4tXHR9XG4tfVxuLVxuIHZvaWQgYnBmX2dlbl9fcmVjb3JkX2F0dGFjaF90YXJnZXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3QgY2hhciAqYXR0YWNoX25hbWUsXG4gXHRcdFx0XHQgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKVxuIHtcbkBAIC0xMjExLDEwICYjNDM7MTE0OSwxMCBAQCB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuIFx0ICogfVxuIFx0ICpcbiBcdCAqIFRoZSBydW50aW1lIGluaXRpYWxfdmFsdWUgY29tZXMgZnJvbSB0aGUgaG9zdC1zdXBwbGllZCBsb2FkZXJcbi1cdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKClcbi1cdCAqIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCBtYXAtXHUwMDNlc2hhW10uIEZvciBhIHNpZ25lZCBsb2FkZXIgKGdlbl9oYXNoKVxuLVx0ICogdGhlIGF0dGVzdGVkIGJsb2IgdmFsdWUgbXVzdCBiZSBhdXRob3JpdGF0aXZlLCBzbyBza2lwIHRoZSBvdmVycmlkZVxuLVx0ICogYW5kIGxlYXZlIHRoZSBoYXNoZWQgdmFsdWUgaW4gcGxhY2UuXG4mIzQzO1x0ICogY3R4IGFuZCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJsb2IgdmFsdWUgdGhhdCB0aGUgcHJvZ3JhbSBzaWduYXR1cmVcbiYjNDM7XHQgKiBjb3ZlcnMgYW5kIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXQgbG9hZCB0aW1lLiBGb3IgYSBzaWduZWQgbG9hZGVyXG4mIzQzO1x0ICogKGdlbl9oYXNoKSB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXBcbiYjNDM7XHQgKiB0aGUgb3ZlcnJpZGUgYW5kIGxlYXZlIHRoZSBzaWduZWQgdmFsdWUgaW4gcGxhY2UuXG4gXHQgKi9cbiBcdGlmICghT1BUU19HRVQoZ2VuLVx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpIHtcbiBcdFx0ZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18zLCBCUEZfUkVHXzYsXG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li5kNWI3ZGI3MDNiM2ZlOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmhcbkBAIC03NjgsNyAmIzQzOzc2OCw2IEBAIGludCBlbGZfcmVzb2x2ZV9wYXR0ZXJuX29mZnNldHMoY29uc3QgY2hhciAqYmluYXJ5X3BhdGgsIGNvbnN0IGNoYXIgKnBhdHRlcm4sXG4gaW50IHByb2JlX2ZkKGludCBmZCk7XG4gXG4gI2RlZmluZSBTSEEyNTZfRElHRVNUX0xFTkdUSCAzMlxuLSNkZWZpbmUgU0hBMjU2X0RXT1JEX1NJWkUgU0hBMjU2X0RJR0VTVF9MRU5HVEggLyBzaXplb2YoX191NjQpXG4gXG4gdm9pZCBsaWJicGZfc2hhMjU2KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIF9fdTggb3V0W1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSk7XG4gaW50IHByb2JlX3N5c19icGZfZXh0KHZvaWQpO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbmluZGV4IDc0NTAzZDM1OGJjOGE1Li44NTU1YWI4YWY1NTRjMyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuQEAgLTMyMCwyNSAmIzQzOzMyMCw2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfbGlua19jcmVhdGUoaW50IHByb2dfZmQsIGludCB0YXJnZXRfZmQsXG4gXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9MSU5LX0NSRUFURSwgXHUwMDI2YXR0ciwgYXR0cl9zeik7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKGludCBmZClcbi17XG4tXHRjb25zdCBzaXplX3QgYXR0cl9zeiA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBpbmZvKTtcbi1cdF9fdTggc2hhW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcbi1cdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbztcbi1cdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuLVx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbi1cbi1cdG1lbXNldChcdTAwMjZpbmZvLCAwLCBzaXplb2YoaW5mbykpO1xuLVx0aW5mby5oYXNoID0gKGxvbmcpIFx1MDAyNnNoYTtcbi1cdGluZm8uaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEg7XG4tXG4tXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgYXR0cl9zeik7XG4tXHRhdHRyLmluZm8uYnBmX2ZkID0gZmQ7XG4tXHRhdHRyLmluZm8uaW5mbyA9IChsb25nKSBcdTAwMjZpbmZvO1xuLVx0YXR0ci5pbmZvLmluZm9fbGVuID0gaW5mb19sZW47XG4tXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9PQkpfR0VUX0lORk9fQllfRkQsIFx1MDAyNmF0dHIsIGF0dHJfc3opO1xuLX1cbi1cbiBzdGF0aWMgaW5saW5lIGludCBza2VsX21hcF9mcmVlemUoaW50IGZkKVxuIHtcbiBcdGNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIG1hcF9mZCk7XG5AQCAtMzg0LDEyICYjNDM7MzY1LDYgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRzZXRfZXJyO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbi1cdGVyciA9IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCk7XG4tXHRpZiAoZXJyIFx1MDAzYyAwKSB7XG4tXHRcdG9wdHMtXHUwMDNlZXJyc3RyID0gXCYjMzQ7ZmFpbGVkIHRvIGZldGNoIG9iaiBpbmZvXCYjMzQ7O1xuLVx0XHRzZXRfZXJyO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiAjZW5kaWZcbiBcbiBcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBwcm9nX2xvYWRfYXR0cl9zeik7XG5AQCAtNDAwLDYgJiM0MzszNzUsOCBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gI2lmbmRlZiBfX0tFUk5FTF9fXG4gXHRhdHRyLnNpZ25hdHVyZSA9IChsb25nKSBvcHRzLVx1MDAzZXNpZ25hdHVyZTtcbiBcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zejtcbiYjNDM7XHRpZiAob3B0cy1cdTAwM2VzaWduYXR1cmUpXG4mIzQzO1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gI2Vsc2VcbiBcdGlmIChvcHRzLVx1MDAzZXNpZ25hdHVyZSB8fCBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zeilcbiBcdFx0cHJfd2FybihcJiMzNDtzaWduYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGZyb20gYnBmX3ByZWxvYWRcXG5cJiMzNDspO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuaW5kZXggNWZjNDE3ZTMxZmM2MTUuLmIzYWMzZDliMGUzMTZkIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbkBAIC0xMSw2ICYjNDM7MTEsOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2tleWN0bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2J0Zi5oXHUwMDNlXG4mIzQzO1xuICNpbmNsdWRlIFwmIzM0O2JwZi9saWJicGZfaW50ZXJuYWwuaFwmIzM0OyAvKiBmb3IgbGliYnBmX3NoYTI1NigpICovXG4gI2luY2x1ZGUgXCYjMzQ7YnBmL3NrZWxfaW50ZXJuYWwuaFwmIzM0O1x0IC8qIGZvciBsb2FkZXIgY3R4IGxheW91dCAoYnBmX2xvYWRlcl9jdHggZXRjKSAqL1xuIFxuQEAgLTE5LDggJiM0MzsyMSw2IEBAXG4gI2luY2x1ZGUgXCYjMzQ7dGVzdF9zaWduZWRfbG9hZGVyX2RhdGEuc2tlbC5oXCYjMzQ7XG4gI2luY2x1ZGUgXCYjMzQ7dGVzdF9zaWduZWRfbG9hZGVyX2xzbS5za2VsLmhcJiMzNDtcbiBcbi0jZGVmaW5lIFNJR19NQVRDSF9JTlNOUyAzMyAvKiBleGNsICg1KSAmIzQzOyA0ICogc2hhLWR3b3JkICg3KSAqL1xuLVxuIGVudW0ge1xuIFx0QlBGX1NJR19VTlNJR05FRCA9IDAsXG4gXHRCUEZfU0lHX1ZFUklGSUVELFxuQEAgLTM1LDcgJiM0MzszNSw4IEBAIGVudW0ge1xuIH07XG4gXG4gc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXG4tXHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZClcbiYjNDM7XHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcbiYjNDM7XHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4ge1xuIFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBmZDtcbkBAIC01Miw2ICYjNDM7NTMsNyBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiBcdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiBcdFx0YXR0ci5rZXlyaW5nX2lkID0ga2V5cmluZ19pZDtcbiBcdH1cbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcbiBcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0Oywgc2l6ZW9mKFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDspKTtcbiBcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiBcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuQEAgLTYyLDE0ICYjNDM7NjQsMTIgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LFxuLVx0XHRcdCAgYm9vbCBnZXRfaGFzaCwgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXG4mIzQzO1x0XHRcdCAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pXG4ge1xuIFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXG4gXHRcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxuIFx0XHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBleGNsX3N6KTtcbi1cdF9fdTggaGJ1ZltTSEEyNTZfRElHRVNUX0xFTkdUSF07XG4tXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm87XG4tXHRfX3UzMiBpbGVuID0gc2l6ZW9mKGluZm8pLCBrZXkgPSAwO1xuJiM0MztcdF9fdTMyIGtleSA9IDA7XG4gXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IG1hcF9mZCwgcHJvZ19mZCwgcmV0O1xuIFxuQEAgLTg3LDE1ICYjNDM7ODcsNiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiBcdFx0cmV0ID0gLWVycm5vO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG4tXHRpZiAoZ2V0X2hhc2gpIHtcbi1cdFx0bWVtc2V0KFx1MDAyNmluZm8sIDAsIHNpemVvZihpbmZvKSk7XG4tXHRcdGluZm8uaGFzaCA9IHB0cl90b191NjQoaGJ1Zik7XG4tXHRcdGluZm8uaGFzaF9zaXplID0gc2l6ZW9mKGhidWYpO1xuLVx0XHRpZiAoYnBmX21hcF9nZXRfaW5mb19ieV9mZChtYXBfZmQsIFx1MDAyNmluZm8sIFx1MDAyNmlsZW4pKSB7XG4tXHRcdFx0cmV0ID0gLWVycm5vO1xuLVx0XHRcdGdvdG8gb3V0X21hcDtcbi1cdFx0fVxuLVx0fVxuIFxuIFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4gXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbkBAIC0xMDgsNiAmIzQzOzk5LDcgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuIFx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuIFx0XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gXHR9XG4gXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDssIHNpemVvZihcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7KSk7XG4gXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbkBAIC0yMzYsNzkgJiM0MzsyMjgsNiBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBjaGVja19zaWdfbWF0Y2hfc2hhcGUoY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbiwgaW50IG4pXG4te1xuLVx0aW50IGEgPSAtMSwgY2xlYW51cCA9IC0xLCBpLCBiYXNlLCB0LCBicls1XSwgbmIgPSAwO1xuLVxuLVx0LyogQlBGX1BTRVVET19NQVBfSURYICh0aGUgc3RydWN0IGJwZl9tYXAgKiBmb3JtKSBpcyB1c2VkIG9ubHkgaGVyZS4gKi9cbi1cdGZvciAoaSA9IDA7IGkgJiM0MzsgMSBcdTAwM2MgbjsgaSYjNDM7JiM0MzspIHtcbi1cdFx0aWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baV0uc3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFgpIHtcbi1cdFx0XHRhID0gaTtcbi1cdFx0XHRicmVhaztcbi1cdFx0fVxuLVx0fVxuLVx0aWYgKCFBU1NFUlRfR0UoYSwgMCwgXCYjMzQ7ZW1pdF9zaWduYXR1cmVfbWF0Y2ggcHJlc2VudFwmIzM0OykpXG4tXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX0xFKGEgJiM0MzsgU0lHX01BVENIX0lOU05TLCBuLCBcJiMzNDtibG9jayBmaXRzIGluIHByb2dyYW1cJiMzNDspKVxuLVx0XHRyZXR1cm47XG4tXG4tXHQvKiBleGNsIGNoZWNrOiByMiA9ICoodTMyICopKG1hcCAmIzQzOyAzMik7IGlmIHIyICE9IDEgZ290byBjbGVhbnVwICovXG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVyksIFwmIzM0O2V4Y2wgbG9hZCB3aWR0aFwmIzM0Oyk7XG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyAyXS5vZmYsIFNIQTI1Nl9ESUdFU1RfTEVOR1RILCBcJiMzNDtleGNsIGZpZWxkIG9mZnNldFwmIzM0Oyk7XG4tXHRBU1NFUlRfRVEoaW5bYSAmIzQzOyA0XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSyksIFwmIzM0O2V4Y2wgYnJhbmNoIG9wXCYjMzQ7KTtcbi1cdEFTU0VSVF9FUShpblthICYjNDM7IDRdLmltbSwgMSwgXCYjMzQ7ZXhjbCBjb21wYXJlZCB0byAxXCYjMzQ7KTtcbi1cdGJyW25iJiM0MzsmIzQzO10gPSBhICYjNDM7IDQ7XG4tXG4tXHQvKiA0IHNoYS1kd29yZCBjaGVja3M6IHIyID0gKih1NjQgKikobWFwICYjNDM7IGkqOCk7IGlmIHIyICE9IHIzIGdvdG8gY2xlYW51cCAqL1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSYjNDM7JiM0MzspIHtcbi1cdFx0YmFzZSA9IGEgJiM0MzsgNSAmIzQzOyBpICogNztcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgMl0uY29kZSwgKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXKSwgXCYjMzQ7c2hhIGxvYWQgd2lkdGhcJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyAyXS5vZmYsIGkgKiA4LCBcJiMzNDtzaGEgZHdvcmQgb2Zmc2V0XCYjMzQ7KTtcbi1cdFx0QVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgM10uY29kZSwgKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpLCBcJiMzNDtzaGEgaW1tNjQgKEhfbWV0YSlcJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSAmIzQzOyA2XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWCksIFwmIzM0O3NoYSBicmFuY2ggb3BcJiMzNDspO1xuLVx0XHRicltuYiYjNDM7JiM0MztdID0gYmFzZSAmIzQzOyA2O1xuLVx0fVxuLVxuLVx0Lypcbi1cdCAqIExvY2F0ZSB0aGUgcmVhbCBjbGVhbnVwIGxhYmVsIHNvIHdlIGNhbiBwaW4gdGhlIGV4YWN0IGp1bXAgdGFyZ2V0LFxuLVx0ICogbm90IGp1c3QgXCYjMzQ7c29tZSBiYWNrd2FyZCBsYWJlbFwmIzM0Oy4gYnBmX2dlbl9faW5pdCgpIGVtaXRzIHRoZSBjbGVhbnVwXG4tXHQgKiBibG9jayBhcyBhIHByb2ctZmQgY2xvc2UgbG9vcCB3aG9zZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUgbGFiZWxcbi1cdCAqIGV2ZXJ5IGVycm9yIGJyYW5jaCBqdW1wcyB0by5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMDsgaSAmIzQzOyAyIFx1MDAzYyBhOyBpJiM0MzsmIzQzOykge1xuLVx0XHRpZiAoaW5baV0uY29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcdTAwMjZcdTAwMjYgaW5baV0uc3JjX3JlZyA9PSBCUEZfUkVHXzEwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSAmIzQzOyAxXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0pTTEUgfCBCUEZfSykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpICYjNDM7IDFdLmRzdF9yZWcgPT0gQlBGX1JFR18xIFx1MDAyNlx1MDAyNiBpbltpICYjNDM7IDFdLmltbSA9PSAwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSAmIzQzOyAxXS5vZmYgPT0gMSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgJiM0MzsgMl0uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9DQUxMKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgJiM0MzsgMl0uaW1tID09IEJQRl9GVU5DX3N5c19jbG9zZSkge1xuLVx0XHRcdGNsZWFudXAgPSBpO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXHR9XG4tXHRpZiAoIUFTU0VSVF9HRShjbGVhbnVwLCAwLCBcJiMzNDtjbGVhbnVwIGxhYmVsIGxvY2F0ZWRcJiMzNDspKVxuLVx0XHRyZXR1cm47XG4tXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBuYjsgaSYjNDM7JiM0MzspIHtcbi1cdFx0dCA9IGJyW2ldICYjNDM7IDEgJiM0MzsgaW5bYnJbaV1dLm9mZjtcbi1cdFx0QVNTRVJUX0VRKHQsIGNsZWFudXAsIFwmIzM0O3NpZy1tYXRjaCBsYW5kcyBvbiBjbGVhbnVwXCYjMzQ7KTtcbi1cdH1cbi1cdC8qXG4tXHQgKiBTYW1lIGludmFyaWFudCBmb3IgZXZlcnkgb3RoZXIgY2xlYW51cC1ib3VuZCBqdW1wIGluIHRoZSBwcm9ncmFtOlxuLVx0ICogZW1pdF9jaGVja19lcnIoKSBpcyB0aGUgb25seSBzb3VyY2Ugb2YgXCYjMzQ7aWYgKHI3IFx1MDAzYyAwKSBnb3RvIGNsZWFudXBcJiMzNDssXG4tXHQgKiBzbyBlYWNoIG9mIHRob3NlIG11c3QgYWxzbyByZXNvbHZlIGV4YWN0bHkgdG8gY2xlYW51cC5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMCwgdCA9IDA7IGkgXHUwMDNjIG47IGkmIzQzOyYjNDM7KSB7XG4tXHRcdGlmIChpbltpXS5jb2RlICE9IChCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfSykgfHxcbi1cdFx0ICAgIGluW2ldLmRzdF9yZWcgIT0gQlBGX1JFR183IHx8IGluW2ldLmltbSAhPSAwIHx8IGluW2ldLm9mZiBcdTAwM2U9IDApXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdEFTU0VSVF9FUShpICYjNDM7IDEgJiM0MzsgaW5baV0ub2ZmLCBjbGVhbnVwLCBcJiMzNDtlcnItY2hlY2sgbGFuZHMgb24gY2xlYW51cFwmIzM0Oyk7XG4tXHRcdHQmIzQzOyYjNDM7O1xuLVx0fVxuLVx0QVNTRVJUX0dUKHQsIDAsIFwmIzM0O2ZvdW5kIGVtaXRfY2hlY2tfZXJyIGp1bXBzXCYjMzQ7KTtcbi19XG4tXG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XG4gXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfb3B0cyBnb3B0cztcbkBAIC0zNzIsMTYgJiM0MzsyOTEsNiBAQCBzdGF0aWMgdm9pZCBnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKVxuIFx0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KGYtXHUwMDNlc2tlbCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2NoZWNrX3NoYXBlKHZvaWQpXG4te1xuLVx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVxuLVx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApXG4tXHRcdGNoZWNrX3NpZ19tYXRjaF9zaGFwZSgoY29uc3Qgc3RydWN0IGJwZl9pbnNuICopZi5nb3B0cy5pbnNucyxcbi1cdFx0XHRcdCAgICAgIGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbi19XG4tXG4gc3RhdGljIHZvaWQgbWV0YWRhdGFfbWF0Y2godm9pZClcbiB7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG5AQCAtMzkxLDk0ICYjNDM7MzAwLDIyMCBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9tYXRjaCh2b2lkKVxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbiBcdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbiYjNDM7XHRcdFx0XHQgICBmLmN0eCwgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4gXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0Oyk7XG4gXHRcdEFTU0VSVF9FUShyLCAwLCBcJiMzNDtob25lc3QgbG9hZGVyIHJldHZhbFwmIzM0Oyk7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfc2hhX21pc21hdGNoKHZvaWQpXG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxuIHtcbiYjNDM7XHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdGJvb2wgcmFuO1xuLVx0aW50IHI7XG4mIzQzO1x0aW50IGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogYmxvYlswXSBsaXZlcyBpbiB0aGUgbG9hZGVyJiMzOTtzIGZkX2FycmF5IHNjcmF0Y2ggKGZpcnN0IGFkZF9kYXRhIGluXG4tXHRcdCAqIGJwZl9nZW5fX2luaXQpOyBhIDAtbWFwIHByb2dyYW0gbmV2ZXIgcmVhZHMgaXQsIHNvIGZsaXBwaW5nIGl0XG4tXHRcdCAqIGNoYW5nZXMgb25seSBtYXAtXHUwMDNlc2hhLiBUaGUgbWV0YWRhdGEgY2hlY2sgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdFxuLVx0XHQgKiBjYW4gbm90aWNlIC1cdTAwM2UgaXNvbGF0ZXMgZW1pdF9zaWduYXR1cmVfbWF0Y2guXG4mIzQzO1x0XHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcbiYjNDM7XHRcdCAqIFBLQ1MjNyBzaWduYXR1cmUpIG11c3QgYmUgcmVqZWN0ZWQgYXQgbG9hZDogdGhlIHNpZ25hdHVyZVxuJiM0MztcdFx0ICogcGF0aCBpcyBob25vcmVkLCBub3QgaWdub3JlZC4gKFRoZSB2YWxpZCBwYXRoIGlzIGNvdmVyZWQgYnlcbiYjNDM7XHRcdCAqIHRoZSBzaWduZWQgbHNrZWxzLilcbiBcdFx0ICovXG4tXHRcdGYuYmxvYlswXSBePSAweGZmO1xuLVx0XHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxuLVx0XHRcdFx0ICAgZi5kYXRhX3N6LCBmLmV4Y2wsIHNpemVvZihmLmV4Y2wpLCBOVUxMLCAwLFxuLVx0XHRcdFx0ICAgdHJ1ZSwgZi5jdHgsIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuLVx0XHRBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCYjMzQ7dGFtcGVyZWQgYmxvYiByZWplY3RlZCBieSBlbWl0X3NpZ25hdHVyZV9tYXRjaFwmIzM0Oyk7XG4mIzQzO1x0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuJiM0MztcdFx0XHRcdCBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XG4mIzQzO1x0XHRBU1NFUlRfTFQoZmQsIDAsIFwmIzM0O2ludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcJiMzNDspO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX25vdF9leGNsdXNpdmUodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiB7XG4mIzQzO1x0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4tXHRib29sIHJhbjtcbi1cdGludCByO1xuJiM0MztcdGludCBtYXBfZmQsIGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogQ29ycmVjdCBibG9iIGJ1dCBhIG5vbi1leGNsdXNpdmUgbWV0YWRhdGEgbWFwOiB0aGUgdmVyaWZpZXIgZG9lc1xuLVx0XHQgKiBub3QgcmVqZWN0IChleGNsX3Byb2dfc2hhIHVuc2V0KSwgc28gdGhlIHJ1bnRpbWUgbWFwLVx1MDAzZWV4Y2wgPT0gMVxuLVx0XHQgKiBjaGVjayBpbiB0aGUgbG9hZGVyIG11c3QuXG4mIzQzO1x0XHQgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSBvbmx5IGJpbmQgZXhjbHVzaXZlIG1hcHMgdGhyb3VnaCBmZF9hcnJheVxuJiM0MztcdFx0ICogKHRoZWlyIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlKS4gQmluZGluZyBhXG4mIzQzO1x0XHQgKiBub24tZXhjbHVzaXZlIG1hcCBpcyByZWplY3RlZCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgaXMgZXZlblxuJiM0MztcdFx0ICogZXhhbWluZWQuXG4gXHRcdCAqL1xuLVx0XHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxuLVx0XHRcdFx0ICAgZi5kYXRhX3N6LCBOVUxMLCAwLCBOVUxMLCAwLCB0cnVlLCBmLmN0eCxcbi1cdFx0XHRcdCAgIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuLVx0XHRBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspO1xuLVx0XHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXCYjMzQ7bm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXAgcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcJiMzNDtub25leGNsXCYjMzQ7LCA0LFxuJiM0MztcdFx0XHRcdFx0Zi5kYXRhX3N6LCAxLCBOVUxMKTtcbiYjNDM7XHRcdGlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCBcJiMzNDtub25leGNsX21hcFwmIzM0OykpIHtcbiYjNDM7XHRcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsXG4mIzQzO1x0XHRcdFx0XHQganVuaywgc2l6ZW9mKGp1bmspLFxuJiM0MztcdFx0XHRcdFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4mIzQzO1x0XHRcdEFTU0VSVF9FUShmZCwgLUVQRVJNLFxuJiM0MztcdFx0XHRcdCAgXCYjMzQ7bm9uLWV4Y2x1c2l2ZSBtYXAgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0XHRjbG9zZShmZCk7XG4mIzQzO1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO1x0XHR9XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQodm9pZClcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXG4ge1xuJiM0MztcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzKTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdGJvb2wgcmFuO1xuLVx0aW50IHI7XG4mIzQzO1x0aW50IG1hcF9mZCwgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHQvKlxuLVx0XHQgKiBDb3JyZWN0LCBleGNsdXNpdmUsIGZyb3plbiBtYXAsIGJ1dCBpdHMgaGFzaCB3YXMgbmV2ZXIgY29tcHV0ZWRcbi1cdFx0ICogKG5vIE9CSl9HRVRfSU5GT19CWV9GRCksIHNvIG1hcC1cdTAwM2VzaGEgc3RheXMgemVyby4gVGhlIGxvYWRlciBtdXN0XG4tXHRcdCAqIGZhaWwgY2xvc2VkIHJhdGhlciB0aGFuIHRyZWF0IGFuIHVuc2V0IGhhc2ggYXMgYSBtYXRjaC5cbiYjNDM7XHRcdCAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZVxuJiM0MztcdFx0ICogc2lnbmF0dXJlLiBBbiBleGNsdXNpdmUgbWFwIG9mIGFueSBvdGhlciB0eXBlIGlzIHJlamVjdGVkXG4mIzQzO1x0XHQgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXRcbiYjNDM7XHRcdCAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyXG4mIzQzO1x0XHQgKiBhZGRyZXNzKSBhbmQgaW5zbi1hcnJheSBtYXBzIChidWZmZXIgc21hbGxlciB0aGFuIHZhbHVlX3NpemUpXG4mIzQzO1x0XHQgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlXG4mIzQzO1x0XHQgKiBtZW1jcHkoKSYjMzk7ZCBmcm9tIHRoZW0uIEEgaGFzaCBtYXAgc3RhbmRzIGluIGhlcmU6IGl0IGlzXG4mIzQzO1x0XHQgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LlxuIFx0XHQgKi9cbi1cdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbi1cdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIGZhbHNlLCBmLmN0eCwgZi5jdHhfc3osIFx1MDAyNnJhbik7XG4tXHRcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0Oyk7XG4tXHRcdEFTU0VSVF9FUShyLCAtRUlOVkFMLCBcJiMzNDt1bmNvbXB1dGVkIG1ldGFkYXRhIGhhc2ggcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdFx0bW9wdHMuZXhjbF9wcm9nX2hhc2ggPSBmLmV4Y2w7XG4mIzQzO1x0XHRtb3B0cy5leGNsX3Byb2dfaGFzaF9zaXplID0gc2l6ZW9mKGYuZXhjbCk7XG4mIzQzO1x0XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCYjMzQ7ZXhjbF9oYXNoXCYjMzQ7LCA0LCA0LCAxLFxuJiM0MztcdFx0XHRcdFx0XHUwMDI2bW9wdHMpO1xuJiM0MztcdFx0aWYgKEFTU0VSVF9PS19GRChtYXBfZmQsIFwmIzM0O2V4Y2xfaGFzaF9tYXBcJiMzNDspKSB7XG4mIzQzO1x0XHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLFxuJiM0MztcdFx0XHRcdFx0IGp1bmssIHNpemVvZihqdW5rKSxcbiYjNDM7XHRcdFx0XHRcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xuJiM0MztcdFx0XHRBU1NFUlRfRVEoZmQsIC1FSU5WQUwsXG4mIzQzO1x0XHRcdFx0ICBcJiMzNDtub24tYXJyYXkgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGlmIChmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0XHRjbG9zZShtYXBfZmQpO1xuJiM0MztcdFx0fVxuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKVxuJiM0MztzdGF0aWMgaW50IHNldHVwX21ldGFfbWFwKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2J0ZlhYWFhYWFwmIzM0OywgKmRpciA9IE5VTEw7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5MjtcbiYjNDM7XHRpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQgPSAtMTtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbiYjNDM7XHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xuJiM0MztcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRpbnQgZmRzWzJdO1xuJiM0MztcdF9fdTggc2lnWzgxOTJdO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpICE9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGZkX2FycmF5IGJpbmRzIG1hcHMgYW5kIEJURnMgYWxpa2UsIGJ1dCBvbmx5IGV4Y2x1c2l2ZSBhcnJheSBtYXBzIGFyZVxuJiM0MztcdCAqIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUuIEJ1aWxkIGFuIG90aGVyd2lzZSBnZW51aW5lbHkgc2lnbmVkIGxvYWQgLVxuJiM0MztcdCAqIGluc25zIHx8IG1ldGFkYXRhLCBleGNsdXNpdmUgZnJvemVuIG1hcCBhdCBmZF9hcnJheVswXSAtIHRoZW4gc211Z2dsZVxuJiM0MztcdCAqIGFuIGV4dHJhIEJURiBpbnRvIGZkX2FycmF5WzFdLiBBIHNpZ25lZCBwcm9ncmFtIG1heSBub3QgYmluZCBhbnkgQlRGLFxuJiM0MztcdCAqIHNvIHJlc29sdmluZyB0aGUgZmRfYXJyYXkgZW50cmllcyByZWplY3RzIHRoZSBCVEYgd2l0aCAtRUFDQ0VTIChpblxuJiM0MztcdCAqIF9fYWRkX3VzZWRfYnRmKCksIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW4gdmVyaWZpZWQpLlxuJiM0MztcdCAqL1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcJiMzNDtzaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeiwgc2lnLFxuJiM0MztcdFx0XHQgICAgICAgXHUwMDI2c2lnX3N6KSwgXCYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCYjMzQ7bWV0YV9tYXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcJiMzNDtidGZfbmV3X2VtcHR5XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGJ0Zl9fYWRkX2ludChidGYsIFwmIzM0O2ludFwmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJ0Zl9fbG9hZF9pbnRvX2tlcm5lbChidGYpLCBcJiMzNDtidGZfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZmRzWzBdID0gbWFwX2ZkO1xuJiM0MztcdGZkc1sxXSA9IGJ0Zl9fZmQoYnRmKTtcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcbiYjNDM7XHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IDI7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiYjNDM7XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7LCBzaXplb2YoXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0OykpO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0QVNTRVJUX0VRKHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkLCAtRUFDQ0VTLFxuJiM0MztcdFx0ICBcJiMzNDtCVEYgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkIHBvc3QtdmVyaWZpZXJcJiMzNDspO1xuJiM0MztcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKGJ0ZilcbiYjNDM7XHRcdGJ0Zl9fZnJlZShidGYpO1xuJiM0MztcdGlmIChtYXBfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRpZiAoaGF2ZV9maXh0dXJlKVxuJiM0MztcdFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4mIzQzO1x0aWYgKGRpcilcbiYjNDM7XHRcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuJiM0MztcdGZyZWUoYnVmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKVxuIHtcbiBcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuJiM0MztcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuJiM0MztcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHQvKlxuLVx0XHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcbi1cdFx0ICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlXG4tXHRcdCAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5XG4tXHRcdCAqIHRoZSBzaWduZWQgbHNrZWxzLilcbiYjNDM7XHRcdCAqIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gbm93IHJ1bnMgaW5zaWRlIGJwZl9jaGVjaygpLCBzbyBhXG4mIzQzO1x0XHQgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC1cbiYjNDM7XHRcdCAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LlxuIFx0XHQgKi9cbi1cdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbi1cdFx0XHRcdCBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuJiM0MztcdFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XG4mIzQzO1x0XHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuJiM0MztcdFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuJiM0MztcdFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuJiM0MztcdFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KGp1bmspO1xuJiM0MztcdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTtcbiYjNDM7XHRcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbiYjNDM7XHRcdGF0dHIubG9nX2xldmVsID0gMTtcbiYjNDM7XHRcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XG4mIzQzO1x0XHRhdHRyLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuJiM0MztcdFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7LCBzaXplb2YoXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0OykpO1xuJiM0MztcbiYjNDM7XHRcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiYjNDM7XHRcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuIFx0XHRBU1NFUlRfTFQoZmQsIDAsIFwmIzM0O2ludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcJiMzNDspO1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdFx0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWRcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICBcJiMzNDt2ZXJpZmllciBsb2dzIHNpZ25hdHVyZSBmYWlsdXJlXCYjMzQ7KTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbkBAIC00OTUsNyAmIzQzOzUzMCw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV90b29fbGFyZ2Uodm9pZClcbiBcdFx0ICogaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXIgaXMgcmVhZC5cbiBcdFx0ICovXG4gXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4tXHRcdFx0XHQgNjQgXHUwMDNjXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdFx0XHRcdCA2NCBcdTAwM2NcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XG4gXHRcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCwgXCYjMzQ7b3ZlcnNpemVkIHNpZ25hdHVyZSByZWplY3RlZFwmIzM0Oyk7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbkBAIC01MTUsNyAmIzQzOzU1MCw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKVxuIFx0XHQgKiBsYXJnZSBwb3NpdGl2ZSBzZXJpYWwgdGFrZXMgdGhlIHVzZXIta2V5cmluZyBwYXRoIGFuZCB3b24mIzM5O3QgZXhpc3QuXG4gXHRcdCAqL1xuIFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuLVx0XHRcdFx0IHNpemVvZihqdW5rKSwgSU5UX01BWCk7XG4mIzQzO1x0XHRcdFx0IHNpemVvZihqdW5rKSwgSU5UX01BWCwgMCk7XG4gXHRcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCwgXCYjMzQ7c2lnbmF0dXJlIHdpdGggYmFkIGtleXJpbmdfaWQgcmVqZWN0ZWRcJiMzNDspO1xuIFx0fVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG5AQCAtNTc1LDcgJiM0Mzs2MTAsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCh2b2lkKVxuIFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuIFxuIFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcbi1cdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuJiM0MztcdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0aWYgKCFBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspIHx8XG4gXHQgICAgIUFTU0VSVF9FUShyLCAwLCBcJiMzNDtsb2FkZXIgcmV0dmFsXCYjMzQ7KSlcbiBcdFx0Z290byBmcmVlX2Jsb2I7XG5AQCAtNjYxLDcgJiM0Mzs2OTYsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkKHZvaWQpXG4gXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4gXG4gXHRyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxuLVx0XHRcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4mIzQzO1x0XHRcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4gXHRpZiAoIUFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7bG9hZGVyIHJhblwmIzM0OykgfHxcbiBcdCAgICAhQVNTRVJUX0VRKHIsIDAsIFwmIzM0O2xvYWRlciByZXR2YWxcJiMzNDspKVxuIFx0XHRnb3RvIGZyZWVfYmxvYjtcbkBAIC03MTQsNiAmIzQzOzc0OSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBzaWdbODE5Ml07XG4gXHRfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejtcbiBcdHVuc2lnbmVkIGNoYXIgKmluc25zID0gTlVMTCwgKnRhbXBlcmVkID0gTlVMTCwgKmJsb2IgPSBOVUxMO1xuJiM0MztcdHVuc2lnbmVkIGNoYXIgKnNpZ25idWYgPSBOVUxMO1xuIFx0aW50IG5yX21hcHMgPSAwLCBucl9wcm9ncyA9IDAsIHI7XG4gXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbTtcbkBAIC03NjAsMjkgJiM0Mzs3OTYsNDYgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnModm9pZClcbiBcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcbiBcdGxpYmJwZl9zaGEyNTYoaW5zbnMsIGluc25zX3N6LCBleGNsKTtcbiBcbi1cdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIGluc25zX3N6LCBzaWcsIFx1MDAyNnNpZ19zeiksIFwmIzM0O3NpZ24tZmlsZVwmIzM0OykpXG4mIzQzO1x0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICYjNDM7IGRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCBcJiMzNDtzaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRtZW1jcHkoc2lnbmJ1ZiwgaW5zbnMsIGluc25zX3N6KTtcbiYjNDM7XHRtZW1jcHkoc2lnbmJ1ZiAmIzQzOyBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiAmIzQzOyBkYXRhX3N6LCBzaWcsIFx1MDAyNnNpZ19zeiksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiBcdFx0Z290byBjbGVhbnVwO1xuIFxuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4mIzQzO1x0XHRcdCAgIHNpZywgc2lnX3N6LCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdEFTU0VSVF9UUlVFKHJhbiwgXCYjMzQ7dmFsaWQgc2lnbmF0dXJlOiBsb2FkZXIgbG9hZGVkIGFuZCByYW5cJiMzNDspO1xuIFx0QVNTRVJUX0VRKHIsIDAsIFwmIzM0O3ZhbGlkIHNpZ25hdHVyZSBhY2NlcHRlZFwmIzM0Oyk7XG4gXHRjbG9zZV9sb2FkZXJfY3R4X2ZkcyhjdHgsIG5yX21hcHMsIG5yX3Byb2dzKTtcbiBcbiBcdG1lbWNweSh0YW1wZXJlZCwgaW5zbnMsIGluc25zX3N6KTtcbiBcdHRhbXBlcmVkW2luc25zX3N6IC8gMl0gXj0gMHhmZjtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJpbmQgdGhlIG1ldGFkYXRhIG1hcCB0byB0aGUgdGFtcGVyZWQgbG9hZGVyJiMzOTtzIG93biBkaWdlc3QsIHNvIHRoZVxuJiM0MztcdCAqIHZlcmlmaWVyJiMzOTtzIGV4Y2x1c2l2ZS1tYXAgY2hlY2sgKGV4Y2xfcHJvZ19zaGEgPT0gcHJvZy1cdTAwM2VkaWdlc3QpIHBhc3Nlc1xuJiM0MztcdCAqIGFuZCB0aGUgc2lnbmF0dXJlIC0gdmVyaWZpZWQgYWZ0ZXIgdGhlIG1hcHMgYXJlIHJlc29sdmVkIC0gaXMgd2hhdFxuJiM0MztcdCAqIHJlamVjdHMgdGhlIGxvYWQuIFRoaXMgaXMgdGhlIGF0dGFja2VyJiMzOTtzIGJlc3QgY2FzZTogZXZlbiBhZnRlclxuJiM0MztcdCAqIHJlLWJpbmRpbmcgdGhlIGV4Y2x1c2l2ZSBtYXAgdG8gdGhlaXIgdGFtcGVyZWQgbG9hZGVyLCB0aGUgc2lnbmF0dXJlXG4mIzQzO1x0ICogb3ZlciB0aGUgb3JpZ2luYWwgaW5zbnMgfHwgbWV0YWRhdGEgc3RpbGwgZmFpbHMuIChMZWF2aW5nIHRoZSBtYXBcbiYjNDM7XHQgKiBib3VuZCB0byB0aGUgb3JpZ2luYWwgZGlnZXN0IHdvdWxkIGluc3RlYWQgdHJpcCB0aGUgZXhjbCBjaGVjayBmaXJzdC4pXG4mIzQzO1x0ICovXG4mIzQzO1x0bGliYnBmX3NoYTI1Nih0YW1wZXJlZCwgaW5zbnNfc3osIGV4Y2wpO1xuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcih0YW1wZXJlZCwgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4mIzQzO1x0XHRcdCAgIHNpZywgc2lnX3N6LCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdEFTU0VSVF9GQUxTRShyYW4sIFwmIzM0O3RhbXBlcmVkIGxvYWRlciByZWplY3RlZCBiZWZvcmUgcnVuXCYjMzQ7KTtcbiBcdEFTU0VSVF9FUShyLCAtRUtFWVJFSkVDVEVELCBcJiMzNDtzaWduYXR1cmUgaXMgYm91bmQgdG8gdGhlIGluc3RydWN0aW9uc1wmIzM0Oyk7XG4gY2xlYW51cDpcbiBcdGZyZWUoaW5zbnMpO1xuIFx0ZnJlZSh0YW1wZXJlZCk7XG4gXHRmcmVlKGJsb2IpO1xuJiM0MztcdGZyZWUoc2lnbmJ1Zik7XG4gXHRmcmVlKGN0eCk7XG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7XG4gXHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbkBAIC0xMDA3LDEwICYjNDM7MTA2MCwxMSBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiB7XG4gXHRjaGFyIGRpcl90bXBsW10gPSBcJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJfbHNtWFhYWFhYXCYjMzQ7LCAqZGlyID0gTlVMTDtcbiBcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtICpsc20gPSBOVUxMO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIG1zaWdfc3ogPSA4MTkyO1xuIFx0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7XG4gXHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0X191MzIgc2lnX3N6ID0gODE5MjtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpidWY7XG4gXHRfX3MzMiBzZXNfc2VyaWFsO1xuIFx0X191OCBzaWdbODE5Ml07XG4gXG5AQCAtMTAyOSw3ICYjNDM7MTA4Myw3IEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKVxuIFx0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcJiMzNDttZXRhX21hcF91bnNpZ25lZFwmIzM0OykpXG4gXHRcdGdvdG8gb3V0O1xuIFx0bHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuID0gMDtcbi1cdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIE5VTEwsIDAsIDApO1xuJiM0MztcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIE5VTEwsIDAsIDAsIDApO1xuIFx0Y2xvc2UobWFwX2ZkKTtcbiBcdG1hcF9mZCA9IC0xO1xuIFx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXCYjMzQ7dW5zaWduZWQgbG9hZGVyIGxvYWRcJiMzNDspKVxuQEAgLTEwNjIsMjIgJiM0MzsxMTE2LDUxIEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKVxuIFx0XHRnb3RvIG91dDtcbiBcdGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiA9IDA7XG4gXHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsXG4tXHRcdFx0ICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdFx0XHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0bWFwX2ZkID0gLTE7XG4tXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcJiMzNDtzaWduZWQgbG9hZGVyIGxvYWRcJiMzNDspKVxuLVx0XHRnb3RvIG91dDtcbi1cdGNsb3NlKHByb2dfZmQpO1xuJiM0MztcdEFTU0VSVF9FUShwcm9nX2ZkLCAtRUFDQ0VTLCBcJiMzNDt1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UocHJvZ19mZCk7XG4gXHRwcm9nX2ZkID0gLTE7XG4gXG4gXHRzZXNfc2VyaWFsID0gc3lzY2FsbChfX05SX2tleWN0bCwgS0VZQ1RMX0dFVF9LRVlSSU5HX0lELFxuIFx0XHRcdCAgICAgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbiBcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4sIDEsIFwmIzM0O3NpZ25lZDogb25lIG9ic2VydmVkIGxvYWRcJiMzNDspO1xuLVx0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2lnX3ZlcmRpY3QsIEJQRl9TSUdfVkVSSUZJRUQsIFwmIzM0O3NpZ25lZCB2ZXJkaWN0XCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcbiYjNDM7XHRcdCAgXCYjMzQ7YWRtaXNzaW9uIHNhdyBhIHZhbGlkIHNpZ25hdHVyZVwmIzM0Oyk7XG4gXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfa2V5cmluZ190eXBlLCBCUEZfU0lHX0tFWVJJTkdfVVNFUiwgXCYjMzQ7c2lnbmVkIGtleXJpbmcgdHlwZVwmIzM0Oyk7XG4gXHRBU1NFUlRfR1Qoc2VzX3NlcmlhbCwgMCwgXCYjMzQ7c2Vzc2lvbiBrZXlyaW5nIHNlcmlhbCByZXNvbHZlZFwmIzM0Oyk7XG4gXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfa2V5cmluZ19zZXJpYWwsIHNlc19zZXJpYWwsXG4gXHRcdCAgXCYjMzQ7c2lnbmVkOiB2YWxpZGF0ZWQgYWdhaW5zdCBzZXNzaW9uIGtleXJpbmdcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXCYjMzQ7bWV0YV9zaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeixcbiYjNDM7XHRcdFx0XHRzaWcsIFx1MDAyNm1zaWdfc3opLCBcJiMzNDtzaWduIGluc25zfHxtZXRhZGF0YVwmIzM0OykpIHtcbiYjNDM7XHRcdGZyZWUoYnVmKTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRmcmVlKGJ1Zik7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCYjMzQ7bWV0YV9tYXBfYm91bmRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuID0gMDtcbiYjNDM7XHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsXG4mIzQzO1x0XHRcdCAgICAgIG1zaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4mIzQzO1x0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRtYXBfZmQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcJiMzNDttZXRhZGF0YS1ib3VuZCBsb2FkZXIgbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XHRwcm9nX2ZkID0gLTE7XG4mIzQzO1x0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiwgMSwgXCYjMzQ7bWV0YWRhdGE6IG9uZSBvYnNlcnZlZCBsb2FkXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcbiYjNDM7XHRcdCAgXCYjMzQ7bWV0YWRhdGEtYm91bmQgdmVyZGljdFwmIzM0Oyk7XG4gb3V0OlxuIFx0aWYgKG1hcF9mZCBcdTAwM2U9IDApXG4gXHRcdGNsb3NlKG1hcF9mZCk7XG5AQCAtMTA5MCwyMCAmIzQzOzExNzMsNDYyIEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKVxuIFx0dGVzdF9zaWduZWRfbG9hZGVyX2xzbV9fZGVzdHJveShsc20pO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogTG9hZC10aW1lIG1ldGFkYXRhIHZlcmlmaWNhdGlvbjogdGhlIGtlcm5lbCBmb2xkcyB0aGUgZnJvemVuIG1ldGFkYXRhIG1hcFxuJiM0MzsgKiBpbnRvIHRoZSBzaWduYXR1cmUgKGluc25zIHx8IG1ldGFkYXRhKSBhbmQgY2hlY2tzIGl0IGF0IEJQRl9QUk9HX0xPQUQgdmlhXG4mIzQzOyAqIGZkX2FycmF5X2NudCwgcmF0aGVyIHRoYW4gdGhlIGxvYWRlciBjaGVja2luZyBmcm9tIHdpdGhpbiBCUEYuIFNpZ24gdGhhdFxuJiM0MzsgKiBjb25jYXRlbmF0aW9uLCBoYW5kIHRoZSBrZXJuZWwgdGhlIG1hcCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25lZCBsb2FkZXIgbG9hZHMsXG4mIzQzOyAqIHJ1bnMsIGFuZCBpbnN0YWxscyBpdHMgdGFyZ2V0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGludCBsb2FkdGltZV9kcml2ZShjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiYjNDM7XHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LCBjb25zdCBfX3U4ICpleGNsLFxuJiM0MztcdFx0XHQgIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBpbnQgKmxvYWRfcmV0LCBib29sICpyYW4pXG4mIzQzO3tcbiYjNDM7XHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyxcbiYjNDM7XHRcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxuJiM0MztcdFx0ICAgIC5leGNsX3Byb2dfaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEgpO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGtleSA9IDA7XG4mIzQzO1x0dW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDtcbiYjNDM7XHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCByZXQgPSAwO1xuJiM0MztcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4mIzQzO1x0X191OCBzaWdbODE5Ml07XG4mIzQzO1xuJiM0MztcdCpyYW4gPSBmYWxzZTtcbiYjNDM7XHQqbG9hZF9yZXQgPSAwO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE1ldGFkYXRhIG1hcCwgYm91bmQgdG8gdGhlIGxvYWRlciBkaWdlc3QgYW5kIGZyb3plbiwgZXhhY3RseSBhc1xuJiM0MztcdCAqIHNrZWxfaW50ZXJuYWwuaCYjMzk7cyBicGZfbG9hZF9hbmRfcnVuKCkgc2V0cyBpdCB1cC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwmIzM0O19fbG9hZGVyLm1hcFwmIzM0OywgNCxcbiYjNDM7XHRcdFx0XHRkYXRhX3N6LCAxLCBcdTAwMjZtb3B0cyk7XG4mIzQzO1x0aWYgKG1hcF9mZCBcdTAwM2MgMClcbiYjNDM7XHRcdHJldHVybiAtZXJybm87XG4mIzQzO1x0aWYgKGJwZl9tYXBfdXBkYXRlX2VsZW0obWFwX2ZkLCBcdTAwMjZrZXksIGRhdGEsIDApIHx8IGJwZl9tYXBfZnJlZXplKG1hcF9mZCkpIHtcbiYjNDM7XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqL1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICYjNDM7IGRhdGFfc3opO1xuJiM0MztcdGlmICghYnVmKSB7XG4mIzQzO1x0XHRyZXQgPSAtRU5PTUVNO1xuJiM0MztcdFx0Z290byBvdXRfbWFwO1xuJiM0MztcdH1cbiYjNDM7XHRtZW1jcHkoYnVmLCBpbnNucywgaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShidWYgJiM0MzsgaW5zbnNfc3osIGRhdGEsIGRhdGFfc3opO1xuJiM0MztcdHJldCA9IHNpZ25fYnVmKGRpciwgYnVmLCBpbnNuc19zeiAmIzQzOyBkYXRhX3N6LCBzaWcsIFx1MDAyNnNpZ19zeik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4mIzQzO1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4mIzQzO1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuJiM0MztcdGF0dHIuaW5zbl9jbnQgPSBpbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoXHUwMDI2bWFwX2ZkKTtcbiYjNDM7XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbiYjNDM7XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuJiM0MztcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbiYjNDM7XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4mIzQzO1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7LCBzaXplb2YoXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0OykpO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0aWYgKHByb2dfZmQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdCpsb2FkX3JldCA9IC1lcnJubztcbiYjNDM7XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuJiM0MztcdGF0dHIudGVzdC5wcm9nX2ZkID0gcHJvZ19mZDtcbiYjNDM7XHRhdHRyLnRlc3QuY3R4X2luID0gcHRyX3RvX3U2NChjdHgpO1xuJiM0MztcdGF0dHIudGVzdC5jdHhfc2l6ZV9pbiA9IGN0eF9zejtcbiYjNDM7XHRpZiAoc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfUlVOLCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0ICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCB0ZXN0KSkgXHUwMDNjIDApIHtcbiYjNDM7XHRcdHJldCA9IC1lcnJubztcbiYjNDM7XHRcdGdvdG8gb3V0X3Byb2c7XG4mIzQzO1x0fVxuJiM0MztcdCpyYW4gPSB0cnVlO1xuJiM0MztcdHJldCA9IChpbnQpYXR0ci50ZXN0LnJldHZhbDtcbiYjNDM7b3V0X3Byb2c6XG4mIzQzO1x0Y2xvc2UocHJvZ19mZCk7XG4mIzQzO291dF9tYXA6XG4mIzQzO1x0ZnJlZShidWYpO1xuJiM0MztcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfdmVyaWZ5KHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGludCBleHBlY3RfbWFwcylcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGdlbl9sb2FkZXJfb3B0cywgZ29wdHMsIC5nZW5faGFzaCA9IHRydWUpO1xuJiM0MztcdGNoYXIgZGlyX3RtcGxbXSA9IFwmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9sdFhYWFhYWFwmIzM0OywgKmRpciA9IE5VTEw7XG4mIzQzO1x0aW50IG5yX21hcHMgPSAwLCBucl9wcm9ncyA9IDAsIGxvYWRfcmV0ID0gMCwgcjtcbiYjNDM7XHRfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZ19kZXNjICpwZDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX21hcF9kZXNjICptZDtcbiYjNDM7XHR1bnNpZ25lZCBjaGFyICpibG9iID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XG4mIzQzO1x0c3RydWN0IGJwZl9tYXAgKm07XG4mIzQzO1x0X191MzIgY3R4X3N6LCBkYXRhX3N6O1xuJiM0MztcdHZvaWQgKmN0eCA9IE5VTEw7XG4mIzQzO1x0Ym9vbCByYW4gPSBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcJiMzNDtrZXlyaW5nXCYjMzQ7LCBcJiMzNDtfdWlkLjBcJiMzNDssIE5VTEwsXG4mIzQzO1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRcdHJtZGlyKGRpcik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19nZW5fbG9hZGVyKG9iaiwgXHUwMDI2Z29wdHMpLCBcJiMzNDtnZW5fbG9hZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2xvYWQob2JqKSwgXCYjMzQ7Z2VuX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX3Byb2dyYW0ocCwgb2JqKVxuJiM0MztcdFx0bnJfcHJvZ3MmIzQzOyYjNDM7O1xuJiM0MztcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX21hcChtLCBvYmopXG4mIzQzO1x0XHRucl9tYXBzJiM0MzsmIzQzOztcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShucl9tYXBzLCBleHBlY3RfbWFwcywgXCYjMzQ7Zml4dHVyZSBtYXAgY291bnRcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGN0eF9zeiA9IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpICYjNDM7XG4mIzQzO1x0XHQgbnJfbWFwcyAqIHNpemVvZihzdHJ1Y3QgYnBmX21hcF9kZXNjKSAmIzQzO1xuJiM0MztcdFx0IG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTtcbiYjNDM7XHRjdHggPSBjYWxsb2MoMSwgY3R4X3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoY3R4LCBcJiMzNDtjdHhfYWxsb2NcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0KChzdHJ1Y3QgYnBmX2xvYWRlcl9jdHggKiljdHgpLVx1MDAzZXN6ID0gY3R4X3N6O1xuJiM0MztcbiYjNDM7XHRkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejtcbiYjNDM7XHRibG9iID0gbWFsbG9jKGRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihibG9iLCBcJiMzNDtibG9iX2FsbG9jXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcbiYjNDM7XG4mIzQzO1x0LyogZXhjbF9wcm9nX2hhc2ggPSBTSEEyNTYobG9hZGVyIGluc25zKSA9PSB0aGUgbG9hZGVyJiMzOTtzIHByb2ctXHUwMDNlZGlnZXN0LiAqL1xuJiM0MztcdGxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTtcbiYjNDM7XG4mIzQzO1x0ciA9IGxvYWR0aW1lX2RyaXZlKGRpciwgZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxuJiM0MztcdFx0XHQgICBleGNsLCBjdHgsIGN0eF9zeiwgXHUwMDI2bG9hZF9yZXQsIFx1MDAyNnJhbik7XG4mIzQzO1x0QVNTRVJUX09LKGxvYWRfcmV0LCBcJiMzNDtzaWduZWQgbG9hZGVyIGxvYWRlZCAoaW5zbnMgfHwgbWV0YWRhdGEpXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfVFJVRShyYW4sIFwmIzM0O2xvYWRlciByYW5cJiMzNDspO1xuJiM0MztcdEFTU0VSVF9FUShyLCAwLCBcJiMzNDtsb2FkZXIgaW5zdGFsbGVkIGl0cyB0YXJnZXRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRtZCA9IChzdHJ1Y3QgYnBmX21hcF9kZXNjICopKChjaGFyICopY3R4ICYjNDM7IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTtcbiYjNDM7XHRwZCA9IChzdHJ1Y3QgYnBmX3Byb2dfZGVzYyAqKShtZCAmIzQzOyBucl9tYXBzKTtcbiYjNDM7XHRBU1NFUlRfR1QocGRbMF0ucHJvZ19mZCwgMCwgXCYjMzQ7dGFyZ2V0IHByb2dyYW0gaW5zdGFsbGVkXCYjMzQ7KTtcbiYjNDM7XHRpZiAobnJfbWFwcylcbiYjNDM7XHRcdEFTU0VSVF9HVChtZFswXS5tYXBfZmQsIDAsIFwmIzM0O3RhcmdldCBtYXAgaW5zdGFsbGVkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XG4mIzQzO291dDpcbiYjNDM7XHRmcmVlKGJsb2IpO1xuJiM0MztcdGZyZWUoY3R4KTtcbiYjNDM7XHRpZiAoZGlyKVxuJiM0MztcdFx0cnVuX3NldHVwKFwmIzM0O2NsZWFudXBcJiMzNDssIGRpcik7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGxvYWR0aW1lX25vX21hcCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbCA9IHRlc3Rfc2lnbmVkX2xvYWRlcl9fb3BlbigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7c2tlbF9vcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRsb2FkdGltZV92ZXJpZnkoc2tlbC1cdTAwM2VvYmosIDApO1xuJiM0MztcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfd2l0aF9tYXAodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fb3BlbigpO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7c2tlbF9vcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRsb2FkdGltZV92ZXJpZnkoc2tlbC1cdTAwM2VvYmosIDEpO1xuJiM0MztcdHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXBfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEEgc2lnbmVkIHByb2dyYW0gbmVlZCBub3QgYmluZCBhbnkgbWFwLiBBIHBsYWluIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTFxuJiM0MzsgKiBwcm9ncmFtIHdpdGggbm8gZmRfYXJyYXkgaXMgc2lnbmVkIG92ZXIgaXRzIGluc3RydWN0aW9ucyBhbG9uZTogdGhlIGtlcm5lbFxuJiM0MzsgKiB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlLCBmb2xkcyBubyBtZXRhZGF0YSwgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBFeGVyY2lzZVxuJiM0MzsgKiB0aGUgZmRfYXJyYXkgPT0gTlVMTCAvIGZkX2FycmF5X2NudCA9PSAwIHBhdGgsIGFuZCBjb25maXJtIHRoZSBzaWduYXR1cmVcbiYjNDM7ICogc3RpbGwgYXV0aGVudGljYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIChhIHRhbXBlcmVkIGNvcHkgaXMgcmVqZWN0ZWQpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbiYjNDM7XHRcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdGNoYXIgZGlyX3RtcGxbXSA9IFwmIzM0Oy90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFwmIzM0OywgKmRpcjtcbiYjNDM7XHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuJiM0MztcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4mIzQzO1x0X191OCBzaWdbODE5Ml07XG4mIzQzO1x0aW50IHByb2dfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcJiMzNDtrZXlyaW5nXCYjMzQ7LCBcJiMzNDtfdWlkLjBcJiMzNDssIE5VTEwsXG4mIzQzO1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRcdHJtZGlyKGRpcik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBObyBtZXRhZGF0YSBtYXA6IHRoZSBzaWduZWQgcGF5bG9hZCBpcyB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lLiAqL1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduLWZpbGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiYjNDM7XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbiYjNDM7XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4mIzQzO1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuJiM0MztcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiYjNDM7XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiYjNDM7XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0LyogZmRfYXJyYXkgYW5kIGZkX2FycmF5X2NudCBkZWxpYmVyYXRlbHkgbGVmdCBOVUxMLzAuICovXG4mIzQzO1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtzaWduZWRfbm9tYXBcJiMzNDssIHNpemVvZihcJiMzNDtzaWduZWRfbm9tYXBcJiMzNDspKTtcbiYjNDM7XG4mIzQzO1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4mIzQzO1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShwcm9nX2ZkLCAwLCBcJiMzNDttYXAtbGVzcyBzaWduZWQgcHJvZ3JhbSBsb2FkZWRcJiMzNDspKSB7XG4mIzQzO1x0XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XG4mIzQzO1x0LyogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucywgc28gdGFtcGVyaW5nIG11c3QgYmUgcmVqZWN0ZWQuICovXG4mIzQzO1x0aW5zbnNbMF0uaW1tID0gMTtcbiYjNDM7XHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiYjNDM7XHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuJiM0MztcdGVyciA9IHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FS0VZUkVKRUNURUQsIFwmIzM0O3RhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSByZWFjaCBtYXBzIG9ubHkgdGhyb3VnaCBmZF9hcnJheSBpbmRpY2VzLCBzbyB0aGUga2VybmVsXG4mIzQzOyAqIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBBIGRpcmVjdCBCUEZfUFNFVURPX01BUF9GRCByZWZlcmVuY2UgLSBhIHJhdyxcbiYjNDM7ICogdW5mb2xkZWQgZmQgYmFrZWQgaW50byB0aGUgc2lnbmVkIGluc3RydWN0aW9ucyAtIGlzIHJlamVjdGVkIGJ5IHRoZSB2ZXJpZmllci5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuJiM0MztcdFx0QlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLFxuJiM0MztcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuJiM0MztcdFx0QlBGX0VYSVRfSU5TTigpLFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyWFhYWFhYXCYjMzQ7LCAqZGlyO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRfX3U4IHNpZ1s4MTkyXTtcbiYjNDM7XHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCYjMzQ7c2lnX21hcGZkXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFwmIzM0O21hcF9jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcdC8qIGJha2UgdGhlIHJhdyBtYXAgZmQgaW50byB0aGUgbGRfaW1tNjQgKi9cbiYjNDM7XG4mIzQzO1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcJiMzNDtrZXlyaW5nXCYjMzQ7LCBcJiMzNDtfdWlkLjBcJiMzNDssIE5VTEwsXG4mIzQzO1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXRfbWFwO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRcdHJtZGlyKGRpcik7XG4mIzQzO1x0XHRnb3RvIG91dF9tYXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMsIHJhdyBtYXAgZmQgYW5kIGFsbC4gKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4mIzQzO1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4mIzQzO1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuJiM0MztcdGF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbiYjNDM7XHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwmIzM0O0R1YWwgQlNEL0dQTFwmIzM0Oyk7XG4mIzQzO1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuJiM0MztcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4mIzQzO1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuJiM0MztcdC8qIE5vIGZkX2FycmF5OiB0aGUgbWFwIGlzIHJlYWNoZWQgYnkgYSByYXcgZmQgaW4gdGhlIGluc3RydWN0aW9ucy4gKi9cbiYjNDM7XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O3NpZ25lZF9tYXBmZFwmIzM0Oywgc2l6ZW9mKFwmIzM0O3NpZ25lZF9tYXBmZFwmIzM0OykpO1xuJiM0MztcbiYjNDM7XHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiYjNDM7XHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuJiM0MztcdGVyciA9IHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FSU5WQUwsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIHJlZmVyZW5jaW5nIGEgbWFwIGJ5IGZkIHJlamVjdGVkXCYjMzQ7KTtcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbiYjNDM7b3V0X21hcDpcbiYjNDM7XHRjbG9zZShtYXBfZmQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSByZWFjaCBtYXBzIG9ubHkgdGhyb3VnaCB0aGUgY29udGludW91cyBmZF9hcnJheSwgc28gdGhlXG4mIzQzOyAqIGtlcm5lbCBmb2xkcyAoYW5kIHRodXMgYXR0ZXN0cykgdGhlbS4gUmVmZXJlbmNpbmcgYSBtYXAgYnkgZmRfYXJyYXkgKmluZGV4KlxuJiM0MzsgKiB3aGlsZSBsZWF2aW5nIGZkX2FycmF5X2NudCBhdCAwIHNlbGVjdHMgdGhlIHNwYXJzZSBwYXRoLCB3aGljaCByZXNvbHZlcyBhIG1hcFxuJiM0MzsgKiB0aGUgc2lnbmF0dXJlIG5ldmVyIGNvdmVyZWQ7IHRoZSB2ZXJpZmllciByZWplY3RzIGl0IHVwIGZyb250IHdpdGggLUVBQ0NFUy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9zcGFyc2VfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuJiM0MztcdFx0QlBGX0xEX0lNTTY0X1JBVyhCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCwgMCksXG4mIzQzO1x0XHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXG4mIzQzO1x0XHRCUEZfRVhJVF9JTlNOKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRjaGFyIGRpcl90bXBsW10gPSBcJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJfc3BYWFhYWFhcJiMzNDssICpkaXI7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gODE5MjtcbiYjNDM7XHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuJiM0MztcdF9fdTggc2lnWzgxOTJdO1xuJiM0MztcdGludCBtYXBfZmQsIHByb2dfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcJiMzNDtzaWdfc3BhcnNlXCYjMzQ7LCA0LCA0LCAxLCBOVUxMKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFwmIzM0O21hcF9jcmVhdGVcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dF9tYXA7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdFx0cm1kaXIoZGlyKTtcbiYjNDM7XHRcdGdvdG8gb3V0X21hcDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNpZ24gdGhlIGluc3RydWN0aW9ucyBhbG9uZTsgdGhlIHNwYXJzZSBtYXAgaXMgbm90IGZvbGRlZC4gKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsIFx1MDAyNnNpZ19zeiksXG4mIzQzO1x0XHQgICAgICAgXCYjMzQ7c2lnbi1maWxlXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4mIzQzO1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4mIzQzO1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuJiM0MztcdGF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTtcbiYjNDM7XHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwmIzM0O0R1YWwgQlNEL0dQTFwmIzM0Oyk7XG4mIzQzO1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuJiM0MztcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KFx1MDAyNm1hcF9mZCk7XG4mIzQzO1x0YXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi9cbiYjNDM7XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbiYjNDM7XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuJiM0MztcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbiYjNDM7XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwmIzM0O3NpZ25lZF9zcGFyc2VcJiMzNDssIHNpemVvZihcJiMzNDtzaWduZWRfc3BhcnNlXCYjMzQ7KSk7XG4mIzQzO1xuJiM0MztcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuJiM0MztcdFx0XHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4mIzQzO1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCYjMzQ7c2lnbmVkIHByb2dyYW0gYmluZGluZyBhIHNwYXJzZSBmZF9hcnJheSBtYXAgcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdHJ1bl9zZXR1cChcJiMzNDtjbGVhbnVwXCYjMzQ7LCBkaXIpO1xuJiM0MztvdXRfbWFwOlxuJiM0MztcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuJiM0MztcdFx0QlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgQlBGX1BTRVVET19LRlVOQ19DQUxMLCAxLCAxKSxcbiYjNDM7XHRcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcbiYjNDM7XHRcdEJQRl9FWElUX0lOU04oKSxcbiYjNDM7XHR9O1xuJiM0MztcdGNoYXIgZGlyX3RtcGxbXSA9IFwmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFhcJiMzNDssICpkaXI7XG4mIzQzO1x0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkLCBlcnIsIGZkc1syXTtcbiYjNDM7XHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4mIzQzO1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiYjNDM7XHRfX3U4IHNpZ1s4MTkyXTtcbiYjNDM7XG4mIzQzO1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcJiMzNDtrZXlyaW5nXCYjMzQ7LCBcJiMzNDtfdWlkLjBcJiMzNDssIE5VTEwsXG4mIzQzO1x0XHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRcdHJtZGlyKGRpcik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduLWZpbGVcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCYjMzQ7YnRmX25ld19lbXB0eVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0YnRmX19hZGRfaW50KGJ0ZiwgXCYjMzQ7aW50XCYjMzQ7LCA0LCBCVEZfSU5UX1NJR05FRCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFwmIzM0O2J0Zl9sb2FkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRmZHNbMF0gPSAtMTtcbiYjNDM7XHRmZHNbMV0gPSBidGZfX2ZkKGJ0Zik7XG4mIzQzO1xuJiM0MztcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuJiM0MztcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuJiM0MztcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbiYjNDM7XHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XG4mIzQzO1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcJiMzNDtEdWFsIEJTRC9HUExcJiMzNDspO1xuJiM0MztcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiYjNDM7XHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChmZHMpO1xuJiM0MztcdGF0dHIuZmRfYXJyYXlfY250ID0gMDsgLyogc3BhcnNlOiBmb3JjZSBsYXp5IGtmdW5jIEJURiByZXNvbHV0aW9uICovXG4mIzQzO1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4mIzQzO1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiYjNDM7XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzO1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtzaWduZWRfa2Z1bmNcJiMzNDssIHNpemVvZihcJiMzNDtzaWduZWRfa2Z1bmNcJiMzNDspKTtcbiYjNDM7XG4mIzQzO1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4mIzQzO1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbiYjNDM7XHRlcnIgPSBwcm9nX2ZkIFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCYjMzQ7bW9kdWxlIGtmdW5jIEJURiBpbiBzaWduZWQgcHJvZ3JhbSByZWplY3RlZFwmIzM0Oyk7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0aWYgKGJ0ZilcbiYjNDM7XHRcdGJ0Zl9fZnJlZShidGYpO1xuJiM0MztcdGlmIChtYXBfZmQgXHUwMDNlPSAwKVxuJiM0MztcdFx0Y2xvc2UobWFwX2ZkKTtcbiYjNDM7XHRydW5fc2V0dXAoXCYjMzQ7Y2xlYW51cFwmIzM0OywgZGlyKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIHtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2NoZWNrX3NoYXBlXCYjMzQ7KSlcbi1cdFx0bWV0YWRhdGFfY2hlY2tfc2hhcGUoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsb2FkdGltZV9ub19tYXBcJiMzNDspKVxuJiM0MztcdFx0bG9hZHRpbWVfbm9fbWFwKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bG9hZHRpbWVfd2l0aF9tYXBcJiMzNDspKVxuJiM0MztcdFx0bG9hZHRpbWVfd2l0aF9tYXAoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX21hdGNoXCYjMzQ7KSlcbiBcdFx0bWV0YWRhdGFfbWF0Y2goKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX3NoYV9taXNtYXRjaFwmIzM0OykpXG4tXHRcdG1ldGFkYXRhX3NoYV9taXNtYXRjaCgpO1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWV0YWRhdGFfbm90X2V4Y2x1c2l2ZVwmIzM0OykpXG4tXHRcdG1ldGFkYXRhX25vdF9leGNsdXNpdmUoKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkXCYjMzQ7KSlcbi1cdFx0bWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25hdHVyZV9lbmZvcmNlZFwmIzM0OykpXG4gXHRcdHNpZ25hdHVyZV9lbmZvcmNlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWRcJiMzNDspKVxuJiM0MztcdFx0c2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWRcJiMzNDspKVxuJiM0MztcdFx0c2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCgpO1xuJiM0MztcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25hdHVyZV9mYWlsdXJlX2xvZ3NcJiMzNDspKVxuJiM0MztcdFx0c2lnbmF0dXJlX2ZhaWx1cmVfbG9ncygpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmF0dXJlX3Rvb19sYXJnZVwmIzM0OykpXG4gXHRcdHNpZ25hdHVyZV90b29fbGFyZ2UoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O3NpZ25hdHVyZV9iYWRfa2V5cmluZ1wmIzM0OykpXG5AQCAtMTEzMiw0ICYjNDM7MTY1NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIFx0XHRtYXBfaGFzaF91bnN1cHBvcnRlZF90eXBlKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsc21fc2lnbmF0dXJlX3ZlcmRpY3RcJiMzNDspKVxuIFx0XHRsc21fc2lnbmF0dXJlX3ZlcmRpY3QoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduZWRfbm9fZmRfYXJyYXlcJiMzNDspKVxuJiM0MztcdFx0c2lnbmVkX25vX2ZkX2FycmF5KCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZFwmIzM0OykpXG4mIzQzO1x0XHRzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7c2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZFwmIzM0OykpXG4mIzQzO1x0XHRzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKCk7XG4gfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWVMmIzM0OywKICAgICYjMzQ7U1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OJiMzNDssCiAgICAmIzM0O0ZTX1ZFUklUWSYjMzQ7LAogICAgJiMzNDtGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZSYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5JiMzNDssCiAgICAmIzM0O3Byb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX3NwYXJzZSYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeCYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzJiMzNDssCiAgICAmIzM0O2ZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZSYjMzQ7LAogICAgJiMzNDthZGRfZmRfZnJvbV9mZF9hcnJheSYjMzQ7LAogICAgJiMzNDticGZfY2xhc3NpZnlfa2V5cmluZyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBJdCBtb3ZlcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmcm9tIGBicGZfcHJvZ19sb2FkYCB0byBgYnBmX2NoZWNrYCBpbnNpZGUgdGhlIHZlcmlmaWVyLCBhbmQgY2hhbmdlcyBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKHN1cHBvcnRpbmcgY29udGludW91cyBhbmQgc3BhcnNlIGFycmF5cykuIEl0IGFkZHMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgYGZkX2FycmF5YCByZXNvbHV0aW9uIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzbyB0aGV5IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGNiODQzNDNkMGRmNjExMjkzYmZiMDEzMjQ1Mjc5NWMyNGY4OTczNjQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IEp1bCAyIDE3OjIyOjA1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0CmluZGV4IDBkNWM2ZjY1OTI2NjdhLi42MzhhMDBkNDJiYzJhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0CiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdApAQCAtMjgsNiAmIzQzOzI4LDcgQEAgdGhhdCBnb2VzIGludG8gZ3JlYXQgdGVjaG5pY2FsIGRlcHRoIGFib3V0IHRoZSBCUEYgQXJjaGl0ZWN0dXJlLgogICAgY2xhc3NpY192c19leHRlbmRlZC5yc3QKICAgIGJwZl9pdGVyYXRvcnMKICAgIGJwZl9saWNlbnNpbmcKJiM0MzsgICBzaWduaW5nCiAgICB0ZXN0X2RlYnVnCiAgICBjbGFuZy1ub3RlcwogICAgbGludXgtbm90ZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAuLjAxZmE0YTFlZTAxNGY3Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QKQEAgLTAsMCAmIzQzOzEsNDkwIEBACiYjNDM7Li4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsKJiM0Mzs9PT09PT09PT09PT0KJiM0MztCUEYgc2lnbmluZwomIzQzOz09PT09PT09PT09PQomIzQzOwomIzQzO1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBCUEYgcHJvZ3JhbXMgYXJlIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ25lZCwgaG93IHRoZQomIzQzO2tlcm5lbCB2ZXJpZmllcyB0aGVtIGF0IGxvYWQgdGltZSwgYW5kIGhvdyBMaW51eCBTZWN1cml0eSBNb2R1bGVzIChMU01zKSAtCiYjNDM7aW5jbHVkaW5nIHRoZSBCUEYgTFNNIC0gdXNlIHRoZSByZXN1bHRpbmcgdmVyZGljdCB0byBlbmZvcmNlIHBvbGljeS4gSXQgaXMKJiM0Mzt3cml0dGVuIGZvciBkZXZlbG9wZXJzIHdobyB3YW50IHRvIHByb2R1Y2Ugc2lnbmVkIEJQRiBvYmplY3RzLCB1bmRlcnN0YW5kIHdoYXQKJiM0Mzt0aGUgc2lnbmF0dXJlIGFjdHVhbGx5IGd1YXJhbnRlZXMsIG9yIGJ1aWxkIGEgcG9saWN5IG9uIHRvcCBvZiBpdC4KJiM0MzsKJiM0MztNb3RpdmF0aW9uCiYjNDM7PT09PT09PT09PQomIzQzOwomIzQzO0Egc2lnbmVkIEJQRiBwcm9ncmFtIGxldHMgdGhlIGtlcm5lbCBlc3RhYmxpc2ggdGhhdCB0aGUgYnl0ZWNvZGUgYmVpbmcgbG9hZGVkCiYjNDM7b3JpZ2luYXRlcyBmcm9tIGEgdHJ1c3RlZCBwcm9kdWNlciBhbmQgd2FzIG5vdCBtb2RpZmllZCBpbiB0cmFuc2l0LiBPbiBpdHMgb3duCiYjNDM7dGhlIGtlcm5lbCBkb2VzIG5vdCAqcmVxdWlyZSogc2lnbmF0dXJlcyAtIGFuIHVuc2lnbmVkIHByb2dyYW0gbG9hZHMgZXhhY3RseSBhcwomIzQzO2JlZm9yZSAtIGJ1dCBpdCByZWNvcmRzIGEgdmVyZGljdCAoc2VlIGBUaGUgdmVyZGljdGBfKSB0aGF0IGFuIExTTSBjYW4gZ2F0ZSBvbi4KJiM0MztUaGlzIGlzIHRoZSBidWlsZGluZyBibG9jayBmb3IgcG9saWNpZXMgc3VjaCBhcyAmIzM0O29ubHkgcnVuIEJQRiB0aGF0IHdhcyBzaWduZWQgYnkKJiM0MzthIGtleSBpbiB0aGUgdHJ1c3RlZCBrZXlyaW5nJiMzNDssIGFzIGVuZm9yY2VkIGZvciBpbnN0YW5jZSBieSBJUEUuCiYjNDM7CiYjNDM7U2lnbmluZyBpcyBvcnRob2dvbmFsIHRvIHRoZSBleGlzdGluZyBwZXJtaXNzaW9uIG1vZGVsOiBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQomIzQzO2NhcGFiaWxpdHkgY2hlY2tzIG9yIHRoZSB2ZXJpZmllci4gQSBzaWduZWQgbG9hZCBzdGlsbCByZXF1aXJlcyB0aGUgdXN1YWwKJiM0Mztwcml2aWxlZ2VzIChgYENBUF9CUEZgYCBhbmQgYW55IHByb2dyYW0tdHlwZS1zcGVjaWZpYyBjYXBhYmlsaXR5LCBzdWJqZWN0IHRvCiYjNDM7YGBrZXJuZWwudW5wcml2aWxlZ2VkX2JwZl9kaXNhYmxlZGBgKSwgYW5kIHRoZSBsb2FkZXImIzM5O3MgaW5zdHJ1Y3Rpb25zIGFyZSBzdGlsbAomIzQzO2NoZWNrZWQgYnkgdGhlIHZlcmlmaWVyIGxpa2UgYW55IG90aGVyIHByb2dyYW0uIEEgdmFsaWQgc2lnbmF0dXJlIGVzdGFibGlzaGVzCiYjNDM7Km9yaWdpbiBhbmQgaW50ZWdyaXR5Kiwgbm90IHNhZmV0eSAtIGl0IGxldHMgYSBwb2xpY3kgdHJ1c3Qgd2hlcmUgdGhlIGJ5dGVjb2RlCiYjNDM7Y2FtZSBmcm9tLCBpdCBkb2VzIG5vdCBsZXQgYSBsb2FkIHNraXAgYW55IGNoZWNrIGl0IHdvdWxkIG90aGVyd2lzZSBmYWNlLgomIzQzOwomIzQzO1RoZSBoYXJkIHBhcnQgaXMgKndoYXQqIGdldHMgc2lnbmVkLiBBIG5haXZlIHNjaGVtZSB3b3VsZCBzaWduIGEgcHJvZ3JhbSYjMzk7cwomIzQzO2luc3RydWN0aW9uIGJ1ZmZlciBhdCBidWlsZCB0aW1lIGFuZCB2ZXJpZnkgdGhhdCBzaWduYXR1cmUgYXQKJiM0MztgYEJQRl9QUk9HX0xPQURgYC4gVGhhdCBkb2VzIG5vdCBzdXJ2aXZlIGNvbnRhY3Qgd2l0aCByZWFsIEJQRiBvYmplY3RzLCBiZWNhdXNlCiYjNDM7dGhlIGJ5dGVzIHRoZSBrZXJuZWwgZmluYWxseSBsb2FkcyBhcmUgbm90IHRoZSBieXRlcyB0aGUgZGV2ZWxvcGVyIGJ1aWx0IGFuZAomIzQzO3NpZ25lZC4gQmV0d2VlbiB0aGUgdHdvLCBsaWJicGYgYW5kIHRoZSBrZXJuZWwgcmV3cml0ZSB0aGUgcHJvZ3JhbToKJiM0MzsKJiM0MzstICoqbWFwIGZpbGUgZGVzY3JpcHRvcnMqKiBhcmUgcGF0Y2hlZCBpbnRvIGBgbGRfaW1tNjRgYCBpbnN0cnVjdGlvbnMKJiM0MzsgIChgYEJQRl9QU0VVRE9fTUFQX0ZEYGApLCBhbmQgYSBtYXAmIzM5O3MgZmQgaXMgYXNzaWduZWQgYXQgbG9hZCB0aW1lLCBzbyBpdAomIzQzOyAgZGlmZmVycyBvbiBldmVyeSBydW47CiYjNDM7LSAqKkNPLVJFIHJlbG9jYXRpb25zKiogcmV3cml0ZSBmaWVsZCBvZmZzZXRzLCBzaXplcyBhbmQgZXhpc3RlbmNlIGZsYWdzIGFnYWluc3QKJiM0MzsgIHRoZSAqcnVubmluZyoga2VybmVsJiMzOTtzIEJURiwgc28gdGhlIHJlc3VsdCBkaWZmZXJzIGZyb20gb25lIGtlcm5lbCB0byB0aGUgbmV4dDsKJiM0MzstICoqa2Z1bmMgYW5kIGtzeW0gcmVmZXJlbmNlcyoqIGFyZSByZXNvbHZlZCB0byBpZHMvYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nCiYjNDM7ICBrZXJuZWw7CiYjNDM7LSAqKmdsb2JhbCBkYXRhKiogKGBgLnJvZGF0YWBgL2BgLmRhdGFgYC9gYC5ic3NgYCkgaXMgY3JlYXRlZCBhbmQgc2VlZGVkIGFzIG1hcHMKJiM0MzsgIGF0IGxvYWQuCiYjNDM7CiYjNDM7U28gYSBzaWduYXR1cmUgb3ZlciB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBtYXRjaCB0aGUgcmVsb2NhdGVkCiYjNDM7aW5zdHJ1Y3Rpb25zIHRoZSB2ZXJpZmllciBlbmRzIHVwIGNoZWNraW5nLCBhbmQgdGhlIHJlbG9jYXRlZCBmb3JtIGNhbm5vdCBiZQomIzQzO3Byb2R1Y2VkIGFoZWFkIG9mIHRpbWUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSB0YXJnZXQga2VybmVsLiBUaGVyZSBpcyBubwomIzQzO2ZpeGVkIGJ5dGUgc3RyaW5nIHRoYXQgaXMgYm90aCBzaWduYWJsZSBhdCBidWlsZCB0aW1lIGFuZCB3aGF0IHRoZSBrZXJuZWwKJiM0MzthY3R1YWxseSBsb2FkcyAtIHdoaWNoIGlzIHdoeSBhIHByb2dyYW0gY2Fubm90IHNpbXBseSBiZSBzaWduZWQgYW5kIGxvYWRlZAomIzQzO2RpcmVjdGx5LgomIzQzOwomIzQzO1RoZSB0cnVzdGVkIGxvYWRlcgomIzQzOz09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO1RoZSBzb2x1dGlvbiBpcyB0byBtb3ZlIHRoYXQgc2V0dXAgd29yayAqaW50byogYSBzbWFsbCBCUEYgcHJvZ3JhbSAtIHRoZQomIzQzOyoqbG9hZGVyKiogLSBhbmQgc2lnbiB0aGUgbG9hZGVyIGluc3RlYWQgb2YgdGhlIGluZGl2aWR1YWwgcHJvZ3JhbXMuIGxpYmJwZiYjMzk7cwomIzQzO2BgZ2VuX2xvYWRlcmBgIG1hY2hpbmVyeSAoYGBicGZ0b29sIGdlbiBza2VsZXRvbiAtTGBgLCB0aGUgJiMzNDtsaWdodCBza2VsZXRvbiYjMzQ7KQomIzQzO2VtaXRzIGEgYGBCUEZfUFJPR19UWVBFX1NZU0NBTExgYCBwcm9ncmFtIHdob3NlIGJvZHkgcGVyZm9ybXMgdGhlIGJwZigpIHN5c2NhbGxzCiYjNDM7dGhhdCBjcmVhdGUgbWFwcywgYXBwbHkgcmVsb2NhdGlvbnMsIGFuZCBsb2FkIHRoZSByZWFsIHByb2dyYW1zLiBUaGUgcGF5bG9hZCBpdAomIzQzO2luc3RhbGxzIC0gdGhlIHNlcmlhbGl6ZWQgcHJvZ3JhbXMsIG1hcCBkZXNjcmlwdGlvbnMsIHJlbG9jYXRpb24gZGF0YSBhbmQKJiM0Mztpbml0aWFsIHZhbHVlcyAtIGxpdmVzIGluIGEgc2VwYXJhdGUgYXJyYXkgbWFwLCB0aGUgKiptZXRhZGF0YSBtYXAqKgomIzQzOyhgYF9fbG9hZGVyLm1hcGBgKS4KJiM0MzsKJiM0MztTbyB0aGUgdW5pdCBvZiB0cnVzdCBpcyB0aGUgbG9hZGVyLCBhbmQgdGhlIHNpZ25pbmcgY29udHJhY3QgaXM6OgomIzQzOwomIzQzOyAgICBTaWcoSV9sb2FkZXIgfHwgRF9tZXRhKQomIzQzOwomIzQzO3doZXJlIGBgSV9sb2FkZXJgYCBpcyB0aGUgbG9hZGVyJiMzOTtzIGluc3RydWN0aW9uIHN0cmVhbSBhbmQgYGBEX21ldGFgYCBpcyB0aGUKJiM0Mztjb250ZW50IG9mIHRoZSBtZXRhZGF0YSBtYXAuIFZlcmlmeWluZyB0aGUgbG9hZGVyJiMzOTtzIHNpZ25hdHVyZSBlc3RhYmxpc2hlcyB0aGF0CiYjNDM7Ym90aCB0aGUgbG9hZGVyICphbmQqIHRoZSBwYXlsb2FkIGl0IGlzIGFib3V0IHRvIGluc3RhbGwgYXJlIGF1dGhlbnRpYy4gVGhlCiYjNDM7bG9hZGVyIGlzIHJlcHJvZHVjaWJsZTogYGBnZW5fbG9hZGVyYGAgYnVpbGRzIGl0IGZyb20gcHJpbWl0aXZlcyBzbyB0aGUgc2FtZQomIzQzO29iamVjdCB5aWVsZHMgdGhlIHNhbWUgYnl0ZXMgb24gYW55IGJ1aWxkIGhvc3QuCiYjNDM7CiYjNDM7V2h5IHRoZSBsb2FkZXIgaXMgc2lnbmFibGUgd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3QKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQomIzQzOwomIzQzO1RoZSBsb2FkZXIgc2lkZXN0ZXBzIGV2ZXJ5IHJld3JpdGUgbGlzdGVkIGFib3ZlLCBiZWNhdXNlIHRoZSBieXRlcyB0aGF0IGFyZQomIzQzO3NpZ25lZCBhcmUgKnJlbG9jYXRpb24taW52YXJpYW50KjoKJiM0MzsKJiM0MzstIFRoZSBsb2FkZXImIzM5O3Mgb3duIGluc3RydWN0aW9ucyBhcmUgYSBmaXhlZCBzZXF1ZW5jZSBvZiBicGYoKSBzeXNjYWxscyBlbWl0dGVkCiYjNDM7ICBieSBgYGdlbl9sb2FkZXJgYDsgdGhleSBjYXJyeSBubyBDTy1SRSByZWxvY2F0aW9ucyBhbmQgcmVzb2x2ZSBubyBrc3ltcywgc28KJiM0MzsgIHRoZXkgYXJlIGlkZW50aWNhbCBvbiBldmVyeSBrZXJuZWwuIFRoZSBtZXRhZGF0YSBtYXAgaXMgcmVmZXJlbmNlZCBieSAqaW5kZXgqCiYjNDM7ICBpbnRvIGBgZmRfYXJyYXlgYCAoYGBCUEZfUFNFVURPX01BUF9JRFhgYCksIG5vdCBieSBhIGJha2VkLWluIGZpbGUgZGVzY3JpcHRvciwKJiM0MzsgIHNvIGV2ZW4gdGhhdCByZWZlcmVuY2UgZG9lcyBub3QgY2hhbmdlIGJldHdlZW4gYnVpbGQgYW5kIGxvYWQuIFRoZSBsb2FkZXIKJiM0MzsgIGluc3RydWN0aW9uIGJ5dGVzIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXJlIGV4YWN0bHkgdGhlIGJ5dGVzIHRoYXQgd2VyZSBzaWduZWQuCiYjNDM7LSBUaGUgbWV0YWRhdGEgbWFwIGlzIG9wYXF1ZSwgZnJvemVuIGRhdGEgLSB0aGUgc2VyaWFsaXplZCB0YXJnZXQgcHJvZ3JhbXMsCiYjNDM7ICB0aGVpciByZWxvY2F0aW9uIHJlY29yZHMsIG1hcCBkZXNjcmlwdGlvbnMgYW5kIGluaXRpYWwgdmFsdWVzLiBJdHMgYnl0ZXMgYXJlCiYjNDM7ICBpZGVudGljYWwgYXQgYnVpbGQgdGltZSBhbmQgYXQgbG9hZCB0aW1lLCBzbyB0aGV5IGFyZSBzaW1wbHkgYXBwZW5kZWQgdG8gdGhlCiYjNDM7ICBpbnN0cnVjdGlvbnMgYW5kIGNvdmVyZWQgYnkgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGVyZSBpcyBubyBzZXBhcmF0ZSBtZXRhZGF0YQomIzQzOyAgaGFzaCB0byBjb21wdXRlIG9yIGNvbXBhcmUpLgomIzQzOwomIzQzO0FsbCB0aGUgaG9zdC1zcGVjaWZpYyByZXdyaXRpbmcgLSBjcmVhdGluZyBtYXBzLCBwYXRjaGluZyB0aGVpciBmZHMgaW50byB0aGUKJiM0Mzt0YXJnZXQgcHJvZ3JhbXMsIGFwcGx5aW5nIENPLVJFLCByZXNvbHZpbmcga3N5bXMsIHNlZWRpbmcgZ2xvYmFsIGRhdGEgLSBzdGlsbAomIzQzO2hhcHBlbnMsIGJ1dCBpdCBoYXBwZW5zICppbnNpZGUgdGhlIGxvYWRlciBhdCBydW50aW1lKiwgb24gdGhlIHZlcmlmaWVkCiYjNDM7bWV0YWRhdGEsICoqYWZ0ZXIqKiB0aGUga2VybmVsIGhhcyB2ZXJpZmllZCB0aGUgYGBpbnNucyB8fCBtZXRhZGF0YWBgIHNpZ25hdHVyZS4KJiM0MztUaGUga2VybmVsIG5ldmVyIGhhcyB0byB2ZXJpZnkgdGhlIHJlbG9jYXRlZCB0YXJnZXQgcHJvZ3JhbXM6IGl0IHZlcmlmaWVzIHRoZQomIzQzO2xvYWRlciBhbmQgaXRzIGlucHV0cyBvbmNlLCBhbmQgdHJ1c3QgdHJhbnNmZXJzIHRvIHdoYXRldmVyIHRoYXQgbm93LXRydXN0ZWQsCiYjNDM7ZGV0ZXJtaW5pc3RpYyBsb2FkZXIgaW5zdGFsbHMuIFRoZSByZWxvY2F0aW9uIHN0ZXAgaXMgbW92ZWQgZnJvbSAmIzM0O2JlZm9yZSB0aGUKJiM0MztzaWduYXR1cmUgY2FuIGJlIGNoZWNrZWQmIzM0OyB0byAmIzM0O2FmdGVyIGEgdHJ1c3RlZCBwcm9ncmFtIHJ1bnMmIzM0OyAtIHdoaWNoIGlzIGV4YWN0bHkKJiM0Mzt3aGF0IG1ha2VzIGl0IHNpZ25hYmxlLgomIzQzOwomIzQzO0JlY2F1c2UgdGhlIG1ldGFkYXRhIG1hcCBpcyB0aGUgbG9hZGVyJiMzOTtzIG9ubHkgdW50cnVzdGVkIGlucHV0LCB0d28gZXhpc3RpbmcgbWFwCiYjNDM7cHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOgomIzQzOwomIzQzO0V4Y2x1c2l2ZSBtYXBzCiYjNDM7ICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlCiYjNDM7ICAgIGFjY2Vzc2VkIGJ5IGEgcHJvZ3JhbSB3aG9zZSBkaWdlc3QgbWF0Y2hlcyB0aGF0IGhhc2guIFRoZSB2ZXJpZmllciBlbmZvcmNlcwomIzQzOyAgICBgYG1hcC0mZ3Q7ZXhjbF9wcm9nX3NoYSA9PSBwcm9nLSZndDtkaWdlc3RgYCBmb3IgZXZlcnkgbWFwIGEgcHJvZ3JhbSB1c2VzLCBzbyB0aGUKJiM0MzsgICAgbWV0YWRhdGEgbWFwIGlzIGJvdW5kIHRvIGV4YWN0bHkgdGhlIHNpZ25lZCBsb2FkZXIgYW5kIGNhbm5vdCBiZSBzaGFyZWQgd2l0aAomIzQzOyAgICBvciBtdXRhdGVkIGJ5IGFub3RoZXIgcHJvZ3JhbS4KJiM0MzsKJiM0MztGcm96ZW4gbWFwcwomIzQzOyAgICBUaGUgbWV0YWRhdGEgbWFwIGlzIGZyb3plbiAoYGBCUEZfTUFQX0ZSRUVaRWBgKSBiZWZvcmUgdGhlIGxvYWRlciBpcyBsb2FkZWQuCiYjNDM7ICAgIEZyZWV6aW5nIGJsb2NrcyBmdXJ0aGVyIHVzZXJzcGFjZSB3cml0ZXMsIHNvIHRoZSBieXRlcyBmb2xkZWQgaW50byB0aGUKJiM0MzsgICAgc2lnbmF0dXJlIGNhbm5vdCBjaGFuZ2UgYmVmb3JlIHRoZSBsb2FkZXIgcnVucy4gKEZyZWV6aW5nIGRvZXMgbm90IG1ha2UgdGhlCiYjNDM7ICAgIG1hcCByZWFkLW9ubHkgdG8gdGhlIGxvYWRlciBwcm9ncmFtIGl0c2VsZiwgd2hpY2ggc3RpbGwgd3JpdGVzIGNyZWF0ZWQgZmlsZQomIzQzOyAgICBkZXNjcmlwdG9ycyBiYWNrIGludG8gdGhlIGJsb2ImIzM5O3Mgc2NyYXRjaCBhcmVhLikKJiM0MzsKJiM0MztMb2FkLXRpbWUgdmVyaWZpY2F0aW9uCiYjNDM7PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztSYXRoZXIgdGhhbiBoYXZlIHRoZSBsb2FkZXIgY2hlY2sgaXRzIG93biBtZXRhZGF0YSBmcm9tIHdpdGhpbiBCUEYsIHRoZSBrZXJuZWwKJiM0Mzt2ZXJpZmllcyBpdCBkaXJlY3RseSBhdCBgYEJQRl9QUk9HX0xPQURgYCwgd2l0aCBubyBuZXcgVUFQSS4gVGhlIG1lY2hhbmlzbQomIzQzO3JldXNlcyB0aGUgZXhpc3RpbmcgYGBmZF9hcnJheWBgOgomIzQzOwomIzQzOyMuIFVzZXJzcGFjZSBjcmVhdGVzIHRoZSBtZXRhZGF0YSBtYXAgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgc2V0IHRvIHRoZQomIzQzOyAgIGxvYWRlciYjMzk7cyBkaWdlc3QsIHBvcHVsYXRlcyBpdCwgYW5kIGZyZWV6ZXMgaXQuCiYjNDM7Iy4gVGhlIGxvYWRlciBpcyBsb2FkZWQgd2l0aCBgYHNpZ25hdHVyZWBgL2Bgc2lnbmF0dXJlX3NpemVgYC9gYGtleXJpbmdfaWRgYAomIzQzOyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYAomIzQzOyAgIHNldCBzbyB0aGUga2VybmVsIGtub3dzIHRoZSBhcnJheSYjMzk7cyBsZW5ndGguCiYjNDM7Iy4gU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBydW5zIGluc2lkZSB0aGUgdmVyaWZpZXIgKGBgYnBmX2NoZWNrKClgYCksIG9uY2UgaXQKJiM0MzsgICBoYXMgcmVzb2x2ZWQgdGhlIGBgZmRfYXJyYXlgYCBlbnRyaWVzIGludG8gdGhlIHByb2dyYW0mIzM5O3MgYGB1c2VkX21hcHNgYC4gVGhlCiYjNDM7ICAgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGVyZWZvcmUgdGhlIHZlcnkgb2JqZWN0cyB0aGUgcHJvZ3JhbQomIzQzOyAgIGJpbmRzIC0gYSBzaW5nbGUgcmVzb2x1dGlvbiBvZiBgYGZkX2FycmF5YGAsIG5vdCBhIHNlcGFyYXRlIHJlYWQsIHNvIHRoZQomIzQzOyAgIHZlcmlmaWVkIGJ5dGVzIGNhbm5vdCBiZSBzd2FwcGVkIGZvciBhIGRpZmZlcmVudCBtYXAgYWZ0ZXIgdGhlIGNoZWNrIChubwomIzQzOyAgIHRpbWUtb2YtY2hlY2svdGltZS1vZi11c2Ugd2luZG93KS4gRWFjaCBmb2xkZWQgbWFwIG11c3QgYmUgZXhjbHVzaXZlIChjYXJyeQomIzQzOyAgIGBgZXhjbF9wcm9nX3NoYWBgKSBhbmQgYSBwbGFpbiBhcnJheSBtYXAgKGBgQlBGX01BUF9UWVBFX0FSUkFZYGApOyBvbmx5IGFuCiYjNDM7ICAgYXJyYXkgbWFwIGV4cG9zZXMgaXRzIHZhbHVlIGJ1ZmZlciB0aHJvdWdoIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyKClgYCBhcyBhCiYjNDM7ICAga2VybmVsIGFkZHJlc3Mgc3Bhbm5pbmcgYGB2YWx1ZV9zaXplYGAgYnl0ZXMuIEEgbWFwIHRoYXQgaXMgbm90IGV4Y2x1c2l2ZSwgbm90CiYjNDM7ICAgZnJvemVuLCBvciBub3QgYSBwbGFpbiBhcnJheSBpcyByZWplY3RlZCwgd2l0aCBhIHZlcmlmaWVyIGxvZyBtZXNzYWdlIG5hbWluZwomIzQzOyAgIHRoZSBvZmZlbmRpbmcgbWFwLiBUaGUga2VybmVsIGFwcGVuZHMgZWFjaCBtYXAmIzM5O3MgZnJvemVuCiYjNDM7ICAgY29udGVudHMgdG8gdGhlIGluc3RydWN0aW9uIGJ1ZmZlciBhbmQgdmVyaWZpZXMgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb3ZlciB0aGUKJiM0MzsgICBjb25jYXRlbmF0aW9uIGBgaW5zbnMgfHwgbWV0YWRhdGFfMCB8fCBtZXRhZGF0YV8xIHx8IC4uLmBgIGluIGBgdXNlZF9tYXBzYGAKJiM0MzsgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuCiYjNDM7CiYjNDM7QSBzaWduZWQgcHJvZ3JhbSB0aGVyZWZvcmUgdGFrZXMgb25lIG9mIGV4YWN0bHkgdHdvIHNoYXBlcywgYm90aCBmdWxseQomIzQzO3N1cHBvcnRlZDoKJiM0MzsKJiM0MzstICoqTm8gYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCA9PSAwYGApOiB0aGVyZSBpcyBub3RoaW5nIHRvIGFwcGVuZCwgc28gdGhlCiYjNDM7ICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlCiYjNDM7ICB5aWVsZHMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBUaGlzIGlzIHRoZSBvcmRpbmFyeSBjYXNlCiYjNDM7ICBmb3IgYSBkaXJlY3RseS1sb2FkZWQgc2lnbmVkIHByb2dyYW0gd2l0aCBubyBzZXBhcmF0ZSBwYXlsb2FkOyBpdCBpcyAqbm90KgomIzQzOyAgcmVqZWN0ZWQgZm9yICYjMzQ7bWlzc2luZyYjMzQ7IG1ldGFkYXRhLCBiZWNhdXNlIGl0IGhhcyBub25lIHRvIGNvdmVyLgomIzQzOy0gKipFeGNsdXNpdmUgYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCAmZ3Q7IDBgYCk6IGV2ZXJ5IGVudHJ5IGlzIGV4Y2x1c2l2ZSBhbmQKJiM0MzsgIGZvbGRlZCwgc28gdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLgomIzQzOwomIzQzO1RoZXJlIGlzIG5vIHRoaXJkIHNoYXBlOiBhIG5vbi1leGNsdXNpdmUgbWFwIGluIGEgc2lnbmVkIHByb2dyYW0mIzM5O3MgYGBmZF9hcnJheWBgCiYjNDM7aXMgcmVqZWN0ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgbGVmdCBvdXQgb2YgdGhlIHNpZ25hdHVyZSwgc28gYSBwcm9ncmFtIGJvdW5kCiYjNDM7dG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLgomIzQzOwomIzQzO1RoZSBkaWdlc3QgYmluZGluZyAoYGBleGNsX3Byb2dfc2hhID09IHByb2ctJmd0O2RpZ2VzdGBgKSBpcyBlbmZvcmNlZCBieSB0aGUKJiM0Mzt2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC0KJiM0MztiZWZvcmUgdGhlIHZlcmlmaWVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIHRoZSB0YWcgLSBgYHByb2ctJmd0O2RpZ2VzdGBgIGlzCiYjNDM7Y29tcHV0ZWQgdXAgZnJvbnQgaW4gdGhlIHZlcmlmaWVyLCBvdmVyIHRoZSB1bm1vZGlmaWVkIChzaWduYXR1cmUtY292ZXJlZCkKJiM0MztpbnN0cnVjdGlvbnMsIGZvciBhbnkgc2lnbmVkIGxvYWQuCiYjNDM7CiYjNDM7Q292ZXJhZ2UgaXMgdGhlbiBlbmZvcmNlZCBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zLCBhdCB0aGUgcG9pbnQKJiM0MztlYWNoIG9iamVjdCBpcyBib3VuZCByYXRoZXIgdGhhbiBieSBhIGNvdW50IHRha2VuIGFmdGVyd2FyZHMuIE9uY2UgdGhlIHNpZ25hdHVyZQomIzQzO2hhcyBiZWVuIHZlcmlmaWVkLCBiaW5kaW5nIGFueSBmdXJ0aGVyIG1hcCBpcyByZWZ1c2VkOiBhIG1hcCByZWFjaGVkIGJ5IGEKJiM0MztkaXJlY3RseS1yZWZlcmVuY2VkIGZkLCBvciBhIG1hcCBzd2FwcGVkIGludG8gYW4gYGBmZF9hcnJheWBgIHNsb3QgdGhlIGxvYWRlcgomIzQzO3JlYWRzLCBpcyBub3QgYW1vbmcgdGhvc2UgYWxyZWFkeSBmb2xkZWQsIHNvIGl0IGlzIHJlamVjdGVkIHRoZSBtb21lbnQgdGhlCiYjNDM7dmVyaWZpZXIgdHJpZXMgdG8gYmluZCBpdC4gQSBCVEYgaXMgcmVmdXNlZCBvdXRyaWdodCBmb3IgYSBzaWduZWQgcHJvZ3JhbSAtIGEKJiM0Mztrc3ltIG9yIGEgQlRGIGZkIGluIGBgZmRfYXJyYXlgYCwgd2hldGhlciByZXNvbHZlZCB1cCBmcm9udCBvciBsYXppbHkgZm9yIGEKJiM0Mzttb2R1bGUga2Z1bmMsIGlzIHJlamVjdGVkIHdoZW4gaXQgd291bGQgYmUgYm91bmQuIFRvZ2V0aGVyIHdpdGggdGhlIGZvbGQgcnVsZQomIzQzO2Fib3ZlIHRoaXMga2VlcHMgdGhlIHZlcmRpY3QgYmluYXJ5OiBhIHNpZ25lZCBwcm9ncmFtIGNhbm5vdCB1c2UgYSBtYXAgaXRzCiYjNDM7c2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLCBhbmQgYSBkaWZmZXJlbnQgYnV0IGVxdWFsbHkgZGlnZXN0LWJvdW5kIG1hcCBjYW5ub3QgYmUKJiM0MztzdWJzdGl0dXRlZCBhdCBhbiBgYGZkX2FycmF5YGAgc2xvdC4gTm9uLWV4Y2x1c2l2ZSBtYXBzIGFyZSBuZXZlciBmb2xkZWQsIHNvIGEKJiM0MztzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIG9uZSBhdCBhbGwuCiYjNDM7CiYjNDM7VGhlIHZlcmRpY3QKJiM0Mzs9PT09PT09PT09PQomIzQzOwomIzQzO0EgcHJvZ3JhbSBpcyBlaXRoZXIgdW5zaWduZWQgb3IgZnVsbHkgdmVyaWZpZWQgLSB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGUKJiM0MztzdGF0ZS4gVGhlIG91dGNvbWUgaXMgcmVjb3JkZWQgaW4gYGBwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0YGA6CiYjNDM7CiYjNDM7Li4gY29kZS1ibG9jazo6IGMKJiM0MzsKJiM0MzsgICAgZW51bSBicGZfc2lnX3ZlcmRpY3QgewomIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLAomIzQzOyAgICAgICAgICAgIEJQRl9TSUdfVkVSSUZJRUQsCiYjNDM7ICAgIH07CiYjNDM7CiYjNDM7YGBCUEZfU0lHX1ZFUklGSUVEYGAgbWVhbnMgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMKJiM0MzsqYW5kKiB0aGUgZnJvemVuIGNvbnRlbnRzIG9mIGV2ZXJ5IGV4Y2x1c2l2ZSBtYXAgdGhlIHByb2dyYW0gdXNlczoKJiM0MzsKJiM0MzstIEZvciBhbiBvcmRpbmFyeSwgZGlyZWN0bHktbG9hZGVkIHNpZ25lZCBwcm9ncmFtIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHRoZSB3aG9sZQomIzQzOyAgYXJ0aWZhY3QgYW5kIGl0IHVzZXMgbm8gZXhjbHVzaXZlIG1hcHMsIHNvIGEgdmFsaWQgaW5zdHJ1Y3Rpb24gc2lnbmF0dXJlIGlzCiYjNDM7ICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLgomIzQzOy0gRm9yIGEgc2lnbmVkIGxvYWRlciB0aGUgbWV0YWRhdGEgbWFwIGlzIGV4Y2x1c2l2ZSwgc28gaXRzIGNvbnRlbnRzIGFyZSBmb2xkZWQKJiM0MzsgIGluIGFuZCB0aGUgc2lnbmF0dXJlIGNvdmVycyBgYGluc25zIHx8IG1ldGFkYXRhYGAuCiYjNDM7CiYjNDM7VGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vICYjMzQ7aW5zdHJ1Y3Rpb25zIHZlcmlmaWVkIGJ1dCBtZXRhZGF0YSBub3QmIzM0OyB2ZXJkaWN0OiBhCiYjNDM7c2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3QKJiM0MztyZWNvcmRlZCB3aXRoIGEgd2Vha2VyIHZlcmRpY3QuIGBgQlBGX1NJR19WRVJJRklFRGBgIHRoZXJlZm9yZSBhbHdheXMgbWVhbnMgdGhlCiYjNDM7cHJvZ3JhbSBhbmQgZXZlcnl0aGluZyB0aGUgc2lnbmF0dXJlIGlzIHJlc3BvbnNpYmxlIGZvciBhcmUgYXV0aGVudGljLCB3aGljaCBpcwomIzQzO3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uCiYjNDM7CiYjNDM7QWxvbmdzaWRlIHRoZSB2ZXJkaWN0IHRoZSBrZXJuZWwgcmVjb3JkcyB3aGljaCBrZXlyaW5nIHZhbGlkYXRlZCB0aGUgc2lnbmF0dXJlOwomIzQzO3NlZSBgS2V5cmluZ3NgXy4KJiM0MzsKJiM0MztFbmZvcmNlbWVudCB2aWEgTFNNcwomIzQzOz09PT09PT09PT09PT09PT09PT09CiYjNDM7CiYjNDM7U2lnbmluZyBvbmx5ICpyZWNvcmRzKiBhIHZlcmRpY3Q7IGFuIExTTSB0dXJucyBpdCBpbnRvIHBvbGljeS4gVGhlIHZlcmRpY3QgYW5kCiYjNDM7a2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWQKJiM0Mzt0aGVtIGRpcmVjdGx5IChzZWUgRG9jdW1lbnRhdGlvbi9icGYvcHJvZ19sc20ucnN0IGZvciB3cml0aW5nIGFuZCBhdHRhY2hpbmcgQlBGCiYjNDM7TFNNIHByb2dyYW1zKTsgdGhlIHNhbWUgZmllbGRzIGFyZSBlcXVhbGx5IGF2YWlsYWJsZSB0byBpbi10cmVlIExTTXMgc3VjaCBhcwomIzQzO0lQRS4gVHdvIGhvb2tzIGFyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZAomIzQzO2Bgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGAgZ2F0ZXMgYWRtaXNzaW9uIGJlZm9yZSB0aGUgbWFpbiB2ZXJpZmljYXRpb24gd29yaywKJiM0MzthbmQgdGhlIGV4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIG9ic2VydmVzIGEgcHJvZ3JhbSB0aGF0IGhhcyBmdWxseQomIzQzO2xvYWRlZC4KJiM0MzsKJiM0MztBZG1pc3Npb246IGBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGAKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJiM0MzsKJiM0MztUaGlzIGhvb2sgZ2F0ZXMgYWRtaXNzaW9uICoqZm9yIGV2ZXJ5IGxvYWQqKiwgZnJvbSBhIHNpbmdsZSBjYWxsIHNpdGUgaW5zaWRlIHRoZQomIzQzO3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlCiYjNDM7b3B0aW9uYWwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgc28gdGhlIHZlcmRpY3QgYW5kIGtleXJpbmcgZmllbGRzIGFyZSBmaW5hbCAtIHRoZQomIzQzO2hvb2sgY2FuIHNlZSB3aGV0aGVyLCBhbmQgaG93IHN0cm9uZ2x5LCB0aGUgcHJvZ3JhbSB3YXMgc2lnbmVkLCB3aGljaCBrZXlyaW5nCiYjNDM7dmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlCiYjNDM7a2VybmVsLiBGb3IgYSBzaWduZWQgbG9hZCB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBoZXJlICh0aGUgc2lnbmF0dXJlCiYjNDM7aGFzIGp1c3QgYmVlbiBjaGVja2VkKTsgZm9yIGFuIHVuc2lnbmVkIGxvYWQgaXQgaXMgYGBCUEZfU0lHX1VOU0lHTkVEYGAuCiYjNDM7CiYjNDM7VGhpcyBpcyB0aGUgcGxhY2UgZm9yICpjb2Fyc2UgYWRtaXNzaW9uKiB0aGF0IG11c3QgYWxzbyBzZWUgdW5zaWduZWQgYW5kCiYjNDM7bm90LXlldC12ZXJpZmllZCBsb2FkczogcmVxdWlyZSBhIHNpZ25hdHVyZSBhdCBhbGwsIHJlc3RyaWN0IHRoZSBhY2NlcHRhYmxlCiYjNDM7a2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlCiYjNDM7cnVsZXMsIG9yIGF1ZGl0IGV2ZXJ5IGF0dGVtcHQuIEl0IGlzIHRoZSBwcmltYXJ5IGRlbnkgcG9pbnQuCiYjNDM7CiYjNDM7T25lIHN1YnRsZXR5OiB0aGlzIGhvb2sgcnVucyAqYmVmb3JlKiB0aGUgdmVyaWZpZXIgZmluaXNoZXMgaXRzIHdvcmssIHNvCiYjNDM7YGBCUEZfU0lHX1ZFUklGSUVEYGAgKmhlcmUqIG1lYW5zIG9ubHkgJiMzNDt2YWxpZGx5IHNpZ25lZCYjMzQ7IC0gbm90ICYjMzQ7bG9hZGVkJiMzNDsuIEFsbG93aW5nCiYjNDM7YSBsb2FkIGF0IHRoaXMgcG9pbnQgbGV0cyBpdCAqcHJvY2VlZCo7IGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgcHJvZ3JhbSB3aWxsCiYjNDM7bG9hZC4gQSB2YWxpZGx5IHNpZ25lZCBwcm9ncmFtIGNhbiBzdGlsbCBiZSByZWplY3RlZCBhZnRlcndhcmRzIG9uIHR3bwomIzQzO2luZGVwZW5kZW50IGdyb3VuZHM6IHRoZSB2ZXJpZmllciBtYXkgcmVqZWN0IGl0IGxpa2UgYW55IG90aGVyIHByb2dyYW0gKHVuc2FmZQomIzQzO21lbW9yeSBhY2Nlc3MsIGJhZCBjb250cm9sIGZsb3csIHJlc291cmNlIGxpbWl0cywgLi4uKSwgYW5kIHRoZSBrZXJuZWwgc2VwYXJhdGVseQomIzQzO3JlZnVzZXMgLSBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zIGFuZCBiaW5kcyBlYWNoIG9iamVjdCAtIGFueSBtYXAKJiM0Mzt0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIG9yIGFueSBCVEYgYXQgYWxsLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBob29rCiYjNDM7cmV0dXJuZWQuIE9ubHkgYWZ0ZXIgdGhlIHByb2dyYW0gaGFzIGZ1bGx5IGxvYWRlZCwgYXQgdGhlIG5leHQgaG9vawomIzQzOyhgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCksIGRvZXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgY2FycnkgaXRzIGZ1bGwgbWVhbmluZzoKJiM0Mzt2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC4KJiM0MzsKJiM0MztBIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiAmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGwmIzM0OzogYWNjZXB0IHByb2dyYW1zCiYjNDM7c2lnbmVkIGJ5IGEgc3lzdGVtIGtleXJpbmcsIGFjY2VwdCBhIHVzZXIta2V5cmluZyBzaWduYXR1cmUgb25seSBpZiB0aGUKJiM0MztrZXkva2V5cmluZyBpdCB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGEKJiM0Mzt0YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmUKJiM0MzthdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKQomIzQzOwomIzQzOy4uIGNvZGUtYmxvY2s6OiBjCiYjNDM7CiYjNDM7ICAgIC8qIFNlcmlhbHMgb2YgdXNlciBrZXlzL2tleXJpbmdzIHdlIGFkZGl0aW9uYWxseSB0cnVzdC4gKi8KJiM0MzsgICAgc3RydWN0IHsKJiM0MzsgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOwomIzQzOyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi8KJiM0MzsgICAgICAgICAgICBfX3R5cGUodmFsdWUsIF9fdTgpOwomIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNjQpOwomIzQzOyAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOyAgICAvKiBBdWRpdCBzdHJlYW0gY29uc3VtZWQgYnkgYSB1c2Vyc3BhY2UgbG9nZ2VyLiAqLwomIzQzOyAgICBzdHJ1Y3QgewomIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7CiYjNDM7ICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCAxICZsdDsmbHQ7IDE2KTsKJiM0MzsgICAgfSBhdWRpdCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsgICAgc3RydWN0IGRlY2lzaW9uIHsgX191MzIgcHJvZ190eXBlLCB2ZXJkaWN0LCBrdHlwZTsgX19zMzIgc2VyaWFsLCByZXQ7IH07CiYjNDM7CiYjNDM7ICAgIFNFQygmIzM0O2xzbS9icGZfcHJvZ19sb2FkJiMzNDspCiYjNDM7ICAgIGludCBCUEZfUFJPRyhhZG1pdCwgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwKJiM0MzsgICAgICAgICAgICAgICAgIHN0cnVjdCBicGZfdG9rZW4gKnRva2VuLCBib29sIGtlcm5lbCkKJiM0MzsgICAgewomIzQzOyAgICAgICAgICAgIF9fdTMyIHZlcmRpY3QgPSBwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0OwomIzQzOyAgICAgICAgICAgIF9fdTMyIGt0eXBlICAgPSBwcm9nLSZndDthdXgtJmd0O3NpZy5rZXlyaW5nX3R5cGU7CiYjNDM7ICAgICAgICAgICAgX19zMzIgc2VyaWFsICA9IHByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfc2VyaWFsOwomIzQzOyAgICAgICAgICAgIHN0cnVjdCBkZWNpc2lvbiAqZDsKJiM0MzsgICAgICAgICAgICBpbnQgcmV0ID0gMDsKJiM0MzsKJiM0MzsgICAgICAgICAgICBpZiAoa2VybmVsKQomIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0cnVzdCBpbi1rZXJuZWwgbG9hZHMgKi8KJiM0MzsKJiM0MzsgICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKQomIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovCiYjNDM7ICAgICAgICAgICAgZWxzZSBpZiAoa3R5cGUgPT0gQlBGX1NJR19LRVlSSU5HX1VTRVIgJmFtcDsmYW1wOwomIzQzOyAgICAgICAgICAgICAgICAgICAgICFicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7dHJ1c3RlZF91c2VyX2tleXMsICZhbXA7c2VyaWFsKSkKJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5L2tleXJpbmcgbm90IGFsbG93bGlzdGVkICovCiYjNDM7CiYjNDM7ICAgICAgICAgICAgZCA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoJmFtcDthdWRpdCwgc2l6ZW9mKCpkKSwgMCk7CiYjNDM7ICAgICAgICAgICAgaWYgKGQpIHsKJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtJmd0O3Byb2dfdHlwZSA9IGF0dHItJmd0O3Byb2dfdHlwZTsKJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtJmd0O3ZlcmRpY3QgPSB2ZXJkaWN0OwomIzQzOyAgICAgICAgICAgICAgICAgICAgZC0mZ3Q7a3R5cGUgPSBrdHlwZTsKJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtJmd0O3NlcmlhbCA9IHNlcmlhbDsKJiM0MzsgICAgICAgICAgICAgICAgICAgIGQtJmd0O3JldCA9IHJldDsKJiM0MzsgICAgICAgICAgICAgICAgICAgIGJwZl9yaW5nYnVmX3N1Ym1pdChkLCAwKTsgICAgICAgLyogcmVjb3JkIGFsbG93ICphbmQqIGRlbnkgKi8KJiM0MzsgICAgICAgICAgICB9CiYjNDM7ICAgICAgICAgICAgcmV0dXJuIHJldDsKJiM0MzsgICAgfQomIzQzOwomIzQzO09ic2VydmluZyBhIHZlcmlmaWVkIGxvYWQ6IGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgCiYjNDM7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KJiM0MzsKJiM0MztUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2VwYXJhdGUgJiMzNDttZXRhZGF0YSBhdHRlc3RlZCYjMzQ7IGhvb2suIFRoZSBjb3ZlcmFnZSBjaGVjawomIzQzO2Fib3ZlIGlzIGVuZm9yY2VkIGJ5IHRoZSBrZXJuZWwgdW5jb25kaXRpb25hbGx5LCBzbyBhIHNpZ25lZCBsb2FkZXIgdGhhdCBmYWlscwomIzQzO3RvIGNvdmVyIGl0cyBtZXRhZGF0YSBuZXZlciBsb2FkcyBhbmQgYW4gTFNNIG5ldmVyIGhhcyB0byByZS1lc3RhYmxpc2ggdGhhdAomIzQzO2ZhY3QuIFRvICphY3Qgb24qIGEgcHJvZ3JhbSB0aGF0IGhhcyBzdWNjZXNzZnVsbHkgYW5kIGZ1bGx5IGxvYWRlZCwgdXNlIHRoZQomIzQzO2V4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIGhvb2sgKGBgbHNtL2JwZl9wcm9nYGApLCB3aGljaCBmaXJlcyBmcm9tCiYjNDM7YGBicGZfcHJvZ19uZXdfZmQoKWBgIC0gYWZ0ZXIgdGhlIHZlcmlmaWVyLCBhZnRlciB0aGUgY292ZXJhZ2UgY2hlY2ssIGFuZCBhZnRlcgomIzQzO2BgYnBmX3Byb2dfYWxsb2NfaWQoKWBgLiBSZWxhdGl2ZSB0byB0aGUgYWRtaXNzaW9uIGhvb2sgdGhpcyBwb2ludCBpcyBzdHJpY3RseQomIzQzO2xhdGVyIGFuZCBzdHJvbmdlcjoKJiM0MzsKJiM0MzstIHRoZSBwcm9ncmFtIGhhcyBhbiBpZCAoYGBwcm9nLSZndDthdXgtJmd0O2lkYGApLCBzbyBpdCBjYW4gYmUgcmVjb3JkZWQgb3IgY29ycmVsYXRlZAomIzQzOyAgd2l0aCBsYXRlciBldmVudHM7CiYjNDM7LSBgYHZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRGBgICpoZXJlKiBtZWFucyAqKmZ1bGx5KiogdmVyaWZpZWQgLSBhIHByb2dyYW0KJiM0MzsgIHRoYXQgdXNlZCBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIHdhcyBhbHJlYWR5IHJlamVjdGVkLCBzbyBpdCBjYW5ub3QKJiM0MzsgIHJlYWNoIHRoaXMgcG9pbnQ7CiYjNDM7LSBpdCBvYnNlcnZlcyBvbmx5IHByb2dyYW1zIHRoYXQgYWN0dWFsbHkgbG9hZGVkOyBhIGZhaWxlZCBsb2FkIG5ldmVyIG1pbnRzIGFuCiYjNDM7ICBmZCwgc28gaXQgbmV2ZXIgcmVhY2hlcyB0aGlzIGhvb2suCiYjNDM7CiYjNDM7SXQgdGFrZXMgb25seSB0aGUgYGBwcm9nYGAgYW5kIGEgbm9uLXplcm8gcmV0dXJuIHN0aWxsIGFib3J0cyAodGhlIGZkIGlzIG5vdAomIzQzO2hhbmRlZCBvdXQpLCBzbyBpdCBjYW4gdmV0byBhcyB3ZWxsIGFzIG9ic2VydmUuIE9uZSB3cmlua2xlOiBpdCBhbHNvIGZpcmVzIG9uCiYjNDM7b3RoZXIgcGF0aHMgdGhhdCBtaW50IGEgbmV3IHByb2dyYW0gZmQgLSBub3RhYmx5IGBgYnBmX3Byb2dfZ2V0X2ZkX2J5X2lkKClgYCAtCiYjNDM7bm90IGp1c3Qgb24gYSBmcmVzaCBsb2FkLiBCZWNhdXNlIHRoZSBwcm9ncmFtIGFscmVhZHkgaGFzIGl0cyBpZCBoZXJlLCBhbiBMU00KJiM0MztjYW4gdGVsbCB0aGUgdHdvIGFwYXJ0IHdpdGggYSBzbWFsbCBoYXNoIG1hcDogdGhlICpmaXJzdCogdGltZSBhbiBpZCBpcyBzZWVuIGlzCiYjNDM7dGhlIGxvYWQ7IGEgbGF0ZXIgc2lnaHRpbmcgb2YgdGhlIHNhbWUgaWQgaXMganVzdCBhbm90aGVyIGZkIHRvIGEgcHJvZ3JhbSB0aGF0CiYjNDM7YWxyZWFkeSBleGlzdHMuCiYjNDM7CiYjNDM7VG8gYm91bmQgdGhlIG1hcCBhbmQgbGV0IGEgcmV1c2VkIGlkIHJlYWQgYXMgYSBmcmVzaCBsb2FkLCB0aGlzIGNhbiBiZSBwYWlyZWQKJiM0Mzt3aXRoIGBgc2VjdXJpdHlfYnBmX3Byb2dfZnJlZSgpYGAgKGBgbHNtL2JwZl9wcm9nX2ZyZWVgYCksIHdoaWNoIGRlbGV0ZXMgdGhlCiYjNDM7ZW50cnkgb24gdGVhcmRvd24gLSBrZXllZCBieSB0aGUgc2FtZSBgYHByb2dgYCBwb2ludGVyLCBzaW5jZQomIzQzO2BgYnBmX3Byb2dfZnJlZV9pZCgpYGAgaGFzIGFscmVhZHkgY2xlYXJlZCBgYHByb2ctJmd0O2F1eC0mZ3Q7aWRgYCB0byBgYDBgYCBieSB0aGUgdGltZQomIzQzO3RoYXQgaG9vayBydW5zLiAoSWxsdXN0cmF0aXZlIC0gcHJpdmlsZWdlZCBMU00sIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiYjNDM7CiYjNDM7Li4gY29kZS1ibG9jazo6IGMKJiM0MzsKJiM0MzsgICAgc3RydWN0IHJlYyB7IF9fdTMyIGlkLCBrdHlwZTsgX19zMzIgc2VyaWFsOyB9OwomIzQzOwomIzQzOyAgICBzdHJ1Y3QgewomIzQzOyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7CiYjNDM7ICAgICAgICAgICAgX190eXBlKGtleSwgX191NjQpOyAgICAgICAgICAgICAvKiBzdHJ1Y3QgYnBmX3Byb2cgKiAtLSBzdGFibGUgaWQgKi8KJiM0MzsgICAgICAgICAgICBfX3R5cGUodmFsdWUsIHN0cnVjdCByZWMpOwomIzQzOyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNDA5Nik7CiYjNDM7ICAgIH0gbGl2ZSBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsgICAgU0VDKCYjMzQ7bHNtL2JwZl9wcm9nJiMzNDspICAgICAgICAgICAgLyogZmlyZXMgYWZ0ZXIgbG9hZCBhbmQgb24gZXZlcnkgbGF0ZXIgZmQgKi8KJiM0MzsgICAgaW50IEJQRl9QUk9HKG9ic2VydmUsIHN0cnVjdCBicGZfcHJvZyAqcHJvZykKJiM0MzsgICAgewomIzQzOyAgICAgICAgICAgIF9fdTY0IGtleSA9IChfX3U2NCkodW5zaWduZWQgbG9uZylwcm9nOwomIzQzOyAgICAgICAgICAgIHN0cnVjdCByZWMgcjsKJiM0MzsKJiM0MzsgICAgICAgICAgICBpZiAocHJvZy0mZ3Q7YXV4LSZndDtzaWcudmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKQomIzQzOyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiYjNDM7ICAgICAgICAgICAgaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtsaXZlLCAmYW1wO2tleSkpCiYjNDM7ICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzZWVuIGJlZm9yZTogYSBsYXRlciBmZCwgbm90IGEgbG9hZCAqLwomIzQzOwomIzQzOyAgICAgICAgICAgIC8qIEZpcnN0IHNpZ2h0aW5nID09IHRoaXMgcHJvZ3JhbSBqdXN0IGxvYWRlZDsgaWQgaXMgdmFsaWQgaGVyZS4gKi8KJiM0MzsgICAgICAgICAgICByLmlkICAgICA9IHByb2ctJmd0O2F1eC0mZ3Q7aWQ7CiYjNDM7ICAgICAgICAgICAgci5rdHlwZSAgPSBwcm9nLSZndDthdXgtJmd0O3NpZy5rZXlyaW5nX3R5cGU7CiYjNDM7ICAgICAgICAgICAgci5zZXJpYWwgPSBwcm9nLSZndDthdXgtJmd0O3NpZy5rZXlyaW5nX3NlcmlhbDsKJiM0MzsgICAgICAgICAgICBicGZfbWFwX3VwZGF0ZV9lbGVtKCZhbXA7bGl2ZSwgJmFtcDtrZXksICZhbXA7ciwgQlBGX05PRVhJU1QpOwomIzQzOyAgICAgICAgICAgIC8qIC4uLiBuZXdseS1sb2FkZWQgdmVyaWZpZWQtcHJvZ3JhbSBhY3Rpb24sIGUuZy4gcmVjb3JkIHIuaWQgLi4uICovCiYjNDM7ICAgICAgICAgICAgcmV0dXJuIDA7CiYjNDM7ICAgIH0KJiM0MzsKJiM0MztQdXR0aW5nIHRoZW0gdG9nZXRoZXI6IHRvICpyZXF1aXJlKiB2ZXJpZmllZCBCUEYsIGRlbnkgYXQgdGhlIGFkbWlzc2lvbiBob29rCiYjNDM7dW5sZXNzIHRoZSB2ZXJkaWN0IGlzIGBgQlBGX1NJR19WRVJJRklFRGBgIChhbmQsIGlmIGRlc2lyZWQsIHJlc3RyaWN0IHRoZQomIzQzO2tleXJpbmcpLiBUaGUga2VybmVsIHRoZW4gZ3VhcmFudGVlcyB0aGF0IGFueSBwcm9ncmFtIHdoaWNoIGFjdHVhbGx5IGxvYWRzIHdpdGgKJiM0Mzt0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvCiYjNDM7YSBkZW55LWJ5LWRlZmF1bHQgYWRtaXNzaW9uIHBvbGljeSBuZWVkcyBubyBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuIFVzZQomIzQzO2Bgc2VjdXJpdHlfYnBmX3Byb2coKWBgIHRvIHJlY29yZCBvciBmaW5hbGx5IGdhdGUgdGhlIHZlcmlmaWVkIHByb2dyYW1zIG9uY2UKJiM0Mzt0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHMKJiM0MztsZXQgYSBwb2xpY3kgZGlzdGluZ3Vpc2gsIGZvciBleGFtcGxlLCAmIzM0O3ZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleSYjMzQ7CiYjNDM7ZnJvbSAmIzM0O3ZlcmlmaWVkIGJ5IGEgdXNlciBrZXkmIzM0Oy4gUG9saWN5IExTTXMgc3VjaCBhcyBJUEUgY29uc3VtZSB0aGUgc2FtZSBob29rcyB0bwomIzQzO2VuZm9yY2Ugc3lzdGVtIHBvbGljeSB3aXRob3V0IHdyaXRpbmcgYW55IEJQRi4KJiM0MzsKJiM0MztLZXlyaW5ncwomIzQzOz09PT09PT09CiYjNDM7CiYjNDM7YGBrZXlyaW5nX2lkYGAgc2VsZWN0cyB0aGUgdHJ1c3RlZCBrZXlyaW5nIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkCiYjNDM7YWdhaW5zdC4gVGhlIHdlbGwta25vd24gaWRzIGBgMGBgIChidWlsdGluKSwgYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAKJiM0MzthbmQgYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgc3lzdGVtIGtleXJpbmdzOwomIzQzO2FueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBzZXJpYWwgb2YgYSB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcuCiYjNDM7VGhlIGtleXJpbmcgaXMgbG9va2VkIHVwIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGEKJiM0MztzaWduYXR1cmUgbmFtaW5nIGEgbm9uLWV4aXN0ZW50IGtleXJpbmcgaXMgcmVqZWN0ZWQgdXAgZnJvbnQsIGFuZCBhIGZhaWxlZAomIzQzO3ZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBzbyBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aCBhCiYjNDM7c2lnbmF0dXJlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC4KJiM0MzsKJiM0MztUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctJmd0O2F1eC0mZ3Q7c2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OgomIzQzOwomIzQzO2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYCkKJiM0MzsgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6CiYjNDM7ICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW0KJiM0MzsgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXMKJiM0MzsgICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLgomIzQzOwomIzQzO2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYCkKJiM0MzsgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlCiYjNDM7ICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZQomIzQzOyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWMKJiM0MzsgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZwomIzQzOyAgICBgYEtFWV9TUEVDX1NFU1NJT05fS0VZUklOR2BgLCBmb3IgZXhhbXBsZSwgcmVjb3JkcyB0aGUgc2Vzc2lvbiBrZXlyaW5nJiMzOTtzCiYjNDM7ICAgIHNlcmlhbC4gVGhlIHN5c3RlbSBrZXlyaW5ncyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZCBleHBvc2Ugbm8gc2VyaWFsCiYjNDM7ICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm0KJiM0MzsgICAgc2lnbmF0dXJlcywgYW5kIGBgMGBgIGZvciB1bnNpZ25lZCBwcm9ncmFtcy4gSW4gb3RoZXIgd29yZHMsIGEgbm9uLXplcm8KJiM0MzsgICAgYGBrZXlyaW5nX3NlcmlhbGBgIGlzIGV4YWN0bHkgJiMzNDt2ZXJpZmllZCBhZ2FpbnN0IHRoZSB1c2VyIGtleS9rZXlyaW5nIHdpdGgKJiM0MzsgICAgdGhpcyBzZXJpYWwmIzM0Oy4KJiM0MzsKJiM0MzsuLiBsaXN0LXRhYmxlOjoKJiM0MzsgICA6aGVhZGVyLXJvd3M6IDEKJiM0MzsKJiM0MzsgICAqIC0gYGBrZXlyaW5nX2lkYGAKJiM0MzsgICAgIC0gYGBrZXlyaW5nX3R5cGVgYAomIzQzOyAgICAgLSBgYGtleXJpbmdfc2VyaWFsYGAKJiM0MzsgICAqIC0gKG5vIHNpZ25hdHVyZSkKJiM0MzsgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgCiYjNDM7ICAgICAtIGBgMGBgCiYjNDM7ICAgKiAtIGBgMGBgCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYAomIzQzOyAgICAgLSBgYDBgYAomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYAomIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUllgYAomIzQzOyAgICAgLSBgYDBgYAomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNYGAKJiM0MzsgICAgIC0gYGAwYGAKJiM0MzsgICAqIC0gb3RoZXIgKGEgdXNlci9zZXNzaW9uIGtleSBzZXJpYWwpCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYAomIzQzOyAgICAgLSBzZXJpYWwgb2YgdGhlIHJlc29sdmVkIGtleS9rZXlyaW5nCiYjNDM7CiYjNDM7UHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdAomIzQzOz09PT09PT09PT09PT09PT09PT09PT09PT09CiYjNDM7CiYjNDM7YGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjoKJiM0MzsKJiM0MzsgICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgJmx0O3ByaXZhdGVfa2V5LnBlbSZndDsgLWkgJmx0O2NlcnRpZmljYXRlLng1MDkmZ3Q7IFwKJiM0MzsgICAgICAgICAgICBvYmouYnBmLm8gJmd0OyBvYmoubHNrZWwuaAomIzQzOwomIzQzO2BgLUxgYCBzZWxlY3RzIHRoZSBsaWdodC1za2VsZXRvbiAoYGBnZW5fbG9hZGVyYGApIGJhY2tlbmQgYW5kIGBgLVNgYCBlbmFibGVzCiYjNDM7c2lnbmluZzsgYGAta2BgIGFuZCBgYC1pYGAgc3VwcGx5IHRoZSBzaWduaW5nIGtleSBhbmQgaXRzIFguNTA5IGNlcnRpZmljYXRlLgomIzQzO2BgYnBmdG9vbGBgIHNpZ25zIGBgaW5zbnMgfHwgbWV0YWRhdGFgYCAtIHRoZSBleGFjdCBieXRlcyB0aGUga2VybmVsCiYjNDM7cmVjb25zdHJ1Y3RzIC0gYW5kIGFsc28gY29tcHV0ZXMgYGBleGNsX3Byb2dfaGFzaGBgIGFzIHRoZSBkaWdlc3Qgb2YgdGhlIGxvYWRlcgomIzQzO2luc3RydWN0aW9ucyBzbyB0aGUgbWV0YWRhdGEgbWFwIGNhbiBiZSBib3VuZCB0byB0aGUgbG9hZGVyLiBUaGUgc2lnbmF0dXJlLAomIzQzO2NlcnRpZmljYXRlIGFuZCBoYXNoIGFyZSBlbWJlZGRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlcjsgbG9hZGluZyB0aGUgc2tlbGV0b24KJiM0MztwZXJmb3JtcyB0aGUgY3JlYXRlL3BvcHVsYXRlL2ZyZWV6ZS9sb2FkIHNlcXVlbmNlIGRlc2NyaWJlZCBhYm92ZS4KJiM0MzsKJiM0MztBdCBydW50aW1lIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjaG9zZW4ga2V5cmluZyAoZm9yCiYjNDM7ZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbHRpbiB0cnVzdGVkCiYjNDM7a2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLgomIzQzOwomIzQzO1VBUEkgcmVmZXJlbmNlCiYjNDM7PT09PT09PT09PT09PT0KJiM0MzsKJiM0MztgYEJQRl9QUk9HX0xPQURgYCAoYGB1bmlvbiBicGZfYXR0cmBgKToKJiM0MzsKJiM0MztgYHNpZ25hdHVyZWBgLCBgYHNpZ25hdHVyZV9zaXplYGAKJiM0MzsgICAgUG9pbnRlciB0byBhbmQgbGVuZ3RoIG9mIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IuCiYjNDM7CiYjNDM7YGBrZXlyaW5nX2lkYGAKJiM0MzsgICAgVHJ1c3RlZCBrZXlyaW5nIHNlbGVjdG9yIChzZWUgYEtleXJpbmdzYF8pLgomIzQzOwomIzQzO2BgZmRfYXJyYXlgYCwgYGBmZF9hcnJheV9jbnRgYAomIzQzOyAgICBBcnJheSBvZiBtYXAgZmlsZSBkZXNjcmlwdG9ycyBib3VuZCB0byB0aGUgcHJvZ3JhbS4gYGBmZF9hcnJheV9jbnRgYCBtdXN0IGJlCiYjNDM7ICAgIHNldCBmb3IgdGhlIGtlcm5lbCB0byBzY2FuIHRoZSBhcnJheS4gV2hlbiBhIHNpZ25hdHVyZSBpcyBwcmVzZW50LCBldmVyeSBtYXAKJiM0MzsgICAgaW4gdGhlIGFycmF5IG11c3QgYmUgZXhjbHVzaXZlOyBpdHMgZnJvemVuIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGUKJiM0MzsgICAgdmVyaWZpZWQgYnVmZmVyLCBhbmQgYSBub24tZXhjbHVzaXZlIGVudHJ5IGlzIHJlamVjdGVkLgomIzQzOwomIzQzO2BgQlBGX01BUF9DUkVBVEVgYCAoYGB1bmlvbiBicGZfYXR0cmBgKToKJiM0MzsKJiM0MztgYGV4Y2xfcHJvZ19oYXNoYGAsIGBgZXhjbF9wcm9nX2hhc2hfc2l6ZWBgCiYjNDM7ICAgIFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBwcm9ncmFtIHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyAoZXhjbHVzaXZlKSBtYXAuIFRoaXMKJiM0MzsgICAgYmluZHMgdGhlIG1ldGFkYXRhIG1hcCB0byB0aGUgbG9hZGVyOyBpdCBpcyBub3QgYSBoYXNoIG9mIHRoZSBtYXAgKmNvbnRlbnQqLgomIzQzOyAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLAomIzQzOyAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuCiYjNDM7CiYjNDM7Tm90ZXMgYW5kIGxpbWl0YXRpb25zCiYjNDM7PT09PT09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzOy0gVGhlIGluc3RydWN0aW9ucyBwbHVzIGZvbGRlZCBtZXRhZGF0YSBhcmUgdmVyaWZpZWQgYXMgb25lIGBgYnBmX2R5bnB0cmBgLAomIzQzOyAgd2hpY2ggYm91bmRzIHRoZSBjb21iaW5lZCBzaXplIChjdXJyZW50bHkgfjE2IE1pQik7IHZlcnkgbGFyZ2Ugb2JqZWN0cyBjYW4KJiM0MzsgIGV4Y2VlZCBpdC4KJiM0MzstIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2gKJiM0MzsgIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYGAuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaAppbmRleCA3NmI4Yjc2MjdhMTA4NS4uOTYxZWZiOTAzMTQxY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaApAQCAtODk4LDYgJiM0Mzs4OTgsMTQgQEAgc3RydWN0IGJwZl9zY2NfaW5mbyB7CiAKIHN0cnVjdCBicGZfbGl2ZW5lc3M7CiAKJiM0MztzdHJ1Y3QgYnBmX2ZkX2FycmF5IHsKJiM0MzsJdW5pb24gewomIzQzOwkJc3RydWN0IGJwZl9tYXAgKm1hcDsKJiM0MzsJCXN0cnVjdCBidGYgKmJ0ZjsKJiM0MzsJCXVuc2lnbmVkIGxvbmcgdmFsOwomIzQzOwl9OwomIzQzO307CiYjNDM7CiAvKiBzaW5nbGUgY29udGFpbmVyIGZvciBhbGwgc3RydWN0cwogICogb25lIHZlcmlmaWVyX2VudiBwZXIgYnBmX2NoZWNrKCkgY2FsbAogICovCkBAIC05MzksNiAmIzQzOzk0Nyw3IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHsKIAlib29sIGJ5cGFzc19zcGVjX3Y0OwogCWJvb2wgc2Vlbl9kaXJlY3Rfd3JpdGU7CiAJYm9vbCBzZWVuX2V4Y2VwdGlvbjsKJiM0MzsJYm9vbCBzaWduYXR1cmU7CiAJc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhICppbnNuX2F1eF9kYXRhOyAvKiBhcnJheSBvZiBwZXItaW5zbiBzdGF0ZSAqLwogCWNvbnN0IHN0cnVjdCBicGZfbGluZV9pbmZvICpwcmV2X2xpbmZvOwogCXN0cnVjdCBicGZfdmVyaWZpZXJfbG9nIGxvZzsKQEAgLTk4OSw3ICYjNDM7OTk4LDE5IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHsKIAl1MzIgZnJlZV9saXN0X3NpemU7CiAJdTMyIGV4cGxvcmVkX3N0YXRlc19zaXplOwogCXUzMiBudW1fYmFja2VkZ2VzOwotCWJwZnB0cl90IGZkX2FycmF5OwomIzQzOwkvKgomIzQzOwkgKiBUaGUgcHJvZ3JhbSYjMzk7cyBmZF9hcnJheSBjb21lcyBpbiB0d28gc2hhcGVzLCB0b2xkIGFwYXJ0IGJ5IHdoZXRoZXIKJiM0MzsJICogdGhlIGNhbGxlciBwYXNzZWQgZmRfYXJyYXlfY250LiBUaGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmU6CiYjNDM7CSAqICAtIGNvbnRpbnVvdXMgKGZkX2FycmF5X2NudCBnaXZlbik6IC0mZ3Q7ZmRfYXJyYXkgaG9sZHMgZXZlcnkgZW50cnkKJiM0MzsJICogICAgcmVzb2x2ZWQgdG8gaXRzIG9iamVjdCB1cCBmcm9udCwgaW5kZXhlZCBieSBmZF9hcnJheSBwb3NpdGlvbiwKJiM0MzsJICogICAgd2l0aCAtJmd0O2ZkX2FycmF5X2NudCBzbG90czsgLSZndDtmZF9hcnJheV9yYXcgaXMgdW51c2VkLgomIzQzOwkgKiAgLSBzcGFyc2UgKG5vIGZkX2FycmF5X2NudCk6IC0mZ3Q7ZmRfYXJyYXkgaXMgTlVMTCwgYW5kIGVudHJpZXMgYXJlCiYjNDM7CSAqICAgIHJlYWQgZnJvbSAtJmd0O2ZkX2FycmF5X3JhdyAodGhlIGNhbGxlciYjMzk7cyBmZF9hcnJheSkgYW5kIHJlc29sdmVkCiYjNDM7CSAqICAgIGxhemlseSBvbiBmaXJzdCByZWZlcmVuY2UuCiYjNDM7CSAqLwomIzQzOwlzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpmZF9hcnJheTsKJiM0MzsJdTMyIGZkX2FycmF5X2NudDsKJiM0MzsJYnBmcHRyX3QgZmRfYXJyYXlfcmF3OwogCiAJLyogYml0IG1hc2sgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGEgcmVnaXN0ZXIgaGFzIGJlZW4gYWNjZXNzZWQKIAkgKiBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBmdW5jdGlvbiBzdGF0ZSB3YXMgcHJpbnRlZApkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuYwppbmRleCA2ZGIzMDZkMjNiNDc5Zi4uYzQ5NmM3M2E4NDgzMmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jCkBAIC00MCw3ICYjNDM7NDAsNiBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3RyYWNlcG9pbnQuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9vdmVyZmxvdy5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2Nvb2tpZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3ZlcmlmaWNhdGlvbi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKIAogI2luY2x1ZGUgJmx0O25ldC9uZXRmaWx0ZXIvbmZfYnBmX2xpbmsuaCZndDsKQEAgLTE2MDAsMTEgJiM0MzsxNTk5LDYgQEAgc3RhdGljIGludCBtYXBfY3JlYXRlX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl92ZXIKIAkJCWdvdG8gZnJlZV9tYXA7CiAJCX0KIAotCQkvKiBTZWUgbGliYnBmOiBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpICovCi0JCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgZXhjbCkgIT0gU0hBMjU2X0RJR0VTVF9TSVpFKTsKLQkJQlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtJmd0O2V4Y2wsIHUzMikpOwotCQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIHNoYSkgICE9IDApOwotCQlCVUlMRF9CVUdfT04oIV9fc2FtZV90eXBlKG1hcC0mZ3Q7c2hhLCB1OFtTSEEyNTZfRElHRVNUX1NJWkVdKSk7CiAJCW1hcC0mZ3Q7ZXhjbCA9IDE7CiAJfSBlbHNlIGlmIChhdHRyLSZndDtleGNsX3Byb2dfaGFzaF9zaXplKSB7CiAJCWJwZl9sb2cobG9nLCAmIzM0O0ludmFsaWQgZXhjbF9wcm9nX2hhc2hfc2l6ZS5cbiYjMzQ7KTsKQEAgLTI4ODYsNjQgJiM0MzsyODgwLDYgQEAgc3RhdGljIGJvb2wgaXNfcGVyZm1vbl9wcm9nX3R5cGUoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSkKIAl9CiB9CiAKLXN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZCkKLXsKLQlzd2l0Y2ggKGtleXJpbmdfaWQpIHsKLQljYXNlIDA6Ci0JCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjsKLQljYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzoKLQkJcmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7Ci0JY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzoKLQkJcmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwKLQkJCQkgICAgIGJvb2wgaXNfa2VybmVsLCBzMzIgKmtleXJpbmdfc2VyaWFsKQotewotCWJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLSZndDtzaWduYXR1cmUsIGlzX2tlcm5lbCk7Ci0Jc3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBpbnNuc19wdHI7Ci0Jc3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7Ci0Jdm9pZCAqc2lnOwotCWludCBlcnIgPSAwOwotCi0JLyoKLQkgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLgotCSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgotCSAqLwotCWlmIChhdHRyLSZndDtzaWduYXR1cmVfc2l6ZSAmZ3Q7IEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItJmd0O2tleXJpbmdfaWQpID09IDApCi0JCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQllbHNlCi0JCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7Ci0KLQlpZiAoIWtleSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwotCWlmIChJU19FUlIoc2lnKSkgewotCQlicGZfa2V5X3B1dChrZXkpOwotCQlyZXR1cm4gUFRSX0VSUihzaWcpOwotCX0KLQotCWJwZl9keW5wdHJfaW5pdCgmYW1wO3NpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLAotCQkJYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwotCWJwZl9keW5wdHJfaW5pdCgmYW1wO2luc25zX3B0ciwgcHJvZy0mZ3Q7aW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsCi0JCQlwcm9nLSZndDtsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7Ci0KLQllcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKikmYW1wO2luc25zX3B0ciwKLQkJCQkJIChzdHJ1Y3QgYnBmX2R5bnB0ciAqKSZhbXA7c2lnX3B0ciwga2V5KTsKLQlpZiAoIWVycikKLQkJKmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTsKLQlicGZfa2V5X3B1dChrZXkpOwotCWt2ZnJlZShzaWcpOwotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgYnBmX3Byb2dfbWFya19pbnNuX2FycmF5c19yZWFkeShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiB7CiAJaW50IGVycjsKQEAgLTMxMzMsMTcgJiM0MzszMDY5LDggQEAgc3RhdGljIGludCBicGZfcHJvZ19sb2FkKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXQKIAogCS8qIGVCUEYgcHJvZ3JhbXMgbXVzdCBiZSBHUEwgY29tcGF0aWJsZSB0byB1c2UgR1BMLWVkIGZ1bmN0aW9ucyAqLwogCXByb2ctJmd0O2dwbF9jb21wYXRpYmxlID0gbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSA/IDEgOiAwOwotCWlmIChhdHRyLSZndDtzaWduYXR1cmUpIHsKLQkJZXJyID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShwcm9nLCBhdHRyLCB1YXR0ci5pc19rZXJuZWwsCi0JCQkJCQkmYW1wO3Byb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfc2VyaWFsKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZnJlZV9wcm9nOwotCQlwcm9nLSZndDthdXgtJmd0O3NpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7Ci0JfSBlbHNlIHsKLQkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7Ci0JCXByb2ctJmd0O2F1eC0mZ3Q7c2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEOwotCX0KJiM0MzsJcHJvZy0mZ3Q7YXV4LSZndDtzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7CiYjNDM7CXByb2ctJmd0O2F1eC0mZ3Q7c2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEOwogCXByb2ctJmd0O29yaWdfcHJvZyA9IE5VTEw7CiAJcHJvZy0mZ3Q7aml0ZWQgPSAwOwogCkBAIC0zMTg5LDEwICYjNDM7MzExNiw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0CiAJaWYgKGVyciAmbHQ7IDApCiAJCWdvdG8gZnJlZV9wcm9nOwogCi0JZXJyID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChwcm9nLCBhdHRyLCB0b2tlbiwgdWF0dHIuaXNfa2VybmVsKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZyZWVfcHJvZzsKLQogCS8qIHJ1biBlQlBGIHZlcmlmaWVyICovCiAJZXJyID0gYnBmX2NoZWNrKCZhbXA7cHJvZywgYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTsKIAlpZiAoZXJyICZsdDsgMCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCAyNWFlYTQyNzFjZDA4OS4uMTYwOTA1M2EwZWViZjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTIyLDYgJiM0MzsyMiw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvY3R5cGUuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9lcnJvci1pbmplY3Rpb24uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGZfbHNtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3ZlcmlmaWNhdGlvbi5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9wb2lzb24uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKQEAgLTI0OTAsNiAmIzQzOzI0OTIsODMgQEAgaW50IGJwZl9nZXRfa2Z1bmNfYWRkcihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHUzMiBmdW5jX2lkLAogCXJldHVybiAwOwogfQogCiYjNDM7I2RlZmluZSBCUEZfRkRfU0xPVF9CVEYJMVVMCiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfbWFwKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBicGZfbWFwICptYXApCiYjNDM7ewomIzQzOwlzbG90LSZndDt2YWwgPSAodW5zaWduZWQgbG9uZyltYXA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnRmICpidGYpCiYjNDM7ewomIzQzOwlzbG90LSZndDt2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KQomIzQzO3sKJiM0MzsJaWYgKHNsb3QudmFsICZhbXA7IEJQRl9GRF9TTE9UX0JURikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4gKHN0cnVjdCBicGZfbWFwICopc2xvdC52YWw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9zbG90X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5IHNsb3QpCiYjNDM7ewomIzQzOwlpZiAoIShzbG90LnZhbCAmYW1wOyBCUEZfRkRfU0xPVF9CVEYpKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CXJldHVybiAoc3RydWN0IGJ0ZiAqKShzbG90LnZhbCAmYW1wOyB+QlBGX0ZEX1NMT1RfQlRGKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBidGYgKgomIzQzO2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwomIzQzOwlpZiAoaWR4ICZndDs9IGVudi0mZ3Q7ZmRfYXJyYXlfY250KSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtrZnVuYyBmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XG4mIzM0OywKJiM0MzsJCQlpZHgsIGVudi0mZ3Q7ZmRfYXJyYXlfY250KTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwomIzQzOwl9CiYjNDM7CWJ0ZiA9IGZkX3Nsb3RfYnRmKGVudi0mZ3Q7ZmRfYXJyYXlbaWR4XSk7CiYjNDM7CWlmICghYnRmKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtrZnVuYyBmZF9pZHggJXUgaXMgbm90IGEgbW9kdWxlIEJURlxuJiMzNDssIGlkeCk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKJiM0MzsJfQomIzQzOwlidGZfZ2V0KGJ0Zik7CiYjNDM7CXJldHVybiBidGY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICoKJiM0MztmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmOwomIzQzOwlpbnQgYnRmX2ZkOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoJmFtcDtidGZfZmQsIGVudi0mZ3Q7ZmRfYXJyYXlfcmF3LAomIzQzOwkJCQkgICAgKHNpemVfdClpZHggKiBzaXplb2YoYnRmX2ZkKSwgc2l6ZW9mKGJ0Zl9mZCkpKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiYjNDM7CWJ0ZiA9IGJ0Zl9nZXRfYnlfZmQoYnRmX2ZkKTsKJiM0MzsJaWYgKElTX0VSUihidGYpKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXG4mIzM0Oyk7CiYjNDM7CQlyZXR1cm4gYnRmOwomIzQzOwl9CiYjNDM7CXJldHVybiBidGY7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnRmICpmZF9hcnJheV9nZXRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpCiYjNDM7ewomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwomIzQzOwl9CiYjNDM7CWlmIChlbnYtJmd0O2ZkX2FycmF5KQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7CiYjNDM7CWlmICghYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheV9yYXcpKQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9idGZfc3BhcnNlKGVudiwgaWR4KTsKJiM0MzsKJiM0MzsJdmVyYm9zZShlbnYsICYjMzQ7a2Z1bmMgb2Zmc2V0ICZndDsgMCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIEVSUl9QVFIoLUVQUk9UTyk7CiYjNDM7fQomIzQzOwogc3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQkJCQkgczE2IG9mZnNldCkKIHsKQEAgLTI0OTgsNyAmIzQzOzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiAJc3RydWN0IGJwZl9rZnVuY19idGYgKmI7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCXN0cnVjdCBidGYgKmJ0ZjsKLQlpbnQgYnRmX2ZkOwogCiAJdGFiID0gZW52LSZndDtwcm9nLSZndDthdXgtJmd0O2tmdW5jX2J0Zl90YWI7CiAJYiA9IGJzZWFyY2goJmFtcDtrZl9idGYsIHRhYi0mZ3Q7ZGVzY3MsIHRhYi0mZ3Q7bnJfZGVzY3MsCkBAIC0yNTA5LDIyICYjNDM7MjU4Nyw5IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKIAkJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CiAJCX0KIAotCQlpZiAoYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheSkpIHsKLQkJCXZlcmJvc2UoZW52LCAmIzM0O2tmdW5jIG9mZnNldCAmZ3Q7IDAgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXG4mIzM0Oyk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRVBST1RPKTsKLQkJfQotCi0JCWlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldCgmYW1wO2J0Zl9mZCwgZW52LSZndDtmZF9hcnJheSwKLQkJCQkJICAgIG9mZnNldCAqIHNpemVvZihidGZfZmQpLAotCQkJCQkgICAgc2l6ZW9mKGJ0Zl9mZCkpKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0KLQkJYnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpOwotCQlpZiAoSVNfRVJSKGJ0ZikpIHsKLQkJCXZlcmJvc2UoZW52LCAmIzM0O2ludmFsaWQgbW9kdWxlIEJURiBmZCBzcGVjaWZpZWRcbiYjMzQ7KTsKJiM0MzsJCWJ0ZiA9IGZkX2FycmF5X2dldF9idGYoZW52LCBvZmZzZXQpOwomIzQzOwkJaWYgKElTX0VSUihidGYpKQogCQkJcmV0dXJuIGJ0ZjsKLQkJfQotCiAJCWlmICghYnRmX2lzX21vZHVsZShidGYpKSB7CiAJCQl2ZXJib3NlKGVudiwgJiMzNDtCVEYgZmQgZm9yIGtmdW5jIGlzIG5vdCBhIG1vZHVsZSBCVEZcbiYjMzQ7KTsKIAkJCWJ0Zl9wdXQoYnRmKTsKQEAgLTE3NTc3LDYgJiM0MzsxNzY0MiwxMSBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBidGYgKmJ0ZikKIAkJaWYgKGVudi0mZ3Q7dXNlZF9idGZzW2ldLmJ0ZiA9PSBidGYpCiAJCQlnb3RvIHJldF9wdXQ7CiAKJiM0MzsJaWYgKGVudi0mZ3Q7c2lnbmF0dXJlKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBhbnkgQlRGXG4mIzM0Oyk7CiYjNDM7CQlyZXQgPSAtRUFDQ0VTOwomIzQzOwkJZ290byByZXRfcHV0OwomIzQzOwl9CiAJaWYgKGVudi0mZ3Q7dXNlZF9idGZfY250ICZndDs9IE1BWF9VU0VEX0JURlMpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7VGhlIHRvdGFsIG51bWJlciBvZiBidGZzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxuJiMzNDssCiAJCQlNQVhfVVNFRF9CVEZTKTsKQEAgLTE3ODU5LDYgJiM0MzsxNzkyOSwxMiBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfbWFwICptYXApCiAJCWlmIChlbnYtJmd0O3VzZWRfbWFwc1tpXSA9PSBtYXApCiAJCQlyZXR1cm4gaTsKIAomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUgJmFtcDsmYW1wOwomIzQzOwkgICAgZW52LSZndDtwcm9nLSZndDthdXgtJmd0O3NpZy52ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRUQpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIG1hcCAmIzM5OyVzJiMzOTsgbm90IGNvdmVyZWQgYnkgdGhlIHNpZ25hdHVyZVxuJiMzNDssCiYjNDM7CQkJbWFwLSZndDtuYW1lKTsKJiM0MzsJCXJldHVybiAtRUFDQ0VTOwomIzQzOwl9CiAJaWYgKGVudi0mZ3Q7dXNlZF9tYXBfY250ICZndDs9IE1BWF9VU0VEX01BUFMpIHsKIAkJdmVyYm9zZShlbnYsICYjMzQ7VGhlIHRvdGFsIG51bWJlciBvZiBtYXBzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxuJiMzNDssCiAJCQlNQVhfVVNFRF9NQVBTKTsKQEAgLTE3OTExLDYgJiM0MzsxNzk4Nyw0OCBAQCBzdGF0aWMgaW50IGFkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpCiAJcmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTsKIH0KIAomIzQzO3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9tYXAgKm1hcDsKJiM0MzsKJiM0MzsJaWYgKGlkeCAmZ3Q7PSBlbnYtJmd0O2ZkX2FycmF5X2NudCkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxuJiMzNDssCiYjNDM7CQkJaWR4LCBlbnYtJmd0O2ZkX2FycmF5X2NudCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwltYXAgPSBmZF9zbG90X21hcChlbnYtJmd0O2ZkX2FycmF5W2lkeF0pOwomIzQzOwlpZiAoIW1hcCkgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4ICV1IGlzIG5vdCBhIG1hcFxuJiMzNDssIGlkeCk7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwlyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KQomIzQzO3sKJiM0MzsJaW50IGZkOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoJmFtcDtmZCwgZW52LSZndDtmZF9hcnJheV9yYXcsCiYjNDM7CQkJCSAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CXJldHVybiBhZGRfdXNlZF9tYXAoZW52LCBmZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHgoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeCkKJiM0Mzt7CiYjNDM7CWlmIChlbnYtJmd0O2ZkX2FycmF5KQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoZW52LCBpZHgpOwomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG11c3QgYmluZCBtYXBzIHZpYSBhIGNvbnRpbnVvdXMgZmRfYXJyYXkgKGZkX2FycmF5X2NudClcbiYjMzQ7KTsKJiM0MzsJCXJldHVybiAtRUFDQ0VTOwomIzQzOwl9CiYjNDM7CWlmICghYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheV9yYXcpKQomIzQzOwkJcmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShlbnYsIGlkeCk7CiYjNDM7CiYjNDM7CXZlcmJvc2UoZW52LCAmIzM0O2ZkX2lkeCB3aXRob3V0IGZkX2FycmF5IGlzIGludmFsaWRcbiYjMzQ7KTsKJiM0MzsJcmV0dXJuIC1FUFJPVE87CiYjNDM7fQomIzQzOwogc3RhdGljIGludCBjaGVja19hbHVfZmllbGRzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKIAl1OCBjbGFzcyA9IEJQRl9DTEFTUyhpbnNuLSZndDtjb2RlKTsKQEAgLTE4MTI4LDcgJiM0MzsxODI0Niw2IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIAkJCXN0cnVjdCBicGZfbWFwICptYXA7CiAJCQlpbnQgbWFwX2lkeDsKIAkJCXU2NCBhZGRyOwotCQkJdTMyIGZkOwogCiAJCQlpZiAoaSA9PSBpbnNuX2NudCAtIDEgfHwgaW5zblsxXS5jb2RlICE9IDAgfHwKIAkJCSAgICBpbnNuWzFdLmRzdF9yZWcgIT0gMCB8fCBpbnNuWzFdLnNyY19yZWcgIT0gMCB8fApAQCAtMTgxODAsMjEgJiM0MzsxODI5NywxNyBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiAJCQlzd2l0Y2ggKGluc25bMF0uc3JjX3JlZykgewogCQkJY2FzZSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUU6CiAJCQljYXNlIEJQRl9QU0VVRE9fTUFQX0lEWDoKLQkJCQlpZiAoYnBmcHRyX2lzX251bGwoZW52LSZndDtmZF9hcnJheSkpIHsKLQkJCQkJdmVyYm9zZShlbnYsICYjMzQ7ZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxuJiMzNDspOwotCQkJCQlyZXR1cm4gLUVQUk9UTzsKLQkJCQl9Ci0JCQkJaWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KCZhbXA7ZmQsIGVudi0mZ3Q7ZmRfYXJyYXksCi0JCQkJCQkJICAgIGluc25bMF0uaW1tICogc2l6ZW9mKGZkKSwKLQkJCQkJCQkgICAgc2l6ZW9mKGZkKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwomIzQzOwkJCQltYXBfaWR4ID0gZmRfYXJyYXlfZ2V0X21hcF9pZHgoZW52LCBpbnNuWzBdLmltbSk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWZkID0gaW5zblswXS5pbW07CiYjNDM7CQkJCWlmIChlbnYtJmd0O3NpZ25hdHVyZSkgewomIzQzOwkJCQkJdmVyYm9zZShlbnYsICYjMzQ7c2lnbmVkIHByb2dyYW0gY2Fubm90IHJlZmVyZW5jZSBhIG1hcCBieSBmZCwgb25seSB2aWEgZmRfYXJyYXkgaW5kZXhcbiYjMzQ7KTsKJiM0MzsJCQkJCXJldHVybiAtRUlOVkFMOwomIzQzOwkJCQl9CiYjNDM7CQkJCW1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBpbnNuWzBdLmltbSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCW1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBmZCk7CiAJCQlpZiAobWFwX2lkeCAmbHQ7IDApCiAJCQkJcmV0dXJuIG1hcF9pZHg7CiAJCQltYXAgPSBlbnYtJmd0O3VzZWRfbWFwc1ttYXBfaWR4XTsKQEAgLTE5NDY5LDcgJiM0MzsxOTU4Miw3IEBAIHN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZCkKICAqIHRoaXMgY2FzZSBleHBlY3QgdGhhdCBldmVyeSBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIGVpdGhlciBhIG1hcCBvcgogICogYSBCVEYuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRyYXNoLgogICovCi1zdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZCkKJiM0MztzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZCkKIHsKIAlzdHJ1Y3QgYnBmX21hcCAqbWFwOwogCXN0cnVjdCBidGYgKmJ0ZjsKQEAgLTE5NDgxLDUxICYjNDM7MTk1OTQsNjkgQEAgc3RhdGljIGludCBhZGRfZmRfZnJvbV9mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpCiAJCWVyciA9IF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTsKIAkJaWYgKGVyciAmbHQ7IDApCiAJCQlyZXR1cm4gZXJyOwomIzQzOwkJZmRfc2xvdF9zZXRfbWFwKCZhbXA7ZW52LSZndDtmZF9hcnJheVtpZHhdLCBtYXApOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7CiAJaWYgKCFJU19FUlIoYnRmKSkgewogCQlidGZfZ2V0KGJ0Zik7Ci0JCXJldHVybiBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7CiYjNDM7CQllcnIgPSBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7CiYjNDM7CQlpZiAoZXJyICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gZXJyOwomIzQzOwkJZmRfc2xvdF9zZXRfYnRmKCZhbXA7ZW52LSZndDtmZF9hcnJheVtpZHhdLCBidGYpOwomIzQzOwkJcmV0dXJuIDA7CiAJfQogCiAJdmVyYm9zZShlbnYsICYjMzQ7ZmQgJWQgaXMgbm90IHBvaW50aW5nIHRvIHZhbGlkIGJwZl9tYXAgb3IgYnRmXG4mIzM0OywgZmQpOwogCXJldHVybiBQVFJfRVJSKG1hcCk7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIpCiYjNDM7I2RlZmluZSBNQVhfRkRfQVJSQVlfQ05UIChNQVhfVVNFRF9NQVBTICYjNDM7IE1BWF9LRlVOQ19CVEZTKQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCiYjNDM7CQkJCSAgICAgICBicGZwdHJfdCBmZF9hcnJheSwgdTMyIGNudCkKIHsKLQlzaXplX3Qgc2l6ZSA9IHNpemVvZihpbnQpOwotCWludCByZXQ7Ci0JaW50IGZkOwomIzQzOwlpbnQgZmQsIHJldDsKIAl1MzIgaTsKIAotCWVudi0mZ3Q7ZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLSZndDtmZF9hcnJheSwgdWF0dHIuaXNfa2VybmVsKTsKLQotCS8qCi0JICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCAobm8gZmRfYXJyYXlfY250IGlzIGdpdmVuKSBhbmQgbmV3Ci0JICogQVBJcyBpcyB0aGF0IGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgZmRfYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUKLQkgKiBjb250aW51b3VzIGFuZCBpcyBzY2FubmVkIGZvciBtYXAgZmRzIHJpZ2h0IGF3YXkKLQkgKi8KLQlpZiAoIWF0dHItJmd0O2ZkX2FycmF5X2NudCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwotCWlmIChhdHRyLSZndDtmZF9hcnJheV9jbnQgJmd0Oz0gKFUzMl9NQVggLyBzaXplKSkgewotCQl2ZXJib3NlKGVudiwgJiMzNDtmZF9hcnJheV9jbnQgaXMgdG9vIGJpZyAoJXUpXG4mIzM0OywgYXR0ci0mZ3Q7ZmRfYXJyYXlfY250KTsKLQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CWlmIChjbnQgJmd0OyBNQVhfRkRfQVJSQVlfQ05UKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtmZF9hcnJheSBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXUsIG1heCAldSlcbiYjMzQ7LAomIzQzOwkJCWNudCwgTUFYX0ZEX0FSUkFZX0NOVCk7CiYjNDM7CQlyZXR1cm4gLUUyQklHOwogCX0KIAotCWZvciAoaSA9IDA7IGkgJmx0OyBhdHRyLSZndDtmZF9hcnJheV9jbnQ7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldCgmYW1wO2ZkLCBlbnYtJmd0O2ZkX2FycmF5LCBpICogc2l6ZSwgc2l6ZSkpCiYjNDM7CWVudi0mZ3Q7ZmRfYXJyYXkgPSBrdmNhbGxvYyhjbnQsIHNpemVvZigqZW52LSZndDtmZF9hcnJheSksIEdGUF9LRVJORUwpOwomIzQzOwlpZiAoIWVudi0mZ3Q7ZmRfYXJyYXkpCiYjNDM7CQlyZXR1cm4gLUVOT01FTTsKJiM0MzsJZW52LSZndDtmZF9hcnJheV9jbnQgPSBjbnQ7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBjbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoJmFtcDtmZCwgZmRfYXJyYXksCiYjNDM7CQkJCQkgICAgKHNpemVfdClpICogc2l6ZW9mKGZkKSwgc2l6ZW9mKGZkKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlyZXQgPSBhZGRfZmRfZnJvbV9mZF9hcnJheShlbnYsIGZkKTsKJiM0MzsJCXJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgaSwgZmQpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKJiM0MzsJCQkgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKQomIzQzO3sKJiM0MzsJYnBmcHRyX3QgZmRfYXJyYXkgPSBtYWtlX2JwZnB0cihhdHRyLSZndDtmZF9hcnJheSwgdWF0dHIuaXNfa2VybmVsKTsKIAomIzQzOwlpZiAoYnBmcHRyX2lzX251bGwoZmRfYXJyYXkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CS8qCiYjNDM7CSAqIE5ldyBBUEk6IHRoZSBjYWxsZXIgcGFzc2VzIGZkX2FycmF5X2NudCBhbmQgYSBjb250aW51b3VzIGFycmF5IHRoYXQKJiM0MzsJICogaXMgcmVzb2x2ZWQgYW5kIGJvdW5kIHVwIGZyb250LiBMZWdhY3kgQVBJIChubyBmZF9hcnJheV9jbnQpOiBrZWVwCiYjNDM7CSAqIHRoZSBjYWxsZXImIzM5O3MgYXJyYXkgYW5kIHJlc29sdmUgZW50cmllcyBsYXppbHksIG9uIGZpcnN0IHJlZmVyZW5jZS4KJiM0MzsJICovCiYjNDM7CWlmIChhdHRyLSZndDtmZF9hcnJheV9jbnQpCiYjNDM7CQlyZXR1cm4gcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzKGVudiwgZmRfYXJyYXksCiYjNDM7CQkJCQkJICAgYXR0ci0mZ3Q7ZmRfYXJyYXlfY250KTsKJiM0MzsJZW52LSZndDtmZF9hcnJheV9yYXcgPSBmZF9hcnJheTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk3NDAsNiAmIzQzOzE5ODcxLDEzOSBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLAogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKQomIzQzO3sKJiM0MzsJc3dpdGNoIChrZXlyaW5nX2lkKSB7CiYjNDM7CWNhc2UgMDoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjsKJiM0MzsJY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkc6CiYjNDM7CQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTsKJiM0MzsJY2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBWZXJpZnkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb2YgYSBsb2FkZWQgcHJvZ3JhbS4gQ2FsbGVkIGZyb20gYnBmX2NoZWNrKCkKJiM0MzsgKiBvbmNlIHRoZSBwcm9ncmFtJiMzOTtzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzbwomIzQzOyAqIHRoZSBleGFjdCBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZSBvbmVzIHRoZSBwcm9ncmFtIGJpbmRzLgomIzQzOyAqCiYjNDM7ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mCiYjNDM7ICogZWFjaCBtYXAsIGluIEBtYXBzIG9yZGVyOiBpbnNucyB8fCBtYXBfMCB8fCBtYXBfMSB8fCBbLi4uXS4gT24gc3VjY2VzcyB0aGUKJiM0MzsgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctJmd0O2F1eC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKJiM0MzsJCQkJICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpCiYjNDM7ewomIzQzOwlicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci0mZ3Q7c2lnbmF0dXJlLCBpc19rZXJuZWwpOwomIzQzOwlzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtJmd0O3Byb2c7CiYjNDM7CXN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi0mZ3Q7dXNlZF9tYXBzOwomIzQzOwlzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDsKJiM0MzsJdm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7CiYjNDM7CXUzMiBtYXBfY250ID0gZW52LSZndDt1c2VkX21hcF9jbnQ7CiYjNDM7CXUzMiBpLCBvZmYsIGluc25zX3N6OwomIzQzOwl1NjQgZGF0YV9zejsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIERvbiYjMzk7dCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuCiYjNDM7CSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgomIzQzOwkgKi8KJiM0MzsJaWYgKGF0dHItJmd0O3NpZ25hdHVyZV9zaXplICZndDsgS01BTExPQ19NQVhfQ0FDSEVfU0laRSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci0mZ3Q7a2V5cmluZ19pZCkgPT0gMCkKJiM0MzsJCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKJiM0MzsJZWxzZQomIzQzOwkJa2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLSZndDtrZXlyaW5nX2lkLCAwKTsKJiM0MzsJaWYgKCFrZXkpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O2Nhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcbiYjMzQ7LAomIzQzOwkJCWF0dHItJmd0O2tleXJpbmdfaWQpOwomIzQzOwkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItJmd0O3NpZ25hdHVyZV9zaXplKTsKJiM0MzsJaWYgKElTX0VSUihzaWcpKSB7CiYjNDM7CQlicGZfa2V5X3B1dChrZXkpOwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoc2lnKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpbnNuc19zeiA9IHByb2ctJmd0O2xlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwomIzQzOwlkYXRhX3N6ID0gaW5zbnNfc3o7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBtYXBfY250OyBpJiM0MzsmIzQzOykgewomIzQzOwkJc3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07CiYjNDM7CiYjNDM7CQlpZiAobWFwLSZndDttYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHwKJiM0MzsJCSAgICAhbWFwLSZndDtvcHMtJmd0O21hcF9kaXJlY3RfdmFsdWVfYWRkcikgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBhbiBhcnJheVxuJiMzNDssCiYjNDM7CQkJCW1hcC0mZ3Q7bmFtZSk7CiYjNDM7CQkJZXJyID0gLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghUkVBRF9PTkNFKG1hcC0mZ3Q7ZnJvemVuKSkgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBmcm96ZW5cbiYjMzQ7LAomIzQzOwkJCQltYXAtJmd0O25hbWUpOwomIzQzOwkJCWVyciA9IC1FUEVSTTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsJCWlmICghbWFwLSZndDtleGNsX3Byb2dfc2hhKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGV4Y2x1c2l2ZVxuJiMzNDssCiYjNDM7CQkJCW1hcC0mZ3Q7bmFtZSk7CiYjNDM7CQkJZXJyID0gLUVQRVJNOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJZGF0YV9zeiAmIzQzOz0gbWFwLSZndDt2YWx1ZV9zaXplOwomIzQzOwl9CiYjNDM7CWlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHsKJiM0MzsJCXZlcmJvc2UoZW52LCAmIzM0O3NpZ25lZCBwYXlsb2FkIHRvbyBsYXJnZTogJWxsdSBieXRlc1xuJiMzNDssIGRhdGFfc3opOwomIzQzOwkJZXJyID0gLUUyQklHOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZGF0YSA9IGt2bWFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKJiM0MzsJaWYgKCFkYXRhKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJbWVtY3B5KGRhdGEsIHByb2ctJmd0O2luc25zaSwgaW5zbnNfc3opOwomIzQzOwlvZmYgPSBpbnNuc19zejsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTsKJiM0MzsJCXU2NCBhZGRyOwomIzQzOwomIzQzOwkJZXJyID0gbWFwLSZndDtvcHMtJmd0O21hcF9kaXJlY3RfdmFsdWVfYWRkcihtYXAsICZhbXA7YWRkciwgMCk7CiYjNDM7CQlpZiAoZXJyKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7ZmFpbGVkIHRvIHJlYWQgc2lnbmVkIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTs6ICVkXG4mIzM0OywKJiM0MzsJCQkJbWFwLSZndDtuYW1lLCBlcnIpOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwkJbWVtY3B5KGRhdGEgJiM0Mzsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsCiYjNDM7CQkgICAgICAgbWFwLSZndDt2YWx1ZV9zaXplKTsKJiM0MzsJCW9mZiAmIzQzOz0gbWFwLSZndDt2YWx1ZV9zaXplOwomIzQzOwl9CiYjNDM7CiYjNDM7CWJwZl9keW5wdHJfaW5pdCgmYW1wO2RhdGFfcHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIGRhdGFfc3opOwomIzQzOwlicGZfZHlucHRyX2luaXQoJmFtcDtzaWdfcHRyLCBzaWcsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwKJiM0MzsJCQlhdHRyLSZndDtzaWduYXR1cmVfc2l6ZSk7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKSZhbXA7ZGF0YV9wdHIsCiYjNDM7CQkJCQkgKHN0cnVjdCBicGZfZHlucHRyICopJmFtcDtzaWdfcHRyLCBrZXkpOwomIzQzOwlpZiAoZXJyKSB7CiYjNDM7CQl2ZXJib3NlKGVudiwgJiMzNDtzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJWRcbiYjMzQ7LCBlcnIpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJdmVyYm9zZShlbnYsICYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwYXNzZWRcbiYjMzQ7KTsKJiM0MzsJCXByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTsKJiM0MzsJCXByb2ctJmd0O2F1eC0mZ3Q7c2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItJmd0O2tleXJpbmdfaWQpOwomIzQzOwkJcHJvZy0mZ3Q7YXV4LSZndDtzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7CiYjNDM7CX0KJiM0MztvdXQ6CiYjNDM7CWt2ZnJlZShkYXRhKTsKJiM0MzsJYnBmX2tleV9wdXQoa2V5KTsKJiM0MzsJa3ZmcmVlKHNpZyk7CiYjNDM7CXJldHVybiBlcnI7CiYjNDM7fQomIzQzOwogaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJICAgICAgc3RydWN0IGJwZl9sb2dfYXR0ciAqYXR0cl9sb2cpCiB7CkBAIC0xOTc4Miw2ICYjNDM7MjAwNDYsNyBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwKIAllbnYtJmd0O2J5cGFzc19zcGVjX3YxID0gYnBmX2J5cGFzc19zcGVjX3YxKGVudi0mZ3Q7cHJvZy0mZ3Q7YXV4LSZndDt0b2tlbik7CiAJZW52LSZndDtieXBhc3Nfc3BlY192NCA9IGJwZl9ieXBhc3Nfc3BlY192NChlbnYtJmd0O3Byb2ctJmd0O2F1eC0mZ3Q7dG9rZW4pOwogCWVudi0mZ3Q7YnBmX2NhcGFibGUgPSBpc19wcml2ID0gYnBmX3Rva2VuX2NhcGFibGUoZW52LSZndDtwcm9nLSZndDthdXgtJmd0O3Rva2VuLCBDQVBfQlBGKTsKJiM0MzsJZW52LSZndDtzaWduYXR1cmUgPSBhdHRyLSZndDtzaWduYXR1cmU7CiAKIAlicGZfZ2V0X2J0Zl92bWxpbnV4KCk7CiAKQEAgLTE5Nzk1LDExICYjNDM7MjAwNjAsMjcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJcmV0ID0gYnBmX3Zsb2dfaW5pdCgmYW1wO2Vudi0mZ3Q7bG9nLCBhdHRyX2xvZy0mZ3Q7bGV2ZWwsIGF0dHJfbG9nLSZndDt1YnVmLCBhdHRyX2xvZy0mZ3Q7c2l6ZSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfdW5sb2NrOwomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXJldCA9IGJwZl9wcm9nX2NhbGNfdGFnKGVudi0mZ3Q7cHJvZyk7CiYjNDM7CQlpZiAocmV0ICZsdDsgMCkKJiM0MzsJCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKJiM0MzsJfQogCiAJcmV0ID0gcHJvY2Vzc19mZF9hcnJheShlbnYsIGF0dHIsIHVhdHRyKTsKIAlpZiAocmV0KQogCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKIAomIzQzOwlpZiAoZW52LSZndDtzaWduYXR1cmUpIHsKJiM0MzsJCXJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpOwomIzQzOwkJaWYgKHJldCkKJiM0MzsJCQlnb3RvIHNraXBfZnVsbF9jaGVjazsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBzZWN1cml0eV9icGZfcHJvZ19sb2FkKGVudi0mZ3Q7cHJvZywgYXR0ciwgZW52LSZndDtwcm9nLSZndDthdXgtJmd0O3Rva2VuLAomIzQzOwkJCQkgICAgIHVhdHRyLmlzX2tlcm5lbCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIHNraXBfZnVsbF9jaGVjazsKJiM0MzsKIAltYXJrX3ZlcmlmaWVyX3N0YXRlX2NsZWFuKGVudik7CiAKIAlpZiAoSVNfRVJSKGJ0Zl92bWxpbnV4KSkgewpAQCAtMjAwMjcsNiAmIzQzOzIwMzA4LDcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsCiAJYnBmX2NsZWFyX2luc25fYXV4X2RhdGEoZW52LCAwLCBlbnYtJmd0O3Byb2ctJmd0O2xlbik7CiAJdmZyZWUoZW52LSZndDtpbnNuX2F1eF9kYXRhKTsKIGVycl9mcmVlX2VudjoKJiM0MzsJa3ZmcmVlKGVudi0mZ3Q7ZmRfYXJyYXkpOwogCWJwZl9zdGFja19saXZlbmVzc19mcmVlKGVudik7CiAJa3ZmcmVlKGVudi0mZ3Q7Y2ZnLmluc25fcG9zdG9yZGVyKTsKIAlrdmZyZWUoZW52LSZndDtzY2NfaW5mbyk7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jCmluZGV4IDZhZTcyNjJlYmUwYzFkLi5hMDFkMDZkMjJkMWEzYiAxMDA2NDQKLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMKQEAgLTc5Myw2ICYjNDM7NzkzLDggQEAgc3RhdGljIGludCBnZW5fdHJhY2Uoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgY29uc3QgY2hhciAqb2JqX25hbWUsIGNvbnN0IGNoYXIgKmgKIAlpZiAoc2lnbl9wcm9ncykgewogCQlzb3B0cy5pbnNucyA9IG9wdHMuaW5zbnM7CiAJCXNvcHRzLmluc25zX3N6ID0gb3B0cy5pbnNuc19zejsKJiM0MzsJCXNvcHRzLmRhdGEgPSBvcHRzLmRhdGE7CiYjNDM7CQlzb3B0cy5kYXRhX3N6ID0gb3B0cy5kYXRhX3N6OwogCQlzb3B0cy5leGNsX3Byb2dfaGFzaCA9IHByb2dfc2hhOwogCQlzb3B0cy5leGNsX3Byb2dfaGFzaF9zeiA9IHNpemVvZihwcm9nX3NoYSk7CiAJCXNvcHRzLnNpZ25hdHVyZSA9IHNpZ19idWY7CmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmMKaW5kZXggZjliNzQyZjRiYjEwNGIuLjdjYzk5MWM2OWRjMmM4IDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jCkBAIC0xMzUsOSAmIzQzOzEzNSwyMSBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cykKIAlDTVNfQ29udGVudEluZm8gKmNtcyA9IE5VTEw7CiAJbG9uZyBhY3R1YWxfc2lnX2xlbiA9IDA7CiAJWDUwOSAqeDUwOSA9IE5VTEw7CiYjNDM7CXZvaWQgKmRhdGEgPSBOVUxMOwomIzQzOwlzaXplX3QgZGF0YV9zejsKIAlpbnQgZXJyID0gMDsKIAotCWJkX2luID0gQklPX25ld19tZW1fYnVmKG9wdHMtJmd0O2luc25zLCBvcHRzLSZndDtpbnNuc19zeik7CiYjNDM7CWRhdGFfc3ogPSAoc2l6ZV90KW9wdHMtJmd0O2luc25zX3N6ICYjNDM7IG9wdHMtJmd0O2RhdGFfc3o7CiYjNDM7CWRhdGEgPSBtYWxsb2MoZGF0YV9zeik7CiYjNDM7CWlmICghZGF0YSkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwltZW1jcHkoZGF0YSwgb3B0cy0mZ3Q7aW5zbnMsIG9wdHMtJmd0O2luc25zX3N6KTsKJiM0MzsJaWYgKG9wdHMtJmd0O2RhdGFfc3opCiYjNDM7CQltZW1jcHkoKGNoYXIgKilkYXRhICYjNDM7IG9wdHMtJmd0O2luc25zX3N6LCBvcHRzLSZndDtkYXRhLCBvcHRzLSZndDtkYXRhX3N6KTsKJiM0MzsKJiM0MzsJYmRfaW4gPSBCSU9fbmV3X21lbV9idWYoZGF0YSwgZGF0YV9zeik7CiAJaWYgKCFiZF9pbikgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFudXA7CkBAIC0xNzgsNyAmIzQzOzE5MCw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCUVWUF9EaWdlc3Qob3B0cy0mZ3Q7aW5zbnMsIG9wdHMtJmd0O2luc25zX3N6LCBvcHRzLSZndDtleGNsX3Byb2dfaGFzaCwKIAkJICAgJmFtcDtvcHRzLSZndDtleGNsX3Byb2dfaGFzaF9zeiwgRVZQX3NoYTI1NigpLCBOVUxMKTsKIAotCQliZF9vdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKJiM0MzsJYmRfb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7CiAJaWYgKCFiZF9vdXQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwpAQCAtMjEyLDYgJiM0MzsyMjQsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cykKIAlYNTA5X2ZyZWUoeDUwOSk7CiAJRVZQX1BLRVlfZnJlZShwcml2YXRlX2tleSk7CiAJQklPX2ZyZWUoYmRfaW4pOwomIzQzOwlmcmVlKGRhdGEpOwogCURJU1BMQVlfT1NTTF9FUlIoZXJyICZsdDsgMCk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmgKaW5kZXggNDlhZjQyNjBiOGU2YjcuLjA0MjU2OTE4Nzc1MjE3IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaApAQCAtNTEsNyAmIzQzOzUxLDYgQEAgc3RydWN0IGJwZl9nZW4gewogCV9fdTMyIG5yX2tzeW1zOwogCWludCBmZF9hcnJheTsKIAlpbnQgbnJfZmRfYXJyYXk7Ci0JaW50IGhhc2hfaW5zbl9vZmZzZXRbU0hBMjU2X0RXT1JEX1NJWkVdOwogfTsKIAogdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuYwppbmRleCBjN2YyZDJhYzdiYjM1Zi4uNmUzZGQ1MjQyNzYxODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jCkBAIC0xMTEsNyAmIzQzOzExMSw2IEBAIHN0YXRpYyB2b2lkIGVtaXQyKHN0cnVjdCBicGZfZ2VuICpnZW4sIHN0cnVjdCBicGZfaW5zbiBpbnNuMSwgc3RydWN0IGJwZl9pbnNuIGluCiAKIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSk7CiBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZik7Ci1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTsKIAogdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpCiB7CkBAIC0xNTQsOCAmIzQzOzE1Myw2IEBAIHZvaWQgYnBmX2dlbl9faW5pdChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbG9nX2xldmVsLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzCiAJLyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovCiAJZW1pdChnZW4sIEJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzcpKTsKIAllbWl0KGdlbiwgQlBGX0VYSVRfSU5TTigpKTsKLQlpZiAoT1BUU19HRVQoZ2VuLSZndDtvcHRzLCBnZW5faGFzaCwgZmFsc2UpKQotCQllbWl0X3NpZ25hdHVyZV9tYXRjaChnZW4pOwogfQogCiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpCkBAIC0zNzcsOCAmIzQzOzM3NCw2IEBAIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKQogCV9fZW1pdF9zeXNfY2xvc2UoZ2VuKTsKIH0KIAotc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbik7Ci0KIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcykKIHsKIAlpbnQgaTsKQEAgLTQwOCw5ICYjNDM7NDAzLDYgQEAgaW50IGJwZl9nZW5fX2ZpbmlzaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKQogCWlmICghZ2VuLSZndDtlcnJvcikgewogCQlzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzICpvcHRzID0gZ2VuLSZndDtvcHRzOwogCi0JCWlmIChPUFRTX0dFVChvcHRzLCBnZW5faGFzaCwgZmFsc2UpKQotCQkJY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoZ2VuKTsKLQogCQlvcHRzLSZndDtpbnNucyA9IGdlbi0mZ3Q7aW5zbl9zdGFydDsKIAkJb3B0cy0mZ3Q7aW5zbnNfc3ogPSBnZW4tJmd0O2luc25fY3VyIC0gZ2VuLSZndDtpbnNuX3N0YXJ0OwogCQlvcHRzLSZndDtkYXRhID0gZ2VuLSZndDtkYXRhX3N0YXJ0OwpAQCAtNDYwLDIyICYjNDM7NDUyLDYgQEAgdm9pZCBicGZfZ2VuX19mcmVlKHN0cnVjdCBicGZfZ2VuICpnZW4pCiAJX3ZhbDsJCQkJCQkJXAogfSkKIAotc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbikKLXsKLQlfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdOwotCV9fdTY0IHNoYV9kdzsKLQlpbnQgaTsKLQotCWxpYmJwZl9zaGEyNTYoZ2VuLSZndDtkYXRhX3N0YXJ0LCBnZW4tJmd0O2RhdGFfY3VyIC0gZ2VuLSZndDtkYXRhX3N0YXJ0LCAoX191OCAqKXNoYSk7Ci0JZm9yIChpID0gMDsgaSAmbHQ7IFNIQTI1Nl9EV09SRF9TSVpFOyBpJiM0MzsmIzQzOykgewotCQlzdHJ1Y3QgYnBmX2luc24gKmluc24gPQotCQkJKHN0cnVjdCBicGZfaW5zbiAqKShnZW4tJmd0O2luc25fc3RhcnQgJiM0MzsgZ2VuLSZndDtoYXNoX2luc25fb2Zmc2V0W2ldKTsKLQkJc2hhX2R3ID0gdGd0X2VuZGlhbihzaGFbaV0pOwotCQlpbnNuWzBdLmltbSA9IChfX3UzMilzaGFfZHc7Ci0JCWluc25bMV0uaW1tID0gc2hhX2R3ICZndDsmZ3Q7IDMyOwotCX0KLX0KLQogdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsCiAJCSAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpCiB7CkBAIC01NTcsOCAmIzQzOzUzMyw5IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLAogCSAqIENvbmRpdGlvbmFsbHkgdXBkYXRlIG1heF9lbnRyaWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyCiAJICogY3R4LiBUaGlzIHNpemVzIHRoZSBtYXAgYXQgcnVudGltZSwgYnV0IGZvciBhIHNpZ25lZCBsb2FkZXIKIAkgKiAoZ2VuX2hhc2gpIGl0IHdvdWxkIGxldCBhbiB1bnRydXN0ZWQgaG9zdCByZS1kaW1lbnNpb24gdGhlCi0JICogcHJvZ3JhbSYjMzk7cyBtYXBzIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKCksIG91dHNpZGUgd2hhdCB0aGUKLQkgKiBzaWduYXR1cmUgYXR0ZXN0cyB0by4gS2VlcCB0aGUgc2lnbmVyLXByb3ZpZGVkIG1heF9lbnRyaWVzCiYjNDM7CSAqIHByb2dyYW0mIzM5O3MgbWFwcywgb3V0c2lkZSB3aGF0IHRoZSBzaWduYXR1cmUgYXR0ZXN0cyB0bzogdGhlCiYjNDM7CSAqIG1ldGFkYXRhIGJsb2IgaXMgY292ZXJlZCBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUgYW5kIHZlcmlmaWVkCiYjNDM7CSAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXMKIAkgKiBiYWtlZCBpbnRvIHRoZSBibG9iIGluIHRoYXQgY2FzZS4KIAkgKi8KIAlpZiAobWFwX2lkeCAmZ3Q7PSAwICZhbXA7JmFtcDsgIU9QVFNfR0VUKGdlbi0mZ3Q7b3B0cywgZ2VuX2hhc2gsIGZhbHNlKSkKQEAgLTU5Niw0NSAmIzQzOzU3Myw2IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLAogCQllbWl0X3N5c19jbG9zZV9zdGFjayhnZW4sIHN0YWNrX29mZihpbm5lcl9tYXBfZmQpKTsKIH0KIAotc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbikKLXsKLQlfX3M2NCBvZmY7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFJlamVjdCBpZiB0aGUgbWV0YWRhdGEgbWFwIGlzIG5vdCBleGNsdXNpdmUuIFdpdGhvdXQgZXhjbHVzaXZpdHkKLQkgKiB0aGUgY2FjaGVkIG1hcC0mZ3Q7c2hhW10gdmVyaWZpZWQgYWJvdmUgY2FuIGJlIHN0YWxlOiBhbm90aGVyIEJQRgotCSAqIHByb2dyYW0gd2l0aCBtYXAgYWNjZXNzIGNvdWxkIGhhdmUgbXV0YXRlZCB0aGUgY29udGVudHMgYmV0d2VlbgotCSAqIEJQRl9PQkpfR0VUX0lORk9fQllfRkQgYW5kIGxvYWRlciBleGVjdXRpb24uCi0JICovCi0JZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsCi0JCQkJCSAwLCAwLCAwLCAwKSk7Ci0JZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgU0hBMjU2X0RJR0VTVF9MRU5HVEgpKTsKLQlvZmYgPSAtKGdlbi0mZ3Q7aW5zbl9jdXIgLSBnZW4tJmd0O2luc25fc3RhcnQgLSBnZW4tJmd0O2NsZWFudXBfbGFiZWwpIC8gOCAtIDI7Ci0JaWYgKGlzX3NpbW0xNihvZmYpKSB7Ci0JCWVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpOwotCQllbWl0KGdlbiwgQlBGX0pNUF9JTU0oQlBGX0pORSwgQlBGX1JFR18yLCAxLCBvZmYpKTsKLQl9IGVsc2UgewotCQlnZW4tJmd0O2Vycm9yID0gLUVSQU5HRTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpICZsdDsgU0hBMjU2X0RXT1JEX1NJWkU7IGkmIzQzOyYjNDM7KSB7Ci0JCWVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLAotCQkJCQkJIDAsIDAsIDAsIDApKTsKLQkJZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIGkgKiBzaXplb2YoX191NjQpKSk7Ci0JCWdlbi0mZ3Q7aGFzaF9pbnNuX29mZnNldFtpXSA9IGdlbi0mZ3Q7aW5zbl9jdXIgLSBnZW4tJmd0O2luc25fc3RhcnQ7Ci0JCWVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMywgMCwgMCwgMCwgMCwgMCkpOwotCi0JCW9mZiA9IC0oZ2VuLSZndDtpbnNuX2N1ciAtIGdlbi0mZ3Q7aW5zbl9zdGFydCAtIGdlbi0mZ3Q7Y2xlYW51cF9sYWJlbCkgLyA4IC0gMjsKLQkJaWYgKGlzX3NpbW0xNihvZmYpKSB7Ci0JCQllbWl0KGdlbiwgQlBGX01PVjY0X0lNTShCUEZfUkVHXzcsIC1FSU5WQUwpKTsKLQkJCWVtaXQoZ2VuLCBCUEZfSk1QX1JFRyhCUEZfSk5FLCBCUEZfUkVHXzIsIEJQRl9SRUdfMywgb2ZmKSk7Ci0JCX0gZWxzZSB7Ci0JCQlnZW4tJmd0O2Vycm9yID0gLUVSQU5HRTsKLQkJfQotCX0KLX0KLQogdm9pZCBicGZfZ2VuX19yZWNvcmRfYXR0YWNoX3RhcmdldChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCBjaGFyICphdHRhY2hfbmFtZSwKIAkJCQkgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKQogewpAQCAtMTIxMSwxMCAmIzQzOzExNDksMTAgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSwKIAkgKiB9CiAJICoKIAkgKiBUaGUgcnVudGltZSBpbml0aWFsX3ZhbHVlIGNvbWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyCi0JICogY3R4IGFuZCB3b3VsZCBvdmVyd3JpdGUgdGhlIGJsb2IgdmFsdWUgYWZ0ZXIgZW1pdF9zaWduYXR1cmVfbWF0Y2goKQotCSAqIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCBtYXAtJmd0O3NoYVtdLiBGb3IgYSBzaWduZWQgbG9hZGVyIChnZW5faGFzaCkKLQkgKiB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAgdGhlIG92ZXJyaWRlCi0JICogYW5kIGxlYXZlIHRoZSBoYXNoZWQgdmFsdWUgaW4gcGxhY2UuCiYjNDM7CSAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIHRoYXQgdGhlIHByb2dyYW0gc2lnbmF0dXJlCiYjNDM7CSAqIGNvdmVycyBhbmQgdGhlIGtlcm5lbCB2ZXJpZmllcyBhdCBsb2FkIHRpbWUuIEZvciBhIHNpZ25lZCBsb2FkZXIKJiM0MzsJICogKGdlbl9oYXNoKSB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAKJiM0MzsJICogdGhlIG92ZXJyaWRlIGFuZCBsZWF2ZSB0aGUgc2lnbmVkIHZhbHVlIGluIHBsYWNlLgogCSAqLwogCWlmICghT1BUU19HRVQoZ2VuLSZndDtvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7CiAJCWVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LApkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKaW5kZXggMDRjZDMwM2ZiNWE4NzkuLmQ1YjdkYjcwM2IzZmU5IDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2xpYi9icGYvbGliYnBmX2ludGVybmFsLmgKQEAgLTc2OCw3ICYjNDM7NzY4LDYgQEAgaW50IGVsZl9yZXNvbHZlX3BhdHRlcm5fb2Zmc2V0cyhjb25zdCBjaGFyICpiaW5hcnlfcGF0aCwgY29uc3QgY2hhciAqcGF0dGVybiwKIGludCBwcm9iZV9mZChpbnQgZmQpOwogCiAjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyCi0jZGVmaW5lIFNIQTI1Nl9EV09SRF9TSVpFIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIC8gc2l6ZW9mKF9fdTY0KQogCiB2b2lkIGxpYmJwZl9zaGEyNTYoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgX191OCBvdXRbU0hBMjU2X0RJR0VTVF9MRU5HVEhdKTsKIGludCBwcm9iZV9zeXNfYnBmX2V4dCh2b2lkKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmgKaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjg1NTVhYjhhZjU1NGMzIDEwMDY0NAotLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaApAQCAtMzIwLDI1ICYjNDM7MzIwLDYgQEAgc3RhdGljIGlubGluZSBpbnQgc2tlbF9saW5rX2NyZWF0ZShpbnQgcHJvZ19mZCwgaW50IHRhcmdldF9mZCwKIAlyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9MSU5LX0NSRUFURSwgJmFtcDthdHRyLCBhdHRyX3N6KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2tlbF9vYmpfZ2V0X2luZm9fYnlfZmQoaW50IGZkKQotewotCWNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGluZm8pOwotCV9fdTggc2hhW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKLQlzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm87Ci0JX191MzIgaW5mb19sZW4gPSBzaXplb2YoaW5mbyk7Ci0JdW5pb24gYnBmX2F0dHIgYXR0cjsKLQotCW1lbXNldCgmYW1wO2luZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0JaW5mby5oYXNoID0gKGxvbmcpICZhbXA7c2hhOwotCWluZm8uaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEg7Ci0KLQltZW1zZXQoJmFtcDthdHRyLCAwLCBhdHRyX3N6KTsKLQlhdHRyLmluZm8uYnBmX2ZkID0gZmQ7Ci0JYXR0ci5pbmZvLmluZm8gPSAobG9uZykgJmFtcDtpbmZvOwotCWF0dHIuaW5mby5pbmZvX2xlbiA9IGluZm9fbGVuOwotCXJldHVybiBza2VsX3N5c19icGYoQlBGX09CSl9HRVRfSU5GT19CWV9GRCwgJmFtcDthdHRyLCBhdHRyX3N6KTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgc2tlbF9tYXBfZnJlZXplKGludCBmZCkKIHsKIAljb25zdCBzaXplX3QgYXR0cl9zeiA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBtYXBfZmQpOwpAQCAtMzg0LDEyICYjNDM7MzY1LDYgQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCQlzZXRfZXJyOwogCQlnb3RvIG91dDsKIAl9Ci0JZXJyID0gc2tlbF9vYmpfZ2V0X2luZm9fYnlfZmQobWFwX2ZkKTsKLQlpZiAoZXJyICZsdDsgMCkgewotCQlvcHRzLSZndDtlcnJzdHIgPSAmIzM0O2ZhaWxlZCB0byBmZXRjaCBvYmogaW5mbyYjMzQ7OwotCQlzZXRfZXJyOwotCQlnb3RvIG91dDsKLQl9CiAjZW5kaWYKIAogCW1lbXNldCgmYW1wO2F0dHIsIDAsIHByb2dfbG9hZF9hdHRyX3N6KTsKQEAgLTQwMCw2ICYjNDM7Mzc1LDggQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogI2lmbmRlZiBfX0tFUk5FTF9fCiAJYXR0ci5zaWduYXR1cmUgPSAobG9uZykgb3B0cy0mZ3Q7c2lnbmF0dXJlOwogCWF0dHIuc2lnbmF0dXJlX3NpemUgPSBvcHRzLSZndDtzaWduYXR1cmVfc3o7CiYjNDM7CWlmIChvcHRzLSZndDtzaWduYXR1cmUpCiYjNDM7CQlhdHRyLmZkX2FycmF5X2NudCA9IDE7CiAjZWxzZQogCWlmIChvcHRzLSZndDtzaWduYXR1cmUgfHwgb3B0cy0mZ3Q7c2lnbmF0dXJlX3N6KQogCQlwcl93YXJuKCYjMzQ7c2lnbmF0dXJlcyBhcmUgbm90IHN1cHBvcnRlZCBmcm9tIGJwZl9wcmVsb2FkXG4mIzM0Oyk7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMKaW5kZXggNWZjNDE3ZTMxZmM2MTUuLmIzYWMzZDliMGUzMTZkIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jCkBAIC0xMSw2ICYjNDM7MTEsOCBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L2tleWN0bC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwogCiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9idGYuaCZndDsKJiM0MzsKICNpbmNsdWRlICYjMzQ7YnBmL2xpYmJwZl9pbnRlcm5hbC5oJiMzNDsgLyogZm9yIGxpYmJwZl9zaGEyNTYoKSAqLwogI2luY2x1ZGUgJiMzNDticGYvc2tlbF9pbnRlcm5hbC5oJiMzNDsJIC8qIGZvciBsb2FkZXIgY3R4IGxheW91dCAoYnBmX2xvYWRlcl9jdHggZXRjKSAqLwogCkBAIC0xOSw4ICYjNDM7MjEsNiBAQAogI2luY2x1ZGUgJiMzNDt0ZXN0X3NpZ25lZF9sb2FkZXJfZGF0YS5za2VsLmgmIzM0OwogI2luY2x1ZGUgJiMzNDt0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtLnNrZWwuaCYjMzQ7CiAKLSNkZWZpbmUgU0lHX01BVENIX0lOU05TIDMzIC8qIGV4Y2wgKDUpICYjNDM7IDQgKiBzaGEtZHdvcmQgKDcpICovCi0KIGVudW0gewogCUJQRl9TSUdfVU5TSUdORUQgPSAwLAogCUJQRl9TSUdfVkVSSUZJRUQsCkBAIC0zNSw3ICYjNDM7MzUsOCBAQCBlbnVtIHsKIH07CiAKIHN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLAotCQkgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQpCiYjNDM7CQkgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsCiYjNDM7CQkgICAgICAgX191MzIgZmRfYXJyYXlfY250KQogewogCXVuaW9uIGJwZl9hdHRyIGF0dHI7CiAJaW50IGZkOwpAQCAtNTIsNiAmIzQzOzUzLDcgQEAgc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsCiAJCWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiAJCWF0dHIua2V5cmluZ19pZCA9IGtleXJpbmdfaWQ7CiAJfQomIzQzOwlhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDsKIAltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7LCBzaXplb2YoJiMzNDtfX2xvYWRlci5wcm9nJiMzNDspKTsKIAlmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsICZhbXA7YXR0ciwKIAkJICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwpAQCAtNjIsMTQgJiM0Mzs2NCwxMiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeiwKIAkJCSAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osCi0JCQkgIGJvb2wgZ2V0X2hhc2gsIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBib29sICpsb2FkZXJfcmFuKQomIzQzOwkJCSAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGJvb2wgKmxvYWRlcl9yYW4pCiB7CiAJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsCiAJCSAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLAogCQkgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBleGNsX3N6KTsKLQlfX3U4IGhidWZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwotCXN0cnVjdCBicGZfbWFwX2luZm8gaW5mbzsKLQlfX3UzMiBpbGVuID0gc2l6ZW9mKGluZm8pLCBrZXkgPSAwOwomIzQzOwlfX3UzMiBrZXkgPSAwOwogCXVuaW9uIGJwZl9hdHRyIGF0dHI7CiAJaW50IG1hcF9mZCwgcHJvZ19mZCwgcmV0OwogCkBAIC04NywxNSAmIzQzOzg3LDYgQEAgc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osCiAJCXJldCA9IC1lcnJubzsKIAkJZ290byBvdXRfbWFwOwogCX0KLQlpZiAoZ2V0X2hhc2gpIHsKLQkJbWVtc2V0KCZhbXA7aW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQkJaW5mby5oYXNoID0gcHRyX3RvX3U2NChoYnVmKTsKLQkJaW5mby5oYXNoX3NpemUgPSBzaXplb2YoaGJ1Zik7Ci0JCWlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgJmFtcDtpbmZvLCAmYW1wO2lsZW4pKSB7Ci0JCQlyZXQgPSAtZXJybm87Ci0JCQlnb3RvIG91dF9tYXA7Ci0JCX0KLQl9CiAKIAltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwogCWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwpAQCAtMTA4LDYgJiM0Mzs5OSw3IEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LAogCQlhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTsKIAkJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejsKIAkJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwomIzQzOwkJYXR0ci5mZF9hcnJheV9jbnQgPSAxOwogCX0KIAltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7LCBzaXplb2YoJiMzNDtfX2xvYWRlci5wcm9nJiMzNDspKTsKIAlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLApAQCAtMjM2LDc5ICYjNDM7MjI4LDYgQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX3NpZ19tYXRjaF9zaGFwZShjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluLCBpbnQgbikKLXsKLQlpbnQgYSA9IC0xLCBjbGVhbnVwID0gLTEsIGksIGJhc2UsIHQsIGJyWzVdLCBuYiA9IDA7Ci0KLQkvKiBCUEZfUFNFVURPX01BUF9JRFggKHRoZSBzdHJ1Y3QgYnBmX21hcCAqIGZvcm0pIGlzIHVzZWQgb25seSBoZXJlLiAqLwotCWZvciAoaSA9IDA7IGkgJiM0MzsgMSAmbHQ7IG47IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChpbltpXS5jb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSAmYW1wOyZhbXA7Ci0JCSAgICBpbltpXS5zcmNfcmVnID09IEJQRl9QU0VVRE9fTUFQX0lEWCkgewotCQkJYSA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIUFTU0VSVF9HRShhLCAwLCAmIzM0O2VtaXRfc2lnbmF0dXJlX21hdGNoIHByZXNlbnQmIzM0OykpCi0JCXJldHVybjsKLQlpZiAoIUFTU0VSVF9MRShhICYjNDM7IFNJR19NQVRDSF9JTlNOUywgbiwgJiMzNDtibG9jayBmaXRzIGluIHByb2dyYW0mIzM0OykpCi0JCXJldHVybjsKLQotCS8qIGV4Y2wgY2hlY2s6IHIyID0gKih1MzIgKikobWFwICYjNDM7IDMyKTsgaWYgcjIgIT0gMSBnb3RvIGNsZWFudXAgKi8KLQlBU1NFUlRfRVEoaW5bYSAmIzQzOyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVyksICYjMzQ7ZXhjbCBsb2FkIHdpZHRoJiMzNDspOwotCUFTU0VSVF9FUShpblthICYjNDM7IDJdLm9mZiwgU0hBMjU2X0RJR0VTVF9MRU5HVEgsICYjMzQ7ZXhjbCBmaWVsZCBvZmZzZXQmIzM0Oyk7Ci0JQVNTRVJUX0VRKGluW2EgJiM0MzsgNF0uY29kZSwgKEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0spLCAmIzM0O2V4Y2wgYnJhbmNoIG9wJiMzNDspOwotCUFTU0VSVF9FUShpblthICYjNDM7IDRdLmltbSwgMSwgJiMzNDtleGNsIGNvbXBhcmVkIHRvIDEmIzM0Oyk7Ci0JYnJbbmImIzQzOyYjNDM7XSA9IGEgJiM0MzsgNDsKLQotCS8qIDQgc2hhLWR3b3JkIGNoZWNrczogcjIgPSAqKHU2NCAqKShtYXAgJiM0MzsgaSo4KTsgaWYgcjIgIT0gcjMgZ290byBjbGVhbnVwICovCi0JZm9yIChpID0gMDsgaSAmbHQ7IDQ7IGkmIzQzOyYjNDM7KSB7Ci0JCWJhc2UgPSBhICYjNDM7IDUgJiM0MzsgaSAqIDc7Ci0JCUFTU0VSVF9FUShpbltiYXNlICYjNDM7IDJdLmNvZGUsIChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVyksICYjMzQ7c2hhIGxvYWQgd2lkdGgmIzM0Oyk7Ci0JCUFTU0VSVF9FUShpbltiYXNlICYjNDM7IDJdLm9mZiwgaSAqIDgsICYjMzQ7c2hhIGR3b3JkIG9mZnNldCYjMzQ7KTsKLQkJQVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgM10uY29kZSwgKEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFcpLCAmIzM0O3NoYSBpbW02NCAoSF9tZXRhKSYjMzQ7KTsKLQkJQVNTRVJUX0VRKGluW2Jhc2UgJiM0MzsgNl0uY29kZSwgKEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1gpLCAmIzM0O3NoYSBicmFuY2ggb3AmIzM0Oyk7Ci0JCWJyW25iJiM0MzsmIzQzO10gPSBiYXNlICYjNDM7IDY7Ci0JfQotCi0JLyoKLQkgKiBMb2NhdGUgdGhlIHJlYWwgY2xlYW51cCBsYWJlbCBzbyB3ZSBjYW4gcGluIHRoZSBleGFjdCBqdW1wIHRhcmdldCwKLQkgKiBub3QganVzdCAmIzM0O3NvbWUgYmFja3dhcmQgbGFiZWwmIzM0Oy4gYnBmX2dlbl9faW5pdCgpIGVtaXRzIHRoZSBjbGVhbnVwCi0JICogYmxvY2sgYXMgYSBwcm9nLWZkIGNsb3NlIGxvb3Agd2hvc2UgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgdGhlIGxhYmVsCi0JICogZXZlcnkgZXJyb3IgYnJhbmNoIGp1bXBzIHRvLgotCSAqLwotCWZvciAoaSA9IDA7IGkgJiM0MzsgMiAmbHQ7IGE7IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChpbltpXS5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSAmYW1wOyZhbXA7Ci0JCSAgICBpbltpXS5kc3RfcmVnID09IEJQRl9SRUdfMSAmYW1wOyZhbXA7IGluW2ldLnNyY19yZWcgPT0gQlBGX1JFR18xMCAmYW1wOyZhbXA7Ci0JCSAgICBpbltpICYjNDM7IDFdLmNvZGUgPT0gKEJQRl9KTVAgfCBCUEZfSlNMRSB8IEJQRl9LKSAmYW1wOyZhbXA7Ci0JCSAgICBpbltpICYjNDM7IDFdLmRzdF9yZWcgPT0gQlBGX1JFR18xICZhbXA7JmFtcDsgaW5baSAmIzQzOyAxXS5pbW0gPT0gMCAmYW1wOyZhbXA7Ci0JCSAgICBpbltpICYjNDM7IDFdLm9mZiA9PSAxICZhbXA7JmFtcDsKLQkJICAgIGluW2kgJiM0MzsgMl0uY29kZSA9PSAoQlBGX0pNUCB8IEJQRl9DQUxMKSAmYW1wOyZhbXA7Ci0JCSAgICBpbltpICYjNDM7IDJdLmltbSA9PSBCUEZfRlVOQ19zeXNfY2xvc2UpIHsKLQkJCWNsZWFudXAgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFBU1NFUlRfR0UoY2xlYW51cCwgMCwgJiMzNDtjbGVhbnVwIGxhYmVsIGxvY2F0ZWQmIzM0OykpCi0JCXJldHVybjsKLQlmb3IgKGkgPSAwOyBpICZsdDsgbmI7IGkmIzQzOyYjNDM7KSB7Ci0JCXQgPSBicltpXSAmIzQzOyAxICYjNDM7IGluW2JyW2ldXS5vZmY7Ci0JCUFTU0VSVF9FUSh0LCBjbGVhbnVwLCAmIzM0O3NpZy1tYXRjaCBsYW5kcyBvbiBjbGVhbnVwJiMzNDspOwotCX0KLQkvKgotCSAqIFNhbWUgaW52YXJpYW50IGZvciBldmVyeSBvdGhlciBjbGVhbnVwLWJvdW5kIGp1bXAgaW4gdGhlIHByb2dyYW06Ci0JICogZW1pdF9jaGVja19lcnIoKSBpcyB0aGUgb25seSBzb3VyY2Ugb2YgJiMzNDtpZiAocjcgJmx0OyAwKSBnb3RvIGNsZWFudXAmIzM0OywKLQkgKiBzbyBlYWNoIG9mIHRob3NlIG11c3QgYWxzbyByZXNvbHZlIGV4YWN0bHkgdG8gY2xlYW51cC4KLQkgKi8KLQlmb3IgKGkgPSAwLCB0ID0gMDsgaSAmbHQ7IG47IGkmIzQzOyYjNDM7KSB7Ci0JCWlmIChpbltpXS5jb2RlICE9IChCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfSykgfHwKLQkJICAgIGluW2ldLmRzdF9yZWcgIT0gQlBGX1JFR183IHx8IGluW2ldLmltbSAhPSAwIHx8IGluW2ldLm9mZiAmZ3Q7PSAwKQotCQkJY29udGludWU7Ci0JCUFTU0VSVF9FUShpICYjNDM7IDEgJiM0MzsgaW5baV0ub2ZmLCBjbGVhbnVwLCAmIzM0O2Vyci1jaGVjayBsYW5kcyBvbiBjbGVhbnVwJiMzNDspOwotCQl0JiM0MzsmIzQzOzsKLQl9Ci0JQVNTRVJUX0dUKHQsIDAsICYjMzQ7Zm91bmQgZW1pdF9jaGVja19lcnIganVtcHMmIzM0Oyk7Ci19Ci0KIHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgewogCXN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWw7CiAJc3RydWN0IGdlbl9sb2FkZXJfb3B0cyBnb3B0czsKQEAgLTM3MiwxNiAmIzQzOzI5MSw2IEBAIHN0YXRpYyB2b2lkIGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYpCiAJdGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KGYtJmd0O3NrZWwpOwogfQogCi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9jaGVja19zaGFwZSh2b2lkKQotewotCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQotCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApCi0JCWNoZWNrX3NpZ19tYXRjaF9zaGFwZSgoY29uc3Qgc3RydWN0IGJwZl9pbnNuICopZi5nb3B0cy5pbnNucywKLQkJCQkgICAgICBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbikpOwotCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7Ci19Ci0KIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpCiB7CiAJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwpAQCAtMzkxLDk0ICYjNDM7MzAwLDIyMCBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9tYXRjaCh2b2lkKQogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKIAkJciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwKIAkJCQkgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsCi0JCQkJICAgdHJ1ZSwgZi5jdHgsIGYuY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CQkJCSAgIGYuY3R4LCBmLmN0eF9zeiwgJmFtcDtyYW4pOwogCQlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKIAkJQVNTRVJUX0VRKHIsIDAsICYjMzQ7aG9uZXN0IGxvYWRlciByZXR2YWwmIzM0Oyk7CiAJfQogCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiB9CiAKLXN0YXRpYyB2b2lkIG1ldGFkYXRhX3NoYV9taXNtYXRjaCh2b2lkKQomIzQzO3N0YXRpYyB2b2lkIHNpZ25hdHVyZV9lbmZvcmNlZCh2b2lkKQogewomIzQzOwlzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7Ci0JYm9vbCByYW47Ci0JaW50IHI7CiYjNDM7CWludCBmZDsKIAogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKIAkJLyoKLQkJICogYmxvYlswXSBsaXZlcyBpbiB0aGUgbG9hZGVyJiMzOTtzIGZkX2FycmF5IHNjcmF0Y2ggKGZpcnN0IGFkZF9kYXRhIGluCi0JCSAqIGJwZl9nZW5fX2luaXQpOyBhIDAtbWFwIHByb2dyYW0gbmV2ZXIgcmVhZHMgaXQsIHNvIGZsaXBwaW5nIGl0Ci0JCSAqIGNoYW5nZXMgb25seSBtYXAtJmd0O3NoYS4gVGhlIG1ldGFkYXRhIGNoZWNrIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQKLQkJICogY2FuIG5vdGljZSAtJmd0OyBpc29sYXRlcyBlbWl0X3NpZ25hdHVyZV9tYXRjaC4KJiM0MzsJCSAqIEEgcHJlc2VudC1idXQtaW52YWxpZCBzaWduYXR1cmUgKHRoZSBjZXJ0IGJ5dGVzIGFyZSBub3QgYQomIzQzOwkJICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlCiYjNDM7CQkgKiBwYXRoIGlzIGhvbm9yZWQsIG5vdCBpZ25vcmVkLiAoVGhlIHZhbGlkIHBhdGggaXMgY292ZXJlZCBieQomIzQzOwkJICogdGhlIHNpZ25lZCBsc2tlbHMuKQogCQkgKi8KLQkJZi5ibG9iWzBdIF49IDB4ZmY7Ci0JCXIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsCi0JCQkJICAgZi5kYXRhX3N6LCBmLmV4Y2wsIHNpemVvZihmLmV4Y2wpLCBOVUxMLCAwLAotCQkJCSAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgJmFtcDtyYW4pOwotCQlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKLQkJQVNTRVJUX0VRKHIsIC1FSU5WQUwsICYjMzQ7dGFtcGVyZWQgYmxvYiByZWplY3RlZCBieSBlbWl0X3NpZ25hdHVyZV9tYXRjaCYjMzQ7KTsKJiM0MzsJCWZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssCiYjNDM7CQkJCSBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CiYjNDM7CQlBU1NFUlRfTFQoZmQsIDAsICYjMzQ7aW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZCYjMzQ7KTsKIAl9CiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KIAotc3RhdGljIHZvaWQgbWV0YWRhdGFfbm90X2V4Y2x1c2l2ZSh2b2lkKQomIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiB7CiYjNDM7CXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwogCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQlib29sIHJhbjsKLQlpbnQgcjsKJiM0MzsJaW50IG1hcF9mZCwgZmQ7CiAKIAlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiAJCS8qCi0JCSAqIENvcnJlY3QgYmxvYiBidXQgYSBub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcDogdGhlIHZlcmlmaWVyIGRvZXMKLQkJICogbm90IHJlamVjdCAoZXhjbF9wcm9nX3NoYSB1bnNldCksIHNvIHRoZSBydW50aW1lIG1hcC0mZ3Q7ZXhjbCA9PSAxCi0JCSAqIGNoZWNrIGluIHRoZSBsb2FkZXIgbXVzdC4KJiM0MzsJCSAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IG9ubHkgYmluZCBleGNsdXNpdmUgbWFwcyB0aHJvdWdoIGZkX2FycmF5CiYjNDM7CQkgKiAodGhlaXIgY29udGVudHMgYXJlIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUpLiBCaW5kaW5nIGEKJiM0MzsJCSAqIG5vbi1leGNsdXNpdmUgbWFwIGlzIHJlamVjdGVkLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuCiYjNDM7CQkgKiBleGFtaW5lZC4KIAkJICovCi0JCXIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsCi0JCQkJICAgZi5kYXRhX3N6LCBOVUxMLCAwLCBOVUxMLCAwLCB0cnVlLCBmLmN0eCwKLQkJCQkgICBmLmN0eF9zeiwgJmFtcDtyYW4pOwotCQlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKLQkJQVNTRVJUX0VRKHIsIC1FSU5WQUwsICYjMzQ7bm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXAgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CQltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7bm9uZXhjbCYjMzQ7LCA0LAomIzQzOwkJCQkJZi5kYXRhX3N6LCAxLCBOVUxMKTsKJiM0MzsJCWlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCAmIzM0O25vbmV4Y2xfbWFwJiMzNDspKSB7CiYjNDM7CQkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsCiYjNDM7CQkJCQkganVuaywgc2l6ZW9mKGp1bmspLAomIzQzOwkJCQkJIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7CiYjNDM7CQkJQVNTRVJUX0VRKGZkLCAtRVBFUk0sCiYjNDM7CQkJCSAgJiMzNDtub24tZXhjbHVzaXZlIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CQkJaWYgKGZkICZndDs9IDApCiYjNDM7CQkJCWNsb3NlKGZkKTsKJiM0MzsJCQljbG9zZShtYXBfZmQpOwomIzQzOwkJfQogCX0KIAlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwogfQogCi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCh2b2lkKQomIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKQogewomIzQzOwlzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpOwogCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQlib29sIHJhbjsKLQlpbnQgcjsKJiM0MzsJaW50IG1hcF9mZCwgZmQ7CiAKIAlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiAJCS8qCi0JCSAqIENvcnJlY3QsIGV4Y2x1c2l2ZSwgZnJvemVuIG1hcCwgYnV0IGl0cyBoYXNoIHdhcyBuZXZlciBjb21wdXRlZAotCQkgKiAobm8gT0JKX0dFVF9JTkZPX0JZX0ZEKSwgc28gbWFwLSZndDtzaGEgc3RheXMgemVyby4gVGhlIGxvYWRlciBtdXN0Ci0JCSAqIGZhaWwgY2xvc2VkIHJhdGhlciB0aGFuIHRyZWF0IGFuIHVuc2V0IGhhc2ggYXMgYSBtYXRjaC4KJiM0MzsJCSAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZQomIzQzOwkJICogc2lnbmF0dXJlLiBBbiBleGNsdXNpdmUgbWFwIG9mIGFueSBvdGhlciB0eXBlIGlzIHJlamVjdGVkCiYjNDM7CQkgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXQKJiM0MzsJCSAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyCiYjNDM7CQkgKiBhZGRyZXNzKSBhbmQgaW5zbi1hcnJheSBtYXBzIChidWZmZXIgc21hbGxlciB0aGFuIHZhbHVlX3NpemUpCiYjNDM7CQkgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlCiYjNDM7CQkgKiBtZW1jcHkoKSYjMzk7ZCBmcm9tIHRoZW0uIEEgaGFzaCBtYXAgc3RhbmRzIGluIGhlcmU6IGl0IGlzCiYjNDM7CQkgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LgogCQkgKi8KLQkJciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwKLQkJCQkgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsCi0JCQkJICAgZmFsc2UsIGYuY3R4LCBmLmN0eF9zeiwgJmFtcDtyYW4pOwotCQlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKLQkJQVNTRVJUX0VRKHIsIC1FSU5WQUwsICYjMzQ7dW5jb21wdXRlZCBtZXRhZGF0YSBoYXNoIHJlamVjdGVkJiMzNDspOwomIzQzOwkJbW9wdHMuZXhjbF9wcm9nX2hhc2ggPSBmLmV4Y2w7CiYjNDM7CQltb3B0cy5leGNsX3Byb2dfaGFzaF9zaXplID0gc2l6ZW9mKGYuZXhjbCk7CiYjNDM7CQltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgJiMzNDtleGNsX2hhc2gmIzM0OywgNCwgNCwgMSwKJiM0MzsJCQkJCSZhbXA7bW9wdHMpOwomIzQzOwkJaWYgKEFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7ZXhjbF9oYXNoX21hcCYjMzQ7KSkgewomIzQzOwkJCWZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLAomIzQzOwkJCQkJIGp1bmssIHNpemVvZihqdW5rKSwKJiM0MzsJCQkJCSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpOwomIzQzOwkJCUFTU0VSVF9FUShmZCwgLUVJTlZBTCwKJiM0MzsJCQkJICAmIzM0O25vbi1hcnJheSBtYXAgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkJiMzNDspOwomIzQzOwkJCWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJCQljbG9zZShmZCk7CiYjNDM7CQkJY2xvc2UobWFwX2ZkKTsKJiM0MzsJCX0KIAl9CiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KIAotc3RhdGljIHZvaWQgc2lnbmF0dXJlX2VuZm9yY2VkKHZvaWQpCiYjNDM7c3RhdGljIGludCBzZXR1cF9tZXRhX21hcChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiYjNDM7ewomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9idGZYWFhYWFgmIzM0OywgKmRpciA9IE5VTEw7CiYjNDM7CV9fdTMyIHNpZ19zeiA9IDgxOTI7CiYjNDM7CWludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xOwomIzQzOwl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7CiYjNDM7CWJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7CiYjNDM7CXN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7CiYjNDM7CXVuaW9uIGJwZl9hdHRyIGF0dHI7CiYjNDM7CWludCBmZHNbMl07CiYjNDM7CV9fdTggc2lnWzgxOTJdOwomIzQzOwomIzQzOwlzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksICYjMzQ7a2V5cmluZyYjMzQ7LCAmIzM0O191aWQuMCYjMzQ7LCBOVUxMLAomIzQzOwkJS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTsKJiM0MzsJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CQlybWRpcihkaXIpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpICE9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaGF2ZV9maXh0dXJlID0gdHJ1ZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogZmRfYXJyYXkgYmluZHMgbWFwcyBhbmQgQlRGcyBhbGlrZSwgYnV0IG9ubHkgZXhjbHVzaXZlIGFycmF5IG1hcHMgYXJlCiYjNDM7CSAqIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUuIEJ1aWxkIGFuIG90aGVyd2lzZSBnZW51aW5lbHkgc2lnbmVkIGxvYWQgLQomIzQzOwkgKiBpbnNucyB8fCBtZXRhZGF0YSwgZXhjbHVzaXZlIGZyb3plbiBtYXAgYXQgZmRfYXJyYXlbMF0gLSB0aGVuIHNtdWdnbGUKJiM0MzsJICogYW4gZXh0cmEgQlRGIGludG8gZmRfYXJyYXlbMV0uIEEgc2lnbmVkIHByb2dyYW0gbWF5IG5vdCBiaW5kIGFueSBCVEYsCiYjNDM7CSAqIHNvIHJlc29sdmluZyB0aGUgZmRfYXJyYXkgZW50cmllcyByZWplY3RzIHRoZSBCVEYgd2l0aCAtRUFDQ0VTIChpbgomIzQzOwkgKiBfX2FkZF91c2VkX2J0ZigpLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuIHZlcmlmaWVkKS4KJiM0MzsJICovCiYjNDM7CWJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgJiMzNDtzaWduYnVmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CW1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opOwomIzQzOwltZW1jcHkoYnVmICYjNDM7IGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6LCBzaWcsCiYjNDM7CQkJICAgICAgICZhbXA7c2lnX3N6KSwgJiMzNDtzaWduIGluc25zfHxtZXRhZGF0YSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwltYXBfZmQgPSBzZXR1cF9tZXRhX21hcCgmYW1wO2YpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJYnRmID0gYnRmX19uZXdfZW1wdHkoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgJiMzNDtidGZfbmV3X2VtcHR5JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWJ0Zl9fYWRkX2ludChidGYsICYjMzQ7aW50JiMzNDssIDQsIEJURl9JTlRfU0lHTkVEKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksICYjMzQ7YnRmX2xvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJZmRzWzBdID0gbWFwX2ZkOwomIzQzOwlmZHNbMV0gPSBidGZfX2ZkKGJ0Zik7CiYjNDM7CW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiYjNDM7CWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwomIzQzOwlhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTsKJiM0MzsJYXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTsKJiM0MzsJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKJiM0MzsJYXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFOwomIzQzOwlhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChmZHMpOwomIzQzOwlhdHRyLmZkX2FycmF5X2NudCA9IDI7CiYjNDM7CWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwomIzQzOwlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwomIzQzOwlhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7CW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJQVNTRVJUX0VRKHByb2dfZmQgJmx0OyAwID8gLWVycm5vIDogcHJvZ19mZCwgLUVBQ0NFUywKJiM0MzsJCSAgJiMzNDtCVEYgaW4gc2lnbmVkIGZkX2FycmF5IHJlamVjdGVkIHBvc3QtdmVyaWZpZXImIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztvdXQ6CiYjNDM7CWlmIChidGYpCiYjNDM7CQlidGZfX2ZyZWUoYnRmKTsKJiM0MzsJaWYgKG1hcF9mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UobWFwX2ZkKTsKJiM0MzsJaWYgKGhhdmVfZml4dHVyZSkKJiM0MzsJCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiYjNDM7CWlmIChkaXIpCiYjNDM7CQlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7CWZyZWUoYnVmKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKQogewogCXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwomIzQzOwljaGFyIGxvZ19idWZbMTAyNF0gPSB7fTsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7CiYjNDM7CXVuaW9uIGJwZl9hdHRyIGF0dHI7CiAJaW50IGZkOwogCiAJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgPT0gMCkgewogCQkvKgotCQkgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGEKLQkJICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlCi0JCSAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5Ci0JCSAqIHRoZSBzaWduZWQgbHNrZWxzLikKJiM0MzsJCSAqIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gbm93IHJ1bnMgaW5zaWRlIGJwZl9jaGVjaygpLCBzbyBhCiYjNDM7CQkgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC0KJiM0MzsJCSAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LgogCQkgKi8KLQkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuaywKLQkJCQkgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwkJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKJiM0MzsJCWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwomIzQzOwkJYXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7CiYjNDM7CQlhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwomIzQzOwkJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKJiM0MzsJCWF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTsKJiM0MzsJCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTsKJiM0MzsJCWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaXplb2YoanVuayk7CiYjNDM7CQlhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7CQlhdHRyLmxvZ19sZXZlbCA9IDE7CiYjNDM7CQlhdHRyLmxvZ19idWYgPSBwdHJfdG9fdTY0KGxvZ19idWYpOwomIzQzOwkJYXR0ci5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTsKJiM0MzsJCW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwomIzQzOwomIzQzOwkJZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwogCQlBU1NFUlRfTFQoZmQsIDAsICYjMzQ7aW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZCYjMzQ7KTsKJiM0MzsJCWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkKTsKJiM0MzsJCUFTU0VSVF9IQVNfU1VCU1RSKGxvZ19idWYsICYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQmIzM0OywKJiM0MzsJCQkJICAmIzM0O3ZlcmlmaWVyIGxvZ3Mgc2lnbmF0dXJlIGZhaWx1cmUmIzM0Oyk7CiAJfQogCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiB9CkBAIC00OTUsNyAmIzQzOzUzMCw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV90b29fbGFyZ2Uodm9pZCkKIAkJICogaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXIgaXMgcmVhZC4KIAkJICovCiAJCWZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssCi0JCQkJIDY0ICZsdDsmbHQ7IDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwkJCQkgNjQgJmx0OyZsdDsgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CiAJCUFTU0VSVF9FUShmZCwgLUVJTlZBTCwgJiMzNDtvdmVyc2l6ZWQgc2lnbmF0dXJlIHJlamVjdGVkJiMzNDspOwogCX0KIAlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwpAQCAtNTE1LDcgJiM0Mzs1NTAsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYmFkX2tleXJpbmcodm9pZCkKIAkJICogbGFyZ2UgcG9zaXRpdmUgc2VyaWFsIHRha2VzIHRoZSB1c2VyLWtleXJpbmcgcGF0aCBhbmQgd29uJiMzOTt0IGV4aXN0LgogCQkgKi8KIAkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuaywKLQkJCQkgc2l6ZW9mKGp1bmspLCBJTlRfTUFYKTsKJiM0MzsJCQkJIHNpemVvZihqdW5rKSwgSU5UX01BWCwgMCk7CiAJCUFTU0VSVF9FUShmZCwgLUVJTlZBTCwgJiMzNDtzaWduYXR1cmUgd2l0aCBiYWQga2V5cmluZ19pZCByZWplY3RlZCYjMzQ7KTsKIAl9CiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKQEAgLTU3NSw3ICYjNDM7NjEwLDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X21heF9lbnRyaWVzX2lnbm9yZWQodm9pZCkKIAltZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7CiAKIAlyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LAotCQkJICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCB0cnVlLCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwomIzQzOwkJCSAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgY3R4LCBjdHhfc3osICZhbXA7cmFuKTsKIAlpZiAoIUFTU0VSVF9UUlVFKHJhbiwgJiMzNDtsb2FkZXIgcmFuJiMzNDspIHx8CiAJICAgICFBU1NFUlRfRVEociwgMCwgJiMzNDtsb2FkZXIgcmV0dmFsJiMzNDspKQogCQlnb3RvIGZyZWVfYmxvYjsKQEAgLTY2MSw3ICYjNDM7Njk2LDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCh2b2lkKQogCW1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTsKIAogCXIgPSBydW5fZ2VuX2xvYWRlcihnb3B0cy5pbnNucywgZ29wdHMuaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osCi0JCQkgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CQkJICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwogCWlmICghQVNTRVJUX1RSVUUocmFuLCAmIzM0O2xvYWRlciByYW4mIzM0OykgfHwKIAkgICAgIUFTU0VSVF9FUShyLCAwLCAmIzM0O2xvYWRlciByZXR2YWwmIzM0OykpCiAJCWdvdG8gZnJlZV9ibG9iOwpAQCAtNzE0LDYgJiM0Mzs3NDksNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKQogCV9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF0sIHNpZ1s4MTkyXTsKIAlfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejsKIAl1bnNpZ25lZCBjaGFyICppbnNucyA9IE5VTEwsICp0YW1wZXJlZCA9IE5VTEwsICpibG9iID0gTlVMTDsKJiM0MzsJdW5zaWduZWQgY2hhciAqc2lnbmJ1ZiA9IE5VTEw7CiAJaW50IG5yX21hcHMgPSAwLCBucl9wcm9ncyA9IDAsIHI7CiAJc3RydWN0IGJwZl9wcm9ncmFtICpwOwogCXN0cnVjdCBicGZfbWFwICptOwpAQCAtNzYwLDI5ICYjNDM7Nzk2LDQ2IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpCiAJbWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opOwogCWxpYmJwZl9zaGEyNTYoaW5zbnMsIGluc25zX3N6LCBleGNsKTsKIAotCWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIGluc25zX3N6LCBzaWcsICZhbXA7c2lnX3N6KSwgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CXNpZ25idWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiAmIzQzOyBkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNpZ25idWYsICYjMzQ7c2lnbmJ1ZiYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJbWVtY3B5KHNpZ25idWYsIGluc25zLCBpbnNuc19zeik7CiYjNDM7CW1lbWNweShzaWduYnVmICYjNDM7IGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiAmIzQzOyBkYXRhX3N6LCBzaWcsICZhbXA7c2lnX3N6KSwKJiM0MzsJCSAgICAgICAmIzM0O3NpZ24tZmlsZSYjMzQ7KSkKIAkJZ290byBjbGVhbnVwOwogCiAJbWVtc2V0KGN0eCwgMCwgY3R4X3N6KTsKIAkoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktJmd0O3N6ID0gY3R4X3N6OwogCXIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSwKLQkJCSAgIHNpZywgc2lnX3N6LCB0cnVlLCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwomIzQzOwkJCSAgIHNpZywgc2lnX3N6LCBjdHgsIGN0eF9zeiwgJmFtcDtyYW4pOwogCUFTU0VSVF9UUlVFKHJhbiwgJiMzNDt2YWxpZCBzaWduYXR1cmU6IGxvYWRlciBsb2FkZWQgYW5kIHJhbiYjMzQ7KTsKIAlBU1NFUlRfRVEociwgMCwgJiMzNDt2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWQmIzM0Oyk7CiAJY2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7CiAKIAltZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7CiAJdGFtcGVyZWRbaW5zbnNfc3ogLyAyXSBePSAweGZmOwomIzQzOwkvKgomIzQzOwkgKiBCaW5kIHRoZSBtZXRhZGF0YSBtYXAgdG8gdGhlIHRhbXBlcmVkIGxvYWRlciYjMzk7cyBvd24gZGlnZXN0LCBzbyB0aGUKJiM0MzsJICogdmVyaWZpZXImIzM5O3MgZXhjbHVzaXZlLW1hcCBjaGVjayAoZXhjbF9wcm9nX3NoYSA9PSBwcm9nLSZndDtkaWdlc3QpIHBhc3NlcwomIzQzOwkgKiBhbmQgdGhlIHNpZ25hdHVyZSAtIHZlcmlmaWVkIGFmdGVyIHRoZSBtYXBzIGFyZSByZXNvbHZlZCAtIGlzIHdoYXQKJiM0MzsJICogcmVqZWN0cyB0aGUgbG9hZC4gVGhpcyBpcyB0aGUgYXR0YWNrZXImIzM5O3MgYmVzdCBjYXNlOiBldmVuIGFmdGVyCiYjNDM7CSAqIHJlLWJpbmRpbmcgdGhlIGV4Y2x1c2l2ZSBtYXAgdG8gdGhlaXIgdGFtcGVyZWQgbG9hZGVyLCB0aGUgc2lnbmF0dXJlCiYjNDM7CSAqIG92ZXIgdGhlIG9yaWdpbmFsIGluc25zIHx8IG1ldGFkYXRhIHN0aWxsIGZhaWxzLiAoTGVhdmluZyB0aGUgbWFwCiYjNDM7CSAqIGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBkaWdlc3Qgd291bGQgaW5zdGVhZCB0cmlwIHRoZSBleGNsIGNoZWNrIGZpcnN0LikKJiM0MzsJICovCiYjNDM7CWxpYmJwZl9zaGEyNTYodGFtcGVyZWQsIGluc25zX3N6LCBleGNsKTsKIAltZW1zZXQoY3R4LCAwLCBjdHhfc3opOwogCSgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS0mZ3Q7c3ogPSBjdHhfc3o7CiAJciA9IHJ1bl9nZW5fbG9hZGVyKHRhbXBlcmVkLCBpbnNuc19zeiwgYmxvYiwgZGF0YV9zeiwgZXhjbCwgc2l6ZW9mKGV4Y2wpLAotCQkJICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiYjNDM7CQkJICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCAmYW1wO3Jhbik7CiAJQVNTRVJUX0ZBTFNFKHJhbiwgJiMzNDt0YW1wZXJlZCBsb2FkZXIgcmVqZWN0ZWQgYmVmb3JlIHJ1biYjMzQ7KTsKIAlBU1NFUlRfRVEociwgLUVLRVlSRUpFQ1RFRCwgJiMzNDtzaWduYXR1cmUgaXMgYm91bmQgdG8gdGhlIGluc3RydWN0aW9ucyYjMzQ7KTsKIGNsZWFudXA6CiAJZnJlZShpbnNucyk7CiAJZnJlZSh0YW1wZXJlZCk7CiAJZnJlZShibG9iKTsKJiM0MzsJZnJlZShzaWduYnVmKTsKIAlmcmVlKGN0eCk7CiAJdGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KHNrZWwpOwogCXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKQEAgLTEwMDcsMTAgJiM0MzsxMDYwLDExIEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKQogewogCWNoYXIgZGlyX3RtcGxbXSA9ICYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2xzbVhYWFhYWCYjMzQ7LCAqZGlyID0gTlVMTDsKIAlzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX2xzbSAqbHNtID0gTlVMTDsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MiwgbXNpZ19zeiA9IDgxOTI7CiAJaW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7CiAJYm9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7Ci0JX191MzIgc2lnX3N6ID0gODE5MjsKJiM0MzsJdW5zaWduZWQgY2hhciAqYnVmOwogCV9fczMyIHNlc19zZXJpYWw7CiAJX191OCBzaWdbODE5Ml07CiAKQEAgLTEwMjksNyAmIzQzOzEwODMsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZCkKIAlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXBfdW5zaWduZWQmIzM0OykpCiAJCWdvdG8gb3V0OwogCWxzbS0mZ3Q7YnNzLSZndDtzZWVuID0gMDsKLQlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBOVUxMLCAwLCAwKTsKJiM0MzsJcHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCwgMCk7CiAJY2xvc2UobWFwX2ZkKTsKIAltYXBfZmQgPSAtMTsKIAlpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCAmIzM0O3Vuc2lnbmVkIGxvYWRlciBsb2FkJiMzNDspKQpAQCAtMTA2MiwyMiAmIzQzOzExMTYsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpCiAJCWdvdG8gb3V0OwogCWxzbS0mZ3Q7YnNzLSZndDtzZWVuID0gMDsKIAlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsCi0JCQkgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7CQkJICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApOwogCWNsb3NlKG1hcF9mZCk7CiAJbWFwX2ZkID0gLTE7Ci0JaWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgJiMzNDtzaWduZWQgbG9hZGVyIGxvYWQmIzM0OykpCi0JCWdvdG8gb3V0OwotCWNsb3NlKHByb2dfZmQpOwomIzQzOwlBU1NFUlRfRVEocHJvZ19mZCwgLUVBQ0NFUywgJiMzNDt1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZCYjMzQ7KTsKJiM0MzsJaWYgKHByb2dfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHByb2dfZmQpOwogCXByb2dfZmQgPSAtMTsKIAogCXNlc19zZXJpYWwgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfR0VUX0tFWVJJTkdfSUQsCiAJCQkgICAgIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CiAJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzZWVuLCAxLCAmIzM0O3NpZ25lZDogb25lIG9ic2VydmVkIGxvYWQmIzM0Oyk7Ci0JQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwgJiMzNDtzaWduZWQgdmVyZGljdCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwKJiM0MzsJCSAgJiMzNDthZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlJiMzNDspOwogCUFTU0VSVF9FUShsc20tJmd0O2Jzcy0mZ3Q7c2lnX2tleXJpbmdfdHlwZSwgQlBGX1NJR19LRVlSSU5HX1VTRVIsICYjMzQ7c2lnbmVkIGtleXJpbmcgdHlwZSYjMzQ7KTsKIAlBU1NFUlRfR1Qoc2VzX3NlcmlhbCwgMCwgJiMzNDtzZXNzaW9uIGtleXJpbmcgc2VyaWFsIHJlc29sdmVkJiMzNDspOwogCUFTU0VSVF9FUShsc20tJmd0O2Jzcy0mZ3Q7c2lnX2tleXJpbmdfc2VyaWFsLCBzZXNfc2VyaWFsLAogCQkgICYjMzQ7c2lnbmVkOiB2YWxpZGF0ZWQgYWdhaW5zdCBzZXNzaW9uIGtleXJpbmcmIzM0Oyk7CiYjNDM7CiYjNDM7CWJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgJiMzNDttZXRhX3NpZ25idWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osCiYjNDM7CQkJCXNpZywgJmFtcDttc2lnX3N6KSwgJiMzNDtzaWduIGluc25zfHxtZXRhZGF0YSYjMzQ7KSkgewomIzQzOwkJZnJlZShidWYpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsJZnJlZShidWYpOwomIzQzOwomIzQzOwltYXBfZmQgPSBzZXR1cF9tZXRhX21hcCgmYW1wO2YpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXBfYm91bmQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbHNtLSZndDtic3MtJmd0O3NlZW4gPSAwOwomIzQzOwlwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsCiYjNDM7CQkJICAgICAgbXNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTsKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0MzsJbWFwX2ZkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsICYjMzQ7bWV0YWRhdGEtYm91bmQgbG9hZGVyIGxvYWQmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UocHJvZ19mZCk7CiYjNDM7CXByb2dfZmQgPSAtMTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzZWVuLCAxLCAmIzM0O21ldGFkYXRhOiBvbmUgb2JzZXJ2ZWQgbG9hZCYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKGxzbS0mZ3Q7YnNzLSZndDtzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCwKJiM0MzsJCSAgJiMzNDttZXRhZGF0YS1ib3VuZCB2ZXJkaWN0JiMzNDspOwogb3V0OgogCWlmIChtYXBfZmQgJmd0Oz0gMCkKIAkJY2xvc2UobWFwX2ZkKTsKQEAgLTEwOTAsMjAgJiM0MzsxMTczLDQ2MiBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZCkKIAl0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtX19kZXN0cm95KGxzbSk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIExvYWQtdGltZSBtZXRhZGF0YSB2ZXJpZmljYXRpb246IHRoZSBrZXJuZWwgZm9sZHMgdGhlIGZyb3plbiBtZXRhZGF0YSBtYXAKJiM0MzsgKiBpbnRvIHRoZSBzaWduYXR1cmUgKGluc25zIHx8IG1ldGFkYXRhKSBhbmQgY2hlY2tzIGl0IGF0IEJQRl9QUk9HX0xPQUQgdmlhCiYjNDM7ICogZmRfYXJyYXlfY250LCByYXRoZXIgdGhhbiB0aGUgbG9hZGVyIGNoZWNraW5nIGZyb20gd2l0aGluIEJQRi4gU2lnbiB0aGF0CiYjNDM7ICogY29uY2F0ZW5hdGlvbiwgaGFuZCB0aGUga2VybmVsIHRoZSBtYXAsIGFuZCBjb25maXJtIHRoZSBzaWduZWQgbG9hZGVyIGxvYWRzLAomIzQzOyAqIHJ1bnMsIGFuZCBpbnN0YWxscyBpdHMgdGFyZ2V0LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgbG9hZHRpbWVfZHJpdmUoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osCiYjNDM7CQkJICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LCBjb25zdCBfX3U4ICpleGNsLAomIzQzOwkJCSAgdm9pZCAqY3R4LCBfX3UzMiBjdHhfc3osIGludCAqbG9hZF9yZXQsIGJvb2wgKnJhbikKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzLAomIzQzOwkJICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsCiYjNDM7CQkgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7CiYjNDM7CV9fdTMyIHNpZ19zeiA9IDgxOTIsIGtleSA9IDA7CiYjNDM7CXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7CiYjNDM7CXVuaW9uIGJwZl9hdHRyIGF0dHI7CiYjNDM7CV9fdTggc2lnWzgxOTJdOwomIzQzOwomIzQzOwkqcmFuID0gZmFsc2U7CiYjNDM7CSpsb2FkX3JldCA9IDA7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1ldGFkYXRhIG1hcCwgYm91bmQgdG8gdGhlIGxvYWRlciBkaWdlc3QgYW5kIGZyb3plbiwgZXhhY3RseSBhcwomIzQzOwkgKiBza2VsX2ludGVybmFsLmgmIzM5O3MgYnBmX2xvYWRfYW5kX3J1bigpIHNldHMgaXQgdXAuCiYjNDM7CSAqLwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7X19sb2FkZXIubWFwJiMzNDssIDQsCiYjNDM7CQkJCWRhdGFfc3osIDEsICZhbXA7bW9wdHMpOwomIzQzOwlpZiAobWFwX2ZkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtZXJybm87CiYjNDM7CWlmIChicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgJmFtcDtrZXksIGRhdGEsIDApIHx8IGJwZl9tYXBfZnJlZXplKG1hcF9mZCkpIHsKJiM0MzsJCXJldCA9IC1lcnJubzsKJiM0MzsJCWdvdG8gb3V0X21hcDsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBTaWduIGluc25zIHx8IG1ldGFkYXRhLCB0aGUgc2FtZSBieXRlcyB0aGUga2VybmVsIHJlY29uc3RydWN0cy4gKi8KJiM0MzsJYnVmID0gbWFsbG9jKChzaXplX3QpaW5zbnNfc3ogJiM0MzsgZGF0YV9zeik7CiYjNDM7CWlmICghYnVmKSB7CiYjNDM7CQlyZXQgPSAtRU5PTUVNOwomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwl9CiYjNDM7CW1lbWNweShidWYsIGluc25zLCBpbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgaW5zbnNfc3osIGRhdGEsIGRhdGFfc3opOwomIzQzOwlyZXQgPSBzaWduX2J1ZihkaXIsIGJ1ZiwgaW5zbnNfc3ogJiM0MzsgZGF0YV9zeiwgc2lnLCAmYW1wO3NpZ19zeik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlnb3RvIG91dF9tYXA7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiYjNDM7CWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwomIzQzOwlhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7CiYjNDM7CWF0dHIuaW5zbl9jbnQgPSBpbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwomIzQzOwlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwomIzQzOwlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiYjNDM7CWF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KCZhbXA7bWFwX2ZkKTsKJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJYXR0ci5mZF9hcnJheV9jbnQgPSAxOwomIzQzOwltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7LCBzaXplb2YoJiMzNDtfX2xvYWRlci5wcm9nJiMzNDspKTsKJiM0MzsJcHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsICZhbXA7YXR0ciwKJiM0MzsJCQkgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7CiYjNDM7CWlmIChwcm9nX2ZkICZsdDsgMCkgewomIzQzOwkJKmxvYWRfcmV0ID0gLWVycm5vOwomIzQzOwkJcmV0ID0gLWVycm5vOwomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiYjNDM7CWF0dHIudGVzdC5wcm9nX2ZkID0gcHJvZ19mZDsKJiM0MzsJYXR0ci50ZXN0LmN0eF9pbiA9IHB0cl90b191NjQoY3R4KTsKJiM0MzsJYXR0ci50ZXN0LmN0eF9zaXplX2luID0gY3R4X3N6OwomIzQzOwlpZiAoc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfUlVOLCAmYW1wO2F0dHIsCiYjNDM7CQkgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIHRlc3QpKSAmbHQ7IDApIHsKJiM0MzsJCXJldCA9IC1lcnJubzsKJiM0MzsJCWdvdG8gb3V0X3Byb2c7CiYjNDM7CX0KJiM0MzsJKnJhbiA9IHRydWU7CiYjNDM7CXJldCA9IChpbnQpYXR0ci50ZXN0LnJldHZhbDsKJiM0MztvdXRfcHJvZzoKJiM0MzsJY2xvc2UocHJvZ19mZCk7CiYjNDM7b3V0X21hcDoKJiM0MzsJZnJlZShidWYpOwomIzQzOwljbG9zZShtYXBfZmQpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKQomIzQzO3sKJiM0MzsJTElCQlBGX09QVFMoZ2VuX2xvYWRlcl9vcHRzLCBnb3B0cywgLmdlbl9oYXNoID0gdHJ1ZSk7CiYjNDM7CWNoYXIgZGlyX3RtcGxbXSA9ICYjMzQ7L3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYJiMzNDssICpkaXIgPSBOVUxMOwomIzQzOwlpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgbG9hZF9yZXQgPSAwLCByOwomIzQzOwlfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2dfZGVzYyAqcGQ7CiYjNDM7CXN0cnVjdCBicGZfbWFwX2Rlc2MgKm1kOwomIzQzOwl1bnNpZ25lZCBjaGFyICpibG9iID0gTlVMTDsKJiM0MzsJc3RydWN0IGJwZl9wcm9ncmFtICpwOwomIzQzOwlzdHJ1Y3QgYnBmX21hcCAqbTsKJiM0MzsJX191MzIgY3R4X3N6LCBkYXRhX3N6OwomIzQzOwl2b2lkICpjdHggPSBOVUxMOwomIzQzOwlib29sIHJhbiA9IGZhbHNlOwomIzQzOwomIzQzOwlzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksICYjMzQ7a2V5cmluZyYjMzQ7LCAmIzM0O191aWQuMCYjMzQ7LCBOVUxMLAomIzQzOwkJS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTsKJiM0MzsJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CQlybWRpcihkaXIpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2dlbl9sb2FkZXIob2JqLCAmYW1wO2dvcHRzKSwgJiMzNDtnZW5fbG9hZGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2xvYWQob2JqKSwgJiMzNDtnZW5fbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlicGZfb2JqZWN0X19mb3JfZWFjaF9wcm9ncmFtKHAsIG9iaikKJiM0MzsJCW5yX3Byb2dzJiM0MzsmIzQzOzsKJiM0MzsJYnBmX29iamVjdF9fZm9yX2VhY2hfbWFwKG0sIG9iaikKJiM0MzsJCW5yX21hcHMmIzQzOyYjNDM7OwomIzQzOwlpZiAoIUFTU0VSVF9FUShucl9tYXBzLCBleHBlY3RfbWFwcywgJiMzNDtmaXh0dXJlIG1hcCBjb3VudCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwljdHhfc3ogPSBzaXplb2Yoc3RydWN0IGJwZl9sb2FkZXJfY3R4KSAmIzQzOwomIzQzOwkJIG5yX21hcHMgKiBzaXplb2Yoc3RydWN0IGJwZl9tYXBfZGVzYykgJiM0MzsKJiM0MzsJCSBucl9wcm9ncyAqIHNpemVvZihzdHJ1Y3QgYnBmX3Byb2dfZGVzYyk7CiYjNDM7CWN0eCA9IGNhbGxvYygxLCBjdHhfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoY3R4LCAmIzM0O2N0eF9hbGxvYyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwkoKHN0cnVjdCBicGZfbG9hZGVyX2N0eCAqKWN0eCktJmd0O3N6ID0gY3R4X3N6OwomIzQzOwomIzQzOwlkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejsKJiM0MzsJYmxvYiA9IG1hbGxvYyhkYXRhX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsICYjMzQ7YmxvYl9hbGxvYyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwltZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7CiYjNDM7CiYjNDM7CS8qIGV4Y2xfcHJvZ19oYXNoID0gU0hBMjU2KGxvYWRlciBpbnNucykgPT0gdGhlIGxvYWRlciYjMzk7cyBwcm9nLSZndDtkaWdlc3QuICovCiYjNDM7CWxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTsKJiM0MzsKJiM0MzsJciA9IGxvYWR0aW1lX2RyaXZlKGRpciwgZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LAomIzQzOwkJCSAgIGV4Y2wsIGN0eCwgY3R4X3N6LCAmYW1wO2xvYWRfcmV0LCAmYW1wO3Jhbik7CiYjNDM7CUFTU0VSVF9PSyhsb2FkX3JldCwgJiMzNDtzaWduZWQgbG9hZGVyIGxvYWRlZCAoaW5zbnMgfHwgbWV0YWRhdGEpJiMzNDspOwomIzQzOwlBU1NFUlRfVFJVRShyYW4sICYjMzQ7bG9hZGVyIHJhbiYjMzQ7KTsKJiM0MzsJQVNTRVJUX0VRKHIsIDAsICYjMzQ7bG9hZGVyIGluc3RhbGxlZCBpdHMgdGFyZ2V0JiMzNDspOwomIzQzOwomIzQzOwltZCA9IChzdHJ1Y3QgYnBmX21hcF9kZXNjICopKChjaGFyICopY3R4ICYjNDM7IHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTsKJiM0MzsJcGQgPSAoc3RydWN0IGJwZl9wcm9nX2Rlc2MgKikobWQgJiM0MzsgbnJfbWFwcyk7CiYjNDM7CUFTU0VSVF9HVChwZFswXS5wcm9nX2ZkLCAwLCAmIzM0O3RhcmdldCBwcm9ncmFtIGluc3RhbGxlZCYjMzQ7KTsKJiM0MzsJaWYgKG5yX21hcHMpCiYjNDM7CQlBU1NFUlRfR1QobWRbMF0ubWFwX2ZkLCAwLCAmIzM0O3RhcmdldCBtYXAgaW5zdGFsbGVkJiMzNDspOwomIzQzOwomIzQzOwljbG9zZV9sb2FkZXJfY3R4X2ZkcyhjdHgsIG5yX21hcHMsIG5yX3Byb2dzKTsKJiM0MztvdXQ6CiYjNDM7CWZyZWUoYmxvYik7CiYjNDM7CWZyZWUoY3R4KTsKJiM0MzsJaWYgKGRpcikKJiM0MzsJCXJ1bl9zZXR1cCgmIzM0O2NsZWFudXAmIzM0OywgZGlyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfbm9fbWFwKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O3NrZWxfb3BlbiYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJbG9hZHRpbWVfdmVyaWZ5KHNrZWwtJmd0O29iaiwgMCk7CiYjNDM7CXRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgbG9hZHRpbWVfd2l0aF9tYXAodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fb3BlbigpOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDtza2VsX29wZW4mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWxvYWR0aW1lX3ZlcmlmeShza2VsLSZndDtvYmosIDEpOwomIzQzOwl0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgc2lnbmVkIHByb2dyYW0gbmVlZCBub3QgYmluZCBhbnkgbWFwLiBBIHBsYWluIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTAomIzQzOyAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsCiYjNDM7ICogdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSwgZm9sZHMgbm8gbWV0YWRhdGEsIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gRXhlcmNpc2UKJiM0MzsgKiB0aGUgZmRfYXJyYXkgPT0gTlVMTCAvIGZkX2FycmF5X2NudCA9PSAwIHBhdGgsIGFuZCBjb25maXJtIHRoZSBzaWduYXR1cmUKJiM0MzsgKiBzdGlsbCBhdXRoZW50aWNhdGVzIHRoZSBpbnN0cnVjdGlvbnMgKGEgdGFtcGVyZWQgY29weSBpcyByZWplY3RlZCkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKJiM0MzsJCUJQRl9FWElUX0lOU04oKSwKJiM0MzsJfTsKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL3NpZ25lZF9sb2FkZXJYWFhYWFgmIzM0OywgKmRpcjsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MjsKJiM0MzsJdW5pb24gYnBmX2F0dHIgYXR0cjsKJiM0MzsJX191OCBzaWdbODE5Ml07CiYjNDM7CWludCBwcm9nX2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogTm8gbWV0YWRhdGEgbWFwOiB0aGUgc2lnbmVkIHBheWxvYWQgaXMgdGhlIGluc3RydWN0aW9ucyBhbG9uZS4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCAmYW1wO3NpZ19zeiksCiYjNDM7CQkgICAgICAgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CW1lbXNldCgmYW1wO2F0dHIsIDAsIHNpemVvZihhdHRyKSk7CiYjNDM7CWF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMOwomIzQzOwlhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7CiYjNDM7CWF0dHIuaW5zbl9jbnQgPSBBUlJBWV9TSVpFKGluc25zKTsKJiM0MzsJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKJiM0MzsJYXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFOwomIzQzOwlhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTsKJiM0MzsJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejsKJiM0MzsJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwomIzQzOwkvKiBmZF9hcnJheSBhbmQgZmRfYXJyYXlfY250IGRlbGliZXJhdGVseSBsZWZ0IE5VTEwvMC4gKi8KJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O3NpZ25lZF9ub21hcCYjMzQ7LCBzaXplb2YoJiMzNDtzaWduZWRfbm9tYXAmIzM0OykpOwomIzQzOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocHJvZ19mZCwgMCwgJiMzNDttYXAtbGVzcyBzaWduZWQgcHJvZ3JhbSBsb2FkZWQmIzM0OykpIHsKJiM0MzsJCWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsJY2xvc2UocHJvZ19mZCk7CiYjNDM7CiYjNDM7CS8qIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMsIHNvIHRhbXBlcmluZyBtdXN0IGJlIHJlamVjdGVkLiAqLwomIzQzOwlpbnNuc1swXS5pbW0gPSAxOwomIzQzOwlwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAomIzQzOwkJCSAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKJiM0MzsJZXJyID0gcHJvZ19mZCAmbHQ7IDAgPyAtZXJybm8gOiBwcm9nX2ZkOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUtFWVJFSkVDVEVELCAmIzM0O3RhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgcmVhY2ggbWFwcyBvbmx5IHRocm91Z2ggZmRfYXJyYXkgaW5kaWNlcywgc28gdGhlIGtlcm5lbAomIzQzOyAqIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBBIGRpcmVjdCBCUEZfUFNFVURPX01BUF9GRCByZWZlcmVuY2UgLSBhIHJhdywKJiM0MzsgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0gewomIzQzOwkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlclhYWFhYWCYjMzQ7LCAqZGlyOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsJaW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7c2lnX21hcGZkJiMzNDssIDQsIDQsIDEsIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsICYjMzQ7bWFwX2NyZWF0ZSYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaW5zbnNbMF0uaW1tID0gbWFwX2ZkOwkvKiBiYWtlIHRoZSByYXcgbWFwIGZkIGludG8gdGhlIGxkX2ltbTY0ICovCiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlnb3RvIG91dF9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zLCByYXcgbWFwIGZkIGFuZCBhbGwuICovCiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgJmFtcDtzaWdfc3opLAomIzQzOwkJICAgICAgICYjMzQ7c2lnbi1maWxlJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwltZW1zZXQoJmFtcDthdHRyLCAwLCBzaXplb2YoYXR0cikpOwomIzQzOwlhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDsKJiM0MzsJYXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpOwomIzQzOwlhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7CiYjNDM7CWF0dHIubGljZW5zZSA9IHB0cl90b191NjQoJiMzNDtEdWFsIEJTRC9HUEwmIzM0Oyk7CiYjNDM7CWF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTsKJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJLyogTm8gZmRfYXJyYXk6IHRoZSBtYXAgaXMgcmVhY2hlZCBieSBhIHJhdyBmZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLiAqLwomIzQzOwltZW1jcHkoYXR0ci5wcm9nX25hbWUsICYjMzQ7c2lnbmVkX21hcGZkJiMzNDssIHNpemVvZigmIzM0O3NpZ25lZF9tYXBmZCYjMzQ7KSk7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwllcnIgPSBwcm9nX2ZkICZsdDsgMCA/IC1lcnJubyA6IHByb2dfZmQ7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FSU5WQUwsICYjMzQ7c2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7b3V0X21hcDoKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSByZWFjaCBtYXBzIG9ubHkgdGhyb3VnaCB0aGUgY29udGludW91cyBmZF9hcnJheSwgc28gdGhlCiYjNDM7ICoga2VybmVsIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBSZWZlcmVuY2luZyBhIG1hcCBieSBmZF9hcnJheSAqaW5kZXgqCiYjNDM7ICogd2hpbGUgbGVhdmluZyBmZF9hcnJheV9jbnQgYXQgMCBzZWxlY3RzIHRoZSBzcGFyc2UgcGF0aCwgd2hpY2ggcmVzb2x2ZXMgYSBtYXAKJiM0MzsgKiB0aGUgc2lnbmF0dXJlIG5ldmVyIGNvdmVyZWQ7IHRoZSB2ZXJpZmllciByZWplY3RzIGl0IHVwIGZyb250IHdpdGggLUVBQ0NFUy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHsKJiM0MzsJCUJQRl9MRF9JTU02NF9SQVcoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsIDApLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9zcFhYWFhYWCYjMzQ7LCAqZGlyOwomIzQzOwlfX3UzMiBzaWdfc3ogPSA4MTkyOwomIzQzOwl1bmlvbiBicGZfYXR0ciBhdHRyOwomIzQzOwlfX3U4IHNpZ1s4MTkyXTsKJiM0MzsJaW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyOwomIzQzOwomIzQzOwltYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksICYjMzQ7c2lnX3NwYXJzZSYjMzQ7LCA0LCA0LCAxLCBOVUxMKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobWFwX2ZkLCAwLCAmIzM0O21hcF9jcmVhdGUmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJZ290byBvdXRfbWFwOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlnb3RvIG91dF9tYXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lOyB0aGUgc3BhcnNlIG1hcCBpcyBub3QgZm9sZGVkLiAqLwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBzaXplb2YoaW5zbnMpLCBzaWcsICZhbXA7c2lnX3N6KSwKJiM0MzsJCSAgICAgICAmIzM0O3NpZ24tZmlsZSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKJiM0MzsJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7CiYjNDM7CWF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTsKJiM0MzsJYXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpOwomIzQzOwlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwomIzQzOwlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiYjNDM7CWF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KCZhbXA7bWFwX2ZkKTsKJiM0MzsJYXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi8KJiM0MzsJYXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7CiYjNDM7CWF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7CiYjNDM7CWF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORzsKJiM0MzsJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O3NpZ25lZF9zcGFyc2UmIzM0Oywgc2l6ZW9mKCYjMzQ7c2lnbmVkX3NwYXJzZSYjMzQ7KSk7CiYjNDM7CiYjNDM7CXByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiYjNDM7CQkJICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwllcnIgPSBwcm9nX2ZkICZsdDsgMCA/IC1lcnJubyA6IHByb2dfZmQ7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7c2lnbmVkIHByb2dyYW0gYmluZGluZyBhIHNwYXJzZSBmZF9hcnJheSBtYXAgcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7CWlmIChwcm9nX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShwcm9nX2ZkKTsKJiM0MztjbGVhbnVwOgomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7b3V0X21hcDoKJiM0MzsJY2xvc2UobWFwX2ZkKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7CiYjNDM7CQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLAomIzQzOwkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAomIzQzOwkJQlBGX0VYSVRfSU5TTigpLAomIzQzOwl9OwomIzQzOwljaGFyIGRpcl90bXBsW10gPSAmIzM0Oy90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFgmIzM0OywgKmRpcjsKJiM0MzsJaW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkLCBlcnIsIGZkc1syXTsKJiM0MzsJc3RydWN0IGJ0ZiAqYnRmID0gTlVMTDsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MjsKJiM0MzsJdW5pb24gYnBmX2F0dHIgYXR0cjsKJiM0MzsJX191OCBzaWdbODE5Ml07CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJCXJtZGlyKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCAmYW1wO3NpZ19zeiksCiYjNDM7CQkgICAgICAgJiMzNDtzaWduLWZpbGUmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWJ0ZiA9IGJ0Zl9fbmV3X2VtcHR5KCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidGYsICYjMzQ7YnRmX25ld19lbXB0eSYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJYnRmX19hZGRfaW50KGJ0ZiwgJiMzNDtpbnQmIzM0OywgNCwgQlRGX0lOVF9TSUdORUQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgJiMzNDtidGZfbG9hZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJZmRzWzBdID0gLTE7CiYjNDM7CWZkc1sxXSA9IGJ0Zl9fZmQoYnRmKTsKJiM0MzsKJiM0MzsJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKJiM0MzsJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7CiYjNDM7CWF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTsKJiM0MzsJYXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpOwomIzQzOwlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwomIzQzOwlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiYjNDM7CWF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KGZkcyk7CiYjNDM7CWF0dHIuZmRfYXJyYXlfY250ID0gMDsgLyogc3BhcnNlOiBmb3JjZSBsYXp5IGtmdW5jIEJURiByZXNvbHV0aW9uICovCiYjNDM7CWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwomIzQzOwlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwomIzQzOwlhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7CW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtzaWduZWRfa2Z1bmMmIzM0Oywgc2l6ZW9mKCYjMzQ7c2lnbmVkX2tmdW5jJiMzNDspKTsKJiM0MzsKJiM0MzsJcHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsICZhbXA7YXR0ciwKJiM0MzsJCQkgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7CiYjNDM7CWVyciA9IHByb2dfZmQgJmx0OyAwID8gLWVycm5vIDogcHJvZ19mZDsKJiM0MzsJaWYgKHByb2dfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKHByb2dfZmQpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCAmIzM0O21vZHVsZSBrZnVuYyBCVEYgaW4gc2lnbmVkIHByb2dyYW0gcmVqZWN0ZWQmIzM0Oyk7CiYjNDM7Y2xlYW51cDoKJiM0MzsJaWYgKGJ0ZikKJiM0MzsJCWJ0Zl9fZnJlZShidGYpOwomIzQzOwlpZiAobWFwX2ZkICZndDs9IDApCiYjNDM7CQljbG9zZShtYXBfZmQpOwomIzQzOwlydW5fc2V0dXAoJiMzNDtjbGVhbnVwJiMzNDssIGRpcik7CiYjNDM7fQomIzQzOwogdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZCkKIHsKLQlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX2NoZWNrX3NoYXBlJiMzNDspKQotCQltZXRhZGF0YV9jaGVja19zaGFwZSgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xvYWR0aW1lX25vX21hcCYjMzQ7KSkKJiM0MzsJCWxvYWR0aW1lX25vX21hcCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xvYWR0aW1lX3dpdGhfbWFwJiMzNDspKQomIzQzOwkJbG9hZHRpbWVfd2l0aF9tYXAoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX21hdGNoJiMzNDspKQogCQltZXRhZGF0YV9tYXRjaCgpOwotCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfc2hhX21pc21hdGNoJiMzNDspKQotCQltZXRhZGF0YV9zaGFfbWlzbWF0Y2goKTsKLQlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX25vdF9leGNsdXNpdmUmIzM0OykpCi0JCW1ldGFkYXRhX25vdF9leGNsdXNpdmUoKTsKLQlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX2hhc2hfbm90X2NvbXB1dGVkJiMzNDspKQotCQltZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCgpOwogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmF0dXJlX2VuZm9yY2VkJiMzNDspKQogCQlzaWduYXR1cmVfZW5mb3JjZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfbm9uZXhjbF9mZF9hcnJheV9yZWplY3RlZCYjMzQ7KSkKJiM0MzsJCXNpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkKCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCYjMzQ7KSkKJiM0MzsJCXNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O3NpZ25hdHVyZV9mYWlsdXJlX2xvZ3MmIzM0OykpCiYjNDM7CQlzaWduYXR1cmVfZmFpbHVyZV9sb2dzKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfdG9vX2xhcmdlJiMzNDspKQogCQlzaWduYXR1cmVfdG9vX2xhcmdlKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfYmFkX2tleXJpbmcmIzM0OykpCkBAIC0xMTMyLDQgJiM0MzsxNjU3LDEwIEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpCiAJCW1hcF9oYXNoX3Vuc3VwcG9ydGVkX3R5cGUoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xzbV9zaWduYXR1cmVfdmVyZGljdCYjMzQ7KSkKIAkJbHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX25vX2ZkX2FycmF5JiMzNDspKQomIzQzOwkJc2lnbmVkX25vX2ZkX2FycmF5KCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCYjMzQ7KSkKJiM0MzsJCXNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQoKTsKJiM0MzsJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkJiMzNDspKQomIzQzOwkJc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpOwogfQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODMyNAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDY4NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEJQRiBTaWduaW5nIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIEJQRiBzaWduaW5nLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IHNpZ25pZmljYW50IGNoYW5nZSwgdG91Y2hpbmcgc2V2ZXJhbCBrZXkgYXJlYXMuIEkgc2VlIHRoYXQgaXQmIzM5O3MgbW9kaWZ5aW5nIGRvY3VtZW50YXRpb24gKGBEb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdGApLCBpbXBvcnRhbnQgaW5jbHVkZSBmaWxlcyAoYGluY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhgKSwgdGhlIEJQRiBzeXNjYWxsIGhhbmRsZXIgKGBrZXJuZWwvYnBmL3N5c2NhbGwuY2ApLCB0aGUgdmVyaWZpZXIgaXRzZWxmIChga2VybmVsL2JwZi92ZXJpZmllci5jYCksIGFuZCBhIGJ1bmNoIG9mIHRoZSB1c2VyLXNwYWNlIHRvb2xzIChgYnBmdG9vbGAgYW5kIGBsaWJicGZgKS4gVGhpcyBpcyBmYWlybHkgY29tcHJlaGVuc2l2ZS4KClRoZSBjb3JlIG9mIHRoZSBjaGFuZ2Ugc2VlbXMgdG8gYmUgbW92aW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZnJvbSB0aGUgYGJwZl9wcm9nX2xvYWRgIGZ1bmN0aW9uIHRvIHRoZSBgYnBmX2NoZWNrYCBmdW5jdGlvbiB3aXRoaW4gdGhlIHZlcmlmaWVyLiBUaGF0JiMzOTtzIGludGVyZXN0aW5nLCBhbmQgbWFrZXMgc2Vuc2UgbG9naWNhbGx5OyB2ZXJpZmljYXRpb24gc2hvdWxkIGJlIGRvbmUgKmJlZm9yZSogbG9hZGluZywgd2hpY2ggdGhlIHZlcmlmaWVyIGhhbmRsZXMuIEkgc2VlIHRoYXQgdGhlIGBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudmAgc3RydWN0IGlzIGJlaW5nIGV4cGFuZGVkIHRvIGhvbGQgdGhlIHNpZ25hdHVyZSBhbmQgc29tZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciBhcnJheSBpbmZvcm1hdGlvbi4gVGhpcyBpbXBhY3RzIGhvdyB0aGUgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgaW4gYHByb2Nlc3NfZmRfYXJyYXlgLCBhbmQgdGhlcmUgaXMgYSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgZnVuY3Rpb24gYmVpbmcgYWRkZWQgaW4gdGhlIHZlcmlmaWVyIGNvZGUuIFRoYXQgZnVuY3Rpb24gYXBwZWFycyB0byBoYXZlIGJlZW4gKnJlbW92ZWQqIGZyb20gdGhlIHN5c2NhbGwgaGFuZGxlci4gQW5kIHdhaXQsIHRoZSBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZGAgaXMgYWxzbyBtb3ZpbmcgaW50byB0aGUgdmVyaWZpZXIhCgpMZXQgbWUgZHJpbGwgZG93biBpbnRvIHRoZSBga2VybmVsL2JwZi92ZXJpZmllci5jYCBjaGFuZ2VzIGEgYml0IG1vcmUgY2xvc2VseS4gT2theSwgc28gdGhhdCBuZXcgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIG9idmlvdXNseSBpbXBvcnRhbnQuIEFuZCB0aGUgYHByb2Nlc3NfZmRfYXJyYXlgIGZ1bmN0aW9uIGlzIGJlaW5nIG1vZGlmaWVkIHRvIGhhbmRsZSBib3RoIGNvbnRpbnVvdXMgYW5kIHNwYXJzZSBmaWxlIGRlc2NyaXB0b3IgYXJyYXlzLCB0aGF0JiMzOTtzIGdvb2QuIFRoZXkgYXJlIGFkZGluZyBgZmRfYXJyYXlfZ2V0X2J0ZmAgYW5kIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAgZnVuY3Rpb25zLiBQbHVzLCB0aGV5IHNlZW0gdG8gYmUgbWFraW5nIHRoZSB2ZXJpZmljYXRpb24gZGVwZW5kZW50IG9uIHNvbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBIbW0sIHRoYXQgbG9va3MgbGlrZSBpdCB3aWxsIG5lZWQgc29tZSBjaGVja2luZy4KClRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBkZWVwIGluIHRoZSBCUEYgdmVyaWZpZXIgY29yZSwgd2hpY2ggaXMgcmVhbGx5IGltcG9ydGFudC4gVGhhdCBtZWFucyBpdCBuZWVkcyByb2J1c3QgZnV6emluZywgZGVmaW5pdGVseS4gTGV0IG1lIGlkZW50aWZ5IHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9ucyB0byBmb2N1cyBvbiBmb3IgZnV6emluZy4gSXQmIzM5O2xsIGJlOgoKKiAgIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCAob2J2aW91c2x5KQoqICAgYHByb2Nlc3NfZmRfYXJyYXlgIGFuZCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCAoYmVjYXVzZSB0aGV5IGFyZSBoYW5kbGluZyB0aGUgZmlsZSBkZXNjcmlwdG9yIGFycmF5cykuCiogICBgZmRfYXJyYXlfZ2V0X2J0ZmAgYW5kIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAgKHRoZXkgaGFuZGxlIHRoZSBhcnJheSByZXRyaWV2YWwsIHdoaWNoIGNvdWxkIGJlIGVycm9yIHByb25lKQoqICAgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YAoKSSBzaG91bGQgYWxzbyBjaGVjayB3aGF0IEtjb25maWcgb3B0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZW5hYmxlIEJQRiBzaWduaW5nLiBEb2VzIGl0IGRlcGVuZCBvbiwgc2F5LCBgQ09ORklHX0JQRmAsIGBDT05GSUdfS0VZU2AsIG9yIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYD8gTGV0IG1lIGdyZXAgdGhyb3VnaCB0aGUgY29kZSB0byBmaW5kIG91dC4KCk9rYXksIGxldCYjMzk7cyBzZWUsIGluIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AsIEkgc2VlIGEgY2FsbCB0byBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgLiBBbHJpZ2h0LCBsZXQgbWUgdHJhY2sgZG93biB3aGVyZSB0aGF0IGZ1bmN0aW9uIGlzIGRlZmluZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9icGYuaD0zODIzPXZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpO1xuaW5jbHVkZS9saW51eC9icGYuaDozODI0OmludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxuaW5jbHVkZS9saW51eC9icGYuaC0zODI1LVx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG4tLVxuaW5jbHVkZS9saW51eC9icGYuaD0zODQzPXN0YXRpYyBpbmxpbmUgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcbi0tXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM4NDYtXG5pbmNsdWRlL2xpbnV4L2JwZi5oOjM4NDc6c3RhdGljIGlubGluZSBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbmluY2x1ZGUvbGludXgvYnBmLmgtMzg0OC1cdFx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDI5Nz1fX2JwZl9rZnVuYyB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzA2OiAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMwNy0gKiBAZGF0YV9wOiBkYXRhIHRvIHZlcmlmeVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTUtICovXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzE2Ol9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQ4NTY9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rZXlfcHV0LCBLRl9SRUxFQVNFKVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDg1ODpCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUsIEtGX1NMRUVQQUJMRSlcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTktI2VuZGlmXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5ODk3PXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk4OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTk5MDpcdGVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNmRhdGFfcHRyLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5OTkxLVx0XHRcdFx0XHQgKHN0cnVjdCBicGZfZHlucHRyICopXHUwMDI2c2lnX3B0ciwga2V5KTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oPTc3PWV4dGVybiB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICprZXkpIF9fa3N5bTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfa2Z1bmNzLmg6Nzg6ZXh0ZXJuIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wdHIsXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oLTc5LVx0XHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wdHIsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM9MjI9c3RhdGljIGludCBsaWJicGZfcHJpbnRfY2IoZW51bSBsaWJicGZfcHJpbnRfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCxcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYy0yNy1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jOjI4Olx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXCYjMzQ7YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcJiMzNDspKVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjktXHRcdHJldHVybiAwO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL2tmdW5jX2R5bnB0cl9wYXJhbS5jPTM1PXN0YXRpYyBib29sIGhhc19wa2NzN19rZnVuY19zdXBwb3J0KHZvaWQpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTItXHRcdGZwcmludGYoc3RkZXJyLFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM6NTM6XHRcdCAgXCYjMzQ7JXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXG5cJiMzNDssXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYy01NC1cdFx0ICBfX2Z1bmNfXyk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jPTQ2PXN0YXRpYyBpbnQgbGliYnBmX3ByaW50X2NiKGVudW0gbGliYnBmX3ByaW50X2xldmVsIGxldmVsLCBjb25zdCBjaGFyICpmbXQsXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTU0LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jOjU1Olx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXCYjMzQ7YnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcJiMzNDspKVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTU2LVx0XHRyZXR1cm4gMDtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM9MjQyPXN0YXRpYyB2b2lkIHRlc3RfdmVyaWZ5X3BrY3M3X3NpZ19mcm9tX21hcCh2b2lkKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy0yNzMtXHRcdHByaW50ZihcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYzoyNzQ6XHRcdCAgXCYjMzQ7JXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXG5cJiMzNDssXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmMtMjc1LVx0XHQgIF9fZnVuY19fKTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYz0zND1pbnQgQlBGX1BST0cobm90X3ZhbGlkX2R5bnB0ciwgaW50IGNtZCwgdW5pb24gYnBmX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCBzaXplLCBib29sIGtlcm5lbClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYy0zNy1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jOjM4Olx0cmV0dXJuIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnZhbCxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTM5LVx0XHRcdFx0XHQgIChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnZhbCwgTlVMTCk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM9NDQ9aW50IEJQRl9QUk9HKG5vdF9wdHJfdG9fc3RhY2ssIGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBrZXJuZWwpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNDctXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYzo0ODpcdHJldHVybiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShcdTAwMjZ2YWwsIFx1MDAyNnZhbCwgTlVMTCk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYy00OS19XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM9NTI9aW50IEJQRl9QUk9HKGR5bnB0cl9kYXRhX251bGwsIGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBrZXJuZWwpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNzQtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYzo3NTpcdGVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFx1MDAyNnB0ciwgXHUwMDI2cHRyLCB0cnVzdGVkX2tleXJpbmcpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNzYtXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnX2luX3hhdHRyLmM9NDY9aW50IEJQRl9QUk9HKHRlc3RfZmlsZV9vcGVuLCBzdHJ1Y3QgZmlsZSAqZilcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWdfaW5feGF0dHIuYy03OS1cdC8qIFZlcmlmeSBzaWduYXR1cmUgKi9cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jOjgwOlx0cmV0ID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXHUwMDI2ZGlnZXN0X3B0ciwgXHUwMDI2c2lnX3B0ciwgdHJ1c3RlZF9rZXlyaW5nKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jLTgxLVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3ZlcmlmeV9wa2NzN19zaWcuYz00MD1pbnQgQlBGX1BST0coYnBmLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3ZlcmlmeV9wa2NzN19zaWcuYy04My1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3ZlcmlmeV9wa2NzN19zaWcuYzo4NDpcdHJldCA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFx1MDAyNmRhdGFfcHRyLCBcdTAwMjZzaWdfcHRyLCB0cnVzdGVkX2tleXJpbmcpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jLTg1LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQyMTIyCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgQlBGIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKgoKT2theSwgc28gYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBpcyBsb2NhdGVkIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AsIGFuZCBJIHNlZSBpdCYjMzk7cyBvbmx5IGluY2x1ZGVkIHdoZW4gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGVuYWJsZWQuIFRoYXQgbWFrZXMgc2Vuc2UsIGtlZXBpbmcgdGhpbmdzIG1vZHVsYXIuIE5vdywgaGVyZSYjMzk7cyB3aGVyZSBpdCBnZXRzIGludGVyZXN0aW5nLiBJIHJlbWVtYmVyIHNlZWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsIGFuZCBJICp0aGluayogaXQgY2FsbHMgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4gQnV0IHRoZSBrZXkgcXVlc3Rpb24gZm9yIG1lIGlzOiBpcyB0aGlzIGRlcGVuZGVuY3kgKmFsd2F5cyogcHJlc2VudCB3aGVuIEkgZXhwZWN0IGl0PyBJIG5lZWQgdG8gcXVpY2tseSBjb25maXJtIHdoZXRoZXIgdGhlIHZlcmlmaWVyIGNvZGUgaGFzIGEgY29uZGl0aW9uYWwgb24gaXRzIHNpZGUuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNvZGUgaW4gYm90aCBga2VybmVsL2JwZi92ZXJpZmllci5jYCBhbmQgYGtlcm5lbC9icGYvaGVscGVycy5jYCB0byBiZSBjb21wbGV0ZWx5IHN1cmUgb2YgdGhlIGNhbGwmIzM5O3MgYXZhaWxhYmlsaXR5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmM9NDI5Nz1fX2JwZl9rZnVuYyB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzA2OiAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMwNy0gKiBAZGF0YV9wOiBkYXRhIHRvIHZlcmlmeVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTUtICovXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzE2Ol9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQ4NTY9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rZXlfcHV0LCBLRl9SRUxFQVNFKVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDg1ODpCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUsIEtGX1NMRUVQQUJMRSlcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTktI2VuZGlmXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5ODk3PXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk4OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTk5MDpcdGVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNmRhdGFfcHRyLFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5OTkxLVx0XHRcdFx0XHQgKHN0cnVjdCBicGZfZHlucHRyICopXHUwMDI2c2lnX3B0ciwga2V5KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjkzMwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHN1bW1hcnksIHByZXNlbnRlZCBhcyBhIHN0cmVhbSBvZiB0aG91Z2h0OgoKKipDaGVja2luZyB0aGUgQlBGIENvZGUqKgoKQWxyaWdodCwgSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIHRoaXMuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGRpdmUgaW50byB0aGUga2VybmVsIGhlYWRlcnMg4oCTIHNwZWNpZmljYWxseSwgYGluY2x1ZGUvbGludXgvYnBmLmhgLiBJJiMzOTttIGludGVyZXN0ZWQgaW4gdW5kZXJzdGFuZGluZyBob3cgdGhpcyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIG9yLCBhdCB0aGUgdmVyeSBsZWFzdCwgZGVmaW5lZC4gSSYjMzk7bSBnb2luZyB0byBsb29rIGZvciB0aGUgZGVjbGFyYXRpb24gYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gb3IgY29tbWVudHMgdGhhdCBtaWdodCBwcm92aWRlIGNsdWVzIGFib3V0IGl0cyBwdXJwb3NlLCBhcmd1bWVudHMsIHJldHVybiB2YWx1ZXMsIGFuZCBob3cgaXQgZml0cyBpbnRvIHRoZSBicm9hZGVyIEJQRiBlY29zeXN0ZW0uIEkgZXhwZWN0IHRoaXMgaGVhZGVyIHRvIGxheSB0aGUgZ3JvdW5kd29yaywgb3V0bGluaW5nIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgYW5kIGFueSByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBpdCB1dGlsaXplcy4gSG9wZWZ1bGx5LCB0aGUgaGVhZGVyIGZpbGUgaW5jbHVkZXMgc29tZSByZWxldmFudCBpbmxpbmUgZG9jdW1lbnRhdGlvbiB0aGF0IGNhbiBjbGFyaWZ5IGl0cyByb2xlIGluIHRoZSBzeXN0ZW0uIEkgYWxzbyB3YW50IHRvIHNlZSBpZiB0aGUgZnVuY3Rpb24gaXMgZXhwb3J0ZWQsIG9yIGlmIGl0IGlzIGludGVybmFsIHRvIHRoZSBCUEYgc3Vic3lzdGVtLiBMZXQmIzM5O3Mgc3RhcnQgdGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2JwZi5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzgyMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDszODIwOlx0I2lmIGRlZmluZWQoQ09ORklHX0tFWVMpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClcbjM4MjE6XHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleShzMzIgc2VyaWFsLCB1NjQgZmxhZ3MpO1xuMzgyMjpcdHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTtcbjM4MjM6XHR2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTtcbjM4MjQ6XHRpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbjM4MjU6XHRcdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuMzgyNjpcdFx0XHRcdCAgICAgICBzdHJ1Y3QgYnBmX2tleSAqdHJ1c3RlZF9rZXlyaW5nKTtcbjM4Mjc6XHRcbjM4Mjg6XHRzdGF0aWMgaW5saW5lIHMzMiBicGZfa2V5X3NlcmlhbChjb25zdCBzdHJ1Y3QgYnBmX2tleSAqa2V5KVxuMzgyOTpcdHtcbjM4MzA6XHRcdHJldHVybiBrZXktXHUwMDNlaGFzX3JlZiA/IGtleS1cdTAwM2VrZXktXHUwMDNlc2VyaWFsIDogMDtcbjM4MzE6XHR9XG4zODMyOlx0I2Vsc2VcbjM4MzM6XHRzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3VzZXJfa2V5KHUzMiBzZXJpYWwsIHU2NCBmbGFncylcbjM4MzQ6XHR7XG4zODM1Olx0XHRyZXR1cm4gTlVMTDtcbjM4MzY6XHR9XG4zODM3Olx0XG4zODM4Olx0c3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZClcbjM4Mzk6XHR7XG4zODQwOlx0XHRyZXR1cm4gTlVMTDtcbjM4NDE6XHR9XG4zODQyOlx0XG4zODQzOlx0c3RhdGljIGlubGluZSB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxuMzg0NDpcdHtcbjM4NDU6XHR9XG4zODQ2Olx0XG4zODQ3Olx0c3RhdGljIGlubGluZSBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcbjM4NDg6XHRcdFx0XHRcdFx0ICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG4zODQ5Olx0XHRcdFx0XHRcdCAgICAgc3RydWN0IGJwZl9rZXkgKnRydXN0ZWRfa2V5cmluZylcbjM4NTA6XHR7XG4zODUxOlx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4zODUyOlx0fVxuMzg1MzpcdFxuMzg1NDpcdHN0YXRpYyBpbmxpbmUgczMyIGJwZl9rZXlfc2VyaWFsKGNvbnN0IHN0cnVjdCBicGZfa2V5ICprZXkpXG4zODU1Olx0e1xuMzg1NjpcdFx0cmV0dXJuIDA7XG4zODU3Olx0fVxuMzg1ODpcdCNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19LRVlTKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfQlBGX1NZU0NBTEwpICovXG4zODU5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDM4NTEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiA4MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0IG1lIHRoaW5rIHRoaXMgdGhyb3VnaC4KCioqSW52ZXN0aWdhdGluZyB0aGUgRGVwZW5kZW5jeSBvZiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSoqCgpBbHJpZ2h0LCBzbyB0aGUgZnVuY3Rpb24gYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBkZXBlbmRzIG9uIGBDT05GSUdfS0VZU2AsIHRoYXQmIzM5O3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEl0IHNlZW1zIHBvaW50bGVzcyBpZiBpdCYjMzk7cyBub3QgYWN0dWFsbHkgaW5jbHVkZWQgd2hlbiB0aGUga2VybmVsIGlzIGJ1aWx0LgoKTXkgZmlyc3QgdGhvdWdodCBpcyB0byBjaGVjayB3aGVyZSBpdCYjMzk7cyBkZWZpbmVkLiBSaWdodCwgaXQmIzM5O3MgaW4gYGtlcm5lbC9icGYvaGVscGVycy5jYC4gTm93LCB0aGUga2V5IGlzIGZpZ3VyaW5nIG91dCB0aGUgYnVpbGQgcHJvY2Vzcy4gSSBuZWVkIHRvIGRldGVybWluZSB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGF0IHBhcnRpY3VsYXIgZmlsZSBpcyBjb21waWxlZC4gV2hlcmUgd291bGQgSSBmaW5kIHRoYXQ/IFRoZSBgTWFrZWZpbGVgIGluIHRoZSBga2VybmVsL2JwZmAgZGlyZWN0b3J5IGlzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IGxvb2tpbmcsIG9yIHBlcmhhcHMgdGhlIGBoZWxwZXJzLmNgIGZpbGUgaXRzZWxmIGNvbnRhaW5zIGhpbnRzLiBUaW1lIHRvIGRpdmUgaW50byB0aG9zZSBhbmQgdHJhY2UgdGhlIGJ1aWxkIGRlcGVuZGVuY2llcy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBidWlsZCBzeXN0ZW0gdGVsbHMgdXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmM9NDI5Nz1fX2JwZl9rZnVuYyB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzA2OiAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMwNy0gKiBAZGF0YV9wOiBkYXRhIHRvIHZlcmlmeVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTUtICovXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzE2Ol9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cdFx0XHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQ4NTY9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9rZXlfcHV0LCBLRl9SRUxFQVNFKVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDg1ODpCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUsIEtGX1NMRUVQQUJMRSlcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTktI2VuZGlmXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ0NTE1CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogNzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqSW52ZXN0aWdhdGluZyB0aGUgQlBGIFZlcmlmaWNhdGlvbiBMb2dpYyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbi4gSSYjMzk7bSB0YWtpbmcgYSBsb29rIGF0IGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgd2l0aGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AuIE15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtXYWl0IGEgc2Vjb25kLCBpc24mIzM5O3QgdGhpcyBmdW5jdGlvbiYjMzk7cyBhdmFpbGFiaWxpdHkgY29udHJvbGxlZCBieSB0aGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgYCNpZiBkZWZpbmVkKENPTkZJR19LRVlTKSAmYW1wOyZhbXA7IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKWA/JiMzNDsgVGhhdCYjMzk7cyBhIGtleSBkZXRhaWwgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IuIFRvIGNvbmZpcm0gbXkgc3VzcGljaW9uIGFuZCBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSSBuZWVkIHRvIHNlZSB3aGVyZSB0aGVzZSBjb25kaXRpb25zIGFyZSBhcHBsaWVkLCBlc3BlY2lhbGx5IHRvIHRoZSBjb2RlIHN1cnJvdW5kaW5nIHRoZSBkZWNsYXJhdGlvbiBhbmQgdXNlIG9mIHRoaXMgZnVuY3Rpb24uIFNvLCBJJiMzOTttIGdvaW5nIHRvIG5hdmlnYXRlIHRvIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AgYW5kIHNwZWNpZmljYWxseSBwaW5wb2ludCBhcm91bmQgbGluZSA0MzE2LiBUaGF0IHNob3VsZCByZXZlYWwgd2hldGhlciB0aGUgcHJlcHJvY2Vzc29yIGxvZ2ljIGlzIGFwcGxpZWQsIGFuZCBjbGFyaWZ5IHRoZSBjb250ZXh0IHdpdGhpbiB3aGljaCB0aGlzIFBLQ1M3IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcm91dGluZSBhY3R1YWxseSBmdW5jdGlvbnMuIFRoaXMgd2lsbCBoZWxwIG1lIHVuZGVyc3RhbmQgaXRzIGRlcGVuZGVuY2llcyBhbmQgd2hldGhlciBpdCYjMzk7cyBlbmFibGVkIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MzAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQzMDA6XHRcdFx0a2V5X3B1dChia2V5LVx1MDAzZWtleSk7XG40MzAxOlx0XG40MzAyOlx0XHRrZnJlZShia2V5KTtcbjQzMDM6XHR9XG40MzA0Olx0XG40MzA1Olx0LyoqXG40MzA2Olx0ICogYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUgLSB2ZXJpZnkgYSBQS0NTIzcgc2lnbmF0dXJlXG40MzA3Olx0ICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcbjQzMDg6XHQgKiBAc2lnX3A6IHNpZ25hdHVyZSBvZiB0aGUgZGF0YVxuNDMwOTpcdCAqIEB0cnVzdGVkX2tleXJpbmc6IGtleXJpbmcgd2l0aCBrZXlzIHRydXN0ZWQgZm9yIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbjQzMTA6XHQgKlxuNDMxMTpcdCAqIFZlcmlmeSB0aGUgUEtDUyM3IHNpZ25hdHVyZSAqc2lnX3B0ciogYWdhaW5zdCB0aGUgc3VwcGxpZWQgKmRhdGFfcHRyKlxuNDMxMjpcdCAqIHdpdGgga2V5cyBpbiBhIGtleXJpbmcgcmVmZXJlbmNlZCBieSAqdHJ1c3RlZF9rZXlyaW5nKi5cbjQzMTM6XHQgKlxuNDMxNDpcdCAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLlxuNDMxNTpcdCAqL1xuNDMxNjpcdF9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxuNDMxNzpcdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG40MzE4Olx0XHRcdFx0ICAgICAgIHN0cnVjdCBicGZfa2V5ICp0cnVzdGVkX2tleXJpbmcpXG40MzE5Olx0e1xuNDMyMDpcdCNpZmRlZiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG40MzIxOlx0XHRjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpkYXRhX3B0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopZGF0YV9wO1xuNDMyMjpcdFx0Y29uc3Qgc3RydWN0IGJwZl9keW5wdHJfa2VybiAqc2lnX3B0ciA9IChzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICopc2lnX3A7XG40MzIzOlx0XHRjb25zdCB2b2lkICpkYXRhLCAqc2lnO1xuNDMyNDpcdFx0dTMyIGRhdGFfbGVuLCBzaWdfbGVuO1xuNDMyNTpcdFx0aW50IHJldDtcbjQzMjY6XHRcbjQzMjc6XHRcdGlmICh0cnVzdGVkX2tleXJpbmctXHUwMDNlaGFzX3JlZikge1xuNDMyODpcdFx0XHQvKlxuNDMyOTpcdFx0XHQgKiBEbyB0aGUgcGVybWlzc2lvbiBjaGVjayBkZWZlcnJlZCBpbiBicGZfbG9va3VwX3VzZXJfa2V5KCkuXG40MzMwOlx0XHRcdCAqIFNlZSBicGZfbG9va3VwX3VzZXJfa2V5KCkgZm9yIG1vcmUgZGV0YWlscy5cbjQzMzE6XHRcdFx0ICpcbjQzMzI6XHRcdFx0ICogQSBjYWxsIHRvIGtleV90YXNrX3Blcm1pc3Npb24oKSBoZXJlIHdvdWxkIGJlIHJlZHVuZGFudCwgYXNcbjQzMzM6XHRcdFx0ICogaXQgaXMgYWxyZWFkeSBkb25lIGJ5IGtleXJpbmdfc2VhcmNoKCkgY2FsbGVkIGJ5XG40MzM0Olx0XHRcdCAqIGZpbmRfYXN5bW1ldHJpY19rZXkoKS5cbjQzMzU6XHRcdFx0ICovXG40MzM2Olx0XHRcdHJldCA9IGtleV92YWxpZGF0ZSh0cnVzdGVkX2tleXJpbmctXHUwMDNla2V5KTtcbjQzMzc6XHRcdFx0aWYgKHJldCBcdTAwM2MgMClcbjQzMzg6XHRcdFx0XHRyZXR1cm4gcmV0O1xuNDMzOTpcdFx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NTUwMAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKktlcm5lbCBDb25maWd1cmF0aW9uIGFuZCBTaWduYXR1cmUgVmVyaWZpY2F0aW9uKioKClJpZ2h0LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGlzIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgZnVuY3Rpb24sIGFuZCBpdCBsb29rcyBsaWtlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBhYnNvbHV0ZWx5ICpjcml0aWNhbCogZm9yIGl0IHRvIGFjdHVhbGx5IGRvIGFueXRoaW5nIG1lYW5pbmdmdWwuIElmIHRoYXQmIzM5O3Mgbm90IGVuYWJsZWQsIEkmIzM5O20gYmV0dGluZyBpdCBqdXN0IGJhaWxzIG91dCB3aXRoIGFuIGAtRU9QTk9UU1VQUGAgb3Igc2ltaWxhciBlcnJvciBjb2RlLCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgdGhlIHNpZ25hdHVyZSBjaGVjay4gTm8gcG9pbnQgaW4gcHJvY2VlZGluZyB3aXRob3V0IHRoYXQsIHJpZ2h0PyBOb3csIGxldCBtZSBxdWlja2x5IGdsYW5jZSBhdCB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgZW5zdXJlIHRoYXQgSSBkaWQgbm90IG1pc3MgYW55dGhpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0MzQwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzQzNDA6XHRcbjQzNDE6XHRcdGRhdGFfbGVuID0gX19icGZfZHlucHRyX3NpemUoZGF0YV9wdHIpO1xuNDM0MjpcdFx0ZGF0YSA9IF9fYnBmX2R5bnB0cl9kYXRhKGRhdGFfcHRyLCBkYXRhX2xlbik7XG40MzQzOlx0XHRpZiAoIWRhdGEpXG40MzQ0Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuNDM0NTpcdFxuNDM0NjpcdFx0c2lnX2xlbiA9IF9fYnBmX2R5bnB0cl9zaXplKHNpZ19wdHIpO1xuNDM0NzpcdFx0c2lnID0gX19icGZfZHlucHRyX2RhdGEoc2lnX3B0ciwgc2lnX2xlbik7XG40MzQ4Olx0XHRpZiAoIXNpZylcbjQzNDk6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG40MzUwOlx0XG40MzUxOlx0XHRyZXR1cm4gdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShkYXRhLCBkYXRhX2xlbiwgc2lnLCBzaWdfbGVuLFxuNDM1MjpcdFx0XHRcdFx0ICAgICAgdHJ1c3RlZF9rZXlyaW5nLVx1MDAzZWtleSxcbjQzNTM6XHRcdFx0XHRcdCAgICAgIFZFUklGWUlOR19CUEZfU0lHTkFUVVJFLCBOVUxMLFxuNDM1NDpcdFx0XHRcdFx0ICAgICAgTlVMTCk7XG40MzU1Olx0I2Vsc2VcbjQzNTY6XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjQzNTc6XHQjZW5kaWYgLyogQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTiAqL1xuNDM1ODpcdH1cbjQzNTk6XHQjZW5kaWYgLyogQ09ORklHX0tFWVMgKi9cbjQzNjA6XHRcbjQzNjE6XHR0eXBlZGVmIGludCAoKmJwZl90YXNrX3dvcmtfY2FsbGJhY2tfdCkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSk7XG40MzYyOlx0XG40MzYzOlx0ZW51bSBicGZfdGFza193b3JrX3N0YXRlIHtcbjQzNjQ6XHRcdC8qIGJwZl90YXNrX3dvcmsgaXMgcmVhZHkgdG8gYmUgdXNlZCAqL1xuNDM2NTpcdFx0QlBGX1RXX1NUQU5EQlkgPSAwLFxuNDM2NjpcdFx0LyogaXJxIHdvcmsgc2NoZWR1bGluZyBpbiBwcm9ncmVzcyAqL1xuNDM2NzpcdFx0QlBGX1RXX1BFTkRJTkcsXG40MzY4Olx0XHQvKiB0YXNrIHdvcmsgc2NoZWR1bGluZyBpbiBwcm9ncmVzcyAqL1xuNDM2OTpcdFx0QlBGX1RXX1NDSEVEVUxJTkcsXG40MzcwOlx0XHQvKiB0YXNrIHdvcmsgaXMgc2NoZWR1bGVkIHN1Y2Nlc3NmdWxseSAqL1xuNDM3MTpcdFx0QlBGX1RXX1NDSEVEVUxFRCxcbjQzNzI6XHRcdC8qIGNhbGxiYWNrIGlzIHJ1bm5pbmcgKi9cbjQzNzM6XHRcdEJQRl9UV19SVU5OSU5HLFxuNDM3NDpcdFx0LyogYXNzb2NpYXRlZCBCUEYgbWFwIHZhbHVlIGlzIGRlbGV0ZWQgKi9cbjQzNzU6XHRcdEJQRl9UV19GUkVFRCxcbjQzNzY6XHR9O1xuNDM3NzpcdFxuNDM3ODpcdHN0cnVjdCBicGZfdGFza193b3JrX2N0eCB7XG40Mzc5Olx0XHRlbnVtIGJwZl90YXNrX3dvcmtfc3RhdGUgc3RhdGU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ2MzYzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGZyb20gbXkgZXhwZXJ0IHBlcnNwZWN0aXZlOgoKKipLZXJuZWwgQ29uZmlndXJhdGlvbiBhbmQgQlBGIFZlcmlmaWNhdGlvbioqCgpSaWdodCwgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGFic29sdXRlbHkgY3J1Y2lhbC4gV2UgbmVlZCB0aGF0IGVuYWJsZWQuIEJ1dCBob2xkIG9uIGEgc2Vjb25kLi4uIEkgcmVjYWxsIHNlZWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIEFuZCB0aGF0IGZ1bmN0aW9uLCBpZiBtZW1vcnkgc2VydmVzLCBjYWxscyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgLiBOb3csIHRoYXQmIzM5O3MgaW50ZXJlc3RpbmcuIEdpdmVuIHRoZSBjb250ZXh0LCBJIHNob3VsZCBxdWlja2x5IHZlcmlmeSBpZiB0aGUgdXNlIG9mIHRob3NlIHNpZ25hdHVyZSBmdW5jdGlvbnMgaXMgc29tZWhvdyBjb25kaXRpb25hbC4gU28sIGxldCBtZSBqdXN0IGRvdWJsZS1jaGVjayB0aGUgY29kZSwgc3BlY2lmaWNhbGx5IGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLCB0byBzZWUgaWYgdGhlIGNhbGxzIHRvIHRob3NlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25zIGFyZSBndWFyZGVkIGJ5IGFub3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb24gb3Igc29tZSBvdGhlciBsb2dpYy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGZ1bGwgY29udGV4dCBoZXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvdmVyaWZpZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5ODkwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5ODkwOlx0ICogb25jZSB0aGUgcHJvZ3JhbSYjMzk7cyBtZXRhZGF0YSBtYXBzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvIHVzZWRfbWFwcywgc29cbjE5ODkxOlx0ICogdGhlIGV4YWN0IG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlIG9uZXMgdGhlIHByb2dyYW0gYmluZHMuXG4xOTg5MjpcdCAqXG4xOTg5MzpcdCAqIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgdGhlIGZyb3plbiBjb250ZW50cyBvZlxuMTk4OTQ6XHQgKiBlYWNoIG1hcCwgaW4gQG1hcHMgb3JkZXI6IGluc25zIHx8IG1hcF8wIHx8IG1hcF8xIHx8IFsuLi5dLiBPbiBzdWNjZXNzIHRoZVxuMTk4OTU6XHQgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctXHUwMDNlYXV4LlxuMTk4OTY6XHQgKi9cbjE5ODk3Olx0c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4xOTg5ODpcdFx0XHRcdFx0ICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpXG4xOTg5OTpcdHtcbjE5OTAwOlx0XHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XG4xOTkwMTpcdFx0c3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBkYXRhX3B0cjtcbjE5OTAyOlx0XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtXHUwMDNlcHJvZztcbjE5OTAzOlx0XHRzdHJ1Y3QgYnBmX21hcCAqKm1hcHMgPSBlbnYtXHUwMDNldXNlZF9tYXBzO1xuMTk5MDQ6XHRcdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xuMTk5MDU6XHRcdHZvaWQgKnNpZywgKmRhdGEgPSBOVUxMO1xuMTk5MDY6XHRcdHUzMiBtYXBfY250ID0gZW52LVx1MDAzZXVzZWRfbWFwX2NudDtcbjE5OTA3Olx0XHR1MzIgaSwgb2ZmLCBpbnNuc19zejtcbjE5OTA4Olx0XHR1NjQgZGF0YV9zejtcbjE5OTA5Olx0XHRpbnQgZXJyID0gMDtcbjE5OTEwOlx0XG4xOTkxMTpcdFx0LypcbjE5OTEyOlx0XHQgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuMTk5MTM6XHRcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxuMTk5MTQ6XHRcdCAqL1xuMTk5MTU6XHRcdGlmIChhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxuMTk5MTY6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4xOTkxNzpcdFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkgPT0gMClcbjE5OTE4Olx0XHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuMTk5MTk6XHRcdGVsc2VcbjE5OTIwOlx0XHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbjE5OTIxOlx0XHRpZiAoIWtleSkge1xuMTk5MjI6XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2Nhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXG5cJiMzNDssXG4xOTkyMzpcdFx0XHRcdGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4xOTkyNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjE5OTI1Olx0XHR9XG4xOTkyNjpcdFxuMTk5Mjc6XHRcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbjE5OTI4Olx0XHRpZiAoSVNfRVJSKHNpZykpIHtcbjE5OTI5Olx0XHRcdGJwZl9rZXlfcHV0KGtleSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3NDIwCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjQ5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jeSBBbmFseXNpcyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgaG93IHRoaXMgQlBGIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd29ya3MuIElmIGBDT05GSUdfS0VZU2AgaXNuJiMzOTt0IGVuYWJsZWQsIHRoZW4gdGhlIGtleSBsb29rdXAgZnVuY3Rpb25zLCBgYnBmX2xvb2t1cF9zeXN0ZW1fa2V5YCBhbmQgYGJwZl9sb29rdXBfdXNlcl9rZXlgLCBhcmUgZ29pbmcgdG8gcmV0dXJuIGBOVUxMYC4gVGhhdCYjMzk7cyBhIHByb2JsZW0gYmVjYXVzZSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdGhlbiByZXR1cm5zIGAtRUlOVkFMYC4gU28sIGNsZWFybHksIEkgbmVlZCBgQ09ORklHX0tFWVNgLiBBbmQgc2luY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBzaWduYXR1cmVzLCBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgYWxzbyBlc3NlbnRpYWwuCgpIb2xkIG9uLCBJJiMzOTt2ZSBhbHJlYWR5IGNvbmZpcm1lZCB0aGF0IGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIGVuYWJsZWQuIEFyZSB0aGVyZSBhbnkgb3RoZXIgcmVxdWlyZWQgY29uZmlndXJhdGlvbnM/IEkmIzM5O2QgYmV0dGVyIGNoZWNrIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaW4gYGluY2x1ZGUvbGludXgvYnBmLmhgLiBBaCwgcmlnaHQsIGl0JiMzOTtzIGRlZmluZWQgd2l0aCBhIGAjaWYgZGVmaW5lZChDT05GSUdfS0VZUykgJmFtcDsmYW1wOyBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClgLiBUaGF0IGNvbmZpcm1zIG15IGZpcnN0IHRob3VnaHQ6IEkgKm5lZWQqIGBDT05GSUdfS0VZU2AuCgpBbHNvLCBJJiMzOTttIHByZXR0eSBzdXJlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGZyb20gcmV0dXJuaW5nIGAtRU9QTk9UU1VQUGAuIFRoYXQmIzM5O3MgdGhlIGV4cGVjdGVkIGJlaGF2aW9yLiBXYWl0LCBpc24mIzM5O3QgdGhhdCBmdW5jdGlvbiBkZWZpbmVkIGluIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2A/IExldCYjMzk7cyB2ZXJpZnkuIFllYWgsIGl0JiMzOTtzIHRoZXJlLCBidXQgaXQmIzM5O3MgZ3VhcmRlZCBieSBgI2lmZGVmIENPTkZJR19LRVlTYCwgc28gdGhhdCBsb29rcyBjb3JyZWN0LiBJIHRoaW5rIEkgd2lsbCBkb3VibGUgY2hlY2sgYGtlcm5lbC9icGYvaGVscGVycy5jYCB0byBtYWtlIGNlcnRhaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0NPTkZJR19LRVlTJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9oZWxwZXJzLmM9NDE5Mj1fX2JwZl9rZnVuYyBpbnQgYnBmX3N0cm5jYXNlc3RyKGNvbnN0IGNoYXIgKnMxX19pZ24sIGNvbnN0IGNoYXIgKnMyX19pZ24sXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDE5Ny1cbmtlcm5lbC9icGYvaGVscGVycy5jOjQxOTg6I2lmZGVmIENPTkZJR19LRVlTXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MTk5LS8qKlxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQzMTY9X19icGZfa2Z1bmMgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDM1OC19XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzU5OiNlbmRpZiAvKiBDT05GSUdfS0VZUyAqL1xua2VybmVsL2JwZi9oZWxwZXJzLmMtNDM2MC1cbi0tXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00ODUxPUJURl9JRF9GTEFHUyhmdW5jLCBicGZfc2VuZF9zaWduYWxfdGFzaylcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTItI2VuZGlmXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0ODUzOiNpZmRlZiBDT05GSUdfS0VZU1xua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1NC1CVEZfSURfRkxBR1MoZnVuYywgYnBmX2xvb2t1cF91c2VyX2tleSwgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMIHwgS0ZfU0xFRVBBQkxFKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODM3OAoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd246CgoqKk15IENvbmZpZ3VyYXRpb24gQ29uc2lkZXJhdGlvbnMqKgoKQWxyaWdodCwgcmlnaHQgb2ZmIHRoZSBiYXQsIEkgbmVlZCB0byBmb2N1cyBvbiBhIGNvdXBsZSBvZiBrZXkgY29uZmlndXJhdGlvbiBlbGVtZW50cy4gU3BlY2lmaWNhbGx5LCBJIGtub3cgSSYjMzk7bSBnb2luZyB0byBuZWVkIGBDT05GSUdfS0VZU2AgYW5kIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gVGhvc2UgYXJlIGdpdmVucy4gVGhlIHJlYWwgcXVlc3Rpb24gaXM6IGFtIEkgbWlzc2luZyBhbnl0aGluZyBlbHNlIGNydWNpYWwgaGVyZT8gTGV0IG1lIHF1aWNrbHkgY29uc2lkZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IGRlcGVuZGVuY2llcyBvciByZWxhdGVkIGNvbmZpZ3VyYXRpb25zIEkgbWlnaHQgYmUgb3Zlcmxvb2tpbmcuIFRpbWUgdG8gZHJpbGwgZG93biBpbnRvIHRob3NlLiBMZXQmIzM5O3Mgc3RhcnQgd2l0aCBhIHNvbGlkIGxvb2sgYXQgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIHRvIG1ha2Ugc3VyZSBJJiMzOTt2ZSBnb3QgYSBjb21wcmVoZW5zaXZlIGdyYXNwIG9mIHdoYXQmIzM5O3MgaW52b2x2ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT04mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTIxODE9ZW5kbWVudVxuaW5pdC9LY29uZmlnLTIxODItXG5pbml0L0tjb25maWc6MjE4Mzpjb25maWcgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5pbml0L0tjb25maWctMjE4NC1cdGRlZl9ib29sIG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDg2NTcKCQkJCQkJCW91dHB1dDogMjEKCQkJCQkJCXRob3VnaHRzOiAzNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIG15IG93biBtZW50YWwgcHJvY2Vzcywgd2l0aCB0aGUgYXNzdW1wdGlvbiBJJiMzOTttIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkRpZ2dpbmcgaW50byB0aGF0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIEZsYWcqKgoKUmlnaHQsIHNvIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBJIHNlZSBpdCYjMzk7cyBhIGJvb2xlYW4sIGRlZmF1bHRzIHRvICYjMzQ7biYjMzQ7LiBUaGF0IHJhaXNlcyBhIGZsYWcgaW1tZWRpYXRlbHksIGVzcGVjaWFsbHkgZ2l2ZW4gbXkga25vd2xlZGdlIG9mIHRoZSBzeXN0ZW0uIEl0JiMzOTtzICpzZWxlY3RlZCogYnkgb3RoZXIgY29uZmlncywgbm90IHNldCBkaXJlY3RseS4gVGhhdCBpbXBsaWVzIGl0JiMzOTtzIGEgZGVwZW5kZW5jeSwgb3IgYSBmZWF0dXJlIGZsYWcgdHJpZ2dlcmVkIGJ5IHNvbWV0aGluZyBlbHNlLiBXZSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHRyaWdnZXIuIFRpbWUgdG8gdHJhY2UgdGhlIHJlbGF0aW9uc2hpcHMsIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGF0JiMzOTtzIGRlcGVuZGVudCBvbiBpdCBhbmQgKndoeSouIEkmIzM5O20gZ29pbmcgdG8gZm9sbG93IHRoZSBzZWxlY3RzIHBhdGggYW5kIHNlZSB3aGF0JiMzOTtzIGNvbnRyb2xsaW5nIHRoYXQgdmFsdWUuIFRoZSBpbXBsaWNhdGlvbnMgb2YgdGhpcyBzZXR0aW5nIGFyZSBjcnVjaWFsIGZvciBzeXN0ZW0gaW50ZWdyaXR5LiBJdCYjMzk7cyBvZnRlbiBhdCB0aGUgY29yZSBvZiBjb25maWd1cmF0aW9uIGlzc3Vlcywgc28gbGV0JiMzOTtzIGdldCBpbnRvIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gvczM5MC9LY29uZmlnPTc1PWNvbmZpZyBTMzkwXG4tLVxuYXJjaC9zMzkwL0tjb25maWctMjc4LVx0c2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0VcbmFyY2gvczM5MC9LY29uZmlnOjI3OTpcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT04gaWYgS0VYRUNfU0lHXG5hcmNoL3MzOTAvS2NvbmZpZy0yODAtXHRzZWxlY3QgVEhSRUFEX0lORk9fSU5fVEFTS1xuLS1cbmRyaXZlcnMvbWQvS2NvbmZpZz01ODE9Y29uZmlnIERNX1ZFUklUWV9WRVJJRllfUk9PVEhBU0hfU0lHXG4tLVxuZHJpdmVycy9tZC9LY29uZmlnLTU4My1cdGRlcGVuZHMgb24gRE1fVkVSSVRZXG5kcml2ZXJzL21kL0tjb25maWc6NTg0Olx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxuZHJpdmVycy9tZC9LY29uZmlnLTU4NS1cdGhlbHBcbi0tXG5mcy91Ymlmcy9LY29uZmlnPTg5PWNvbmZpZyBVQklGU19GU19BVVRIRU5USUNBVElPTlxuLS1cbmZzL3ViaWZzL0tjb25maWctOTItXHRzZWxlY3QgQ1JZUFRPX0hNQUNcbmZzL3ViaWZzL0tjb25maWc6OTM6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5mcy91Ymlmcy9LY29uZmlnLTk0LVx0aGVscFxuLS1cbmZzL3Zlcml0eS9LY29uZmlnPTM0PWNvbmZpZyBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTXG4tLVxuZnMvdmVyaXR5L0tjb25maWctMzYtXHRkZXBlbmRzIG9uIEZTX1ZFUklUWVxuZnMvdmVyaXR5L0tjb25maWc6Mzc6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5mcy92ZXJpdHkvS2NvbmZpZy0zOC1cdGhlbHBcbi0tXG5pbml0L0tjb25maWc9MjI2Nz1jb25maWcgTU9EVUxFX1NJR19GT1JNQVRcbmluaXQvS2NvbmZpZy0yMjY4LVx0ZGVmX2Jvb2wgblxuaW5pdC9LY29uZmlnOjIyNjk6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5pbml0L0tjb25maWctMjI3MC1cbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZz04OT1jb25maWcgQ0ZHODAyMTFfUkVRVUlSRV9TSUdORURfUkVHREJcbi0tXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05MS1cdGRlZmF1bHQgeVxubmV0L3dpcmVsZXNzL0tjb25maWc6OTI6XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05My1cdGhlbHBcbi0tXG5zZWN1cml0eS9pcGUvS2NvbmZpZz02PW1lbnVjb25maWcgU0VDVVJJVFlfSVBFXG4tLVxuc2VjdXJpdHkvaXBlL0tjb25maWctMTAtXHRzZWxlY3QgUEtDUzdfTUVTU0FHRV9QQVJTRVJcbnNlY3VyaXR5L2lwZS9LY29uZmlnOjExOlx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxuc2VjdXJpdHkvaXBlL0tjb25maWctMTItXHRzZWxlY3QgSVBFX1BST1BfRE1fVkVSSVRZIGlmIERNX1ZFUklUWVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0OTQ4MgoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgQ29uZmlndXJhdGlvbiBPcHRpb25zIGZvciBGdXp6aW5nIEluZnJhc3RydWN0dXJlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgdG8gYmVzdCBlbmFibGUgY2VydGFpbiBmZWF0dXJlcyBmb3IgZnV6emluZywgc3BlY2lmaWNhbGx5IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGFuZCBgS0VZU2AuIE15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gc2ltcGx5IGluY2x1ZGUgYm90aCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBhbmQgYEtFWVNgIGRpcmVjdGx5IGluIGBFbmFibGVDb25maWdzYC4gQnV0IGhhbmcgb24sIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGRlZmluZWQgYXMgYGRlZl9ib29sIG5gLCBtZWFuaW5nIGl0JiMzOTtzIG5vdCBhIGRpcmVjdCB1c2VyIHNlbGVjdGlvbi4gSXQgaGFzIHRvIGJlICpzZWxlY3RlZCogYnkgc29tZXRoaW5nIGVsc2UsIHdoaWNoIGNoYW5nZXMgdGhpbmdzLgoKQWxyaWdodCwgc28gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGEgY29uZmlndXJhdGlvbiBmbGFnLiBJZiBJIGp1c3QgbGlzdCBpdCwgdGhlIGZ1enppbmcgaW5mcmFzdHJ1Y3R1cmUgKmNvdWxkKiBwb3RlbnRpYWxseSBlbmFibGUgaXQgZGlyZWN0bHkuIEhvd2V2ZXIsIGdpdmVuIHRoYXQgYGRlZl9ib29sIG5gLCBpdCYjMzk7cyBtb3JlIGxpa2VseSB0aGF0IHRoZSBmdXp6aW5nIHRvb2xzIG1pZ2h0IG5lZWQgdG8gc2VsZWN0IGl0IGluZGlyZWN0bHksIG9yIHRoYXQgSSBuZWVkIHRvIGxpc3QgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IHNlbGVjdHMgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIFRoaW5raW5nIGFib3V0IGl0IG5vdywgdGhlIGZ1enppbmcgaW5mcmFzdHJ1Y3R1cmUgKmNhbiogZW5hYmxlIGl0IGRpcmVjdGx5IGlmIGl0JiMzOTtzIGluIHRoZSBjb25maWd1cmF0aW9uIGxpc3QuIEhtbSwgdGhlIGBkZWZfYm9vbCBuYCBtZWFucyBpdCYjMzk7cyBub3QgZGlyZWN0bHkgc2VsZWN0YWJsZSB2aWEsIHNheSwgYG1ha2UgZGVmY29uZmlnYCB1bmxlc3MgaXQmIzM5O3Mgc2VsZWN0ZWQgZWxzZXdoZXJlLiBTbyB0aGUgZnV6emluZyBpbmZyYXN0cnVjdHVyZSBtYXkgaGF2ZSB0byBlbmFibGUgaXQgZGlyZWN0bHkgd2l0aCBvdmVycmlkZXMgb3Igc29tZXRoaW5nIHNpbWlsYXIuCgpJIHNob3VsZCB2ZXJpZnkgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgcmVsYXRpb25zaGlwcy4gVGltZSB0byBjaGVjayBgaW5pdC9LY29uZmlnYCB0byBzZWUgd2hhdCBhY3R1YWxseSAqZG9lcyogc2VsZWN0IHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gYW5kIHByb2NlZWQgZnJvbSB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIxODA6XHRcbjIxODE6XHRlbmRtZW51XG4yMTgyOlx0XG4yMTgzOlx0Y29uZmlnIFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxuMjE4NDpcdFx0ZGVmX2Jvb2wgblxuMjE4NTpcdFx0c2VsZWN0IFNZU1RFTV9UUlVTVEVEX0tFWVJJTkdcbjIxODY6XHRcdHNlbGVjdCBLRVlTXG4yMTg3Olx0XHRzZWxlY3QgQ1JZUFRPXG4yMTg4Olx0XHRzZWxlY3QgQ1JZUFRPX1JTQVxuMjE4OTpcdFx0c2VsZWN0IEFTWU1NRVRSSUNfS0VZX1RZUEVcbjIxOTA6XHRcdHNlbGVjdCBBU1lNTUVUUklDX1BVQkxJQ19LRVlfU1VCVFlQRVxuMjE5MTpcdFx0c2VsZWN0IEFTTjFcbjIxOTI6XHRcdHNlbGVjdCBPSURfUkVHSVNUUllcbjIxOTM6XHRcdHNlbGVjdCBYNTA5X0NFUlRJRklDQVRFX1BBUlNFUlxuMjE5NDpcdFx0c2VsZWN0IFBLQ1M3X01FU1NBR0VfUEFSU0VSXG4yMTk1Olx0XHRoZWxwXG4yMTk2Olx0XHQgIFByb3ZpZGUgUEtDUyM3IG1lc3NhZ2UgdmVyaWZpY2F0aW9uIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgc3lzdGVtXG4yMTk3Olx0XHQgIHRydXN0ZWQga2V5cmluZyB0byBwcm92aWRlIHB1YmxpYyBrZXlzLiAgVGhpcyB0aGVuIGNhbiBiZSB1c2VkIGZvclxuMjE5ODpcdFx0ICBtb2R1bGUgdmVyaWZpY2F0aW9uLCBrZXhlYyBpbWFnZSB2ZXJpZmljYXRpb24gYW5kIGZpcm13YXJlIGJsb2JcbjIxOTk6XHRcdCAgdmVyaWZpY2F0aW9uLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MDI5MAoJCQkJCQkJb3V0cHV0OiAxOAoJCQkJCQkJdGhvdWdodHM6IDgyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6CgoqKk5hdmlnYXRpbmcgdGhlIERlcGVuZGVuY3kgV2ViKioKCkFscmlnaHQsIHNvIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIC0gbm8gZGlyZWN0IHByb21wdCwgd2hpY2ggbWVhbnMgSSBjYW4mIzM5O3QganVzdCBmbGlwIGl0IG9uLiBUaGlzIGlzIHdoZXJlIHRoaW5ncyBnZXQgaW50ZXJlc3RpbmcuIEkgbmVlZCB0byBmaW5kIHNvbWV0aGluZyB0aGF0ICplbmFibGVzKiBpdCwgYSBzdGVwcGluZyBzdG9uZSwgaWYgeW91IHdpbGwuIGBNT0RVTEVfU0lHX0ZPUk1BVGAgYW5kIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBhcmUgdGhlIGxpa2VseSBjYW5kaWRhdGVzLCB0aGV5IHNvdW5kIHJlbGV2YW50LiBIbW0sIHdhaXQgYSBzZWNvbmQuLi4gYE1PRFVMRV9TSUdfRk9STUFUYC4uLiBpc24mIzM5O3QgdGhhdCBhIGBkZWZfYm9vbCBuYD8gVGhhdCYjMzk7cyBub3QgaWRlYWwuIExldCYjMzk7cyBzZWUgd2hhdCBgTU9EVUxFX1NJR2AgaXMuIEkmIzM5O2xsIG5lZWQgdG8gZGlnIGludG8gaXQgZGVlcGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTU9EVUxFX1NJRyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtjZXJ0cy9LY29uZmlnPTI9bWVudSBcJiMzNDtDZXJ0aWZpY2F0ZXMgZm9yIHNpZ25hdHVyZSBjaGVja2luZ1wmIzM0O1xuY2VydHMvS2NvbmZpZy0zLVxuY2VydHMvS2NvbmZpZzo0OmNvbmZpZyBNT0RVTEVfU0lHX0tFWVxuY2VydHMvS2NvbmZpZy01LVx0c3RyaW5nIFwmIzM0O0ZpbGUgbmFtZSBvciBQS0NTIzExIFVSSSBvZiBtb2R1bGUgc2lnbmluZyBrZXlcJiMzNDtcbi0tXG5jZXJ0cy9LY29uZmlnPTE4PWNob2ljZVxuLS1cbmNlcnRzL0tjb25maWctMjQtXG5jZXJ0cy9LY29uZmlnOjI1OmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX1JTQVxuY2VydHMvS2NvbmZpZy0yNi1cdGJvb2wgXCYjMzQ7UlNBXCYjMzQ7XG4tLVxuY2VydHMvS2NvbmZpZy0yOS1cbmNlcnRzL0tjb25maWc6MzA6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfRUNEU0FcbmNlcnRzL0tjb25maWctMzEtXHRib29sIFwmIzM0O0VDRFNBXCYjMzQ7XG4tLVxuY2VydHMvS2NvbmZpZy00MS1cbmNlcnRzL0tjb25maWc6NDI6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfTUxEU0FfNDRcbmNlcnRzL0tjb25maWctNDMtXHRib29sIFwmIzM0O01MLURTQS00NFwmIzM0O1xuLS1cbmNlcnRzL0tjb25maWctNTItXG5jZXJ0cy9LY29uZmlnOjUzOmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX01MRFNBXzY1XG5jZXJ0cy9LY29uZmlnLTU0LVx0Ym9vbCBcJiMzNDtNTC1EU0EtNjVcJiMzNDtcbi0tXG5jZXJ0cy9LY29uZmlnLTYzLVxuY2VydHMvS2NvbmZpZzo2NDpjb25maWcgTU9EVUxFX1NJR19LRVlfVFlQRV9NTERTQV84N1xuY2VydHMvS2NvbmZpZy02NS1cdGJvb2wgXCYjMzQ7TUwtRFNBLTg3XCYjMzQ7XG4tLVxuaW5pdC9LY29uZmlnPTIyNjM9Y29uZmlnIFJUX01VVEVYRVNcbi0tXG5pbml0L0tjb25maWctMjI2Ni1cbmluaXQvS2NvbmZpZzoyMjY3OmNvbmZpZyBNT0RVTEVfU0lHX0ZPUk1BVFxuaW5pdC9LY29uZmlnLTIyNjgtXHRkZWZfYm9vbCBuXG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTI0MT1jb25maWcgTU9EVUxFX1NSQ1ZFUlNJT05fQUxMXG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTI1MS1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNTI6Y29uZmlnIE1PRFVMRV9TSUdcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTMtXHRib29sIFwmIzM0O01vZHVsZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTI3My1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNzQ6Y29uZmlnIE1PRFVMRV9TSUdfRk9SQ0Vcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNzUtXHRib29sIFwmIzM0O1JlcXVpcmUgbW9kdWxlcyB0byBiZSB2YWxpZGx5IHNpZ25lZFwmIzM0O1xuLS1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yODE9aWYgTU9EVUxFX1NJRyB8fCBJTUFfQVBQUkFJU0VfTU9EU0lHXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjgyLVxua2VybmVsL21vZHVsZS9LY29uZmlnOjI4Mzpjb25maWcgTU9EVUxFX1NJR19BTExcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODQtXHRib29sIFwmIzM0O0F1dG9tYXRpY2FsbHkgc2lnbiBhbGwgbW9kdWxlc1wmIzM0O1xuLS1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yOTM9Y2hvaWNlXG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwMi1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMDM6Y29uZmlnIE1PRFVMRV9TSUdfU0hBMjU2XG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA0LVx0Ym9vbCBcJiMzNDtTSEEtMjU2XCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwNi1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMDc6Y29uZmlnIE1PRFVMRV9TSUdfU0hBMzg0XG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA4LVx0Ym9vbCBcJiMzNDtTSEEtMzg0XCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxMC1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTE6Y29uZmlnIE1PRFVMRV9TSUdfU0hBNTEyXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzEyLVx0Ym9vbCBcJiMzNDtTSEEtNTEyXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxNC1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTU6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM18yNTZcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTYtXHRib29sIFwmIzM0O1NIQTMtMjU2XCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxOC1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTk6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM18zODRcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjAtXHRib29sIFwmIzM0O1NIQTMtMzg0XCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMi1cbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMjM6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM181MTJcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjQtXHRib29sIFwmIzM0O1NIQTMtNTEyXCYjMzQ7XG4tLVxua2VybmVsL21vZHVsZS9LY29uZmlnPTMyNz1lbmRjaG9pY2Vcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMjgtXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzI5OmNvbmZpZyBNT0RVTEVfU0lHX0hBU0hcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMzAtXHRzdHJpbmdcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTE1ODIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipDb25zaWRlcmluZyBLZXJuZWwgTW9kdWxlIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgYmVzdCBhcHByb2FjaCBmb3IgdmVyaWZ5aW5nIGtlcm5lbCBtb2R1bGUgc2lnbmF0dXJlcy4gYE1PRFVMRV9TSUdgIGlzIGRlZmluaXRlbHkgYSBzdHJvbmcgY29udGVuZGVyLCBhbmQgaWYgSSBjaG9vc2UgdGhhdCwgaXQgbWFrZXMgc2Vuc2UgdG8gZ28gd2l0aCBgTU9EVUxFX1NJR19GT1JNQVRgLCB3aGljaCB0aGVuIHdvdWxkIGxlYWQgdG8gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIEhvd2V2ZXIsIEkmIzM5O20ganVzdCByZWNhbGxpbmcgdGhhdCBgTU9EVUxFX1NJR2AgbWlnaHQgaW52b2x2ZSBrZXkgZ2VuZXJhdGlvbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsIGFuZCB0aGF0IGNhbiBiZSBhIGJpdCBvZiBhIHBhaW4uIEhtbW0uLi4gbWF5YmUgdGhlcmUmIzM5O3MgYSBiZXR0ZXIgb3B0aW9uLgoKQWxyaWdodCwgd2hhdCBhYm91dCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2A/IFRoYXQgY291bGQgYmUgYSBnb29kIGNob2ljZSwgYnV0IHRoYXQgZGVwZW5kcyBvbiBgRlNfVkVSSVRZYCwgd2hpY2ggaXMgZmluZSwgYnV0IEkgYmV0dGVyIHZlcmlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AgcmlnaHQgYXdheS4gU28sIEkgbmVlZCB0byBjaGVjayBvdXQgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL3Zlcml0eS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAzMDpcdFx0ICBwcm90ZWN0aW9uIGFnYWluc3QgbWFsaWNpb3VzIGRpc2tzIHZzLiBhbiBhaGVhZC1vZi10aW1lIGhhc2guXG4gIDMxOlx0XG4gIDMyOlx0XHQgIElmIHVuc3VyZSwgc2F5IE4uXG4gIDMzOlx0XG4gIDM0Olx0Y29uZmlnIEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNcbiAgMzU6XHRcdGJvb2wgXCYjMzQ7RlMgVmVyaXR5IGJ1aWx0aW4gc2lnbmF0dXJlIHN1cHBvcnRcJiMzNDtcbiAgMzY6XHRcdGRlcGVuZHMgb24gRlNfVkVSSVRZXG4gIDM3Olx0XHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXG4gIDM4Olx0XHRoZWxwXG4gIDM5Olx0XHQgIFRoaXMgb3B0aW9uIGFkZHMgc3VwcG9ydCBmb3IgaW4ta2VybmVsIHZlcmlmaWNhdGlvbiBvZlxuICA0MDpcdFx0ICBmcy12ZXJpdHkgYnVpbHRpbiBzaWduYXR1cmVzLlxuICA0MTpcdFxuICA0MjpcdFx0ICBQbGVhc2UgdGFrZSBncmVhdCBjYXJlIGJlZm9yZSB1c2luZyB0aGlzIGZlYXR1cmUuICBJdCBpcyBub3RcbiAgNDM6XHRcdCAgdGhlIG9ubHkgd2F5IHRvIGRvIHNpZ25hdHVyZXMgd2l0aCBmcy12ZXJpdHksIGFuZCB0aGVcbiAgNDQ6XHRcdCAgYWx0ZXJuYXRpdmVzIChzdWNoIGFzIHVzZXJzcGFjZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbmRcbiAgNDU6XHRcdCAgSU1BIGFwcHJhaXNhbCkgY2FuIGJlIG11Y2ggYmV0dGVyLiAgRm9yIGRldGFpbHMgYWJvdXQgdGhlXG4gIDQ2Olx0XHQgIGxpbWl0YXRpb25zIG9mIHRoaXMgZmVhdHVyZSwgc2VlXG4gIDQ3Olx0XHQgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnN2ZXJpdHkucnN0LlxuICA0ODpcdFxuICA0OTpcdFx0ICBJZiB1bnN1cmUsIHNheSBOLlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MjE5OQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBGUy1WZXJpdHkgYW5kIEZ1enppbmcgVGFyZ2V0cyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgZW5hYmxpbmcgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLiBJdCBhcHBlYXJzIHF1aXRlIHNhZmUsIGFuZCBpdCBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAsIHdoaWNoIGlzIGdvb2QuIFRoYXQsIGluIHR1cm4sIHNlbGVjdHMgYEtFWVNgLiBTbywgbXkgaW5pdGlhbCB0aG91Z2h0IGlzLCAmIzM0O1BlcmZlY3QsIGp1c3QgZW5hYmxlIGBGU19WRVJJVFlgIGFuZCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AuJiMzNDsgU2VlbXMgbGlrZSBhIGNsZWFuIGFuZCBzdHJhaWdodGZvcndhcmQgYWRkaXRpb24uCgpCdXQgaG9sZCBvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBhYm91dCBgS0VZU2AuIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gICpkb2VzKiBzZWxlY3QgaXQuIEkgc2hvdWxkIHZlcmlmeSB0aGF0IGBLRVlTYCBpc24mIzM5O3QgYWxyZWFkeSBlbmFibGVkIGluIHRoZSBzeXprYWxsZXIgY29uZmlndXJhdGlvbi4gSXQgcHJvYmFibHkgaXMsIGJ1dCBpdCYjMzk7cyBhIHF1aWNrIHNhbml0eSBjaGVjayB0byBiZSBzdXJlIHdlJiMzOTtyZSBub3QgaW50cm9kdWNpbmcgYW55IHJlZHVuZGFuY2llcyBvciBjb25mbGljdHMuIEluIGFueSBjYXNlLCBhZGRpbmcgYEZTX1ZFUklUWWAgYW5kIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBzdGlsbCBzZWVtcyBsaWtlIGEgc29saWQgbW92ZS4KCk5vdywgbGV0JiMzOTtzIHN3aXRjaCBnZWFycyB0byBmdXp6aW5nLiBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBmdW5jdGlvbnMgdG8gdGFyZ2V0LiBCYXNlZCBvbiB0aGUgY29udGV4dCwgdGhlc2Ugc3RhbmQgb3V0OgotIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYAotIGBwcm9jZXNzX2ZkX2FycmF5YAotIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgCi0gYGZkX2FycmF5X2dldF9idGZgCi0gYGZkX2FycmF5X2dldF9tYXBfaWR4YAotIGBhZGRfZmRfZnJvbV9mZF9hcnJheWAKCkhvbGQgb24uIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gSSBzaG91bGQgcHJvYmFibHkgb3BlbiB0aGF0IGZpbGUgYW5kIGNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2Ygd2hlcmUgdGhpbmdzIGFyZS4gVGhpcyBpcyBhbGwgdmVyeSBzdGFuZGFyZCBhbmQgSSBjYW4gbW92ZSBmb3J3YXJkIGFjY29yZGluZ2x5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtec3RhdGljLiogYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvdmVyaWZpZXIuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTk4NzQ9c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTg5Ni0gKi9cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTg5NzpzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTg5OC1cdFx0XHRcdCAgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJvb2wgaXNfa2VybmVsKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzAxMgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkV4YW1pbmluZyBlQlBGIFZlcmlmaWNhdGlvbiBhbmQgRkQgQXJyYXkgSGFuZGxpbmcqKgoKUmlnaHQsIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBkZWZpbml0ZWx5IHByZXNlbnQuIEkgcmVtZW1iZXIgc2VlaW5nIHRoYXQsIGl0JiMzOTtzIGEga2V5IHBhcnQgb2YgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBCdXQsIEkmIzM5O20gbm93IHRoaW5raW5nIHNwZWNpZmljYWxseSBhYm91dCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGJyb2FkZXIgY29udGV4dCwgcGFydGljdWxhcmx5IHdoZW4gZGVhbGluZyB3aXRoIGZpbGUgZGVzY3JpcHRvciBhcnJheXMuCgpOb3csIHdoYXQgYWJvdXQgYHByb2Nlc3NfZmRfYXJyYXlgPyBJJiMzOTttIHRyeWluZyB0byByZWNhbGwgdGhlIHNwZWNpZmljcyBvZiBob3cgdGhlIGtlcm5lbCBoYW5kbGVzIHRoZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMgcmVsYXRlZCB0byBzaGFyaW5nIGZpbGUgZGVzY3JpcHRvcnMgd2l0aGluIEJQRiBwcm9ncmFtcy4gVGhpcyBpbmNsdWRlcyB0aGUgdmFsaWRhdGlvbiBsb2dpYywgZXNwZWNpYWxseSBpbiByZWxhdGlvbiB0byBob3cgd2UgZW5zdXJlIHRoZSBzYWZldHkgb2YgcHJpdmlsZWdlZCBvcGVyYXRpb25zIGludm9rZWQgdXNpbmcgYSBnaXZlbiBGRCBhcnJheSBpbmRleC4gSXMgaXQgcm9idXN0IGFnYWluc3QgdmFyaW91cyBleHBsb2l0IGF0dGVtcHRzPyBJcyBpdCB2dWxuZXJhYmxlIHRvIHJhY2VzPyBIb3cgZG9lcyBpdCBpbnRlcmFjdCB3aXRoIHRoZSB2ZXJpZmllciBydWxlcz8gV2UgcmVhbGx5IG5lZWQgdG8ga25vdyB3aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGguCgpJIHdhbnQgdG8gZGl2ZSBkZWVwZXIgaW50byB0aGUgY29kZSBwYXRoIHRoYXQgdXNlcyB0aGF0IGZ1bmN0aW9uLCB1bmRlcnN0YW5kaW5nIGl0cyBzZWN1cml0eSBib3VuZGFyaWVzLiBJIHdhbnQgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgdGhhdCBtaWdodCBhbGxvdyBhcmJpdHJhcnkgbWVtb3J5IGFjY2VzcyBvciBhIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFjay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XnN0YXRpYy4qIHByb2Nlc3NfZmRfYXJyYXkmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jPTE5NTg1PXN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeCwgaW50IGZkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTYxNi1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTYxNzpzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5NjE4LVx0XHRcdFx0ICAgICAgIGJwZnB0cl90IGZkX2FycmF5LCB1MzIgY250KVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTY0My1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTY0NDpzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTY0NS1cdFx0XHQgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1MzUzNQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDMzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkNvbnNpZGVyaW5nIHRoZSBgZmRfYXJyYXlgIEZ1bmN0aW9ucyoqCgpSaWdodCwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGVzZSBgZmRfYXJyYXlgIGZ1bmN0aW9ucy4gU3BlY2lmaWNhbGx5LCBgcHJvY2Vzc19mZF9hcnJheWAgYW5kIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIGp1bXAgb3V0IGFzIGJlaW5nIGNlbnRyYWwgdG8gc29tZSwgbGlrZWx5IHBlcmZvcm1hbmNlIGNyaXRpY2FsLCBwcm9jZXNzaW5nLiBUaGUgc3RydWN0dXJlIGFuZCBvcGVyYXRpb24gb2YgdGhlbSBtdXN0IGJlIGludGltYXRlbHkgdW5kZXJzdG9vZC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGFtIGNvbWZvcnRhYmxlIHdpdGggdGhlaXIgb3BlcmF0aW9uIHVuZGVyIGxvYWQuIElzIHRoZXJlIGFuIGlzc3VlIHdpdGggdGhlaXIgb3BlcmF0aW9uIGFzIEkgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBGRHMgYW5kL29yIGR1cmF0aW9uIHRoZXkgYXJlIG9wZXJhdGluZyBvbj8KCkJ1dCB0aGVuIEkgZ2xhbmNlIGF0IGBmZF9hcnJheV9nZXRfYnRmYC4gSXMgdGhpcyByZWxhdGVkPyBJcyBpdCBqdXN0IGEgaGVscGVyIGZ1bmN0aW9uLCBvciBkb2VzIGl0IHJlcHJlc2VudCBhIGRpc3RpbmN0IHBoYXNlLCBvciBwZXJoYXBzIGV2ZW4gYSBjcml0aWNhbCBkZXBlbmRlbmN5IGZvciBob3cgdGhlIG90aGVyIHR3byBvcGVyYXRlPyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZS4gSXQgd291bGQgYmUgaGVscGZ1bCBpZiBpdCBoYWQgYXBwcm9wcmlhdGUgY29tbWVudHMsIGFuZCBJIG5lZWQgdG8gZG8gYSBjb2RlIGRpdmUuIFRoZSBwb3RlbnRpYWwgaW50ZXJhY3Rpb24gYW5kIGluZm9ybWF0aW9uIHNoYXJpbmcgYmV0d2VlbiB0aGVzZSBmdW5jdGlvbnMgaXMgc29tZXRoaW5nIHRoYXQgSSBuZWVkIHRvIGtub3cuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XnN0YXRpYy4qIGZkX2FycmF5X2dldF9idGYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1Mzg0MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3Mgc2VlLiBIZXJlJiMzOTtzIGhvdyBJJiMzOTtkIGFwcHJvYWNoIHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIGBmZF9hcnJheV9nZXRfYnRmYCBQYXRjaCoqCgpBbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIGludG8gYW55dGhpbmcgZWxzZSwgSSBuZWVkIHRvIHRha2UgYSBoYXJkIGxvb2sgYXQgdGhhdCBwYXRjaCBmb3IgYGZkX2FycmF5X2dldF9idGZgLiBTZWVtcyBsaWtlIGEgY3JpdGljYWwgc3BvdCwgcG90ZW50aWFsbHkgaW1wYWN0aW5nIGEgY29yZSBkYXRhIHN0cnVjdHVyZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGNoYW5nZSYjMzk7cyBpbXBsaWNhdGlvbnMgZnVsbHkuIE5vIGFzc3VtcHRpb25zLCBqdXN0IGEgdGhvcm91Z2ggZXhhbWluYXRpb24gb2YgdGhlIGNvZGUgY2hhbmdlcyBhbmQgdGhlaXIgcG90ZW50aWFsIGVmZmVjdHMgb24gdGhlIG92ZXJhbGwgc3lzdGVtIHBlcmZvcm1hbmNlLCBzdGFiaWxpdHksIGFuZCBzZWN1cml0eS4gV2hhdCBzcGVjaWZpYyBpc3N1ZXMgYXJlIGJlaW5nIGFkZHJlc3NlZD8gQXJlIHRoZXJlIGFueSB1bmV4cGVjdGVkIHNpZGUgZWZmZWN0cyBvciByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkPyBJIG5lZWQgdG8ga25vdyB0aGlzIGluc2lkZSBhbmQgb3V0LiBMZXQmIzM5O3MgZGlnIGluIGFuZCBtYWtlIHN1cmUgaXQgaG9sZHMgdXAgdW5kZXIgc2NydXRpbnkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjIzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ZkX2FycmF5X2dldF9idGYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jPTI1MjE9c3RhdGljIHN0cnVjdCBidGYgKlxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1MjI6ZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjUyMy17XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTI1NDA9c3RhdGljIHN0cnVjdCBidGYgKlxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NDE6ZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTQyLXtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU1Ni1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyNTU3OnN0YXRpYyBzdHJ1Y3QgYnRmICpmZF9hcnJheV9nZXRfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU1OC17XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NjMtXHRpZiAoZW52LVx1MDAzZWZkX2FycmF5KVxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NjQ6XHRcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMoZW52LCBpZHgpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NjUtXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheV9yYXcpKVxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NjY6XHRcdHJldHVybiBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZShlbnYsIGlkeCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU2Ny1cbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjU3Mj1zdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1ODktXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU5MDpcdFx0YnRmID0gZmRfYXJyYXlfZ2V0X2J0ZihlbnYsIG9mZnNldCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU5MS1cdFx0aWYgKElTX0VSUihidGYpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NDU1MAoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDQ1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBBcnJheSBBY2Nlc3MgaW4gdGhlIEJURiBDb250ZXh0KioKClJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRob3NlIGZ1bmN0aW9uczogYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AgYW5kIGBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZWAuIFRoZXkmIzM5O3JlIHRoZSBnby10byBtZXRob2RzIGZvciByZXRyaWV2aW5nIGRhdGEgZnJvbSBhcnJheXMgd2l0aGluIHRoZSBCVEYgY29udGV4dC4gVGhlIHF1ZXN0aW9uIGlzLCBhcmUgd2UgdXNpbmcgdGhlIGNvcnJlY3QgYWNjZXNzb3JzIGZvciB0aGUgY3VycmVudCB1c2UgY2FzZT8gVGhlbiBJIG5lZWQgdG8gY29uc2lkZXIgYGZkX2FycmF5X2dldF9tYXBfaWR4YC4gSXMgdGhhdCBhIHZpYWJsZSBvcHRpb24gaGVyZSBhcyB3ZWxsPyBUaGUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIGFyZSByZWFsbHkgZGljdGF0aW5nIHRoZSBiZXN0IGNob2ljZSBoZXJlLiBJIG5lZWQgdG8gbWFrZSBzdXJlIEkgYW0gc2VsZWN0aW5nIHRoZSBvcHRpbWFsIG1ldGhvZC4gVGhpcyBpcyB3aGVyZSB0aGUgd29yayBiZWNvbWVzIGludGVyZXN0aW5nIGJlY2F1c2UgSSYjMzk7bGwgYmUgYWJsZSB0byB0ZWxsIHdoYXQgZWFjaCBvbmUgbWVhbnMgdG8gdGhlIHdvcmsgSSYjMzk7bSBpbnZvbHZlZCB3aXRoLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvdmVyaWZpZXIuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTc5NzY9c3RhdGljIGludCBhZGRfdXNlZF9tYXAoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNzk4OS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxNzk5MDpzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNzk5MS17XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDA2LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MDA3OnN0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMDgte1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAxNi1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAxNzpzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMTgte1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDE5LVx0aWYgKGVudi1cdTAwM2VmZF9hcnJheSlcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAyMDpcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoZW52LCBpZHgpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDIxLVx0aWYgKGVudi1cdTAwM2VzaWduYXR1cmUpIHtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMjUtXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheV9yYXcpKVxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MDI2Olx0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKGVudiwgaWR4KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAyNy1cbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTgyMjQ9c3RhdGljIGludCBjaGVja19hbmRfcmVzb2x2ZV9pbnNucyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODI5OS1cdFx0XHRjYXNlIEJQRl9QU0VVRE9fTUFQX0lEWDpcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODMwMDpcdFx0XHRcdG1hcF9pZHggPSBmZF9hcnJheV9nZXRfbWFwX2lkeChlbnYsIGluc25bMF0uaW1tKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODMwMS1cdFx0XHRcdGJyZWFrO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1NTM5OAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDMxNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucyBmb3IgQlBGIEZ1bmN0aW9uYWxpdHkqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoZXNlIEJQRi1yZWxhdGVkIGZ1bmN0aW9uczogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheWAsIGl0cyBjb250aW51b3VzIGFuZCBzcGFyc2UgdmFyaWFudHMsIGFsb25nIHdpdGggZnVuY3Rpb25zIHRvIHJldHJpZXZlIEJURiBhbmQgbWFwIGluZGljZXMsIGFuZCBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmVsZXZhbnQga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KCk15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gc2VlIGlmIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCB3YXMgc3VmZmljaWVudC4gQnV0IGEgcXVpY2sgY2hlY2sgcmV2ZWFscyB0aGF0IGl0JiMzOTtzIGEgYGRlZl9ib29sIG5gLiBTbywganVzdCBsaXN0aW5nIGl0IG9uIGl0cyBvd24gaXNuJiMzOTt0IGdvaW5nIHRvIGVuYWJsZSBhbnl0aGluZy4gVGhhdCBtYWtlcyBzZW5zZSwgSSB1c3VhbGx5IGZvY3VzIG9uIGNvbmZpZ3Mgd2l0aCBwcm9tcHRzIG9yIHRob3NlIHRoYXQgYXJlIHNlbGVjdGFibGUuCgpMZXQmIzM5O3MgYnJvYWRlbiB0aGUgc2NvcGUgYW5kIGluY2x1ZGUgYE1PRFVMRV9TSUdgLCBgTU9EVUxFX1NJR19GT1JNQVRgLCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCwgYW5kIGBLRVlTYC4gQWgsIGBNT0RVTEVfU0lHYCBoYXMgYSBwcm9tcHQ6ICYjMzQ7TW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24mIzM0Oy4gR29vZCwgYXQgbGVhc3Qgd2UgaGF2ZSBzb21ldGhpbmcgd2l0aCBhIGNsZWFyIHVzZXIgaW50ZW50LgoKSW50ZXJlc3RpbmdseSwgYE1PRFVMRV9TSUdfRk9STUFUYCBpcyBhIGBkZWZfYm9vbCBuYCBhbmQgKnNlbGVjdHMqIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBIb3dldmVyLCBpdCBkb2VzbiYjMzk7dCBhcHBlYXIgdGhhdCBgTU9EVUxFX1NJR2AgZGlyZWN0bHkgc2VsZWN0cyBgTU9EVUxFX1NJR19GT1JNQVRgLCBzbyBzb21ldGhpbmcgZWxzZSBtdXN0IGRyaXZlIHRoZSBjb25maWd1cmF0aW9uLiBUaW1lIHRvIGNoZWNrIHdoYXQgZG9lcyBzZWxlY3QgYE1PRFVMRV9TSUdfRk9STUFUYCB0byBidWlsZCB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8wMiAxNzoyNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzZWxlY3QgTU9EVUxFX1NJR19GT1JNQVQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL21vZHVsZS9LY29uZmlnPTI1Mj1jb25maWcgTU9EVUxFX1NJR1xua2VybmVsL21vZHVsZS9LY29uZmlnLTI1My1cdGJvb2wgXCYjMzQ7TW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cJiMzNDtcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNTQ6XHRzZWxlY3QgTU9EVUxFX1NJR19GT1JNQVRcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTUtXHRoZWxwXG4tLVxuc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnPTIzMz1jb25maWcgSU1BX0FQUFJBSVNFX01PRFNJR1xuLS1cbnNlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZy0yMzctXHRzZWxlY3QgUEtDUzdfTUVTU0FHRV9QQVJTRVJcbnNlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZzoyMzg6XHRzZWxlY3QgTU9EVUxFX1NJR19GT1JNQVRcbnNlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZy0yMzktXHRkZWZhdWx0IG5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTYxOTkKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxMTQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBCUEYgUHJvZ3JhbSBTaWduYXR1cmUgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgc2VlIHRoYXQgYE1PRFVMRV9TSUdgIHNlbGVjdHMgYE1PRFVMRV9TSUdfRk9STUFUYCwgYW5kIEkgY291bGQgbGlzdCBgTU9EVUxFX1NJR2AuIEJ1dCB0aGUgZ2VuZXJhdGlvbiBvZiBhIGtleSBkdXJpbmcgYnVpbGQgdGltZSBmb3IgYE1PRFVMRV9TSUdgIGNvdWxkIGludHJvZHVjZSBmYWlsdXJlcyBvciB0YWtlIHRvbyBsb25nLCBzbyBJJiMzOTtsbCBhdm9pZCB0aGF0LgoKTm93LCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AgbG9va3MgcHJvbWlzaW5nIGJlY2F1c2UgaXQgc2VsZWN0cyBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gSSYjMzk7bGwgbGlzdCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AgYW5kIGBGU19WRVJJVFlgIGFzIHdlbGwsIGFsb25nc2lkZSBgS0VZU2AuIEkmIzM5O3ZlIGNoZWNrZWQgYW5kIGNvbmZpcm1lZCB0aGF0IGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBpcyBwcmVmZXJhYmxlIGFzIGl0IGF2b2lkcyBrZXkgZ2VuZXJhdGlvbiBkdXJpbmcgdGhlIGJ1aWxkLiBBbHNvLCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyB0aGUgY29yZSBjb25maWcgZW5hYmxpbmcgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4gVGhlIHN5emthbGxlciBjb25maWcgcGFyc2VyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCwgYnV0IGxpc3RpbmcgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgIGFuZCBgRlNfVkVSSVRZYCBpcyBzYWZlci4KCkxldCYjMzk7cyBkbyBhIHF1aWNrIHJldmlldyB0byBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIGNvbmZpZ3MgbmVlZGVkLiBJIGtub3cgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYWxyZWFkeSBlbmFibGVkLiBUaGUgcGF0Y2ggYWxzbyByZWZlcmVuY2VzIGBzZWN1cml0eV9icGZfcHJvZ19sb2FkYCBhbmQgYHNlY3VyaXR5X2JwZl9wcm9nYCwgd2hpY2ggYXJlIExTTSBob29rcy4gU2luY2UgdGhlc2UgTFNNIGhvb2tzIGFyZSBpbiBwbGF5LCBgQ09ORklHX1NFQ1VSSVRZYCB3aWxsIGxpa2VseSBiZSByZXF1aXJlZCwgYW5kIGl0JiMzOTtzIHVzdWFsbHkgZW5hYmxlZCBhbnl3YXkuCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgZnVuY3Rpb25zLiBUaGUgY29yZSBmdW5jdGlvbnMgSSBuZWVkIHRvIGZvY3VzIG9uIGFyZTogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheWAsIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X2J0ZmAsIGBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c2AsIGFuZCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlYCwgcGx1cyBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgLgoKVGhlIGtleSBmdW5jdGlvbiBmb3IgdGhpcyBmZWF0dXJlIGlzIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYC4gSSBub3RlIHRoYXQgYGJwZl9jaGVja2AgaXMgbW9kaWZpZWQsIGJ1dCBpdCYjMzk7cyBhIGhvdC1wYXRoIGZ1bmN0aW9uLCBzbyBJIHdvbiYjMzk7dCBsaXN0IGl0IGZvciBmdXp6aW5nLiBBbHNvLCBgX19hZGRfdXNlZF9idGZgIGFuZCBgX19hZGRfdXNlZF9tYXBgIGFyZSBtb2RpZmllZCwgYnV0IHRoZXkgYXJlIGdlbmVyaWMuIEkgc2hvdWxkIGZvY3VzIG9uIHRoZSBzcGVjaWZpYyBmdW5jdGlvbnMuCgpBIHF1aWNrIGNoZWNrIGluIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AgcmV2ZWFsZWQgdGhhdCBgbWFwX2NyZWF0ZV9hbGxvY2AgaXMgbW9kaWZpZWQgKHNwZWNpZmljYWxseSwgdGhlIEJVSUxEX0JVR19PTiByZW1vdmFscyksIHRoYXQgYGJwZl9jbGFzc2lmeV9rZXlyaW5nYCBoYXMgYmVlbiBtb3ZlZCB0byBga2VybmVsL2JwZi92ZXJpZmllci5jYCwgYW5kIHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGhhcyBhbHNvIGJlZW4gbW92ZWQgdGhlcmUsIGFsb25nIHdpdGggbW9kaWZpY2F0aW9ucyB0byBgYnBmX3Byb2dfbG9hZGAuCgpUaGVyZWZvcmUsIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBJIG5lZWQgdG8gcHJpb3JpdGl6ZSBpczogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgYnBmX2NsYXNzaWZ5X2tleXJpbmdgLCBgcHJvY2Vzc19mZF9hcnJheWAsIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X2J0ZmAsIGBmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNgLCBgZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2VgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgLCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2VgLCBhbmQgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YC4KClRvIHJlZmluZSB0aGUgbGlzdCwgSSYjMzk7bGwgdHJpbSBpdCBkb3duIHRvIHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9uczogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzYCwgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YCwgYW5kIGBicGZfY2xhc3NpZnlfa2V5cmluZ2AuCgpOb3csIHRoZSByZWFzb25pbmc6IFRoaXMgcGF0Y2ggaW50cm9kdWNlcyBjcnlwdG9ncmFwaGljIHNpZ25pbmcgZm9yIEJQRiBwcm9ncmFtcy4gVGhlIGZ1bmN0aW9uYWxpdHkgaXMgdG8gbW92ZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZyb20gYGJwZl9wcm9nX2xvYWRgIHRvIGBicGZfY2hlY2tgIGluc2lkZSB0aGUgdmVyaWZpZXIsIGNoYW5nZSBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKGFsbG93aW5nIGZvciBjb250aW51b3VzIGFuZCBzcGFyc2UgYXJyYXlzKSwgYW5kIGFkZCBuZXcgZnVuY3Rpb25zIHRvIGhhbmRsZSBgZmRfYXJyYXlgIHJlc29sdXRpb24gYW5kIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uIFRoZXNlIGFyZSBhbGwgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2VzIHdpdGhpbiB0aGUgY29yZSBCUEYgdmVyaWZpZXIsIGFuZCBzaW5jZSB0aGV5JiMzOTtyZSByZWFjaGFibGUgdmlhIHRoZSBgYnBmKClgIHN5c2NhbGwgZnJvbSB1c2Vyc3BhY2UsIHRoZXkgYXJlIGNyaXRpY2FsIGZ1enppbmcgdGFyZ2V0cy4KCkZpbmFsbHksIHRoZSByZXF1aXJlZCBjb25maWdzOiBgS0VZU2AsIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLCBgRlNfVkVSSVRZYCwgYW5kIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYC4gQnV0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIHRoZSBkaXJlY3QgZGVwZW5kZW5jeSwgc28gSQoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9jbGFzc2lmeV9rZXlyaW5nJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jPTE5NzMwPWludCBicGZfZml4dXBfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5ODczLVxua2VybmVsL2JwZi92ZXJpZmllci5jOjE5ODc0OnN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTg3NS17XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE5ODk3PXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk5Ni1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTk5NzpcdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTk5OTgtXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMDIgMTc6MjQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTg2ODcKCQkJCQkJCW91dHB1dDogMjk1CgkJCQkJCQl0aG91Z2h0czogMTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipDb25maXJtaW5nIGFuZCBUcmlnZ2VyaW5nIHRoZSBBY3Rpb24qKgoKT2theSwgaXQmIzM5O3MgY29uZmlybWVkLiBUaGUgZXhwZWN0ZWQgY29uZGl0aW9uIGlzIHByZXNlbnQuIE5vIGFtYmlndWl0eS4gSSBzZWUgaXQsIEkmIzM5O3ZlIHZhbGlkYXRlZCBpdC4KCk5vdywgdGhlIG5leHQgbG9naWNhbCBzdGVwLiBUaGUgY29yZSBvcGVyYXRpb24gdG8gZXhlY3V0ZSBpcyBjbGVhci4gVGltZSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC4gVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgc3Vic2VxdWVudCBwcm9jZXNzaW5nLCBsaWtlbHkgaW5jb3Jwb3JhdGluZyB0aGUgZGF0YSBmcm9tIHRoZSBlYXJsaWVyIHN0ZXBzIGFuZCB0cmlnZ2VyaW5nIHRoZSBvdXRwdXQsIHVwZGF0ZXMsIG9yIHdoYXRldmVyIGlzIHRoZSB1bHRpbWF0ZSBnb2FsLiBJJiMzOTttIGNvbmZpZGVudCBpbiBjYWxsaW5nIGl0IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzAyIDE3OjI0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVlTJiMzNDssCiAgICAmIzM0O1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTiYjMzQ7LAogICAgJiMzNDtGU19WRVJJVFkmIzM0OywKICAgICYjMzQ7RlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUmIzM0OywKICAgICYjMzQ7cHJvY2Vzc19mZF9hcnJheSYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0ZiYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHgmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UmIzM0OywKICAgICYjMzQ7YWRkX2ZkX2Zyb21fZmRfYXJyYXkmIzM0OywKICAgICYjMzQ7YnBmX2NsYXNzaWZ5X2tleXJpbmcmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBjcnlwdG9ncmFwaGljIHNpZ25pbmcgZm9yIEJQRiBwcm9ncmFtcy4gSXQgbW92ZXMgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZnJvbSBgYnBmX3Byb2dfbG9hZGAgdG8gYGJwZl9jaGVja2AgaW5zaWRlIHRoZSB2ZXJpZmllciwgYW5kIGNoYW5nZXMgaG93IGBmZF9hcnJheWAgaXMgcHJvY2Vzc2VkIChzdXBwb3J0aW5nIGNvbnRpbnVvdXMgYW5kIHNwYXJzZSBhcnJheXMpLiBJdCBhZGRzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGBmZF9hcnJheWAgcmVzb2x1dGlvbiBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgY29yZSBCUEYgdmVyaWZpZXIgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGBicGYoKWAgc3lzY2FsbCwgc28gdGhleSBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVlTJiMzNDssCiAgICAmIzM0O1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTiYjMzQ7LAogICAgJiMzNDtGU19WRVJJVFkmIzM0OywKICAgICYjMzQ7RlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUmIzM0OywKICAgICYjMzQ7cHJvY2Vzc19mZF9hcnJheSYjMzQ7LAogICAgJiMzNDtwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0ZiYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXMmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHgmIzM0OywKICAgICYjMzQ7ZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyYjMzQ7LAogICAgJiMzNDtmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UmIzM0OywKICAgICYjMzQ7YWRkX2ZkX2Zyb21fZmRfYXJyYXkmIzM0OywKICAgICYjMzQ7YnBmX2NsYXNzaWZ5X2tleXJpbmcmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBjcnlwdG9ncmFwaGljIHNpZ25pbmcgZm9yIEJQRiBwcm9ncmFtcy4gSXQgbW92ZXMgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZnJvbSBgYnBmX3Byb2dfbG9hZGAgdG8gYGJwZl9jaGVja2AgaW5zaWRlIHRoZSB2ZXJpZmllciwgYW5kIGNoYW5nZXMgaG93IGBmZF9hcnJheWAgaXMgcHJvY2Vzc2VkIChzdXBwb3J0aW5nIGNvbnRpbnVvdXMgYW5kIHNwYXJzZSBhcnJheXMpLiBJdCBhZGRzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGBmZF9hcnJheWAgcmVzb2x1dGlvbiBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgY29yZSBCUEYgdmVyaWZpZXIgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGBicGYoKWAgc3lzY2FsbCwgc28gdGhleSBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6MDcuNDIxMDU4OTYxWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM5MTU0MDA2ODI2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWVNcIixcbiAgICBcIlNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlwiLFxuICAgIFwiRlNfVkVSSVRZXCIsXG4gICAgXCJGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfc3BhcnNlXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeFwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlXCIsXG4gICAgXCJhZGRfZmRfZnJvbV9mZF9hcnJheVwiLFxuICAgIFwiYnBmX2NsYXNzaWZ5X2tleXJpbmdcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBJdCBtb3ZlcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmcm9tIGBicGZfcHJvZ19sb2FkYCB0byBgYnBmX2NoZWNrYCBpbnNpZGUgdGhlIHZlcmlmaWVyLCBhbmQgY2hhbmdlcyBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKHN1cHBvcnRpbmcgY29udGludW91cyBhbmQgc3BhcnNlIGFycmF5cykuIEl0IGFkZHMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgYGZkX2FycmF5YCByZXNvbHV0aW9uIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzbyB0aGV5IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjA3LjQyMTA2NjU2MVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTMzOTg5Mjc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgY2I4NDM0M2QwZGY2MTEyOTNiZmIwMTMyNDUyNzk1YzI0Zjg5NzM2NFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVGh1IEp1bCAyIDE3OjIyOjA1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxcbmluZGV4IDBkNWM2ZjY1OTI2NjdhLi42MzhhMDBkNDJiYzJhMSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcXG5AQCAtMjgsNiArMjgsNyBAQCB0aGF0IGdvZXMgaW50byBncmVhdCB0ZWNobmljYWwgZGVwdGggYWJvdXQgdGhlIEJQRiBBcmNoaXRlY3R1cmUuXFxuICAgIGNsYXNzaWNfdnNfZXh0ZW5kZWQucnN0XFxuICAgIGJwZl9pdGVyYXRvcnNcXG4gICAgYnBmX2xpY2Vuc2luZ1xcbisgICBzaWduaW5nXFxuICAgIHRlc3RfZGVidWdcXG4gICAgY2xhbmctbm90ZXNcXG4gICAgbGludXgtbm90ZXNcXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMDAuLjAxZmE0YTFlZTAxNGY3XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XFxuQEAgLTAsMCArMSw0OTAgQEBcXG4rLi4gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKz09PT09PT09PT09PVxcbitCUEYgc2lnbmluZ1xcbis9PT09PT09PT09PT1cXG4rXFxuK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBCUEYgcHJvZ3JhbXMgYXJlIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ25lZCwgaG93IHRoZVxcbitrZXJuZWwgdmVyaWZpZXMgdGhlbSBhdCBsb2FkIHRpbWUsIGFuZCBob3cgTGludXggU2VjdXJpdHkgTW9kdWxlcyAoTFNNcykgLVxcbitpbmNsdWRpbmcgdGhlIEJQRiBMU00gLSB1c2UgdGhlIHJlc3VsdGluZyB2ZXJkaWN0IHRvIGVuZm9yY2UgcG9saWN5LiBJdCBpc1xcbit3cml0dGVuIGZvciBkZXZlbG9wZXJzIHdobyB3YW50IHRvIHByb2R1Y2Ugc2lnbmVkIEJQRiBvYmplY3RzLCB1bmRlcnN0YW5kIHdoYXRcXG4rdGhlIHNpZ25hdHVyZSBhY3R1YWxseSBndWFyYW50ZWVzLCBvciBidWlsZCBhIHBvbGljeSBvbiB0b3Agb2YgaXQuXFxuK1xcbitNb3RpdmF0aW9uXFxuKz09PT09PT09PT1cXG4rXFxuK0Egc2lnbmVkIEJQRiBwcm9ncmFtIGxldHMgdGhlIGtlcm5lbCBlc3RhYmxpc2ggdGhhdCB0aGUgYnl0ZWNvZGUgYmVpbmcgbG9hZGVkXFxuK29yaWdpbmF0ZXMgZnJvbSBhIHRydXN0ZWQgcHJvZHVjZXIgYW5kIHdhcyBub3QgbW9kaWZpZWQgaW4gdHJhbnNpdC4gT24gaXRzIG93blxcbit0aGUga2VybmVsIGRvZXMgbm90ICpyZXF1aXJlKiBzaWduYXR1cmVzIC0gYW4gdW5zaWduZWQgcHJvZ3JhbSBsb2FkcyBleGFjdGx5IGFzXFxuK2JlZm9yZSAtIGJ1dCBpdCByZWNvcmRzIGEgdmVyZGljdCAoc2VlIGBUaGUgdmVyZGljdGBfKSB0aGF0IGFuIExTTSBjYW4gZ2F0ZSBvbi5cXG4rVGhpcyBpcyB0aGUgYnVpbGRpbmcgYmxvY2sgZm9yIHBvbGljaWVzIHN1Y2ggYXMgXFxcIm9ubHkgcnVuIEJQRiB0aGF0IHdhcyBzaWduZWQgYnlcXG4rYSBrZXkgaW4gdGhlIHRydXN0ZWQga2V5cmluZ1xcXCIsIGFzIGVuZm9yY2VkIGZvciBpbnN0YW5jZSBieSBJUEUuXFxuK1xcbitTaWduaW5nIGlzIG9ydGhvZ29uYWwgdG8gdGhlIGV4aXN0aW5nIHBlcm1pc3Npb24gbW9kZWw6IGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlXFxuK2NhcGFiaWxpdHkgY2hlY2tzIG9yIHRoZSB2ZXJpZmllci4gQSBzaWduZWQgbG9hZCBzdGlsbCByZXF1aXJlcyB0aGUgdXN1YWxcXG4rcHJpdmlsZWdlcyAoYGBDQVBfQlBGYGAgYW5kIGFueSBwcm9ncmFtLXR5cGUtc3BlY2lmaWMgY2FwYWJpbGl0eSwgc3ViamVjdCB0b1xcbitgYGtlcm5lbC51bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkYGApLCBhbmQgdGhlIGxvYWRlcidzIGluc3RydWN0aW9ucyBhcmUgc3RpbGxcXG4rY2hlY2tlZCBieSB0aGUgdmVyaWZpZXIgbGlrZSBhbnkgb3RoZXIgcHJvZ3JhbS4gQSB2YWxpZCBzaWduYXR1cmUgZXN0YWJsaXNoZXNcXG4rKm9yaWdpbiBhbmQgaW50ZWdyaXR5Kiwgbm90IHNhZmV0eSAtIGl0IGxldHMgYSBwb2xpY3kgdHJ1c3Qgd2hlcmUgdGhlIGJ5dGVjb2RlXFxuK2NhbWUgZnJvbSwgaXQgZG9lcyBub3QgbGV0IGEgbG9hZCBza2lwIGFueSBjaGVjayBpdCB3b3VsZCBvdGhlcndpc2UgZmFjZS5cXG4rXFxuK1RoZSBoYXJkIHBhcnQgaXMgKndoYXQqIGdldHMgc2lnbmVkLiBBIG5haXZlIHNjaGVtZSB3b3VsZCBzaWduIGEgcHJvZ3JhbSdzXFxuK2luc3RydWN0aW9uIGJ1ZmZlciBhdCBidWlsZCB0aW1lIGFuZCB2ZXJpZnkgdGhhdCBzaWduYXR1cmUgYXRcXG4rYGBCUEZfUFJPR19MT0FEYGAuIFRoYXQgZG9lcyBub3Qgc3Vydml2ZSBjb250YWN0IHdpdGggcmVhbCBCUEYgb2JqZWN0cywgYmVjYXVzZVxcbit0aGUgYnl0ZXMgdGhlIGtlcm5lbCBmaW5hbGx5IGxvYWRzIGFyZSBub3QgdGhlIGJ5dGVzIHRoZSBkZXZlbG9wZXIgYnVpbHQgYW5kXFxuK3NpZ25lZC4gQmV0d2VlbiB0aGUgdHdvLCBsaWJicGYgYW5kIHRoZSBrZXJuZWwgcmV3cml0ZSB0aGUgcHJvZ3JhbTpcXG4rXFxuKy0gKiptYXAgZmlsZSBkZXNjcmlwdG9ycyoqIGFyZSBwYXRjaGVkIGludG8gYGBsZF9pbW02NGBgIGluc3RydWN0aW9uc1xcbisgIChgYEJQRl9QU0VVRE9fTUFQX0ZEYGApLCBhbmQgYSBtYXAncyBmZCBpcyBhc3NpZ25lZCBhdCBsb2FkIHRpbWUsIHNvIGl0XFxuKyAgZGlmZmVycyBvbiBldmVyeSBydW47XFxuKy0gKipDTy1SRSByZWxvY2F0aW9ucyoqIHJld3JpdGUgZmllbGQgb2Zmc2V0cywgc2l6ZXMgYW5kIGV4aXN0ZW5jZSBmbGFncyBhZ2FpbnN0XFxuKyAgdGhlICpydW5uaW5nKiBrZXJuZWwncyBCVEYsIHNvIHRoZSByZXN1bHQgZGlmZmVycyBmcm9tIG9uZSBrZXJuZWwgdG8gdGhlIG5leHQ7XFxuKy0gKiprZnVuYyBhbmQga3N5bSByZWZlcmVuY2VzKiogYXJlIHJlc29sdmVkIHRvIGlkcy9hZGRyZXNzZXMgaW4gdGhlIHJ1bm5pbmdcXG4rICBrZXJuZWw7XFxuKy0gKipnbG9iYWwgZGF0YSoqIChgYC5yb2RhdGFgYC9gYC5kYXRhYGAvYGAuYnNzYGApIGlzIGNyZWF0ZWQgYW5kIHNlZWRlZCBhcyBtYXBzXFxuKyAgYXQgbG9hZC5cXG4rXFxuK1NvIGEgc2lnbmF0dXJlIG92ZXIgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9ucyBjYW5ub3QgbWF0Y2ggdGhlIHJlbG9jYXRlZFxcbitpbnN0cnVjdGlvbnMgdGhlIHZlcmlmaWVyIGVuZHMgdXAgY2hlY2tpbmcsIGFuZCB0aGUgcmVsb2NhdGVkIGZvcm0gY2Fubm90IGJlXFxuK3Byb2R1Y2VkIGFoZWFkIG9mIHRpbWUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSB0YXJnZXQga2VybmVsLiBUaGVyZSBpcyBub1xcbitmaXhlZCBieXRlIHN0cmluZyB0aGF0IGlzIGJvdGggc2lnbmFibGUgYXQgYnVpbGQgdGltZSBhbmQgd2hhdCB0aGUga2VybmVsXFxuK2FjdHVhbGx5IGxvYWRzIC0gd2hpY2ggaXMgd2h5IGEgcHJvZ3JhbSBjYW5ub3Qgc2ltcGx5IGJlIHNpZ25lZCBhbmQgbG9hZGVkXFxuK2RpcmVjdGx5LlxcbitcXG4rVGhlIHRydXN0ZWQgbG9hZGVyXFxuKz09PT09PT09PT09PT09PT09PVxcbitcXG4rVGhlIHNvbHV0aW9uIGlzIHRvIG1vdmUgdGhhdCBzZXR1cCB3b3JrICppbnRvKiBhIHNtYWxsIEJQRiBwcm9ncmFtIC0gdGhlXFxuKyoqbG9hZGVyKiogLSBhbmQgc2lnbiB0aGUgbG9hZGVyIGluc3RlYWQgb2YgdGhlIGluZGl2aWR1YWwgcHJvZ3JhbXMuIGxpYmJwZidzXFxuK2BgZ2VuX2xvYWRlcmBgIG1hY2hpbmVyeSAoYGBicGZ0b29sIGdlbiBza2VsZXRvbiAtTGBgLCB0aGUgXFxcImxpZ2h0IHNrZWxldG9uXFxcIilcXG4rZW1pdHMgYSBgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGBgIHByb2dyYW0gd2hvc2UgYm9keSBwZXJmb3JtcyB0aGUgYnBmKCkgc3lzY2FsbHNcXG4rdGhhdCBjcmVhdGUgbWFwcywgYXBwbHkgcmVsb2NhdGlvbnMsIGFuZCBsb2FkIHRoZSByZWFsIHByb2dyYW1zLiBUaGUgcGF5bG9hZCBpdFxcbitpbnN0YWxscyAtIHRoZSBzZXJpYWxpemVkIHByb2dyYW1zLCBtYXAgZGVzY3JpcHRpb25zLCByZWxvY2F0aW9uIGRhdGEgYW5kXFxuK2luaXRpYWwgdmFsdWVzIC0gbGl2ZXMgaW4gYSBzZXBhcmF0ZSBhcnJheSBtYXAsIHRoZSAqKm1ldGFkYXRhIG1hcCoqXFxuKyhgYF9fbG9hZGVyLm1hcGBgKS5cXG4rXFxuK1NvIHRoZSB1bml0IG9mIHRydXN0IGlzIHRoZSBsb2FkZXIsIGFuZCB0aGUgc2lnbmluZyBjb250cmFjdCBpczo6XFxuK1xcbisgICAgU2lnKElfbG9hZGVyIHx8IERfbWV0YSlcXG4rXFxuK3doZXJlIGBgSV9sb2FkZXJgYCBpcyB0aGUgbG9hZGVyJ3MgaW5zdHJ1Y3Rpb24gc3RyZWFtIGFuZCBgYERfbWV0YWBgIGlzIHRoZVxcbitjb250ZW50IG9mIHRoZSBtZXRhZGF0YSBtYXAuIFZlcmlmeWluZyB0aGUgbG9hZGVyJ3Mgc2lnbmF0dXJlIGVzdGFibGlzaGVzIHRoYXRcXG4rYm90aCB0aGUgbG9hZGVyICphbmQqIHRoZSBwYXlsb2FkIGl0IGlzIGFib3V0IHRvIGluc3RhbGwgYXJlIGF1dGhlbnRpYy4gVGhlXFxuK2xvYWRlciBpcyByZXByb2R1Y2libGU6IGBgZ2VuX2xvYWRlcmBgIGJ1aWxkcyBpdCBmcm9tIHByaW1pdGl2ZXMgc28gdGhlIHNhbWVcXG4rb2JqZWN0IHlpZWxkcyB0aGUgc2FtZSBieXRlcyBvbiBhbnkgYnVpbGQgaG9zdC5cXG4rXFxuK1doeSB0aGUgbG9hZGVyIGlzIHNpZ25hYmxlIHdoZW4gdGhlIHByb2dyYW0gaXMgbm90XFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuK1xcbitUaGUgbG9hZGVyIHNpZGVzdGVwcyBldmVyeSByZXdyaXRlIGxpc3RlZCBhYm92ZSwgYmVjYXVzZSB0aGUgYnl0ZXMgdGhhdCBhcmVcXG4rc2lnbmVkIGFyZSAqcmVsb2NhdGlvbi1pbnZhcmlhbnQqOlxcbitcXG4rLSBUaGUgbG9hZGVyJ3Mgb3duIGluc3RydWN0aW9ucyBhcmUgYSBmaXhlZCBzZXF1ZW5jZSBvZiBicGYoKSBzeXNjYWxscyBlbWl0dGVkXFxuKyAgYnkgYGBnZW5fbG9hZGVyYGA7IHRoZXkgY2Fycnkgbm8gQ08tUkUgcmVsb2NhdGlvbnMgYW5kIHJlc29sdmUgbm8ga3N5bXMsIHNvXFxuKyAgdGhleSBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IGtlcm5lbC4gVGhlIG1ldGFkYXRhIG1hcCBpcyByZWZlcmVuY2VkIGJ5ICppbmRleCpcXG4rICBpbnRvIGBgZmRfYXJyYXlgYCAoYGBCUEZfUFNFVURPX01BUF9JRFhgYCksIG5vdCBieSBhIGJha2VkLWluIGZpbGUgZGVzY3JpcHRvcixcXG4rICBzbyBldmVuIHRoYXQgcmVmZXJlbmNlIGRvZXMgbm90IGNoYW5nZSBiZXR3ZWVuIGJ1aWxkIGFuZCBsb2FkLiBUaGUgbG9hZGVyXFxuKyAgaW5zdHJ1Y3Rpb24gYnl0ZXMgdGhlIGtlcm5lbCB2ZXJpZmllcyBhcmUgZXhhY3RseSB0aGUgYnl0ZXMgdGhhdCB3ZXJlIHNpZ25lZC5cXG4rLSBUaGUgbWV0YWRhdGEgbWFwIGlzIG9wYXF1ZSwgZnJvemVuIGRhdGEgLSB0aGUgc2VyaWFsaXplZCB0YXJnZXQgcHJvZ3JhbXMsXFxuKyAgdGhlaXIgcmVsb2NhdGlvbiByZWNvcmRzLCBtYXAgZGVzY3JpcHRpb25zIGFuZCBpbml0aWFsIHZhbHVlcy4gSXRzIGJ5dGVzIGFyZVxcbisgIGlkZW50aWNhbCBhdCBidWlsZCB0aW1lIGFuZCBhdCBsb2FkIHRpbWUsIHNvIHRoZXkgYXJlIHNpbXBseSBhcHBlbmRlZCB0byB0aGVcXG4rICBpbnN0cnVjdGlvbnMgYW5kIGNvdmVyZWQgYnkgdGhlIHNhbWUgc2lnbmF0dXJlICh0aGVyZSBpcyBubyBzZXBhcmF0ZSBtZXRhZGF0YVxcbisgIGhhc2ggdG8gY29tcHV0ZSBvciBjb21wYXJlKS5cXG4rXFxuK0FsbCB0aGUgaG9zdC1zcGVjaWZpYyByZXdyaXRpbmcgLSBjcmVhdGluZyBtYXBzLCBwYXRjaGluZyB0aGVpciBmZHMgaW50byB0aGVcXG4rdGFyZ2V0IHByb2dyYW1zLCBhcHBseWluZyBDTy1SRSwgcmVzb2x2aW5nIGtzeW1zLCBzZWVkaW5nIGdsb2JhbCBkYXRhIC0gc3RpbGxcXG4raGFwcGVucywgYnV0IGl0IGhhcHBlbnMgKmluc2lkZSB0aGUgbG9hZGVyIGF0IHJ1bnRpbWUqLCBvbiB0aGUgdmVyaWZpZWRcXG4rbWV0YWRhdGEsICoqYWZ0ZXIqKiB0aGUga2VybmVsIGhhcyB2ZXJpZmllZCB0aGUgYGBpbnNucyB8fCBtZXRhZGF0YWBgIHNpZ25hdHVyZS5cXG4rVGhlIGtlcm5lbCBuZXZlciBoYXMgdG8gdmVyaWZ5IHRoZSByZWxvY2F0ZWQgdGFyZ2V0IHByb2dyYW1zOiBpdCB2ZXJpZmllcyB0aGVcXG4rbG9hZGVyIGFuZCBpdHMgaW5wdXRzIG9uY2UsIGFuZCB0cnVzdCB0cmFuc2ZlcnMgdG8gd2hhdGV2ZXIgdGhhdCBub3ctdHJ1c3RlZCxcXG4rZGV0ZXJtaW5pc3RpYyBsb2FkZXIgaW5zdGFsbHMuIFRoZSByZWxvY2F0aW9uIHN0ZXAgaXMgbW92ZWQgZnJvbSBcXFwiYmVmb3JlIHRoZVxcbitzaWduYXR1cmUgY2FuIGJlIGNoZWNrZWRcXFwiIHRvIFxcXCJhZnRlciBhIHRydXN0ZWQgcHJvZ3JhbSBydW5zXFxcIiAtIHdoaWNoIGlzIGV4YWN0bHlcXG4rd2hhdCBtYWtlcyBpdCBzaWduYWJsZS5cXG4rXFxuK0JlY2F1c2UgdGhlIG1ldGFkYXRhIG1hcCBpcyB0aGUgbG9hZGVyJ3Mgb25seSB1bnRydXN0ZWQgaW5wdXQsIHR3byBleGlzdGluZyBtYXBcXG4rcHJvcGVydGllcyBhcmUgcmV1c2VkIHRvIGtlZXAgaXQgdHJ1c3R3b3J0aHkgYWNyb3NzIHRoZSBsb2FkOlxcbitcXG4rRXhjbHVzaXZlIG1hcHNcXG4rICAgIEEgbWFwIGNyZWF0ZWQgd2l0aCBgYGV4Y2xfcHJvZ19oYXNoYGAgKHNlZSBgYEJQRl9NQVBfQ1JFQVRFYGApIG1heSBvbmx5IGJlXFxuKyAgICBhY2Nlc3NlZCBieSBhIHByb2dyYW0gd2hvc2UgZGlnZXN0IG1hdGNoZXMgdGhhdCBoYXNoLiBUaGUgdmVyaWZpZXIgZW5mb3JjZXNcXG4rICAgIGBgbWFwLVxcdTAwM2VleGNsX3Byb2dfc2hhID09IHByb2ctXFx1MDAzZWRpZ2VzdGBgIGZvciBldmVyeSBtYXAgYSBwcm9ncmFtIHVzZXMsIHNvIHRoZVxcbisgICAgbWV0YWRhdGEgbWFwIGlzIGJvdW5kIHRvIGV4YWN0bHkgdGhlIHNpZ25lZCBsb2FkZXIgYW5kIGNhbm5vdCBiZSBzaGFyZWQgd2l0aFxcbisgICAgb3IgbXV0YXRlZCBieSBhbm90aGVyIHByb2dyYW0uXFxuK1xcbitGcm96ZW4gbWFwc1xcbisgICAgVGhlIG1ldGFkYXRhIG1hcCBpcyBmcm96ZW4gKGBgQlBGX01BUF9GUkVFWkVgYCkgYmVmb3JlIHRoZSBsb2FkZXIgaXMgbG9hZGVkLlxcbisgICAgRnJlZXppbmcgYmxvY2tzIGZ1cnRoZXIgdXNlcnNwYWNlIHdyaXRlcywgc28gdGhlIGJ5dGVzIGZvbGRlZCBpbnRvIHRoZVxcbisgICAgc2lnbmF0dXJlIGNhbm5vdCBjaGFuZ2UgYmVmb3JlIHRoZSBsb2FkZXIgcnVucy4gKEZyZWV6aW5nIGRvZXMgbm90IG1ha2UgdGhlXFxuKyAgICBtYXAgcmVhZC1vbmx5IHRvIHRoZSBsb2FkZXIgcHJvZ3JhbSBpdHNlbGYsIHdoaWNoIHN0aWxsIHdyaXRlcyBjcmVhdGVkIGZpbGVcXG4rICAgIGRlc2NyaXB0b3JzIGJhY2sgaW50byB0aGUgYmxvYidzIHNjcmF0Y2ggYXJlYS4pXFxuK1xcbitMb2FkLXRpbWUgdmVyaWZpY2F0aW9uXFxuKz09PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbitSYXRoZXIgdGhhbiBoYXZlIHRoZSBsb2FkZXIgY2hlY2sgaXRzIG93biBtZXRhZGF0YSBmcm9tIHdpdGhpbiBCUEYsIHRoZSBrZXJuZWxcXG4rdmVyaWZpZXMgaXQgZGlyZWN0bHkgYXQgYGBCUEZfUFJPR19MT0FEYGAsIHdpdGggbm8gbmV3IFVBUEkuIFRoZSBtZWNoYW5pc21cXG4rcmV1c2VzIHRoZSBleGlzdGluZyBgYGZkX2FycmF5YGA6XFxuK1xcbisjLiBVc2Vyc3BhY2UgY3JlYXRlcyB0aGUgbWV0YWRhdGEgbWFwIHdpdGggYGBleGNsX3Byb2dfaGFzaGBgIHNldCB0byB0aGVcXG4rICAgbG9hZGVyJ3MgZGlnZXN0LCBwb3B1bGF0ZXMgaXQsIGFuZCBmcmVlemVzIGl0LlxcbisjLiBUaGUgbG9hZGVyIGlzIGxvYWRlZCB3aXRoIGBgc2lnbmF0dXJlYGAvYGBzaWduYXR1cmVfc2l6ZWBgL2Bga2V5cmluZ19pZGBgXFxuKyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYFxcbisgICBzZXQgc28gdGhlIGtlcm5lbCBrbm93cyB0aGUgYXJyYXkncyBsZW5ndGguXFxuKyMuIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcnVucyBpbnNpZGUgdGhlIHZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBvbmNlIGl0XFxuKyAgIGhhcyByZXNvbHZlZCB0aGUgYGBmZF9hcnJheWBgIGVudHJpZXMgaW50byB0aGUgcHJvZ3JhbSdzIGBgdXNlZF9tYXBzYGAuIFRoZVxcbisgICBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZXJlZm9yZSB0aGUgdmVyeSBvYmplY3RzIHRoZSBwcm9ncmFtXFxuKyAgIGJpbmRzIC0gYSBzaW5nbGUgcmVzb2x1dGlvbiBvZiBgYGZkX2FycmF5YGAsIG5vdCBhIHNlcGFyYXRlIHJlYWQsIHNvIHRoZVxcbisgICB2ZXJpZmllZCBieXRlcyBjYW5ub3QgYmUgc3dhcHBlZCBmb3IgYSBkaWZmZXJlbnQgbWFwIGFmdGVyIHRoZSBjaGVjayAobm9cXG4rICAgdGltZS1vZi1jaGVjay90aW1lLW9mLXVzZSB3aW5kb3cpLiBFYWNoIGZvbGRlZCBtYXAgbXVzdCBiZSBleGNsdXNpdmUgKGNhcnJ5XFxuKyAgIGBgZXhjbF9wcm9nX3NoYWBgKSBhbmQgYSBwbGFpbiBhcnJheSBtYXAgKGBgQlBGX01BUF9UWVBFX0FSUkFZYGApOyBvbmx5IGFuXFxuKyAgIGFycmF5IG1hcCBleHBvc2VzIGl0cyB2YWx1ZSBidWZmZXIgdGhyb3VnaCBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpYGAgYXMgYVxcbisgICBrZXJuZWwgYWRkcmVzcyBzcGFubmluZyBgYHZhbHVlX3NpemVgYCBieXRlcy4gQSBtYXAgdGhhdCBpcyBub3QgZXhjbHVzaXZlLCBub3RcXG4rICAgZnJvemVuLCBvciBub3QgYSBwbGFpbiBhcnJheSBpcyByZWplY3RlZCwgd2l0aCBhIHZlcmlmaWVyIGxvZyBtZXNzYWdlIG5hbWluZ1xcbisgICB0aGUgb2ZmZW5kaW5nIG1hcC4gVGhlIGtlcm5lbCBhcHBlbmRzIGVhY2ggbWFwJ3MgZnJvemVuXFxuKyAgIGNvbnRlbnRzIHRvIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIgYW5kIHZlcmlmaWVzIHRoZSBQS0NTIzcgc2lnbmF0dXJlIG92ZXIgdGhlXFxuKyAgIGNvbmNhdGVuYXRpb24gYGBpbnNucyB8fCBtZXRhZGF0YV8wIHx8IG1ldGFkYXRhXzEgfHwgLi4uYGAgaW4gYGB1c2VkX21hcHNgYFxcbisgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuXFxuK1xcbitBIHNpZ25lZCBwcm9ncmFtIHRoZXJlZm9yZSB0YWtlcyBvbmUgb2YgZXhhY3RseSB0d28gc2hhcGVzLCBib3RoIGZ1bGx5XFxuK3N1cHBvcnRlZDpcXG4rXFxuKy0gKipObyBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250ID09IDBgYCk6IHRoZXJlIGlzIG5vdGhpbmcgdG8gYXBwZW5kLCBzbyB0aGVcXG4rICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlXFxuKyAgeWllbGRzIGBgQlBGX1NJR19WRVJJRklFRGBgIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gVGhpcyBpcyB0aGUgb3JkaW5hcnkgY2FzZVxcbisgIGZvciBhIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIHNlcGFyYXRlIHBheWxvYWQ7IGl0IGlzICpub3QqXFxuKyAgcmVqZWN0ZWQgZm9yIFxcXCJtaXNzaW5nXFxcIiBtZXRhZGF0YSwgYmVjYXVzZSBpdCBoYXMgbm9uZSB0byBjb3Zlci5cXG4rLSAqKkV4Y2x1c2l2ZSBib3VuZCBtYXBzKiogKGBgZmRfYXJyYXlfY250IFxcdTAwM2UgMGBgKTogZXZlcnkgZW50cnkgaXMgZXhjbHVzaXZlIGFuZFxcbisgIGZvbGRlZCwgc28gdGhlIHNpZ25hdHVyZSBjb3ZlcnMgYGBpbnNucyB8fCBtZXRhZGF0YWBgLlxcbitcXG4rVGhlcmUgaXMgbm8gdGhpcmQgc2hhcGU6IGEgbm9uLWV4Y2x1c2l2ZSBtYXAgaW4gYSBzaWduZWQgcHJvZ3JhbSdzIGBgZmRfYXJyYXlgYFxcbitpcyByZWplY3RlZCByYXRoZXIgdGhhbiBzaWxlbnRseSBsZWZ0IG91dCBvZiB0aGUgc2lnbmF0dXJlLCBzbyBhIHByb2dyYW0gYm91bmRcXG4rdG8gYSBzaWduZWQgbG9hZGVyIG5ldmVyIGhhcyBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyLlxcbitcXG4rVGhlIGRpZ2VzdCBiaW5kaW5nIChgYGV4Y2xfcHJvZ19zaGEgPT0gcHJvZy1cXHUwMDNlZGlnZXN0YGApIGlzIGVuZm9yY2VkIGJ5IHRoZVxcbit2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC1cXG4rYmVmb3JlIHRoZSB2ZXJpZmllciB3b3VsZCBvdGhlcndpc2UgY29tcHV0ZSB0aGUgdGFnIC0gYGBwcm9nLVxcdTAwM2VkaWdlc3RgYCBpc1xcbitjb21wdXRlZCB1cCBmcm9udCBpbiB0aGUgdmVyaWZpZXIsIG92ZXIgdGhlIHVubW9kaWZpZWQgKHNpZ25hdHVyZS1jb3ZlcmVkKVxcbitpbnN0cnVjdGlvbnMsIGZvciBhbnkgc2lnbmVkIGxvYWQuXFxuK1xcbitDb3ZlcmFnZSBpcyB0aGVuIGVuZm9yY2VkIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMsIGF0IHRoZSBwb2ludFxcbitlYWNoIG9iamVjdCBpcyBib3VuZCByYXRoZXIgdGhhbiBieSBhIGNvdW50IHRha2VuIGFmdGVyd2FyZHMuIE9uY2UgdGhlIHNpZ25hdHVyZVxcbitoYXMgYmVlbiB2ZXJpZmllZCwgYmluZGluZyBhbnkgZnVydGhlciBtYXAgaXMgcmVmdXNlZDogYSBtYXAgcmVhY2hlZCBieSBhXFxuK2RpcmVjdGx5LXJlZmVyZW5jZWQgZmQsIG9yIGEgbWFwIHN3YXBwZWQgaW50byBhbiBgYGZkX2FycmF5YGAgc2xvdCB0aGUgbG9hZGVyXFxuK3JlYWRzLCBpcyBub3QgYW1vbmcgdGhvc2UgYWxyZWFkeSBmb2xkZWQsIHNvIGl0IGlzIHJlamVjdGVkIHRoZSBtb21lbnQgdGhlXFxuK3ZlcmlmaWVyIHRyaWVzIHRvIGJpbmQgaXQuIEEgQlRGIGlzIHJlZnVzZWQgb3V0cmlnaHQgZm9yIGEgc2lnbmVkIHByb2dyYW0gLSBhXFxuK2tzeW0gb3IgYSBCVEYgZmQgaW4gYGBmZF9hcnJheWBgLCB3aGV0aGVyIHJlc29sdmVkIHVwIGZyb250IG9yIGxhemlseSBmb3IgYVxcbittb2R1bGUga2Z1bmMsIGlzIHJlamVjdGVkIHdoZW4gaXQgd291bGQgYmUgYm91bmQuIFRvZ2V0aGVyIHdpdGggdGhlIGZvbGQgcnVsZVxcbithYm92ZSB0aGlzIGtlZXBzIHRoZSB2ZXJkaWN0IGJpbmFyeTogYSBzaWduZWQgcHJvZ3JhbSBjYW5ub3QgdXNlIGEgbWFwIGl0c1xcbitzaWduYXR1cmUgZG9lcyBub3QgY292ZXIsIGFuZCBhIGRpZmZlcmVudCBidXQgZXF1YWxseSBkaWdlc3QtYm91bmQgbWFwIGNhbm5vdCBiZVxcbitzdWJzdGl0dXRlZCBhdCBhbiBgYGZkX2FycmF5YGAgc2xvdC4gTm9uLWV4Y2x1c2l2ZSBtYXBzIGFyZSBuZXZlciBmb2xkZWQsIHNvIGFcXG4rc2lnbmVkIHByb2dyYW0gY2Fubm90IHVzZSBvbmUgYXQgYWxsLlxcbitcXG4rVGhlIHZlcmRpY3RcXG4rPT09PT09PT09PT1cXG4rXFxuK0EgcHJvZ3JhbSBpcyBlaXRoZXIgdW5zaWduZWQgb3IgZnVsbHkgdmVyaWZpZWQgLSB0aGVyZSBpcyBubyBpbnRlcm1lZGlhdGVcXG4rc3RhdGUuIFRoZSBvdXRjb21lIGlzIHJlY29yZGVkIGluIGBgcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcudmVyZGljdGBgOlxcbitcXG4rLi4gY29kZS1ibG9jazo6IGNcXG4rXFxuKyAgICBlbnVtIGJwZl9zaWdfdmVyZGljdCB7XFxuKyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLFxcbisgICAgICAgICAgICBCUEZfU0lHX1ZFUklGSUVELFxcbisgICAgfTtcXG4rXFxuK2BgQlBGX1NJR19WRVJJRklFRGBgIG1lYW5zIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQgYW5kIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zXFxuKyphbmQqIHRoZSBmcm96ZW4gY29udGVudHMgb2YgZXZlcnkgZXhjbHVzaXZlIG1hcCB0aGUgcHJvZ3JhbSB1c2VzOlxcbitcXG4rLSBGb3IgYW4gb3JkaW5hcnksIGRpcmVjdGx5LWxvYWRlZCBzaWduZWQgcHJvZ3JhbSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgd2hvbGVcXG4rICBhcnRpZmFjdCBhbmQgaXQgdXNlcyBubyBleGNsdXNpdmUgbWFwcywgc28gYSB2YWxpZCBpbnN0cnVjdGlvbiBzaWduYXR1cmUgaXNcXG4rICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLlxcbistIEZvciBhIHNpZ25lZCBsb2FkZXIgdGhlIG1ldGFkYXRhIG1hcCBpcyBleGNsdXNpdmUsIHNvIGl0cyBjb250ZW50cyBhcmUgZm9sZGVkXFxuKyAgaW4gYW5kIHRoZSBzaWduYXR1cmUgY292ZXJzIGBgaW5zbnMgfHwgbWV0YWRhdGFgYC5cXG4rXFxuK1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBcXFwiaW5zdHJ1Y3Rpb25zIHZlcmlmaWVkIGJ1dCBtZXRhZGF0YSBub3RcXFwiIHZlcmRpY3Q6IGFcXG4rc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3RcXG4rcmVjb3JkZWQgd2l0aCBhIHdlYWtlciB2ZXJkaWN0LiBgYEJQRl9TSUdfVkVSSUZJRURgYCB0aGVyZWZvcmUgYWx3YXlzIG1lYW5zIHRoZVxcbitwcm9ncmFtIGFuZCBldmVyeXRoaW5nIHRoZSBzaWduYXR1cmUgaXMgcmVzcG9uc2libGUgZm9yIGFyZSBhdXRoZW50aWMsIHdoaWNoIGlzXFxuK3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uXFxuK1xcbitBbG9uZ3NpZGUgdGhlIHZlcmRpY3QgdGhlIGtlcm5lbCByZWNvcmRzIHdoaWNoIGtleXJpbmcgdmFsaWRhdGVkIHRoZSBzaWduYXR1cmU7XFxuK3NlZSBgS2V5cmluZ3NgXy5cXG4rXFxuK0VuZm9yY2VtZW50IHZpYSBMU01zXFxuKz09PT09PT09PT09PT09PT09PT09XFxuK1xcbitTaWduaW5nIG9ubHkgKnJlY29yZHMqIGEgdmVyZGljdDsgYW4gTFNNIHR1cm5zIGl0IGludG8gcG9saWN5LiBUaGUgdmVyZGljdCBhbmRcXG4ra2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWRcXG4rdGhlbSBkaXJlY3RseSAoc2VlIERvY3VtZW50YXRpb24vYnBmL3Byb2dfbHNtLnJzdCBmb3Igd3JpdGluZyBhbmQgYXR0YWNoaW5nIEJQRlxcbitMU00gcHJvZ3JhbXMpOyB0aGUgc2FtZSBmaWVsZHMgYXJlIGVxdWFsbHkgYXZhaWxhYmxlIHRvIGluLXRyZWUgTFNNcyBzdWNoIGFzXFxuK0lQRS4gVHdvIGhvb2tzIGFyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZFxcbitgYHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoKWBgIGdhdGVzIGFkbWlzc2lvbiBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmssXFxuK2FuZCB0aGUgZXhpc3RpbmcgYGBzZWN1cml0eV9icGZfcHJvZygpYGAgb2JzZXJ2ZXMgYSBwcm9ncmFtIHRoYXQgaGFzIGZ1bGx5XFxuK2xvYWRlZC5cXG4rXFxuK0FkbWlzc2lvbjogYGBzZWN1cml0eV9icGZfcHJvZ19sb2FkKClgYFxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4rXFxuK1RoaXMgaG9vayBnYXRlcyBhZG1pc3Npb24gKipmb3IgZXZlcnkgbG9hZCoqLCBmcm9tIGEgc2luZ2xlIGNhbGwgc2l0ZSBpbnNpZGUgdGhlXFxuK3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlXFxuK29wdGlvbmFsIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIHNvIHRoZSB2ZXJkaWN0IGFuZCBrZXlyaW5nIGZpZWxkcyBhcmUgZmluYWwgLSB0aGVcXG4raG9vayBjYW4gc2VlIHdoZXRoZXIsIGFuZCBob3cgc3Ryb25nbHksIHRoZSBwcm9ncmFtIHdhcyBzaWduZWQsIHdoaWNoIGtleXJpbmdcXG4rdmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlXFxuK2tlcm5lbC4gRm9yIGEgc2lnbmVkIGxvYWQgdGhlIHZlcmRpY3QgaXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgaGVyZSAodGhlIHNpZ25hdHVyZVxcbitoYXMganVzdCBiZWVuIGNoZWNrZWQpOyBmb3IgYW4gdW5zaWduZWQgbG9hZCBpdCBpcyBgYEJQRl9TSUdfVU5TSUdORURgYC5cXG4rXFxuK1RoaXMgaXMgdGhlIHBsYWNlIGZvciAqY29hcnNlIGFkbWlzc2lvbiogdGhhdCBtdXN0IGFsc28gc2VlIHVuc2lnbmVkIGFuZFxcbitub3QteWV0LXZlcmlmaWVkIGxvYWRzOiByZXF1aXJlIGEgc2lnbmF0dXJlIGF0IGFsbCwgcmVzdHJpY3QgdGhlIGFjY2VwdGFibGVcXG4ra2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlXFxuK3J1bGVzLCBvciBhdWRpdCBldmVyeSBhdHRlbXB0LiBJdCBpcyB0aGUgcHJpbWFyeSBkZW55IHBvaW50LlxcbitcXG4rT25lIHN1YnRsZXR5OiB0aGlzIGhvb2sgcnVucyAqYmVmb3JlKiB0aGUgdmVyaWZpZXIgZmluaXNoZXMgaXRzIHdvcmssIHNvXFxuK2BgQlBGX1NJR19WRVJJRklFRGBgICpoZXJlKiBtZWFucyBvbmx5IFxcXCJ2YWxpZGx5IHNpZ25lZFxcXCIgLSBub3QgXFxcImxvYWRlZFxcXCIuIEFsbG93aW5nXFxuK2EgbG9hZCBhdCB0aGlzIHBvaW50IGxldHMgaXQgKnByb2NlZWQqOyBpdCBkb2VzIG5vdCBndWFyYW50ZWUgdGhlIHByb2dyYW0gd2lsbFxcbitsb2FkLiBBIHZhbGlkbHkgc2lnbmVkIHByb2dyYW0gY2FuIHN0aWxsIGJlIHJlamVjdGVkIGFmdGVyd2FyZHMgb24gdHdvXFxuK2luZGVwZW5kZW50IGdyb3VuZHM6IHRoZSB2ZXJpZmllciBtYXkgcmVqZWN0IGl0IGxpa2UgYW55IG90aGVyIHByb2dyYW0gKHVuc2FmZVxcbittZW1vcnkgYWNjZXNzLCBiYWQgY29udHJvbCBmbG93LCByZXNvdXJjZSBsaW1pdHMsIC4uLiksIGFuZCB0aGUga2VybmVsIHNlcGFyYXRlbHlcXG4rcmVmdXNlcyAtIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMgYW5kIGJpbmRzIGVhY2ggb2JqZWN0IC0gYW55IG1hcFxcbit0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIG9yIGFueSBCVEYgYXQgYWxsLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBob29rXFxuK3JldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcXG4rKGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxcbit2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC5cXG4rXFxuK0EgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFxcXCJpcyBpdCBzaWduZWQgYXQgYWxsXFxcIjogYWNjZXB0IHByb2dyYW1zXFxuK3NpZ25lZCBieSBhIHN5c3RlbSBrZXlyaW5nLCBhY2NlcHQgYSB1c2VyLWtleXJpbmcgc2lnbmF0dXJlIG9ubHkgaWYgdGhlXFxuK2tleS9rZXlyaW5nIGl0IHdhcyB2ZXJpZmllZCBhZ2FpbnN0IGlzIG9uIGFuIGV4cGxpY2l0IGFsbG93bGlzdCwgYW5kIGVtaXQgYVxcbit0YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmVcXG4rYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcXG4rXFxuKy4uIGNvZGUtYmxvY2s6OiBjXFxuK1xcbisgICAgLyogU2VyaWFscyBvZiB1c2VyIGtleXMva2V5cmluZ3Mgd2UgYWRkaXRpb25hbGx5IHRydXN0LiAqL1xcbisgICAgc3RydWN0IHtcXG4rICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcXG4rICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqL1xcbisgICAgICAgICAgICBfX3R5cGUodmFsdWUsIF9fdTgpO1xcbisgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDY0KTtcXG4rICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rICAgIC8qIEF1ZGl0IHN0cmVhbSBjb25zdW1lZCBieSBhIHVzZXJzcGFjZSBsb2dnZXIuICovXFxuKyAgICBzdHJ1Y3Qge1xcbisgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xcbisgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDEgXFx1MDAzY1xcdTAwM2MgMTYpO1xcbisgICAgfSBhdWRpdCBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbisgICAgc3RydWN0IGRlY2lzaW9uIHsgX191MzIgcHJvZ190eXBlLCB2ZXJkaWN0LCBrdHlwZTsgX19zMzIgc2VyaWFsLCByZXQ7IH07XFxuK1xcbisgICAgU0VDKFxcXCJsc20vYnBmX3Byb2dfbG9hZFxcXCIpXFxuKyAgICBpbnQgQlBGX1BST0coYWRtaXQsIHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsXFxuKyAgICAgICAgICAgICAgICAgc3RydWN0IGJwZl90b2tlbiAqdG9rZW4sIGJvb2wga2VybmVsKVxcbisgICAge1xcbisgICAgICAgICAgICBfX3UzMiB2ZXJkaWN0ID0gcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcudmVyZGljdDtcXG4rICAgICAgICAgICAgX191MzIga3R5cGUgICA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfdHlwZTtcXG4rICAgICAgICAgICAgX19zMzIgc2VyaWFsICA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsO1xcbisgICAgICAgICAgICBzdHJ1Y3QgZGVjaXNpb24gKmQ7XFxuKyAgICAgICAgICAgIGludCByZXQgPSAwO1xcbitcXG4rICAgICAgICAgICAgaWYgKGtlcm5lbClcXG4rICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqL1xcbitcXG4rICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRClcXG4rICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgdmFsaWRseSBzaWduZWQgKi9cXG4rICAgICAgICAgICAgZWxzZSBpZiAoa3R5cGUgPT0gQlBGX1NJR19LRVlSSU5HX1VTRVIgXFx1MDAyNlxcdTAwMjZcXG4rICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oXFx1MDAyNnRydXN0ZWRfdXNlcl9rZXlzLCBcXHUwMDI2c2VyaWFsKSlcXG4rICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIGtleS9rZXlyaW5nIG5vdCBhbGxvd2xpc3RlZCAqL1xcbitcXG4rICAgICAgICAgICAgZCA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXFx1MDAyNmF1ZGl0LCBzaXplb2YoKmQpLCAwKTtcXG4rICAgICAgICAgICAgaWYgKGQpIHtcXG4rICAgICAgICAgICAgICAgICAgICBkLVxcdTAwM2Vwcm9nX3R5cGUgPSBhdHRyLVxcdTAwM2Vwcm9nX3R5cGU7XFxuKyAgICAgICAgICAgICAgICAgICAgZC1cXHUwMDNldmVyZGljdCA9IHZlcmRpY3Q7XFxuKyAgICAgICAgICAgICAgICAgICAgZC1cXHUwMDNla3R5cGUgPSBrdHlwZTtcXG4rICAgICAgICAgICAgICAgICAgICBkLVxcdTAwM2VzZXJpYWwgPSBzZXJpYWw7XFxuKyAgICAgICAgICAgICAgICAgICAgZC1cXHUwMDNlcmV0ID0gcmV0O1xcbisgICAgICAgICAgICAgICAgICAgIGJwZl9yaW5nYnVmX3N1Ym1pdChkLCAwKTsgICAgICAgLyogcmVjb3JkIGFsbG93ICphbmQqIGRlbnkgKi9cXG4rICAgICAgICAgICAgfVxcbisgICAgICAgICAgICByZXR1cm4gcmV0O1xcbisgICAgfVxcbitcXG4rT2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGBcXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4rXFxuK1RoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZXBhcmF0ZSBcXFwibWV0YWRhdGEgYXR0ZXN0ZWRcXFwiIGhvb2suIFRoZSBjb3ZlcmFnZSBjaGVja1xcbithYm92ZSBpcyBlbmZvcmNlZCBieSB0aGUga2VybmVsIHVuY29uZGl0aW9uYWxseSwgc28gYSBzaWduZWQgbG9hZGVyIHRoYXQgZmFpbHNcXG4rdG8gY292ZXIgaXRzIG1ldGFkYXRhIG5ldmVyIGxvYWRzIGFuZCBhbiBMU00gbmV2ZXIgaGFzIHRvIHJlLWVzdGFibGlzaCB0aGF0XFxuK2ZhY3QuIFRvICphY3Qgb24qIGEgcHJvZ3JhbSB0aGF0IGhhcyBzdWNjZXNzZnVsbHkgYW5kIGZ1bGx5IGxvYWRlZCwgdXNlIHRoZVxcbitleGlzdGluZyBgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCBob29rIChgYGxzbS9icGZfcHJvZ2BgKSwgd2hpY2ggZmlyZXMgZnJvbVxcbitgYGJwZl9wcm9nX25ld19mZCgpYGAgLSBhZnRlciB0aGUgdmVyaWZpZXIsIGFmdGVyIHRoZSBjb3ZlcmFnZSBjaGVjaywgYW5kIGFmdGVyXFxuK2BgYnBmX3Byb2dfYWxsb2NfaWQoKWBgLiBSZWxhdGl2ZSB0byB0aGUgYWRtaXNzaW9uIGhvb2sgdGhpcyBwb2ludCBpcyBzdHJpY3RseVxcbitsYXRlciBhbmQgc3Ryb25nZXI6XFxuK1xcbistIHRoZSBwcm9ncmFtIGhhcyBhbiBpZCAoYGBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZWlkYGApLCBzbyBpdCBjYW4gYmUgcmVjb3JkZWQgb3IgY29ycmVsYXRlZFxcbisgIHdpdGggbGF0ZXIgZXZlbnRzO1xcbistIGBgdmVyZGljdCA9PSBCUEZfU0lHX1ZFUklGSUVEYGAgKmhlcmUqIG1lYW5zICoqZnVsbHkqKiB2ZXJpZmllZCAtIGEgcHJvZ3JhbVxcbisgIHRoYXQgdXNlZCBhIG1hcCB0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIHdhcyBhbHJlYWR5IHJlamVjdGVkLCBzbyBpdCBjYW5ub3RcXG4rICByZWFjaCB0aGlzIHBvaW50O1xcbistIGl0IG9ic2VydmVzIG9ubHkgcHJvZ3JhbXMgdGhhdCBhY3R1YWxseSBsb2FkZWQ7IGEgZmFpbGVkIGxvYWQgbmV2ZXIgbWludHMgYW5cXG4rICBmZCwgc28gaXQgbmV2ZXIgcmVhY2hlcyB0aGlzIGhvb2suXFxuK1xcbitJdCB0YWtlcyBvbmx5IHRoZSBgYHByb2dgYCBhbmQgYSBub24temVybyByZXR1cm4gc3RpbGwgYWJvcnRzICh0aGUgZmQgaXMgbm90XFxuK2hhbmRlZCBvdXQpLCBzbyBpdCBjYW4gdmV0byBhcyB3ZWxsIGFzIG9ic2VydmUuIE9uZSB3cmlua2xlOiBpdCBhbHNvIGZpcmVzIG9uXFxuK290aGVyIHBhdGhzIHRoYXQgbWludCBhIG5ldyBwcm9ncmFtIGZkIC0gbm90YWJseSBgYGJwZl9wcm9nX2dldF9mZF9ieV9pZCgpYGAgLVxcbitub3QganVzdCBvbiBhIGZyZXNoIGxvYWQuIEJlY2F1c2UgdGhlIHByb2dyYW0gYWxyZWFkeSBoYXMgaXRzIGlkIGhlcmUsIGFuIExTTVxcbitjYW4gdGVsbCB0aGUgdHdvIGFwYXJ0IHdpdGggYSBzbWFsbCBoYXNoIG1hcDogdGhlICpmaXJzdCogdGltZSBhbiBpZCBpcyBzZWVuIGlzXFxuK3RoZSBsb2FkOyBhIGxhdGVyIHNpZ2h0aW5nIG9mIHRoZSBzYW1lIGlkIGlzIGp1c3QgYW5vdGhlciBmZCB0byBhIHByb2dyYW0gdGhhdFxcbithbHJlYWR5IGV4aXN0cy5cXG4rXFxuK1RvIGJvdW5kIHRoZSBtYXAgYW5kIGxldCBhIHJldXNlZCBpZCByZWFkIGFzIGEgZnJlc2ggbG9hZCwgdGhpcyBjYW4gYmUgcGFpcmVkXFxuK3dpdGggYGBzZWN1cml0eV9icGZfcHJvZ19mcmVlKClgYCAoYGBsc20vYnBmX3Byb2dfZnJlZWBgKSwgd2hpY2ggZGVsZXRlcyB0aGVcXG4rZW50cnkgb24gdGVhcmRvd24gLSBrZXllZCBieSB0aGUgc2FtZSBgYHByb2dgYCBwb2ludGVyLCBzaW5jZVxcbitgYGJwZl9wcm9nX2ZyZWVfaWQoKWBgIGhhcyBhbHJlYWR5IGNsZWFyZWQgYGBwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZWlkYGAgdG8gYGAwYGAgYnkgdGhlIHRpbWVcXG4rdGhhdCBob29rIHJ1bnMuIChJbGx1c3RyYXRpdmUgLSBwcml2aWxlZ2VkIExTTSwgZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcXG4rXFxuKy4uIGNvZGUtYmxvY2s6OiBjXFxuK1xcbisgICAgc3RydWN0IHJlYyB7IF9fdTMyIGlkLCBrdHlwZTsgX19zMzIgc2VyaWFsOyB9O1xcbitcXG4rICAgIHN0cnVjdCB7XFxuKyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XFxuKyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fdTY0KTsgICAgICAgICAgICAgLyogc3RydWN0IGJwZl9wcm9nICogLS0gc3RhYmxlIGlkICovXFxuKyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgc3RydWN0IHJlYyk7XFxuKyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNDA5Nik7XFxuKyAgICB9IGxpdmUgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rICAgIFNFQyhcXFwibHNtL2JwZl9wcm9nXFxcIikgICAgICAgICAgICAvKiBmaXJlcyBhZnRlciBsb2FkIGFuZCBvbiBldmVyeSBsYXRlciBmZCAqL1xcbisgICAgaW50IEJQRl9QUk9HKG9ic2VydmUsIHN0cnVjdCBicGZfcHJvZyAqcHJvZylcXG4rICAgIHtcXG4rICAgICAgICAgICAgX191NjQga2V5ID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXByb2c7XFxuKyAgICAgICAgICAgIHN0cnVjdCByZWMgcjtcXG4rXFxuKyAgICAgICAgICAgIGlmIChwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy52ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXFxuKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XFxuKyAgICAgICAgICAgIGlmIChicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZsaXZlLCBcXHUwMDI2a2V5KSlcXG4rICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAvKiBzZWVuIGJlZm9yZTogYSBsYXRlciBmZCwgbm90IGEgbG9hZCAqL1xcbitcXG4rICAgICAgICAgICAgLyogRmlyc3Qgc2lnaHRpbmcgPT0gdGhpcyBwcm9ncmFtIGp1c3QgbG9hZGVkOyBpZCBpcyB2YWxpZCBoZXJlLiAqL1xcbisgICAgICAgICAgICByLmlkICAgICA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlaWQ7XFxuKyAgICAgICAgICAgIHIua3R5cGUgID0gcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlO1xcbisgICAgICAgICAgICByLnNlcmlhbCA9IHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsO1xcbisgICAgICAgICAgICBicGZfbWFwX3VwZGF0ZV9lbGVtKFxcdTAwMjZsaXZlLCBcXHUwMDI2a2V5LCBcXHUwMDI2ciwgQlBGX05PRVhJU1QpO1xcbisgICAgICAgICAgICAvKiAuLi4gbmV3bHktbG9hZGVkIHZlcmlmaWVkLXByb2dyYW0gYWN0aW9uLCBlLmcuIHJlY29yZCByLmlkIC4uLiAqL1xcbisgICAgICAgICAgICByZXR1cm4gMDtcXG4rICAgIH1cXG4rXFxuK1B1dHRpbmcgdGhlbSB0b2dldGhlcjogdG8gKnJlcXVpcmUqIHZlcmlmaWVkIEJQRiwgZGVueSBhdCB0aGUgYWRtaXNzaW9uIGhvb2tcXG4rdW5sZXNzIHRoZSB2ZXJkaWN0IGlzIGBgQlBGX1NJR19WRVJJRklFRGBgIChhbmQsIGlmIGRlc2lyZWQsIHJlc3RyaWN0IHRoZVxcbitrZXlyaW5nKS4gVGhlIGtlcm5lbCB0aGVuIGd1YXJhbnRlZXMgdGhhdCBhbnkgcHJvZ3JhbSB3aGljaCBhY3R1YWxseSBsb2FkcyB3aXRoXFxuK3RoYXQgdmVyZGljdCBjb3ZlcmVkIGFsbCBvZiBpdHMgZXhjbHVzaXZlIG1hcHMsIHJlamVjdGluZyBhbnkgdGhhdCBkaWQgbm90IC0gc29cXG4rYSBkZW55LWJ5LWRlZmF1bHQgYWRtaXNzaW9uIHBvbGljeSBuZWVkcyBubyBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuIFVzZVxcbitgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCB0byByZWNvcmQgb3IgZmluYWxseSBnYXRlIHRoZSB2ZXJpZmllZCBwcm9ncmFtcyBvbmNlXFxuK3RoZXkgY2FycnkgYW4gaWQuIFRoZSBgYHZlcmRpY3RgYCwgYGBrZXlyaW5nX3R5cGVgYCBhbmQgYGBrZXlyaW5nX3NlcmlhbGBgIGZpZWxkc1xcbitsZXQgYSBwb2xpY3kgZGlzdGluZ3Vpc2gsIGZvciBleGFtcGxlLCBcXFwidmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5XFxcIlxcbitmcm9tIFxcXCJ2ZXJpZmllZCBieSBhIHVzZXIga2V5XFxcIi4gUG9saWN5IExTTXMgc3VjaCBhcyBJUEUgY29uc3VtZSB0aGUgc2FtZSBob29rcyB0b1xcbitlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYuXFxuK1xcbitLZXlyaW5nc1xcbis9PT09PT09PVxcbitcXG4rYGBrZXlyaW5nX2lkYGAgc2VsZWN0cyB0aGUgdHJ1c3RlZCBrZXlyaW5nIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkXFxuK2FnYWluc3QuIFRoZSB3ZWxsLWtub3duIGlkcyBgYDBgYCAoYnVpbHRpbiksIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXFxuK2FuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XFxuK2FueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBzZXJpYWwgb2YgYSB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcuXFxuK1RoZSBrZXlyaW5nIGlzIGxvb2tlZCB1cCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXFxuK3NpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXFxuK3ZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBzbyBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aCBhXFxuK3NpZ25hdHVyZSBhbHdheXMgaGFzIGNvbnNpc3RlbnQga2V5cmluZyBmaWVsZHMgcmVjb3JkZWQuXFxuK1xcbitUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxcbitcXG4rYGBrZXlyaW5nX3R5cGVgYCAoYGBlbnVtIGJwZl9zaWdfa2V5cmluZ2BgKVxcbisgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6XFxuKyAgICBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAsIGBgX1NFQ09OREFSWWBgLCBgYF9QTEFURk9STWBgIGZvciB0aGUgc3lzdGVtXFxuKyAgICBrZXlyaW5ncywgb3IgYGBfVVNFUmBgIGZvciBhIHVzZXIvc2Vzc2lvbiBrZXlyaW5nLiBJdCBpc1xcbisgICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLlxcbitcXG4rYGBrZXlyaW5nX3NlcmlhbGBgIChgYHMzMmBgKVxcbisgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlXFxuKyAgICAqKnVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGVcXG4rICAgIG9iamVjdCB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCBhZ2FpbnN0LCBub3QgdGhlIGluZGl2aWR1YWwgYXN5bW1ldHJpY1xcbisgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZ1xcbisgICAgYGBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkdgYCwgZm9yIGV4YW1wbGUsIHJlY29yZHMgdGhlIHNlc3Npb24ga2V5cmluZydzXFxuKyAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQgZXhwb3NlIG5vIHNlcmlhbFxcbisgICAgaGVyZSwgc28gdGhlIHNlcmlhbCBpcyBgYDBgYCBmb3IgYnVpbHRpbiwgc2Vjb25kYXJ5IGFuZCBwbGF0Zm9ybVxcbisgICAgc2lnbmF0dXJlcywgYW5kIGBgMGBgIGZvciB1bnNpZ25lZCBwcm9ncmFtcy4gSW4gb3RoZXIgd29yZHMsIGEgbm9uLXplcm9cXG4rICAgIGBga2V5cmluZ19zZXJpYWxgYCBpcyBleGFjdGx5IFxcXCJ2ZXJpZmllZCBhZ2FpbnN0IHRoZSB1c2VyIGtleS9rZXlyaW5nIHdpdGhcXG4rICAgIHRoaXMgc2VyaWFsXFxcIi5cXG4rXFxuKy4uIGxpc3QtdGFibGU6OlxcbisgICA6aGVhZGVyLXJvd3M6IDFcXG4rXFxuKyAgICogLSBgYGtleXJpbmdfaWRgYFxcbisgICAgIC0gYGBrZXlyaW5nX3R5cGVgYFxcbisgICAgIC0gYGBrZXlyaW5nX3NlcmlhbGBgXFxuKyAgICogLSAobm8gc2lnbmF0dXJlKVxcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgXFxuKyAgICAgLSBgYDBgYFxcbisgICAqIC0gYGAwYGBcXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYFxcbisgICAgIC0gYGAwYGBcXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXFxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUllgYFxcbisgICAgIC0gYGAwYGBcXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNYGBcXG4rICAgICAtIGBgMGBgXFxuKyAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYFxcbisgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZ1xcbitcXG4rUHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdFxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PVxcbitcXG4rYGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjpcXG4rXFxuKyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBcXHUwMDNjcHJpdmF0ZV9rZXkucGVtXFx1MDAzZSAtaSBcXHUwMDNjY2VydGlmaWNhdGUueDUwOVxcdTAwM2UgXFxcXFxcbisgICAgICAgICAgICBvYmouYnBmLm8gXFx1MDAzZSBvYmoubHNrZWwuaFxcbitcXG4rYGAtTGBgIHNlbGVjdHMgdGhlIGxpZ2h0LXNrZWxldG9uIChgYGdlbl9sb2FkZXJgYCkgYmFja2VuZCBhbmQgYGAtU2BgIGVuYWJsZXNcXG4rc2lnbmluZzsgYGAta2BgIGFuZCBgYC1pYGAgc3VwcGx5IHRoZSBzaWduaW5nIGtleSBhbmQgaXRzIFguNTA5IGNlcnRpZmljYXRlLlxcbitgYGJwZnRvb2xgYCBzaWducyBgYGluc25zIHx8IG1ldGFkYXRhYGAgLSB0aGUgZXhhY3QgYnl0ZXMgdGhlIGtlcm5lbFxcbityZWNvbnN0cnVjdHMgLSBhbmQgYWxzbyBjb21wdXRlcyBgYGV4Y2xfcHJvZ19oYXNoYGAgYXMgdGhlIGRpZ2VzdCBvZiB0aGUgbG9hZGVyXFxuK2luc3RydWN0aW9ucyBzbyB0aGUgbWV0YWRhdGEgbWFwIGNhbiBiZSBib3VuZCB0byB0aGUgbG9hZGVyLiBUaGUgc2lnbmF0dXJlLFxcbitjZXJ0aWZpY2F0ZSBhbmQgaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IGxvYWRpbmcgdGhlIHNrZWxldG9uXFxuK3BlcmZvcm1zIHRoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlLlxcbitcXG4rQXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvclxcbitleGFtcGxlIGFkZGVkIHRvIHRoZSBzZXNzaW9uIGtleXJpbmcsIG9yIGJ1aWx0IGludG8gdGhlIGtlcm5lbCdzIGJ1aWx0aW4gdHJ1c3RlZFxcbitrZXlyaW5nKSBmb3IgdmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuXFxuK1xcbitVQVBJIHJlZmVyZW5jZVxcbis9PT09PT09PT09PT09PVxcbitcXG4rYGBCUEZfUFJPR19MT0FEYGAgKGBgdW5pb24gYnBmX2F0dHJgYCk6XFxuK1xcbitgYHNpZ25hdHVyZWBgLCBgYHNpZ25hdHVyZV9zaXplYGBcXG4rICAgIFBvaW50ZXIgdG8gYW5kIGxlbmd0aCBvZiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iLlxcbitcXG4rYGBrZXlyaW5nX2lkYGBcXG4rICAgIFRydXN0ZWQga2V5cmluZyBzZWxlY3RvciAoc2VlIGBLZXlyaW5nc2BfKS5cXG4rXFxuK2BgZmRfYXJyYXlgYCwgYGBmZF9hcnJheV9jbnRgYFxcbisgICAgQXJyYXkgb2YgbWFwIGZpbGUgZGVzY3JpcHRvcnMgYm91bmQgdG8gdGhlIHByb2dyYW0uIGBgZmRfYXJyYXlfY250YGAgbXVzdCBiZVxcbisgICAgc2V0IGZvciB0aGUga2VybmVsIHRvIHNjYW4gdGhlIGFycmF5LiBXaGVuIGEgc2lnbmF0dXJlIGlzIHByZXNlbnQsIGV2ZXJ5IG1hcFxcbisgICAgaW4gdGhlIGFycmF5IG11c3QgYmUgZXhjbHVzaXZlOyBpdHMgZnJvemVuIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGVcXG4rICAgIHZlcmlmaWVkIGJ1ZmZlciwgYW5kIGEgbm9uLWV4Y2x1c2l2ZSBlbnRyeSBpcyByZWplY3RlZC5cXG4rXFxuK2BgQlBGX01BUF9DUkVBVEVgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcXG4rXFxuK2BgZXhjbF9wcm9nX2hhc2hgYCwgYGBleGNsX3Byb2dfaGFzaF9zaXplYGBcXG4rICAgIFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBwcm9ncmFtIHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyAoZXhjbHVzaXZlKSBtYXAuIFRoaXNcXG4rICAgIGJpbmRzIHRoZSBtZXRhZGF0YSBtYXAgdG8gdGhlIGxvYWRlcjsgaXQgaXMgbm90IGEgaGFzaCBvZiB0aGUgbWFwICpjb250ZW50Ki5cXG4rICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsXFxuKyAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXFxuK1xcbitOb3RlcyBhbmQgbGltaXRhdGlvbnNcXG4rPT09PT09PT09PT09PT09PT09PT09PVxcbitcXG4rLSBUaGUgaW5zdHJ1Y3Rpb25zIHBsdXMgZm9sZGVkIG1ldGFkYXRhIGFyZSB2ZXJpZmllZCBhcyBvbmUgYGBicGZfZHlucHRyYGAsXFxuKyAgd2hpY2ggYm91bmRzIHRoZSBjb21iaW5lZCBzaXplIChjdXJyZW50bHkgfjE2IE1pQik7IHZlcnkgbGFyZ2Ugb2JqZWN0cyBjYW5cXG4rICBleGNlZWQgaXQuXFxuKy0gVGhlIG1ldGFkYXRhIGNvbnRhaW5lciBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5IG1hcCwgYWNjZXNzZWQgdGhyb3VnaFxcbisgIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYGAuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmggYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oXFxuaW5kZXggNzZiOGI3NjI3YTEwODUuLjk2MWVmYjkwMzE0MWNjIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oXFxuQEAgLTg5OCw2ICs4OTgsMTQgQEAgc3RydWN0IGJwZl9zY2NfaW5mbyB7XFxuIFxcbiBzdHJ1Y3QgYnBmX2xpdmVuZXNzO1xcbiBcXG4rc3RydWN0IGJwZl9mZF9hcnJheSB7XFxuK1xcdHVuaW9uIHtcXG4rXFx0XFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4rXFx0XFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRcXHR1bnNpZ25lZCBsb25nIHZhbDtcXG4rXFx0fTtcXG4rfTtcXG4rXFxuIC8qIHNpbmdsZSBjb250YWluZXIgZm9yIGFsbCBzdHJ1Y3RzXFxuICAqIG9uZSB2ZXJpZmllcl9lbnYgcGVyIGJwZl9jaGVjaygpIGNhbGxcXG4gICovXFxuQEAgLTkzOSw2ICs5NDcsNyBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XFxuIFxcdGJvb2wgYnlwYXNzX3NwZWNfdjQ7XFxuIFxcdGJvb2wgc2Vlbl9kaXJlY3Rfd3JpdGU7XFxuIFxcdGJvb2wgc2Vlbl9leGNlcHRpb247XFxuK1xcdGJvb2wgc2lnbmF0dXJlO1xcbiBcXHRzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEgKmluc25fYXV4X2RhdGE7IC8qIGFycmF5IG9mIHBlci1pbnNuIHN0YXRlICovXFxuIFxcdGNvbnN0IHN0cnVjdCBicGZfbGluZV9pbmZvICpwcmV2X2xpbmZvO1xcbiBcXHRzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyBsb2c7XFxuQEAgLTk4OSw3ICs5OTgsMTkgQEAgc3RydWN0IGJwZl92ZXJpZmllcl9lbnYge1xcbiBcXHR1MzIgZnJlZV9saXN0X3NpemU7XFxuIFxcdHUzMiBleHBsb3JlZF9zdGF0ZXNfc2l6ZTtcXG4gXFx0dTMyIG51bV9iYWNrZWRnZXM7XFxuLVxcdGJwZnB0cl90IGZkX2FycmF5O1xcbitcXHQvKlxcbitcXHQgKiBUaGUgcHJvZ3JhbSdzIGZkX2FycmF5IGNvbWVzIGluIHR3byBzaGFwZXMsIHRvbGQgYXBhcnQgYnkgd2hldGhlclxcbitcXHQgKiB0aGUgY2FsbGVyIHBhc3NlZCBmZF9hcnJheV9jbnQuIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTpcXG4rXFx0ICogIC0gY29udGludW91cyAoZmRfYXJyYXlfY250IGdpdmVuKTogLVxcdTAwM2VmZF9hcnJheSBob2xkcyBldmVyeSBlbnRyeVxcbitcXHQgKiAgICByZXNvbHZlZCB0byBpdHMgb2JqZWN0IHVwIGZyb250LCBpbmRleGVkIGJ5IGZkX2FycmF5IHBvc2l0aW9uLFxcbitcXHQgKiAgICB3aXRoIC1cXHUwMDNlZmRfYXJyYXlfY250IHNsb3RzOyAtXFx1MDAzZWZkX2FycmF5X3JhdyBpcyB1bnVzZWQuXFxuK1xcdCAqICAtIHNwYXJzZSAobm8gZmRfYXJyYXlfY250KTogLVxcdTAwM2VmZF9hcnJheSBpcyBOVUxMLCBhbmQgZW50cmllcyBhcmVcXG4rXFx0ICogICAgcmVhZCBmcm9tIC1cXHUwMDNlZmRfYXJyYXlfcmF3ICh0aGUgY2FsbGVyJ3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZFxcbitcXHQgKiAgICBsYXppbHkgb24gZmlyc3QgcmVmZXJlbmNlLlxcbitcXHQgKi9cXG4rXFx0c3RydWN0IGJwZl9mZF9hcnJheSAqZmRfYXJyYXk7XFxuK1xcdHUzMiBmZF9hcnJheV9jbnQ7XFxuK1xcdGJwZnB0cl90IGZkX2FycmF5X3JhdztcXG4gXFxuIFxcdC8qIGJpdCBtYXNrIHRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBhIHJlZ2lzdGVyIGhhcyBiZWVuIGFjY2Vzc2VkXFxuIFxcdCAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGZ1bmN0aW9uIHN0YXRlIHdhcyBwcmludGVkXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvc3lzY2FsbC5jIGIva2VybmVsL2JwZi9zeXNjYWxsLmNcXG5pbmRleCA2ZGIzMDZkMjNiNDc5Zi4uYzQ5NmM3M2E4NDgzMmMgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcXG4rKysgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xcbkBAIC00MCw3ICs0MCw2IEBAXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC90cmFjZXBvaW50LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9vdmVyZmxvdy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvY29va2llLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC92ZXJpZmljYXRpb24uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFxcdTAwM2VcXG4gXFxuICNpbmNsdWRlIFxcdTAwM2NuZXQvbmV0ZmlsdGVyL25mX2JwZl9saW5rLmhcXHUwMDNlXFxuQEAgLTE2MDAsMTEgKzE1OTksNiBAQCBzdGF0aWMgaW50IG1hcF9jcmVhdGVfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX3ZlclxcbiBcXHRcXHRcXHRnb3RvIGZyZWVfbWFwO1xcbiBcXHRcXHR9XFxuIFxcbi1cXHRcXHQvKiBTZWUgbGliYnBmOiBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpICovXFxuLVxcdFxcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgZXhjbCkgIT0gU0hBMjU2X0RJR0VTVF9TSVpFKTtcXG4tXFx0XFx0QlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtXFx1MDAzZWV4Y2wsIHUzMikpO1xcbi1cXHRcXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJwZl9tYXAsIHNoYSkgICE9IDApO1xcbi1cXHRcXHRCVUlMRF9CVUdfT04oIV9fc2FtZV90eXBlKG1hcC1cXHUwMDNlc2hhLCB1OFtTSEEyNTZfRElHRVNUX1NJWkVdKSk7XFxuIFxcdFxcdG1hcC1cXHUwMDNlZXhjbCA9IDE7XFxuIFxcdH0gZWxzZSBpZiAoYXR0ci1cXHUwMDNlZXhjbF9wcm9nX2hhc2hfc2l6ZSkge1xcbiBcXHRcXHRicGZfbG9nKGxvZywgXFxcIkludmFsaWQgZXhjbF9wcm9nX2hhc2hfc2l6ZS5cXFxcblxcXCIpO1xcbkBAIC0yODg2LDY0ICsyODgwLDYgQEAgc3RhdGljIGJvb2wgaXNfcGVyZm1vbl9wcm9nX3R5cGUoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSlcXG4gXFx0fVxcbiB9XFxuIFxcbi1zdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXFxuLXtcXG4tXFx0c3dpdGNoIChrZXlyaW5nX2lkKSB7XFxuLVxcdGNhc2UgMDpcXG4tXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xcbi1cXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzpcXG4tXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XFxuLVxcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XFxuLVxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XFxuLVxcdGRlZmF1bHQ6XFxuLVxcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcXG4tXFx0fVxcbi19XFxuLVxcbi1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0cixcXG4tXFx0XFx0XFx0XFx0ICAgICBib29sIGlzX2tlcm5lbCwgczMyICprZXlyaW5nX3NlcmlhbClcXG4te1xcbi1cXHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cXHUwMDNlc2lnbmF0dXJlLCBpc19rZXJuZWwpO1xcbi1cXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGluc25zX3B0cjtcXG4tXFx0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XFxuLVxcdHZvaWQgKnNpZztcXG4tXFx0aW50IGVyciA9IDA7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBEb24ndCBhdHRlbXB0IHRvIHVzZSBrbWFsbG9jX2xhcmdlIG9yIHZtYWxsb2MgZm9yIHNpZ25hdHVyZXMuXFxuLVxcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0Llxcbi1cXHQgKi9cXG4tXFx0aWYgKGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIFxcdTAwM2UgS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbi1cXHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cXHUwMDNla2V5cmluZ19pZCkgPT0gMClcXG4tXFx0XFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbi1cXHRlbHNlXFxuLVxcdFxcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cXHUwMDNla2V5cmluZ19pZCwgMCk7XFxuLVxcbi1cXHRpZiAoIWtleSlcXG4tXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuLVxcbi1cXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xcbi1cXHRpZiAoSVNfRVJSKHNpZykpIHtcXG4tXFx0XFx0YnBmX2tleV9wdXQoa2V5KTtcXG4tXFx0XFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcXG4tXFx0fVxcbi1cXG4tXFx0YnBmX2R5bnB0cl9pbml0KFxcdTAwMjZzaWdfcHRyLCBzaWcsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCxcXG4tXFx0XFx0XFx0YXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xcbi1cXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNmluc25zX3B0ciwgcHJvZy1cXHUwMDNlaW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXFxuLVxcdFxcdFxcdHByb2ctXFx1MDAzZWxlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pKTtcXG4tXFxuLVxcdGVyciA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVxcdTAwMjZpbnNuc19wdHIsXFxuLVxcdFxcdFxcdFxcdFxcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2c2lnX3B0ciwga2V5KTtcXG4tXFx0aWYgKCFlcnIpXFxuLVxcdFxcdCprZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XFxuLVxcdGJwZl9rZXlfcHV0KGtleSk7XFxuLVxcdGt2ZnJlZShzaWcpO1xcbi1cXHRyZXR1cm4gZXJyO1xcbi19XFxuLVxcbiBzdGF0aWMgaW50IGJwZl9wcm9nX21hcmtfaW5zbl9hcnJheXNfcmVhZHkoc3RydWN0IGJwZl9wcm9nICpwcm9nKVxcbiB7XFxuIFxcdGludCBlcnI7XFxuQEAgLTMxMzMsMTcgKzMwNjksOCBAQCBzdGF0aWMgaW50IGJwZl9wcm9nX2xvYWQodW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLCBzdHJ1Y3QgYnBmX2xvZ19hdFxcbiBcXG4gXFx0LyogZUJQRiBwcm9ncmFtcyBtdXN0IGJlIEdQTCBjb21wYXRpYmxlIHRvIHVzZSBHUEwtZWQgZnVuY3Rpb25zICovXFxuIFxcdHByb2ctXFx1MDAzZWdwbF9jb21wYXRpYmxlID0gbGljZW5zZV9pc19ncGxfY29tcGF0aWJsZShsaWNlbnNlKSA/IDEgOiAwO1xcbi1cXHRpZiAoYXR0ci1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuLVxcdFxcdGVyciA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUocHJvZywgYXR0ciwgdWF0dHIuaXNfa2VybmVsLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHUwMDI2cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ19zZXJpYWwpO1xcbi1cXHRcXHRpZiAoZXJyKVxcbi1cXHRcXHRcXHRnb3RvIGZyZWVfcHJvZztcXG4tXFx0XFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlID0gYnBmX2NsYXNzaWZ5X2tleXJpbmcoYXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuLVxcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1ZFUklGSUVEO1xcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHRwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBCUEZfU0lHX0tFWVJJTkdfTk9ORTtcXG4tXFx0XFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVU5TSUdORUQ7XFxuLVxcdH1cXG4rXFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlID0gQlBGX1NJR19LRVlSSU5HX05PTkU7XFxuK1xcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xcbiBcXHRwcm9nLVxcdTAwM2VvcmlnX3Byb2cgPSBOVUxMO1xcbiBcXHRwcm9nLVxcdTAwM2VqaXRlZCA9IDA7XFxuIFxcbkBAIC0zMTg5LDEwICszMTE2LDYgQEAgc3RhdGljIGludCBicGZfcHJvZ19sb2FkKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0ciwgc3RydWN0IGJwZl9sb2dfYXRcXG4gXFx0aWYgKGVyciBcXHUwMDNjIDApXFxuIFxcdFxcdGdvdG8gZnJlZV9wcm9nO1xcbiBcXG4tXFx0ZXJyID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChwcm9nLCBhdHRyLCB0b2tlbiwgdWF0dHIuaXNfa2VybmVsKTtcXG4tXFx0aWYgKGVycilcXG4tXFx0XFx0Z290byBmcmVlX3Byb2c7XFxuLVxcbiBcXHQvKiBydW4gZUJQRiB2ZXJpZmllciAqL1xcbiBcXHRlcnIgPSBicGZfY2hlY2soXFx1MDAyNnByb2csIGF0dHIsIHVhdHRyLCBhdHRyX2xvZyk7XFxuIFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uMTYwOTA1M2EwZWViZjIgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jXFxuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuQEAgLTIyLDYgKzIyLDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2N0eXBlLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9lcnJvci1pbmplY3Rpb24uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZl9sc20uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC92ZXJpZmljYXRpb24uaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2J0Zl9pZHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BvaXNvbi5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuQEAgLTI0OTAsNiArMjQ5Miw4MyBAQCBpbnQgYnBmX2dldF9rZnVuY19hZGRyKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdTMyIGZ1bmNfaWQsXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisjZGVmaW5lIEJQRl9GRF9TTE9UX0JURlxcdDFVTFxcbitcXG4rc3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfbWFwKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBicGZfbWFwICptYXApXFxuK3tcXG4rXFx0c2xvdC1cXHUwMDNldmFsID0gKHVuc2lnbmVkIGxvbmcpbWFwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBmZF9zbG90X3NldF9idGYoc3RydWN0IGJwZl9mZF9hcnJheSAqc2xvdCwgc3RydWN0IGJ0ZiAqYnRmKVxcbit7XFxuK1xcdHNsb3QtXFx1MDAzZXZhbCA9ICh1bnNpZ25lZCBsb25nKWJ0ZiB8IEJQRl9GRF9TTE9UX0JURjtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfbWFwICpmZF9zbG90X21hcChzdHJ1Y3QgYnBmX2ZkX2FycmF5IHNsb3QpXFxuK3tcXG4rXFx0aWYgKHNsb3QudmFsIFxcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0cmV0dXJuIChzdHJ1Y3QgYnBmX21hcCAqKXNsb3QudmFsO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqZmRfc2xvdF9idGYoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KVxcbit7XFxuK1xcdGlmICghKHNsb3QudmFsIFxcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdHJldHVybiAoc3RydWN0IGJ0ZiAqKShzbG90LnZhbCBcXHUwMDI2IH5CUEZfRkRfU0xPVF9CVEYpO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXFxuK2ZkX2FycmF5X2dldF9idGZfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbit7XFxuK1xcdHN0cnVjdCBidGYgKmJ0ZjtcXG4rXFxuK1xcdGlmIChpZHggXFx1MDAzZT0gZW52LVxcdTAwM2VmZF9hcnJheV9jbnQpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJrZnVuYyBmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRpZHgsIGVudi1cXHUwMDNlZmRfYXJyYXlfY250KTtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuK1xcdH1cXG4rXFx0YnRmID0gZmRfc2xvdF9idGYoZW52LVxcdTAwM2VmZF9hcnJheVtpZHhdKTtcXG4rXFx0aWYgKCFidGYpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJrZnVuYyBmZF9pZHggJXUgaXMgbm90IGEgbW9kdWxlIEJURlxcXFxuXFxcIiwgaWR4KTtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuK1xcdH1cXG4rXFx0YnRmX2dldChidGYpO1xcbitcXHRyZXR1cm4gYnRmO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXFxuK2ZkX2FycmF5X2dldF9idGZfc3BhcnNlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxuK3tcXG4rXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbitcXHRpbnQgYnRmX2ZkO1xcbitcXG4rXFx0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFxcdTAwMjZidGZfZmQsIGVudi1cXHUwMDNlZmRfYXJyYXlfcmF3LFxcbitcXHRcXHRcXHRcXHQgICAgKHNpemVfdClpZHggKiBzaXplb2YoYnRmX2ZkKSwgc2l6ZW9mKGJ0Zl9mZCkpKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcXG4rXFx0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xcbitcXHRpZiAoSVNfRVJSKGJ0ZikpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIGJ0ZjtcXG4rXFx0fVxcbitcXHRyZXR1cm4gYnRmO1xcbit9XFxuK1xcbitzdGF0aWMgc3RydWN0IGJ0ZiAqZmRfYXJyYXlfZ2V0X2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbit7XFxuK1xcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXFxcblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTtcXG4rXFx0fVxcbitcXHRpZiAoZW52LVxcdTAwM2VmZF9hcnJheSlcXG4rXFx0XFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7XFxuK1xcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheV9yYXcpKVxcbitcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UoZW52LCBpZHgpO1xcbitcXG4rXFx0dmVyYm9zZShlbnYsIFxcXCJrZnVuYyBvZmZzZXQgXFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcXFxuXFxcIik7XFxuK1xcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xcbit9XFxuK1xcbiBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuIFxcdFxcdFxcdFxcdFxcdCBzMTYgb2Zmc2V0KVxcbiB7XFxuQEAgLTI0OTgsNyArMjU3Nyw2IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0c3RydWN0IGJwZl9rZnVuY19idGYgKmI7XFxuIFxcdHN0cnVjdCBtb2R1bGUgKm1vZDtcXG4gXFx0c3RydWN0IGJ0ZiAqYnRmO1xcbi1cXHRpbnQgYnRmX2ZkO1xcbiBcXG4gXFx0dGFiID0gZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZWtmdW5jX2J0Zl90YWI7XFxuIFxcdGIgPSBic2VhcmNoKFxcdTAwMjZrZl9idGYsIHRhYi1cXHUwMDNlZGVzY3MsIHRhYi1cXHUwMDNlbnJfZGVzY3MsXFxuQEAgLTI1MDksMjIgKzI1ODcsOSBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuIFxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FMkJJRyk7XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmIChicGZwdHJfaXNfbnVsbChlbnYtXFx1MDAzZWZkX2FycmF5KSkge1xcbi1cXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImtmdW5jIG9mZnNldCBcXHUwMDNlIDAgd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVQUk9UTyk7XFxuLVxcdFxcdH1cXG4tXFxuLVxcdFxcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2YnRmX2ZkLCBlbnYtXFx1MDAzZWZkX2FycmF5LFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgb2Zmc2V0ICogc2l6ZW9mKGJ0Zl9mZCksXFxuLVxcdFxcdFxcdFxcdFxcdCAgICBzaXplb2YoYnRmX2ZkKSkpXFxuLVxcdFxcdFxcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xcbi1cXG4tXFx0XFx0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xcbi1cXHRcXHRpZiAoSVNfRVJSKGJ0ZikpIHtcXG4tXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0YnRmID0gZmRfYXJyYXlfZ2V0X2J0ZihlbnYsIG9mZnNldCk7XFxuK1xcdFxcdGlmIChJU19FUlIoYnRmKSlcXG4gXFx0XFx0XFx0cmV0dXJuIGJ0ZjtcXG4tXFx0XFx0fVxcbi1cXG4gXFx0XFx0aWYgKCFidGZfaXNfbW9kdWxlKGJ0ZikpIHtcXG4gXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJCVEYgZmQgZm9yIGtmdW5jIGlzIG5vdCBhIG1vZHVsZSBCVEZcXFxcblxcXCIpO1xcbiBcXHRcXHRcXHRidGZfcHV0KGJ0Zik7XFxuQEAgLTE3NTc3LDYgKzE3NjQyLDExIEBAIHN0YXRpYyBpbnQgX19hZGRfdXNlZF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJ0ZiAqYnRmKVxcbiBcXHRcXHRpZiAoZW52LVxcdTAwM2V1c2VkX2J0ZnNbaV0uYnRmID09IGJ0ZilcXG4gXFx0XFx0XFx0Z290byByZXRfcHV0O1xcbiBcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gY2Fubm90IGJpbmQgYW55IEJURlxcXFxuXFxcIik7XFxuK1xcdFxcdHJldCA9IC1FQUNDRVM7XFxuK1xcdFxcdGdvdG8gcmV0X3B1dDtcXG4rXFx0fVxcbiBcXHRpZiAoZW52LVxcdTAwM2V1c2VkX2J0Zl9jbnQgXFx1MDAzZT0gTUFYX1VTRURfQlRGUykge1xcbiBcXHRcXHR2ZXJib3NlKGVudiwgXFxcIlRoZSB0b3RhbCBudW1iZXIgb2YgYnRmcyBwZXIgcHJvZ3JhbSBoYXMgcmVhY2hlZCB0aGUgbGltaXQgb2YgJXVcXFxcblxcXCIsXFxuIFxcdFxcdFxcdE1BWF9VU0VEX0JURlMpO1xcbkBAIC0xNzg1OSw2ICsxNzkyOSwxMiBAQCBzdGF0aWMgaW50IF9fYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfbWFwICptYXApXFxuIFxcdFxcdGlmIChlbnYtXFx1MDAzZXVzZWRfbWFwc1tpXSA9PSBtYXApXFxuIFxcdFxcdFxcdHJldHVybiBpO1xcbiBcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBlbnYtXFx1MDAzZXByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRCkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIG1hcCAnJXMnIG5vdCBjb3ZlcmVkIGJ5IHRoZSBzaWduYXR1cmVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdG1hcC1cXHUwMDNlbmFtZSk7XFxuK1xcdFxcdHJldHVybiAtRUFDQ0VTO1xcbitcXHR9XFxuIFxcdGlmIChlbnYtXFx1MDAzZXVzZWRfbWFwX2NudCBcXHUwMDNlPSBNQVhfVVNFRF9NQVBTKSB7XFxuIFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiVGhlIHRvdGFsIG51bWJlciBvZiBtYXBzIHBlciBwcm9ncmFtIGhhcyByZWFjaGVkIHRoZSBsaW1pdCBvZiAldVxcXFxuXFxcIixcXG4gXFx0XFx0XFx0TUFYX1VTRURfTUFQUyk7XFxuQEAgLTE3OTExLDYgKzE3OTg3LDQ4IEBAIHN0YXRpYyBpbnQgYWRkX3VzZWRfbWFwKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcXG4gXFx0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcXG4rXFxuK1xcdGlmIChpZHggXFx1MDAzZT0gZW52LVxcdTAwM2VmZF9hcnJheV9jbnQpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9pZHggJXUgb3V0IG9mIGJvdW5kcywgZmRfYXJyYXlfY250ICV1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRpZHgsIGVudi1cXHUwMDNlZmRfYXJyYXlfY250KTtcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdH1cXG4rXFx0bWFwID0gZmRfc2xvdF9tYXAoZW52LVxcdTAwM2VmZF9hcnJheVtpZHhdKTtcXG4rXFx0aWYgKCFtYXApIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9pZHggJXUgaXMgbm90IGEgbWFwXFxcXG5cXFwiLCBpZHgpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXHRyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbit7XFxuK1xcdGludCBmZDtcXG4rXFxuK1xcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2ZmQsIGVudi1cXHUwMDNlZmRfYXJyYXlfcmF3LFxcbitcXHRcXHRcXHRcXHQgICAgKHNpemVfdClpZHggKiBzaXplb2YoZmQpLCBzaXplb2YoZmQpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcdHJldHVybiBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHgoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG4re1xcbitcXHRpZiAoZW52LVxcdTAwM2VmZF9hcnJheSlcXG4rXFx0XFx0cmV0dXJuIGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXMoZW52LCBpZHgpO1xcbitcXHRpZiAoZW52LVxcdTAwM2VzaWduYXR1cmUpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtdXN0IGJpbmQgbWFwcyB2aWEgYSBjb250aW51b3VzIGZkX2FycmF5IChmZF9hcnJheV9jbnQpXFxcXG5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIC1FQUNDRVM7XFxuK1xcdH1cXG4rXFx0aWYgKCFicGZwdHJfaXNfbnVsbChlbnYtXFx1MDAzZWZkX2FycmF5X3JhdykpXFxuK1xcdFxcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UoZW52LCBpZHgpO1xcbitcXG4rXFx0dmVyYm9zZShlbnYsIFxcXCJmZF9pZHggd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxcXG5cXFwiKTtcXG4rXFx0cmV0dXJuIC1FUFJPVE87XFxuK31cXG4rXFxuIHN0YXRpYyBpbnQgY2hlY2tfYWx1X2ZpZWxkcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pXFxuIHtcXG4gXFx0dTggY2xhc3MgPSBCUEZfQ0xBU1MoaW5zbi1cXHUwMDNlY29kZSk7XFxuQEAgLTE4MTI4LDcgKzE4MjQ2LDYgQEAgc3RhdGljIGludCBjaGVja19hbmRfcmVzb2x2ZV9pbnNucyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbiBcXHRcXHRcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xcbiBcXHRcXHRcXHRpbnQgbWFwX2lkeDtcXG4gXFx0XFx0XFx0dTY0IGFkZHI7XFxuLVxcdFxcdFxcdHUzMiBmZDtcXG4gXFxuIFxcdFxcdFxcdGlmIChpID09IGluc25fY250IC0gMSB8fCBpbnNuWzFdLmNvZGUgIT0gMCB8fFxcbiBcXHRcXHRcXHQgICAgaW5zblsxXS5kc3RfcmVnICE9IDAgfHwgaW5zblsxXS5zcmNfcmVnICE9IDAgfHxcXG5AQCAtMTgxODAsMjEgKzE4Mjk3LDE3IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcXG4gXFx0XFx0XFx0c3dpdGNoIChpbnNuWzBdLnNyY19yZWcpIHtcXG4gXFx0XFx0XFx0Y2FzZSBCUEZfUFNFVURPX01BUF9JRFhfVkFMVUU6XFxuIFxcdFxcdFxcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYOlxcbi1cXHRcXHRcXHRcXHRpZiAoYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9pZHggd2l0aG91dCBmZF9hcnJheSBpcyBpbnZhbGlkXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FUFJPVE87XFxuLVxcdFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0XFx0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFxcdTAwMjZmZCwgZW52LVxcdTAwM2VmZF9hcnJheSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGluc25bMF0uaW1tICogc2l6ZW9mKGZkKSxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIHNpemVvZihmZCkpKVxcbi1cXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVGQVVMVDtcXG4rXFx0XFx0XFx0XFx0bWFwX2lkeCA9IGZkX2FycmF5X2dldF9tYXBfaWR4KGVudiwgaW5zblswXS5pbW0pO1xcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0ZGVmYXVsdDpcXG4tXFx0XFx0XFx0XFx0ZmQgPSBpbnNuWzBdLmltbTtcXG4rXFx0XFx0XFx0XFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gY2Fubm90IHJlZmVyZW5jZSBhIG1hcCBieSBmZCwgb25seSB2aWEgZmRfYXJyYXkgaW5kZXhcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHRcXHRtYXBfaWR4ID0gYWRkX3VzZWRfbWFwKGVudiwgaW5zblswXS5pbW0pO1xcbiBcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0fVxcbiBcXG4tXFx0XFx0XFx0bWFwX2lkeCA9IGFkZF91c2VkX21hcChlbnYsIGZkKTtcXG4gXFx0XFx0XFx0aWYgKG1hcF9pZHggXFx1MDAzYyAwKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gbWFwX2lkeDtcXG4gXFx0XFx0XFx0bWFwID0gZW52LVxcdTAwM2V1c2VkX21hcHNbbWFwX2lkeF07XFxuQEAgLTE5NDY5LDcgKzE5NTgyLDcgQEAgc3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxcbiAgKiB0aGlzIGNhc2UgZXhwZWN0IHRoYXQgZXZlcnkgZmlsZSBkZXNjcmlwdG9yIGluIHRoZSBhcnJheSBpcyBlaXRoZXIgYSBtYXAgb3JcXG4gICogYSBCVEYuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIHRvIGJlIHRyYXNoLlxcbiAgKi9cXG4tc3RhdGljIGludCBhZGRfZmRfZnJvbV9mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpXFxuK3N0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeCwgaW50IGZkKVxcbiB7XFxuIFxcdHN0cnVjdCBicGZfbWFwICptYXA7XFxuIFxcdHN0cnVjdCBidGYgKmJ0ZjtcXG5AQCAtMTk0ODEsNTEgKzE5NTk0LDY5IEBAIHN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxcbiBcXHRcXHRlcnIgPSBfX2FkZF91c2VkX21hcChlbnYsIG1hcCk7XFxuIFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbiBcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHRcXHRmZF9zbG90X3NldF9tYXAoXFx1MDAyNmVudi1cXHUwMDNlZmRfYXJyYXlbaWR4XSwgbWFwKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuIFxcdGJ0ZiA9IF9fYnRmX2dldF9ieV9mZChmKTtcXG4gXFx0aWYgKCFJU19FUlIoYnRmKSkge1xcbiBcXHRcXHRidGZfZ2V0KGJ0Zik7XFxuLVxcdFxcdHJldHVybiBfX2FkZF91c2VkX2J0ZihlbnYsIGJ0Zik7XFxuK1xcdFxcdGVyciA9IF9fYWRkX3VzZWRfYnRmKGVudiwgYnRmKTtcXG4rXFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiBlcnI7XFxuK1xcdFxcdGZkX3Nsb3Rfc2V0X2J0ZihcXHUwMDI2ZW52LVxcdTAwM2VmZF9hcnJheVtpZHhdLCBidGYpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0fVxcbiBcXG4gXFx0dmVyYm9zZShlbnYsIFxcXCJmZCAlZCBpcyBub3QgcG9pbnRpbmcgdG8gdmFsaWQgYnBmX21hcCBvciBidGZcXFxcblxcXCIsIGZkKTtcXG4gXFx0cmV0dXJuIFBUUl9FUlIobWFwKTtcXG4gfVxcbiBcXG4tc3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcXG4rI2RlZmluZSBNQVhfRkRfQVJSQVlfQ05UIChNQVhfVVNFRF9NQVBTICsgTUFYX0tGVU5DX0JURlMpXFxuK1xcbitzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbitcXHRcXHRcXHRcXHQgICAgICAgYnBmcHRyX3QgZmRfYXJyYXksIHUzMiBjbnQpXFxuIHtcXG4tXFx0c2l6ZV90IHNpemUgPSBzaXplb2YoaW50KTtcXG4tXFx0aW50IHJldDtcXG4tXFx0aW50IGZkO1xcbitcXHRpbnQgZmQsIHJldDtcXG4gXFx0dTMyIGk7XFxuIFxcbi1cXHRlbnYtXFx1MDAzZWZkX2FycmF5ID0gbWFrZV9icGZwdHIoYXR0ci1cXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIChubyBmZF9hcnJheV9jbnQgaXMgZ2l2ZW4pIGFuZCBuZXdcXG4tXFx0ICogQVBJcyBpcyB0aGF0IGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgZmRfYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmVcXG4tXFx0ICogY29udGludW91cyBhbmQgaXMgc2Nhbm5lZCBmb3IgbWFwIGZkcyByaWdodCBhd2F5XFxuLVxcdCAqL1xcbi1cXHRpZiAoIWF0dHItXFx1MDAzZWZkX2FycmF5X2NudClcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcbi1cXHQvKiBDaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqL1xcbi1cXHRpZiAoYXR0ci1cXHUwMDNlZmRfYXJyYXlfY250IFxcdTAwM2U9IChVMzJfTUFYIC8gc2l6ZSkpIHtcXG4tXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9hcnJheV9jbnQgaXMgdG9vIGJpZyAoJXUpXFxcXG5cXFwiLCBhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQpO1xcbi1cXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKGNudCBcXHUwMDNlIE1BWF9GRF9BUlJBWV9DTlQpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmZF9hcnJheSBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXUsIG1heCAldSlcXFxcblxcXCIsXFxuK1xcdFxcdFxcdGNudCwgTUFYX0ZEX0FSUkFZX0NOVCk7XFxuK1xcdFxcdHJldHVybiAtRTJCSUc7XFxuIFxcdH1cXG4gXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQ7IGkrKykge1xcbi1cXHRcXHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXFx1MDAyNmZkLCBlbnYtXFx1MDAzZWZkX2FycmF5LCBpICogc2l6ZSwgc2l6ZSkpXFxuK1xcdGVudi1cXHUwMDNlZmRfYXJyYXkgPSBrdmNhbGxvYyhjbnQsIHNpemVvZigqZW52LVxcdTAwM2VmZF9hcnJheSksIEdGUF9LRVJORUwpO1xcbitcXHRpZiAoIWVudi1cXHUwMDNlZmRfYXJyYXkpXFxuK1xcdFxcdHJldHVybiAtRU5PTUVNO1xcbitcXHRlbnYtXFx1MDAzZWZkX2FycmF5X2NudCA9IGNudDtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIGNudDsgaSsrKSB7XFxuK1xcdFxcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcXHUwMDI2ZmQsIGZkX2FycmF5LFxcbitcXHRcXHRcXHRcXHRcXHQgICAgKHNpemVfdClpICogc2l6ZW9mKGZkKSwgc2l6ZW9mKGZkKSkpXFxuIFxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbi1cXG4tXFx0XFx0cmV0ID0gYWRkX2ZkX2Zyb21fZmRfYXJyYXkoZW52LCBmZCk7XFxuK1xcdFxcdHJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgaSwgZmQpO1xcbiBcXHRcXHRpZiAocmV0KVxcbiBcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXHR9XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4rXFx0XFx0XFx0ICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcXG4re1xcbitcXHRicGZwdHJfdCBmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItXFx1MDAzZWZkX2FycmF5LCB1YXR0ci5pc19rZXJuZWwpO1xcbiBcXG4rXFx0aWYgKGJwZnB0cl9pc19udWxsKGZkX2FycmF5KSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdC8qXFxuK1xcdCAqIE5ldyBBUEk6IHRoZSBjYWxsZXIgcGFzc2VzIGZkX2FycmF5X2NudCBhbmQgYSBjb250aW51b3VzIGFycmF5IHRoYXRcXG4rXFx0ICogaXMgcmVzb2x2ZWQgYW5kIGJvdW5kIHVwIGZyb250LiBMZWdhY3kgQVBJIChubyBmZF9hcnJheV9jbnQpOiBrZWVwXFxuK1xcdCAqIHRoZSBjYWxsZXIncyBhcnJheSBhbmQgcmVzb2x2ZSBlbnRyaWVzIGxhemlseSwgb24gZmlyc3QgcmVmZXJlbmNlLlxcbitcXHQgKi9cXG4rXFx0aWYgKGF0dHItXFx1MDAzZWZkX2FycmF5X2NudClcXG4rXFx0XFx0cmV0dXJuIHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhlbnYsIGZkX2FycmF5LFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICBhdHRyLVxcdTAwM2VmZF9hcnJheV9jbnQpO1xcbitcXHRlbnYtXFx1MDAzZWZkX2FycmF5X3JhdyA9IGZkX2FycmF5O1xcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG5AQCAtMTk3NDAsNiArMTk4NzEsMTM5IEBAIGludCBicGZfZml4dXBfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXFxuK3tcXG4rXFx0c3dpdGNoIChrZXlyaW5nX2lkKSB7XFxuK1xcdGNhc2UgMDpcXG4rXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19CVUlMVElOO1xcbitcXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzpcXG4rXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XFxuK1xcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XFxuK1xcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcXG4rXFx0fVxcbit9XFxuK1xcbisvKlxcbisgKiBWZXJpZnkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb2YgYSBsb2FkZWQgcHJvZ3JhbS4gQ2FsbGVkIGZyb20gYnBmX2NoZWNrKClcXG4rICogb25jZSB0aGUgcHJvZ3JhbSdzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzb1xcbisgKiB0aGUgZXhhY3QgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGUgb25lcyB0aGUgcHJvZ3JhbSBiaW5kcy5cXG4rICpcXG4rICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mXFxuKyAqIGVhY2ggbWFwLCBpbiBAbWFwcyBvcmRlcjogaW5zbnMgfHwgbWFwXzAgfHwgbWFwXzEgfHwgWy4uLl0uIE9uIHN1Y2Nlc3MgdGhlXFxuKyAqIHZlcmRpY3QgYW5kIGtleXJpbmcgaW5mbyBhcmUgcmVjb3JkZWQgb24gcHJvZy1cXHUwMDNlYXV4LlxcbisgKi9cXG4rc3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuK1xcdFxcdFxcdFxcdCAgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJvb2wgaXNfa2VybmVsKVxcbit7XFxuK1xcdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVxcdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XFxuK1xcdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gc2lnX3B0ciwgZGF0YV9wdHI7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGVudi1cXHUwMDNlcHJvZztcXG4rXFx0c3RydWN0IGJwZl9tYXAgKiptYXBzID0gZW52LVxcdTAwM2V1c2VkX21hcHM7XFxuK1xcdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xcbitcXHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcXG4rXFx0dTMyIG1hcF9jbnQgPSBlbnYtXFx1MDAzZXVzZWRfbWFwX2NudDtcXG4rXFx0dTMyIGksIG9mZiwgaW5zbnNfc3o7XFxuK1xcdHU2NCBkYXRhX3N6O1xcbitcXHRpbnQgZXJyID0gMDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIERvbid0IGF0dGVtcHQgdG8gdXNlIGttYWxsb2NfbGFyZ2Ugb3Igdm1hbGxvYyBmb3Igc2lnbmF0dXJlcy5cXG4rXFx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXFxuK1xcdCAqL1xcbitcXHRpZiAoYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUgXFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpID09IDApXFxuK1xcdFxcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbitcXHRpZiAoIWtleSkge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcImNhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFx0fVxcbitcXG4rXFx0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplKTtcXG4rXFx0aWYgKElTX0VSUihzaWcpKSB7XFxuK1xcdFxcdGJwZl9rZXlfcHV0KGtleSk7XFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKHNpZyk7XFxuK1xcdH1cXG4rXFxuK1xcdGluc25zX3N6ID0gcHJvZy1cXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XFxuK1xcdGRhdGFfc3ogPSBpbnNuc19zejtcXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xcbitcXHRcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcXG4rXFxuK1xcdFxcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxcbitcXHRcXHQgICAgIW1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGFuIGFycmF5XFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIVJFQURfT05DRShtYXAtXFx1MDAzZWZyb3plbikpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGZyb3plblxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4rXFx0XFx0XFx0ZXJyID0gLUVQRVJNO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAoIW1hcC1cXHUwMDNlZXhjbF9wcm9nX3NoYSkge1xcbitcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIG11c3QgYmUgZXhjbHVzaXZlXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbitcXHRcXHRcXHRlcnIgPSAtRVBFUk07XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdGRhdGFfc3ogKz0gbWFwLVxcdTAwM2V2YWx1ZV9zaXplO1xcbitcXHR9XFxuK1xcdGlmIChicGZfZHlucHRyX2NoZWNrX3NpemUoZGF0YV9zeikpIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcGF5bG9hZCB0b28gbGFyZ2U6ICVsbHUgYnl0ZXNcXFxcblxcXCIsIGRhdGFfc3opO1xcbitcXHRcXHRlcnIgPSAtRTJCSUc7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGRhdGEgPSBrdm1hbGxvYyhkYXRhX3N6LCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7XFxuK1xcdGlmICghZGF0YSkge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXHRtZW1jcHkoZGF0YSwgcHJvZy1cXHUwMDNlaW5zbnNpLCBpbnNuc19zeik7XFxuK1xcdG9mZiA9IGluc25zX3N6O1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbWFwX2NudDsgaSsrKSB7XFxuK1xcdFxcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xcbitcXHRcXHR1NjQgYWRkcjtcXG4rXFxuK1xcdFxcdGVyciA9IG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcXHUwMDI2YWRkciwgMCk7XFxuK1xcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICclcyc6ICVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUsIGVycik7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcdFxcdG1lbWNweShkYXRhICsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsXFxuK1xcdFxcdCAgICAgICBtYXAtXFx1MDAzZXZhbHVlX3NpemUpO1xcbitcXHRcXHRvZmYgKz0gbWFwLVxcdTAwM2V2YWx1ZV9zaXplO1xcbitcXHR9XFxuK1xcbitcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNmRhdGFfcHRyLCBkYXRhLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsIGRhdGFfc3opO1xcbitcXHRicGZfZHlucHRyX2luaXQoXFx1MDAyNnNpZ19wdHIsIHNpZywgQlBGX0RZTlBUUl9UWVBFX0xPQ0FMLCAwLFxcbitcXHRcXHRcXHRhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxuK1xcbitcXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2ZGF0YV9wdHIsXFxuK1xcdFxcdFxcdFxcdFxcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2c2lnX3B0ciwga2V5KTtcXG4rXFx0aWYgKGVycikge1xcbitcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlZFxcXFxuXFxcIiwgZXJyKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHBhc3NlZFxcXFxuXFxcIik7XFxuK1xcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsID0gYnBmX2tleV9zZXJpYWwoa2V5KTtcXG4rXFx0XFx0cHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWcua2V5cmluZ190eXBlID0gYnBmX2NsYXNzaWZ5X2tleXJpbmcoYXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuK1xcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1ZFUklGSUVEO1xcbitcXHR9XFxuK291dDpcXG4rXFx0a3ZmcmVlKGRhdGEpO1xcbitcXHRicGZfa2V5X3B1dChrZXkpO1xcbitcXHRrdmZyZWUoc2lnKTtcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdCAgICAgIHN0cnVjdCBicGZfbG9nX2F0dHIgKmF0dHJfbG9nKVxcbiB7XFxuQEAgLTE5NzgyLDYgKzIwMDQ2LDcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdGVudi1cXHUwMDNlYnlwYXNzX3NwZWNfdjEgPSBicGZfYnlwYXNzX3NwZWNfdjEoZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXRva2VuKTtcXG4gXFx0ZW52LVxcdTAwM2VieXBhc3Nfc3BlY192NCA9IGJwZl9ieXBhc3Nfc3BlY192NChlbnYtXFx1MDAzZXByb2ctXFx1MDAzZWF1eC1cXHUwMDNldG9rZW4pO1xcbiBcXHRlbnYtXFx1MDAzZWJwZl9jYXBhYmxlID0gaXNfcHJpdiA9IGJwZl90b2tlbl9jYXBhYmxlKGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2V0b2tlbiwgQ0FQX0JQRik7XFxuK1xcdGVudi1cXHUwMDNlc2lnbmF0dXJlID0gYXR0ci1cXHUwMDNlc2lnbmF0dXJlO1xcbiBcXG4gXFx0YnBmX2dldF9idGZfdm1saW51eCgpO1xcbiBcXG5AQCAtMTk3OTUsMTEgKzIwMDYwLDI3IEBAIGludCBicGZfY2hlY2soc3RydWN0IGJwZl9wcm9nICoqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyLFxcbiBcXHRyZXQgPSBicGZfdmxvZ19pbml0KFxcdTAwMjZlbnYtXFx1MDAzZWxvZywgYXR0cl9sb2ctXFx1MDAzZWxldmVsLCBhdHRyX2xvZy1cXHUwMDNldWJ1ZiwgYXR0cl9sb2ctXFx1MDAzZXNpemUpO1xcbiBcXHRpZiAocmV0KVxcbiBcXHRcXHRnb3RvIGVycl91bmxvY2s7XFxuK1xcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSkge1xcbitcXHRcXHRyZXQgPSBicGZfcHJvZ19jYWxjX3RhZyhlbnYtXFx1MDAzZXByb2cpO1xcbitcXHRcXHRpZiAocmV0IFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0Z290byBza2lwX2Z1bGxfY2hlY2s7XFxuK1xcdH1cXG4gXFxuIFxcdHJldCA9IHByb2Nlc3NfZmRfYXJyYXkoZW52LCBhdHRyLCB1YXR0cik7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xcbiBcXG4rXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuK1xcdFxcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xcbitcXHRcXHRpZiAocmV0KVxcbitcXHRcXHRcXHRnb3RvIHNraXBfZnVsbF9jaGVjaztcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChlbnYtXFx1MDAzZXByb2csIGF0dHIsIGVudi1cXHUwMDNlcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2V0b2tlbixcXG4rXFx0XFx0XFx0XFx0ICAgICB1YXR0ci5pc19rZXJuZWwpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIHNraXBfZnVsbF9jaGVjaztcXG4rXFxuIFxcdG1hcmtfdmVyaWZpZXJfc3RhdGVfY2xlYW4oZW52KTtcXG4gXFxuIFxcdGlmIChJU19FUlIoYnRmX3ZtbGludXgpKSB7XFxuQEAgLTIwMDI3LDYgKzIwMzA4LDcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuIFxcdGJwZl9jbGVhcl9pbnNuX2F1eF9kYXRhKGVudiwgMCwgZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VsZW4pO1xcbiBcXHR2ZnJlZShlbnYtXFx1MDAzZWluc25fYXV4X2RhdGEpO1xcbiBlcnJfZnJlZV9lbnY6XFxuK1xcdGt2ZnJlZShlbnYtXFx1MDAzZWZkX2FycmF5KTtcXG4gXFx0YnBmX3N0YWNrX2xpdmVuZXNzX2ZyZWUoZW52KTtcXG4gXFx0a3ZmcmVlKGVudi1cXHUwMDNlY2ZnLmluc25fcG9zdG9yZGVyKTtcXG4gXFx0a3ZmcmVlKGVudi1cXHUwMDNlc2NjX2luZm8pO1xcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9nZW4uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuaW5kZXggNmFlNzI2MmViZTBjMWQuLmEwMWQwNmQyMmQxYTNiIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcXG5AQCAtNzkzLDYgKzc5Myw4IEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXFxuIFxcdGlmIChzaWduX3Byb2dzKSB7XFxuIFxcdFxcdHNvcHRzLmluc25zID0gb3B0cy5pbnNucztcXG4gXFx0XFx0c29wdHMuaW5zbnNfc3ogPSBvcHRzLmluc25zX3N6O1xcbitcXHRcXHRzb3B0cy5kYXRhID0gb3B0cy5kYXRhO1xcbitcXHRcXHRzb3B0cy5kYXRhX3N6ID0gb3B0cy5kYXRhX3N6O1xcbiBcXHRcXHRzb3B0cy5leGNsX3Byb2dfaGFzaCA9IHByb2dfc2hhO1xcbiBcXHRcXHRzb3B0cy5leGNsX3Byb2dfaGFzaF9zeiA9IHNpemVvZihwcm9nX3NoYSk7XFxuIFxcdFxcdHNvcHRzLnNpZ25hdHVyZSA9IHNpZ19idWY7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xcbmluZGV4IGY5Yjc0MmY0YmIxMDRiLi43Y2M5OTFjNjlkYzJjOCAxMDA2NDRcXG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcXG5AQCAtMTM1LDkgKzEzNSwyMSBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gXFx0Q01TX0NvbnRlbnRJbmZvICpjbXMgPSBOVUxMO1xcbiBcXHRsb25nIGFjdHVhbF9zaWdfbGVuID0gMDtcXG4gXFx0WDUwOSAqeDUwOSA9IE5VTEw7XFxuK1xcdHZvaWQgKmRhdGEgPSBOVUxMO1xcbitcXHRzaXplX3QgZGF0YV9zejtcXG4gXFx0aW50IGVyciA9IDA7XFxuIFxcbi1cXHRiZF9pbiA9IEJJT19uZXdfbWVtX2J1ZihvcHRzLVxcdTAwM2VpbnNucywgb3B0cy1cXHUwMDNlaW5zbnNfc3opO1xcbitcXHRkYXRhX3N6ID0gKHNpemVfdClvcHRzLVxcdTAwM2VpbnNuc19zeiArIG9wdHMtXFx1MDAzZWRhdGFfc3o7XFxuK1xcdGRhdGEgPSBtYWxsb2MoZGF0YV9zeik7XFxuK1xcdGlmICghZGF0YSkge1xcbitcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFx0bWVtY3B5KGRhdGEsIG9wdHMtXFx1MDAzZWluc25zLCBvcHRzLVxcdTAwM2VpbnNuc19zeik7XFxuK1xcdGlmIChvcHRzLVxcdTAwM2VkYXRhX3N6KVxcbitcXHRcXHRtZW1jcHkoKGNoYXIgKilkYXRhICsgb3B0cy1cXHUwMDNlaW5zbnNfc3osIG9wdHMtXFx1MDAzZWRhdGEsIG9wdHMtXFx1MDAzZWRhdGFfc3opO1xcbitcXG4rXFx0YmRfaW4gPSBCSU9fbmV3X21lbV9idWYoZGF0YSwgZGF0YV9zeik7XFxuIFxcdGlmICghYmRfaW4pIHtcXG4gXFx0XFx0ZXJyID0gLUVOT01FTTtcXG4gXFx0XFx0Z290byBjbGVhbnVwO1xcbkBAIC0xNzgsNyArMTkwLDcgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXFxuIFxcdEVWUF9EaWdlc3Qob3B0cy1cXHUwMDNlaW5zbnMsIG9wdHMtXFx1MDAzZWluc25zX3N6LCBvcHRzLVxcdTAwM2VleGNsX3Byb2dfaGFzaCxcXG4gXFx0XFx0ICAgXFx1MDAyNm9wdHMtXFx1MDAzZWV4Y2xfcHJvZ19oYXNoX3N6LCBFVlBfc2hhMjU2KCksIE5VTEwpO1xcbiBcXG4tXFx0XFx0YmRfb3V0ID0gQklPX25ldyhCSU9fc19tZW0oKSk7XFxuK1xcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xcbiBcXHRpZiAoIWJkX291dCkge1xcbiBcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRnb3RvIGNsZWFudXA7XFxuQEAgLTIxMiw2ICsyMjQsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4gXFx0WDUwOV9mcmVlKHg1MDkpO1xcbiBcXHRFVlBfUEtFWV9mcmVlKHByaXZhdGVfa2V5KTtcXG4gXFx0QklPX2ZyZWUoYmRfaW4pO1xcbitcXHRmcmVlKGRhdGEpO1xcbiBcXHRESVNQTEFZX09TU0xfRVJSKGVyciBcXHUwMDNjIDApO1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcXG5pbmRleCA0OWFmNDI2MGI4ZTZiNy4uMDQyNTY5MTg3NzUyMTcgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcXG4rKysgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxcbkBAIC01MSw3ICs1MSw2IEBAIHN0cnVjdCBicGZfZ2VuIHtcXG4gXFx0X191MzIgbnJfa3N5bXM7XFxuIFxcdGludCBmZF9hcnJheTtcXG4gXFx0aW50IG5yX2ZkX2FycmF5O1xcbi1cXHRpbnQgaGFzaF9pbnNuX29mZnNldFtTSEEyNTZfRFdPUkRfU0laRV07XFxuIH07XFxuIFxcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcyk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jIGIvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG5pbmRleCBjN2YyZDJhYzdiYjM1Zi4uNmUzZGQ1MjQyNzYxODMgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcXG4rKysgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xcbkBAIC0xMTEsNyArMTExLDYgQEAgc3RhdGljIHZvaWQgZW1pdDIoc3RydWN0IGJwZl9nZW4gKmdlbiwgc3RydWN0IGJwZl9pbnNuIGluc24xLCBzdHJ1Y3QgYnBmX2luc24gaW5cXG4gXFxuIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSk7XFxuIHN0YXRpYyB2b2lkIGVtaXRfc3lzX2Nsb3NlX2Jsb2Ioc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGJsb2Jfb2ZmKTtcXG4tc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbik7XFxuIFxcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4ge1xcbkBAIC0xNTQsOCArMTUzLDYgQEAgdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHNcXG4gXFx0LyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovXFxuIFxcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR183KSk7XFxuIFxcdGVtaXQoZ2VuLCBCUEZfRVhJVF9JTlNOKCkpO1xcbi1cXHRpZiAoT1BUU19HRVQoZ2VuLVxcdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKVxcbi1cXHRcXHRlbWl0X3NpZ25hdHVyZV9tYXRjaChnZW4pO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGFkZF9kYXRhKHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIHNpemUpXFxuQEAgLTM3Nyw4ICszNzQsNiBAQCBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZilcXG4gXFx0X19lbWl0X3N5c19jbG9zZShnZW4pO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhzdHJ1Y3QgYnBmX2dlbiAqZ2VuKTtcXG4tXFxuIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4ge1xcbiBcXHRpbnQgaTtcXG5AQCAtNDA4LDkgKzQwMyw2IEBAIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcXG4gXFx0aWYgKCFnZW4tXFx1MDAzZWVycm9yKSB7XFxuIFxcdFxcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgKm9wdHMgPSBnZW4tXFx1MDAzZW9wdHM7XFxuIFxcbi1cXHRcXHRpZiAoT1BUU19HRVQob3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcXG4tXFx0XFx0XFx0Y29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoZ2VuKTtcXG4tXFxuIFxcdFxcdG9wdHMtXFx1MDAzZWluc25zID0gZ2VuLVxcdTAwM2VpbnNuX3N0YXJ0O1xcbiBcXHRcXHRvcHRzLVxcdTAwM2VpbnNuc19zeiA9IGdlbi1cXHUwMDNlaW5zbl9jdXIgLSBnZW4tXFx1MDAzZWluc25fc3RhcnQ7XFxuIFxcdFxcdG9wdHMtXFx1MDAzZWRhdGEgPSBnZW4tXFx1MDAzZWRhdGFfc3RhcnQ7XFxuQEAgLTQ2MCwyMiArNDUyLDYgQEAgdm9pZCBicGZfZ2VuX19mcmVlKHN0cnVjdCBicGZfZ2VuICpnZW4pXFxuIFxcdF92YWw7XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbiB9KVxcbiBcXG4tc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbilcXG4te1xcbi1cXHRfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdO1xcbi1cXHRfX3U2NCBzaGFfZHc7XFxuLVxcdGludCBpO1xcbi1cXG4tXFx0bGliYnBmX3NoYTI1NihnZW4tXFx1MDAzZWRhdGFfc3RhcnQsIGdlbi1cXHUwMDNlZGF0YV9jdXIgLSBnZW4tXFx1MDAzZWRhdGFfc3RhcnQsIChfX3U4ICopc2hhKTtcXG4tXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIFNIQTI1Nl9EV09SRF9TSVpFOyBpKyspIHtcXG4tXFx0XFx0c3RydWN0IGJwZl9pbnNuICppbnNuID1cXG4tXFx0XFx0XFx0KHN0cnVjdCBicGZfaW5zbiAqKShnZW4tXFx1MDAzZWluc25fc3RhcnQgKyBnZW4tXFx1MDAzZWhhc2hfaW5zbl9vZmZzZXRbaV0pO1xcbi1cXHRcXHRzaGFfZHcgPSB0Z3RfZW5kaWFuKHNoYVtpXSk7XFxuLVxcdFxcdGluc25bMF0uaW1tID0gKF9fdTMyKXNoYV9kdztcXG4tXFx0XFx0aW5zblsxXS5pbW0gPSBzaGFfZHcgXFx1MDAzZVxcdTAwM2UgMzI7XFxuLVxcdH1cXG4tfVxcbi1cXG4gdm9pZCBicGZfZ2VuX19sb2FkX2J0ZihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpidGZfcmF3X2RhdGEsXFxuIFxcdFxcdCAgICAgICBfX3UzMiBidGZfcmF3X3NpemUpXFxuIHtcXG5AQCAtNTU3LDggKzUzMyw5IEBAIHZvaWQgYnBmX2dlbl9fbWFwX2NyZWF0ZShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLFxcbiBcXHQgKiBDb25kaXRpb25hbGx5IHVwZGF0ZSBtYXhfZW50cmllcyBmcm9tIHRoZSBob3N0LXN1cHBsaWVkIGxvYWRlclxcbiBcXHQgKiBjdHguIFRoaXMgc2l6ZXMgdGhlIG1hcCBhdCBydW50aW1lLCBidXQgZm9yIGEgc2lnbmVkIGxvYWRlclxcbiBcXHQgKiAoZ2VuX2hhc2gpIGl0IHdvdWxkIGxldCBhbiB1bnRydXN0ZWQgaG9zdCByZS1kaW1lbnNpb24gdGhlXFxuLVxcdCAqIHByb2dyYW0ncyBtYXBzIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKCksIG91dHNpZGUgd2hhdCB0aGVcXG4tXFx0ICogc2lnbmF0dXJlIGF0dGVzdHMgdG8uIEtlZXAgdGhlIHNpZ25lci1wcm92aWRlZCBtYXhfZW50cmllc1xcbitcXHQgKiBwcm9ncmFtJ3MgbWFwcywgb3V0c2lkZSB3aGF0IHRoZSBzaWduYXR1cmUgYXR0ZXN0cyB0bzogdGhlXFxuK1xcdCAqIG1ldGFkYXRhIGJsb2IgaXMgY292ZXJlZCBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUgYW5kIHZlcmlmaWVkXFxuK1xcdCAqIGJ5IHRoZSBrZXJuZWwgYXQgbG9hZCB0aW1lLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXNcXG4gXFx0ICogYmFrZWQgaW50byB0aGUgYmxvYiBpbiB0aGF0IGNhc2UuXFxuIFxcdCAqL1xcbiBcXHRpZiAobWFwX2lkeCBcXHUwMDNlPSAwIFxcdTAwMjZcXHUwMDI2ICFPUFRTX0dFVChnZW4tXFx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXFxuQEAgLTU5Niw0NSArNTczLDYgQEAgdm9pZCBicGZfZ2VuX19tYXBfY3JlYXRlKHN0cnVjdCBicGZfZ2VuICpnZW4sXFxuIFxcdFxcdGVtaXRfc3lzX2Nsb3NlX3N0YWNrKGdlbiwgc3RhY2tfb2ZmKGlubmVyX21hcF9mZCkpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBlbWl0X3NpZ25hdHVyZV9tYXRjaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuKVxcbi17XFxuLVxcdF9fczY0IG9mZjtcXG4tXFx0aW50IGk7XFxuLVxcbi1cXHQvKlxcbi1cXHQgKiBSZWplY3QgaWYgdGhlIG1ldGFkYXRhIG1hcCBpcyBub3QgZXhjbHVzaXZlLiBXaXRob3V0IGV4Y2x1c2l2aXR5XFxuLVxcdCAqIHRoZSBjYWNoZWQgbWFwLVxcdTAwM2VzaGFbXSB2ZXJpZmllZCBhYm92ZSBjYW4gYmUgc3RhbGU6IGFub3RoZXIgQlBGXFxuLVxcdCAqIHByb2dyYW0gd2l0aCBtYXAgYWNjZXNzIGNvdWxkIGhhdmUgbXV0YXRlZCB0aGUgY29udGVudHMgYmV0d2Vlblxcbi1cXHQgKiBCUEZfT0JKX0dFVF9JTkZPX0JZX0ZEIGFuZCBsb2FkZXIgZXhlY3V0aW9uLlxcbi1cXHQgKi9cXG4tXFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsXFxuLVxcdFxcdFxcdFxcdFxcdCAwLCAwLCAwLCAwKSk7XFxuLVxcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7XFxuLVxcdG9mZiA9IC0oZ2VuLVxcdTAwM2VpbnNuX2N1ciAtIGdlbi1cXHUwMDNlaW5zbl9zdGFydCAtIGdlbi1cXHUwMDNlY2xlYW51cF9sYWJlbCkgLyA4IC0gMjtcXG4tXFx0aWYgKGlzX3NpbW0xNihvZmYpKSB7XFxuLVxcdFxcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpO1xcbi1cXHRcXHRlbWl0KGdlbiwgQlBGX0pNUF9JTU0oQlBGX0pORSwgQlBGX1JFR18yLCAxLCBvZmYpKTtcXG4tXFx0fSBlbHNlIHtcXG4tXFx0XFx0Z2VuLVxcdTAwM2VlcnJvciA9IC1FUkFOR0U7XFxuLVxcdH1cXG4tXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBTSEEyNTZfRFdPUkRfU0laRTsgaSsrKSB7XFxuLVxcdFxcdGVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgMCwgMCwgMCwgMCkpO1xcbi1cXHRcXHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgaSAqIHNpemVvZihfX3U2NCkpKTtcXG4tXFx0XFx0Z2VuLVxcdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldID0gZ2VuLVxcdTAwM2VpbnNuX2N1ciAtIGdlbi1cXHUwMDNlaW5zbl9zdGFydDtcXG4tXFx0XFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18zLCAwLCAwLCAwLCAwLCAwKSk7XFxuLVxcbi1cXHRcXHRvZmYgPSAtKGdlbi1cXHUwMDNlaW5zbl9jdXIgLSBnZW4tXFx1MDAzZWluc25fc3RhcnQgLSBnZW4tXFx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XFxuLVxcdFxcdGlmIChpc19zaW1tMTYob2ZmKSkge1xcbi1cXHRcXHRcXHRlbWl0KGdlbiwgQlBGX01PVjY0X0lNTShCUEZfUkVHXzcsIC1FSU5WQUwpKTtcXG4tXFx0XFx0XFx0ZW1pdChnZW4sIEJQRl9KTVBfUkVHKEJQRl9KTkUsIEJQRl9SRUdfMiwgQlBGX1JFR18zLCBvZmYpKTtcXG4tXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Z2VuLVxcdTAwM2VlcnJvciA9IC1FUkFOR0U7XFxuLVxcdFxcdH1cXG4tXFx0fVxcbi19XFxuLVxcbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKmF0dGFjaF9uYW1lLFxcbiBcXHRcXHRcXHRcXHQgICBlbnVtIGJwZl9hdHRhY2hfdHlwZSB0eXBlKVxcbiB7XFxuQEAgLTEyMTEsMTAgKzExNDksMTAgQEAgdm9pZCBicGZfZ2VuX19tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG1hcF9pZHgsIHZvaWQgKnB2YWx1ZSxcXG4gXFx0ICogfVxcbiBcXHQgKlxcbiBcXHQgKiBUaGUgcnVudGltZSBpbml0aWFsX3ZhbHVlIGNvbWVzIGZyb20gdGhlIGhvc3Qtc3VwcGxpZWQgbG9hZGVyXFxuLVxcdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKClcXG4tXFx0ICogaGFzIGFscmVhZHkgdmFsaWRhdGVkIG1hcC1cXHUwMDNlc2hhW10uIEZvciBhIHNpZ25lZCBsb2FkZXIgKGdlbl9oYXNoKVxcbi1cXHQgKiB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXAgdGhlIG92ZXJyaWRlXFxuLVxcdCAqIGFuZCBsZWF2ZSB0aGUgaGFzaGVkIHZhbHVlIGluIHBsYWNlLlxcbitcXHQgKiBjdHggYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYmxvYiB2YWx1ZSB0aGF0IHRoZSBwcm9ncmFtIHNpZ25hdHVyZVxcbitcXHQgKiBjb3ZlcnMgYW5kIHRoZSBrZXJuZWwgdmVyaWZpZXMgYXQgbG9hZCB0aW1lLiBGb3IgYSBzaWduZWQgbG9hZGVyXFxuK1xcdCAqIChnZW5faGFzaCkgdGhlIGF0dGVzdGVkIGJsb2IgdmFsdWUgbXVzdCBiZSBhdXRob3JpdGF0aXZlLCBzbyBza2lwXFxuK1xcdCAqIHRoZSBvdmVycmlkZSBhbmQgbGVhdmUgdGhlIHNpZ25lZCB2YWx1ZSBpbiBwbGFjZS5cXG4gXFx0ICovXFxuIFxcdGlmICghT1BUU19HRVQoZ2VuLVxcdTAwM2VvcHRzLCBnZW5faGFzaCwgZmFsc2UpKSB7XFxuIFxcdFxcdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMywgQlBGX1JFR182LFxcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxcbmluZGV4IDA0Y2QzMDNmYjVhODc5Li5kNWI3ZGI3MDNiM2ZlOSAxMDA2NDRcXG4tLS0gYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oXFxuKysrIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxcbkBAIC03NjgsNyArNzY4LDYgQEAgaW50IGVsZl9yZXNvbHZlX3BhdHRlcm5fb2Zmc2V0cyhjb25zdCBjaGFyICpiaW5hcnlfcGF0aCwgY29uc3QgY2hhciAqcGF0dGVybixcXG4gaW50IHByb2JlX2ZkKGludCBmZCk7XFxuIFxcbiAjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyXFxuLSNkZWZpbmUgU0hBMjU2X0RXT1JEX1NJWkUgU0hBMjU2X0RJR0VTVF9MRU5HVEggLyBzaXplb2YoX191NjQpXFxuIFxcbiB2b2lkIGxpYmJwZl9zaGEyNTYoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgX191OCBvdXRbU0hBMjU2X0RJR0VTVF9MRU5HVEhdKTtcXG4gaW50IHByb2JlX3N5c19icGZfZXh0KHZvaWQpO1xcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXFxuaW5kZXggNzQ1MDNkMzU4YmM4YTUuLjg1NTVhYjhhZjU1NGMzIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXFxuKysrIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcXG5AQCAtMzIwLDI1ICszMjAsNiBAQCBzdGF0aWMgaW5saW5lIGludCBza2VsX2xpbmtfY3JlYXRlKGludCBwcm9nX2ZkLCBpbnQgdGFyZ2V0X2ZkLFxcbiBcXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9MSU5LX0NSRUFURSwgXFx1MDAyNmF0dHIsIGF0dHJfc3opO1xcbiB9XFxuIFxcbi1zdGF0aWMgaW5saW5lIGludCBza2VsX29ial9nZXRfaW5mb19ieV9mZChpbnQgZmQpXFxuLXtcXG4tXFx0Y29uc3Qgc2l6ZV90IGF0dHJfc3ogPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgaW5mbyk7XFxuLVxcdF9fdTggc2hhW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcXG4tXFx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvO1xcbi1cXHRfX3UzMiBpbmZvX2xlbiA9IHNpemVvZihpbmZvKTtcXG4tXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4tXFxuLVxcdG1lbXNldChcXHUwMDI2aW5mbywgMCwgc2l6ZW9mKGluZm8pKTtcXG4tXFx0aW5mby5oYXNoID0gKGxvbmcpIFxcdTAwMjZzaGE7XFxuLVxcdGluZm8uaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEg7XFxuLVxcbi1cXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIGF0dHJfc3opO1xcbi1cXHRhdHRyLmluZm8uYnBmX2ZkID0gZmQ7XFxuLVxcdGF0dHIuaW5mby5pbmZvID0gKGxvbmcpIFxcdTAwMjZpbmZvO1xcbi1cXHRhdHRyLmluZm8uaW5mb19sZW4gPSBpbmZvX2xlbjtcXG4tXFx0cmV0dXJuIHNrZWxfc3lzX2JwZihCUEZfT0JKX0dFVF9JTkZPX0JZX0ZELCBcXHUwMDI2YXR0ciwgYXR0cl9zeik7XFxuLX1cXG4tXFxuIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfbWFwX2ZyZWV6ZShpbnQgZmQpXFxuIHtcXG4gXFx0Y29uc3Qgc2l6ZV90IGF0dHJfc3ogPSBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwgbWFwX2ZkKTtcXG5AQCAtMzg0LDEyICszNjUsNiBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXFxuIFxcdFxcdHNldF9lcnI7XFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHR9XFxuLVxcdGVyciA9IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCk7XFxuLVxcdGlmIChlcnIgXFx1MDAzYyAwKSB7XFxuLVxcdFxcdG9wdHMtXFx1MDAzZWVycnN0ciA9IFxcXCJmYWlsZWQgdG8gZmV0Y2ggb2JqIGluZm9cXFwiO1xcbi1cXHRcXHRzZXRfZXJyO1xcbi1cXHRcXHRnb3RvIG91dDtcXG4tXFx0fVxcbiAjZW5kaWZcXG4gXFxuIFxcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgcHJvZ19sb2FkX2F0dHJfc3opO1xcbkBAIC00MDAsNiArMzc1LDggQEAgc3RhdGljIGlubGluZSBpbnQgYnBmX2xvYWRfYW5kX3J1bihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxcbiAjaWZuZGVmIF9fS0VSTkVMX19cXG4gXFx0YXR0ci5zaWduYXR1cmUgPSAobG9uZykgb3B0cy1cXHUwMDNlc2lnbmF0dXJlO1xcbiBcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gb3B0cy1cXHUwMDNlc2lnbmF0dXJlX3N6O1xcbitcXHRpZiAob3B0cy1cXHUwMDNlc2lnbmF0dXJlKVxcbitcXHRcXHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XFxuICNlbHNlXFxuIFxcdGlmIChvcHRzLVxcdTAwM2VzaWduYXR1cmUgfHwgb3B0cy1cXHUwMDNlc2lnbmF0dXJlX3N6KVxcbiBcXHRcXHRwcl93YXJuKFxcXCJzaWduYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGZyb20gYnBmX3ByZWxvYWRcXFxcblxcXCIpO1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcXG5pbmRleCA1ZmM0MTdlMzFmYzYxNS4uYjNhYzNkOWIwZTMxNmQgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXFxuQEAgLTExLDYgKzExLDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tleWN0bC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2J0Zi5oXFx1MDAzZVxcbitcXG4gI2luY2x1ZGUgXFxcImJwZi9saWJicGZfaW50ZXJuYWwuaFxcXCIgLyogZm9yIGxpYmJwZl9zaGEyNTYoKSAqL1xcbiAjaW5jbHVkZSBcXFwiYnBmL3NrZWxfaW50ZXJuYWwuaFxcXCJcXHQgLyogZm9yIGxvYWRlciBjdHggbGF5b3V0IChicGZfbG9hZGVyX2N0eCBldGMpICovXFxuIFxcbkBAIC0xOSw4ICsyMSw2IEBAXFxuICNpbmNsdWRlIFxcXCJ0ZXN0X3NpZ25lZF9sb2FkZXJfZGF0YS5za2VsLmhcXFwiXFxuICNpbmNsdWRlIFxcXCJ0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtLnNrZWwuaFxcXCJcXG4gXFxuLSNkZWZpbmUgU0lHX01BVENIX0lOU05TIDMzIC8qIGV4Y2wgKDUpICsgNCAqIHNoYS1kd29yZCAoNykgKi9cXG4tXFxuIGVudW0ge1xcbiBcXHRCUEZfU0lHX1VOU0lHTkVEID0gMCxcXG4gXFx0QlBGX1NJR19WRVJJRklFRCxcXG5AQCAtMzUsNyArMzUsOCBAQCBlbnVtIHtcXG4gfTtcXG4gXFxuIHN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxcbi1cXHRcXHQgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQpXFxuK1xcdFxcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcXG4rXFx0XFx0ICAgICAgIF9fdTMyIGZkX2FycmF5X2NudClcXG4ge1xcbiBcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbiBcXHRpbnQgZmQ7XFxuQEAgLTUyLDYgKzUzLDcgQEAgc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXFxuIFxcdFxcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuIFxcdFxcdGF0dHIua2V5cmluZ19pZCA9IGtleXJpbmdfaWQ7XFxuIFxcdH1cXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XFxuIFxcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcIl9fbG9hZGVyLnByb2dcXFwiLCBzaXplb2YoXFxcIl9fbG9hZGVyLnByb2dcXFwiKSk7XFxuIFxcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuIFxcdFxcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG5AQCAtNjIsMTQgKzY0LDEyIEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxcbiBcXHRcXHRcXHQgIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIGRhdGFfc3osXFxuIFxcdFxcdFxcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcXG4gXFx0XFx0XFx0ICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeixcXG4tXFx0XFx0XFx0ICBib29sIGdldF9oYXNoLCB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgYm9vbCAqbG9hZGVyX3JhbilcXG4rXFx0XFx0XFx0ICB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgYm9vbCAqbG9hZGVyX3JhbilcXG4ge1xcbiBcXHRMSUJCUEZfT1BUUyhicGZfbWFwX2NyZWF0ZV9vcHRzLCBtb3B0cyxcXG4gXFx0XFx0ICAgIC5leGNsX3Byb2dfaGFzaCA9IGV4Y2wsXFxuIFxcdFxcdCAgICAuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IGV4Y2xfc3opO1xcbi1cXHRfX3U4IGhidWZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdO1xcbi1cXHRzdHJ1Y3QgYnBmX21hcF9pbmZvIGluZm87XFxuLVxcdF9fdTMyIGlsZW4gPSBzaXplb2YoaW5mbyksIGtleSA9IDA7XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuIFxcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuIFxcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldDtcXG4gXFxuQEAgLTg3LDE1ICs4Nyw2IEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxcbiBcXHRcXHRyZXQgPSAtZXJybm87XFxuIFxcdFxcdGdvdG8gb3V0X21hcDtcXG4gXFx0fVxcbi1cXHRpZiAoZ2V0X2hhc2gpIHtcXG4tXFx0XFx0bWVtc2V0KFxcdTAwMjZpbmZvLCAwLCBzaXplb2YoaW5mbykpO1xcbi1cXHRcXHRpbmZvLmhhc2ggPSBwdHJfdG9fdTY0KGhidWYpO1xcbi1cXHRcXHRpbmZvLmhhc2hfc2l6ZSA9IHNpemVvZihoYnVmKTtcXG4tXFx0XFx0aWYgKGJwZl9tYXBfZ2V0X2luZm9fYnlfZmQobWFwX2ZkLCBcXHUwMDI2aW5mbywgXFx1MDAyNmlsZW4pKSB7XFxuLVxcdFxcdFxcdHJldCA9IC1lcnJubztcXG4tXFx0XFx0XFx0Z290byBvdXRfbWFwO1xcbi1cXHRcXHR9XFxuLVxcdH1cXG4gXFxuIFxcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4gXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuQEAgLTEwOCw2ICs5OSw3IEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxcbiBcXHRcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4gXFx0XFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4gXFx0XFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHRcXHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XFxuIFxcdH1cXG4gXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwiX19sb2FkZXIucHJvZ1xcXCIsIHNpemVvZihcXFwiX19sb2FkZXIucHJvZ1xcXCIpKTtcXG4gXFx0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbkBAIC0yMzYsNzkgKzIyOCw2IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgY2hlY2tfc2lnX21hdGNoX3NoYXBlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW4sIGludCBuKVxcbi17XFxuLVxcdGludCBhID0gLTEsIGNsZWFudXAgPSAtMSwgaSwgYmFzZSwgdCwgYnJbNV0sIG5iID0gMDtcXG4tXFxuLVxcdC8qIEJQRl9QU0VVRE9fTUFQX0lEWCAodGhlIHN0cnVjdCBicGZfbWFwICogZm9ybSkgaXMgdXNlZCBvbmx5IGhlcmUuICovXFxuLVxcdGZvciAoaSA9IDA7IGkgKyAxIFxcdTAwM2MgbjsgaSsrKSB7XFxuLVxcdFxcdGlmIChpbltpXS5jb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgaW5baV0uc3JjX3JlZyA9PSBCUEZfUFNFVURPX01BUF9JRFgpIHtcXG4tXFx0XFx0XFx0YSA9IGk7XFxuLVxcdFxcdFxcdGJyZWFrO1xcbi1cXHRcXHR9XFxuLVxcdH1cXG4tXFx0aWYgKCFBU1NFUlRfR0UoYSwgMCwgXFxcImVtaXRfc2lnbmF0dXJlX21hdGNoIHByZXNlbnRcXFwiKSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXHRpZiAoIUFTU0VSVF9MRShhICsgU0lHX01BVENIX0lOU05TLCBuLCBcXFwiYmxvY2sgZml0cyBpbiBwcm9ncmFtXFxcIikpXFxuLVxcdFxcdHJldHVybjtcXG4tXFxuLVxcdC8qIGV4Y2wgY2hlY2s6IHIyID0gKih1MzIgKikobWFwICsgMzIpOyBpZiByMiAhPSAxIGdvdG8gY2xlYW51cCAqL1xcbi1cXHRBU1NFUlRfRVEoaW5bYSArIDJdLmNvZGUsIChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSwgXFxcImV4Y2wgbG9hZCB3aWR0aFxcXCIpO1xcbi1cXHRBU1NFUlRfRVEoaW5bYSArIDJdLm9mZiwgU0hBMjU2X0RJR0VTVF9MRU5HVEgsIFxcXCJleGNsIGZpZWxkIG9mZnNldFxcXCIpO1xcbi1cXHRBU1NFUlRfRVEoaW5bYSArIDRdLmNvZGUsIChCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LKSwgXFxcImV4Y2wgYnJhbmNoIG9wXFxcIik7XFxuLVxcdEFTU0VSVF9FUShpblthICsgNF0uaW1tLCAxLCBcXFwiZXhjbCBjb21wYXJlZCB0byAxXFxcIik7XFxuLVxcdGJyW25iKytdID0gYSArIDQ7XFxuLVxcbi1cXHQvKiA0IHNoYS1kd29yZCBjaGVja3M6IHIyID0gKih1NjQgKikobWFwICsgaSo4KTsgaWYgcjIgIT0gcjMgZ290byBjbGVhbnVwICovXFxuLVxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyA0OyBpKyspIHtcXG4tXFx0XFx0YmFzZSA9IGEgKyA1ICsgaSAqIDc7XFxuLVxcdFxcdEFTU0VSVF9FUShpbltiYXNlICsgMl0uY29kZSwgKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXKSwgXFxcInNoYSBsb2FkIHdpZHRoXFxcIik7XFxuLVxcdFxcdEFTU0VSVF9FUShpbltiYXNlICsgMl0ub2ZmLCBpICogOCwgXFxcInNoYSBkd29yZCBvZmZzZXRcXFwiKTtcXG4tXFx0XFx0QVNTRVJUX0VRKGluW2Jhc2UgKyAzXS5jb2RlLCAoQlBGX0xEIHwgQlBGX0lNTSB8IEJQRl9EVyksIFxcXCJzaGEgaW1tNjQgKEhfbWV0YSlcXFwiKTtcXG4tXFx0XFx0QVNTRVJUX0VRKGluW2Jhc2UgKyA2XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfWCksIFxcXCJzaGEgYnJhbmNoIG9wXFxcIik7XFxuLVxcdFxcdGJyW25iKytdID0gYmFzZSArIDY7XFxuLVxcdH1cXG4tXFxuLVxcdC8qXFxuLVxcdCAqIExvY2F0ZSB0aGUgcmVhbCBjbGVhbnVwIGxhYmVsIHNvIHdlIGNhbiBwaW4gdGhlIGV4YWN0IGp1bXAgdGFyZ2V0LFxcbi1cXHQgKiBub3QganVzdCBcXFwic29tZSBiYWNrd2FyZCBsYWJlbFxcXCIuIGJwZl9nZW5fX2luaXQoKSBlbWl0cyB0aGUgY2xlYW51cFxcbi1cXHQgKiBibG9jayBhcyBhIHByb2ctZmQgY2xvc2UgbG9vcCB3aG9zZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUgbGFiZWxcXG4tXFx0ICogZXZlcnkgZXJyb3IgYnJhbmNoIGp1bXBzIHRvLlxcbi1cXHQgKi9cXG4tXFx0Zm9yIChpID0gMDsgaSArIDIgXFx1MDAzYyBhOyBpKyspIHtcXG4tXFx0XFx0aWYgKGluW2ldLmNvZGUgPT0gKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1cpIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBpbltpXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcXHUwMDI2XFx1MDAyNiBpbltpXS5zcmNfcmVnID09IEJQRl9SRUdfMTAgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2kgKyAxXS5jb2RlID09IChCUEZfSk1QIHwgQlBGX0pTTEUgfCBCUEZfSykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2kgKyAxXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcXHUwMDI2XFx1MDAyNiBpbltpICsgMV0uaW1tID09IDAgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2kgKyAxXS5vZmYgPT0gMSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgaW5baSArIDJdLmNvZGUgPT0gKEJQRl9KTVAgfCBCUEZfQ0FMTCkgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0ICAgIGluW2kgKyAyXS5pbW0gPT0gQlBGX0ZVTkNfc3lzX2Nsb3NlKSB7XFxuLVxcdFxcdFxcdGNsZWFudXAgPSBpO1xcbi1cXHRcXHRcXHRicmVhaztcXG4tXFx0XFx0fVxcbi1cXHR9XFxuLVxcdGlmICghQVNTRVJUX0dFKGNsZWFudXAsIDAsIFxcXCJjbGVhbnVwIGxhYmVsIGxvY2F0ZWRcXFwiKSlcXG4tXFx0XFx0cmV0dXJuO1xcbi1cXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgbmI7IGkrKykge1xcbi1cXHRcXHR0ID0gYnJbaV0gKyAxICsgaW5bYnJbaV1dLm9mZjtcXG4tXFx0XFx0QVNTRVJUX0VRKHQsIGNsZWFudXAsIFxcXCJzaWctbWF0Y2ggbGFuZHMgb24gY2xlYW51cFxcXCIpO1xcbi1cXHR9XFxuLVxcdC8qXFxuLVxcdCAqIFNhbWUgaW52YXJpYW50IGZvciBldmVyeSBvdGhlciBjbGVhbnVwLWJvdW5kIGp1bXAgaW4gdGhlIHByb2dyYW06XFxuLVxcdCAqIGVtaXRfY2hlY2tfZXJyKCkgaXMgdGhlIG9ubHkgc291cmNlIG9mIFxcXCJpZiAocjcgXFx1MDAzYyAwKSBnb3RvIGNsZWFudXBcXFwiLFxcbi1cXHQgKiBzbyBlYWNoIG9mIHRob3NlIG11c3QgYWxzbyByZXNvbHZlIGV4YWN0bHkgdG8gY2xlYW51cC5cXG4tXFx0ICovXFxuLVxcdGZvciAoaSA9IDAsIHQgPSAwOyBpIFxcdTAwM2MgbjsgaSsrKSB7XFxuLVxcdFxcdGlmIChpbltpXS5jb2RlICE9IChCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfSykgfHxcXG4tXFx0XFx0ICAgIGluW2ldLmRzdF9yZWcgIT0gQlBGX1JFR183IHx8IGluW2ldLmltbSAhPSAwIHx8IGluW2ldLm9mZiBcXHUwMDNlPSAwKVxcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0QVNTRVJUX0VRKGkgKyAxICsgaW5baV0ub2ZmLCBjbGVhbnVwLCBcXFwiZXJyLWNoZWNrIGxhbmRzIG9uIGNsZWFudXBcXFwiKTtcXG4tXFx0XFx0dCsrO1xcbi1cXHR9XFxuLVxcdEFTU0VSVF9HVCh0LCAwLCBcXFwiZm91bmQgZW1pdF9jaGVja19lcnIganVtcHNcXFwiKTtcXG4tfVxcbi1cXG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XFxuIFxcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWw7XFxuIFxcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgZ29wdHM7XFxuQEAgLTM3MiwxNiArMjkxLDYgQEAgc3RhdGljIHZvaWQgZ2VuX2xvYWRlcl9maXh0dXJlX2Zpbmkoc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSAqZilcXG4gXFx0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KGYtXFx1MDAzZXNrZWwpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9jaGVja19zaGFwZSh2b2lkKVxcbi17XFxuLVxcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG4tXFxuLVxcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgPT0gMClcXG4tXFx0XFx0Y2hlY2tfc2lnX21hdGNoX3NoYXBlKChjb25zdCBzdHJ1Y3QgYnBmX2luc24gKilmLmdvcHRzLmluc25zLFxcbi1cXHRcXHRcXHRcXHQgICAgICBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbikpO1xcbi1cXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuLX1cXG4tXFxuIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpXFxuIHtcXG4gXFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xcbkBAIC0zOTEsOTQgKzMwMCwyMjAgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfbWF0Y2godm9pZClcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXFxuIFxcdFxcdFxcdFxcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcXG4tXFx0XFx0XFx0XFx0ICAgdHJ1ZSwgZi5jdHgsIGYuY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0XFx0ICAgZi5jdHgsIGYuY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4gXFx0XFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbiBcXHRcXHRBU1NFUlRfRVEociwgMCwgXFxcImhvbmVzdCBsb2FkZXIgcmV0dmFsXFxcIik7XFxuIFxcdH1cXG4gXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9zaGFfbWlzbWF0Y2godm9pZClcXG4rc3RhdGljIHZvaWQgc2lnbmF0dXJlX2VuZm9yY2VkKHZvaWQpXFxuIHtcXG4rXFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XFxuIFxcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG4tXFx0Ym9vbCByYW47XFxuLVxcdGludCByO1xcbitcXHRpbnQgZmQ7XFxuIFxcbiBcXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXFx1MDAyNmYpID09IDApIHtcXG4gXFx0XFx0LypcXG4tXFx0XFx0ICogYmxvYlswXSBsaXZlcyBpbiB0aGUgbG9hZGVyJ3MgZmRfYXJyYXkgc2NyYXRjaCAoZmlyc3QgYWRkX2RhdGEgaW5cXG4tXFx0XFx0ICogYnBmX2dlbl9faW5pdCk7IGEgMC1tYXAgcHJvZ3JhbSBuZXZlciByZWFkcyBpdCwgc28gZmxpcHBpbmcgaXRcXG4tXFx0XFx0ICogY2hhbmdlcyBvbmx5IG1hcC1cXHUwMDNlc2hhLiBUaGUgbWV0YWRhdGEgY2hlY2sgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdFxcbi1cXHRcXHQgKiBjYW4gbm90aWNlIC1cXHUwMDNlIGlzb2xhdGVzIGVtaXRfc2lnbmF0dXJlX21hdGNoLlxcbitcXHRcXHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcXG4rXFx0XFx0ICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlXFxuK1xcdFxcdCAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5XFxuK1xcdFxcdCAqIHRoZSBzaWduZWQgbHNrZWxzLilcXG4gXFx0XFx0ICovXFxuLVxcdFxcdGYuYmxvYlswXSBePSAweGZmO1xcbi1cXHRcXHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxcbi1cXHRcXHRcXHRcXHQgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsXFxuLVxcdFxcdFxcdFxcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXFx1MDAyNnJhbik7XFxuLVxcdFxcdEFTU0VSVF9UUlVFKHJhbiwgXFxcImxvYWRlciByYW5cXFwiKTtcXG4tXFx0XFx0QVNTRVJUX0VRKHIsIC1FSU5WQUwsIFxcXCJ0YW1wZXJlZCBibG9iIHJlamVjdGVkIGJ5IGVtaXRfc2lnbmF0dXJlX21hdGNoXFxcIik7XFxuK1xcdFxcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXFxuK1xcdFxcdFxcdFxcdCBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XFxuK1xcdFxcdEFTU0VSVF9MVChmZCwgMCwgXFxcImludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcXFwiKTtcXG4gXFx0fVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX25vdF9leGNsdXNpdmUodm9pZClcXG4rc3RhdGljIHZvaWQgc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcXG4ge1xcbitcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcXG4gXFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xcbi1cXHRib29sIHJhbjtcXG4tXFx0aW50IHI7XFxuK1xcdGludCBtYXBfZmQsIGZkO1xcbiBcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIENvcnJlY3QgYmxvYiBidXQgYSBub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcDogdGhlIHZlcmlmaWVyIGRvZXNcXG4tXFx0XFx0ICogbm90IHJlamVjdCAoZXhjbF9wcm9nX3NoYSB1bnNldCksIHNvIHRoZSBydW50aW1lIG1hcC1cXHUwMDNlZXhjbCA9PSAxXFxuLVxcdFxcdCAqIGNoZWNrIGluIHRoZSBsb2FkZXIgbXVzdC5cXG4rXFx0XFx0ICogQSBzaWduZWQgcHJvZ3JhbSBtYXkgb25seSBiaW5kIGV4Y2x1c2l2ZSBtYXBzIHRocm91Z2ggZmRfYXJyYXlcXG4rXFx0XFx0ICogKHRoZWlyIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlKS4gQmluZGluZyBhXFxuK1xcdFxcdCAqIG5vbi1leGNsdXNpdmUgbWFwIGlzIHJlamVjdGVkLCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBpcyBldmVuXFxuK1xcdFxcdCAqIGV4YW1pbmVkLlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcXG4tXFx0XFx0XFx0XFx0ICAgZi5kYXRhX3N6LCBOVUxMLCAwLCBOVUxMLCAwLCB0cnVlLCBmLmN0eCxcXG4tXFx0XFx0XFx0XFx0ICAgZi5jdHhfc3osIFxcdTAwMjZyYW4pO1xcbi1cXHRcXHRBU1NFUlRfVFJVRShyYW4sIFxcXCJsb2FkZXIgcmFuXFxcIik7XFxuLVxcdFxcdEFTU0VSVF9FUShyLCAtRUlOVkFMLCBcXFwibm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXAgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0XFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwibm9uZXhjbFxcXCIsIDQsXFxuK1xcdFxcdFxcdFxcdFxcdGYuZGF0YV9zeiwgMSwgTlVMTCk7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibm9uZXhjbF9tYXBcXFwiKSkge1xcbitcXHRcXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCxcXG4rXFx0XFx0XFx0XFx0XFx0IGp1bmssIHNpemVvZihqdW5rKSxcXG4rXFx0XFx0XFx0XFx0XFx0IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XFxuK1xcdFxcdFxcdEFTU0VSVF9FUShmZCwgLUVQRVJNLFxcbitcXHRcXHRcXHRcXHQgIFxcXCJub24tZXhjbHVzaXZlIG1hcCBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0XFx0XFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0XFx0Y2xvc2UobWFwX2ZkKTtcXG4rXFx0XFx0fVxcbiBcXHR9XFxuIFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQodm9pZClcXG4rc3RhdGljIHZvaWQgc2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXFxuIHtcXG4rXFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzKTtcXG4gXFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xcbi1cXHRib29sIHJhbjtcXG4tXFx0aW50IHI7XFxuK1xcdGludCBtYXBfZmQsIGZkO1xcbiBcXG4gXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIENvcnJlY3QsIGV4Y2x1c2l2ZSwgZnJvemVuIG1hcCwgYnV0IGl0cyBoYXNoIHdhcyBuZXZlciBjb21wdXRlZFxcbi1cXHRcXHQgKiAobm8gT0JKX0dFVF9JTkZPX0JZX0ZEKSwgc28gbWFwLVxcdTAwM2VzaGEgc3RheXMgemVyby4gVGhlIGxvYWRlciBtdXN0XFxuLVxcdFxcdCAqIGZhaWwgY2xvc2VkIHJhdGhlciB0aGFuIHRyZWF0IGFuIHVuc2V0IGhhc2ggYXMgYSBtYXRjaC5cXG4rXFx0XFx0ICogT25seSBhIHBsYWluIEJQRl9NQVBfVFlQRV9BUlJBWSBtYXkgYmUgZm9sZGVkIGludG8gdGhlXFxuK1xcdFxcdCAqIHNpZ25hdHVyZS4gQW4gZXhjbHVzaXZlIG1hcCBvZiBhbnkgb3RoZXIgdHlwZSBpcyByZWplY3RlZFxcbitcXHRcXHQgKiAoLUVJTlZBTCkgcmF0aGVyIHRoYW4gZm9sZGVkIC0gdGhpcyBpcyB0aGUgdHlwZSBnYXRlIHRoYXRcXG4rXFx0XFx0ICoga2VlcHMgYXJlbmEgbWFwcyAobWFwX2RpcmVjdF92YWx1ZV9hZGRyKCkgcmV0dXJucyBhIHVzZXJcXG4rXFx0XFx0ICogYWRkcmVzcykgYW5kIGluc24tYXJyYXkgbWFwcyAoYnVmZmVyIHNtYWxsZXIgdGhhbiB2YWx1ZV9zaXplKVxcbitcXHRcXHQgKiBvdXQgb2YgdGhlIGhhc2hlZCByZWdpb24sIHdoZXJlIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlXFxuK1xcdFxcdCAqIG1lbWNweSgpJ2QgZnJvbSB0aGVtLiBBIGhhc2ggbWFwIHN0YW5kcyBpbiBoZXJlOiBpdCBpc1xcbitcXHRcXHQgKiBleGNsdXNpdmUgKGJvdW5kIHRvIHRoZSBsb2FkZXIgZGlnZXN0KSBidXQgbm90IGFuIGFycmF5LlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcXG4tXFx0XFx0XFx0XFx0ICAgZi5kYXRhX3N6LCBmLmV4Y2wsIHNpemVvZihmLmV4Y2wpLCBOVUxMLCAwLFxcbi1cXHRcXHRcXHRcXHQgICBmYWxzZSwgZi5jdHgsIGYuY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4tXFx0XFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbi1cXHRcXHRBU1NFUlRfRVEociwgLUVJTlZBTCwgXFxcInVuY29tcHV0ZWQgbWV0YWRhdGEgaGFzaCByZWplY3RlZFxcXCIpO1xcbitcXHRcXHRtb3B0cy5leGNsX3Byb2dfaGFzaCA9IGYuZXhjbDtcXG4rXFx0XFx0bW9wdHMuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IHNpemVvZihmLmV4Y2wpO1xcbitcXHRcXHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXFxcImV4Y2xfaGFzaFxcXCIsIDQsIDQsIDEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZtb3B0cyk7XFxuK1xcdFxcdGlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwiZXhjbF9oYXNoX21hcFxcXCIpKSB7XFxuK1xcdFxcdFxcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLFxcbitcXHRcXHRcXHRcXHRcXHQganVuaywgc2l6ZW9mKGp1bmspLFxcbitcXHRcXHRcXHRcXHRcXHQgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTtcXG4rXFx0XFx0XFx0QVNTRVJUX0VRKGZkLCAtRUlOVkFMLFxcbitcXHRcXHRcXHRcXHQgIFxcXCJub24tYXJyYXkgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFxcXCIpO1xcbitcXHRcXHRcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHRcXHRcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRcXHR9XFxuIFxcdH1cXG4gXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCBzaWduYXR1cmVfZW5mb3JjZWQodm9pZClcXG4rc3RhdGljIGludCBzZXR1cF9tZXRhX21hcChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKTtcXG4rXFxuK3N0YXRpYyB2b2lkIHNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcXG4re1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyX2J0ZlhYWFhYWFxcXCIsICpkaXIgPSBOVUxMO1xcbitcXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xcbitcXHRpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQgPSAtMTtcXG4rXFx0dW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDtcXG4rXFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xcbitcXHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbitcXHRpbnQgZmRzWzJdO1xcbitcXHRfX3U4IHNpZ1s4MTkyXTtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgIT0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGhhdmVfZml4dHVyZSA9IHRydWU7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBmZF9hcnJheSBiaW5kcyBtYXBzIGFuZCBCVEZzIGFsaWtlLCBidXQgb25seSBleGNsdXNpdmUgYXJyYXkgbWFwcyBhcmVcXG4rXFx0ICogZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZS4gQnVpbGQgYW4gb3RoZXJ3aXNlIGdlbnVpbmVseSBzaWduZWQgbG9hZCAtXFxuK1xcdCAqIGluc25zIHx8IG1ldGFkYXRhLCBleGNsdXNpdmUgZnJvemVuIG1hcCBhdCBmZF9hcnJheVswXSAtIHRoZW4gc211Z2dsZVxcbitcXHQgKiBhbiBleHRyYSBCVEYgaW50byBmZF9hcnJheVsxXS4gQSBzaWduZWQgcHJvZ3JhbSBtYXkgbm90IGJpbmQgYW55IEJURixcXG4rXFx0ICogc28gcmVzb2x2aW5nIHRoZSBmZF9hcnJheSBlbnRyaWVzIHJlamVjdHMgdGhlIEJURiB3aXRoIC1FQUNDRVMgKGluXFxuK1xcdCAqIF9fYWRkX3VzZWRfYnRmKCksIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW4gdmVyaWZpZWQpLlxcbitcXHQgKi9cXG4rXFx0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidWYsIFxcXCJzaWduYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcXG4rXFx0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osIHNpZyxcXG4rXFx0XFx0XFx0ICAgICAgIFxcdTAwMjZzaWdfc3opLCBcXFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRtYXBfZmQgPSBzZXR1cF9tZXRhX21hcChcXHUwMDI2Zik7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXFxcIm1ldGFfbWFwXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnRmLCBcXFwiYnRmX25ld19lbXB0eVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0YnRmX19hZGRfaW50KGJ0ZiwgXFxcImludFxcXCIsIDQsIEJURl9JTlRfU0lHTkVEKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnRmX19sb2FkX2ludG9fa2VybmVsKGJ0ZiksIFxcXCJidGZfbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGZkc1swXSA9IG1hcF9mZDtcXG4rXFx0ZmRzWzFdID0gYnRmX19mZChidGYpO1xcbitcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XFxuK1xcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xcbitcXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcXG4rXFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcXFwiRHVhbCBCU0QvR1BMXFxcIik7XFxuK1xcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcXG4rXFx0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoZmRzKTtcXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSAyO1xcbitcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4rXFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4rXFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFxcXCJfX2xvYWRlci5wcm9nXFxcIiwgc2l6ZW9mKFxcXCJfX2xvYWRlci5wcm9nXFxcIikpO1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0QVNTRVJUX0VRKHByb2dfZmQgXFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZCwgLUVBQ0NFUyxcXG4rXFx0XFx0ICBcXFwiQlRGIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZCBwb3N0LXZlcmlmaWVyXFxcIik7XFxuK1xcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitvdXQ6XFxuK1xcdGlmIChidGYpXFxuK1xcdFxcdGJ0Zl9fZnJlZShidGYpO1xcbitcXHRpZiAobWFwX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG1hcF9mZCk7XFxuK1xcdGlmIChoYXZlX2ZpeHR1cmUpXFxuK1xcdFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4rXFx0aWYgKGRpcilcXG4rXFx0XFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rXFx0ZnJlZShidWYpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzaWduYXR1cmVfZmFpbHVyZV9sb2dzKHZvaWQpXFxuIHtcXG4gXFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XFxuK1xcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuIFxcdGludCBmZDtcXG4gXFxuIFxcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgPT0gMCkge1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcXG4tXFx0XFx0ICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlXFxuLVxcdFxcdCAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5XFxuLVxcdFxcdCAqIHRoZSBzaWduZWQgbHNrZWxzLilcXG4rXFx0XFx0ICogU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBub3cgcnVucyBpbnNpZGUgYnBmX2NoZWNrKCksIHNvIGFcXG4rXFx0XFx0ICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtXFxuK1xcdFxcdCAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcXG4tXFx0XFx0XFx0XFx0IHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0XFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4rXFx0XFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XFxuK1xcdFxcdGF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XFxuK1xcdFxcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbitcXHRcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuK1xcdFxcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTtcXG4rXFx0XFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTtcXG4rXFx0XFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHRcXHRhdHRyLmxvZ19sZXZlbCA9IDE7XFxuK1xcdFxcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XFxuK1xcdFxcdGF0dHIubG9nX3NpemUgPSBzaXplb2YobG9nX2J1Zik7XFxuK1xcdFxcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcIl9fbG9hZGVyLnByb2dcXFwiLCBzaXplb2YoXFxcIl9fbG9hZGVyLnByb2dcXFwiKSk7XFxuK1xcbitcXHRcXHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbitcXHRcXHRcXHQgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuIFxcdFxcdEFTU0VSVF9MVChmZCwgMCwgXFxcImludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcXFwiKTtcXG4rXFx0XFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkKTtcXG4rXFx0XFx0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXFxcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkXFxcIixcXG4rXFx0XFx0XFx0XFx0ICBcXFwidmVyaWZpZXIgbG9ncyBzaWduYXR1cmUgZmFpbHVyZVxcXCIpO1xcbiBcXHR9XFxuIFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4gfVxcbkBAIC00OTUsNyArNTMwLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX3Rvb19sYXJnZSh2b2lkKVxcbiBcXHRcXHQgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcXG4tXFx0XFx0XFx0XFx0IDY0IFxcdTAwM2NcXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRcXHRcXHRcXHQgNjQgXFx1MDAzY1xcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XFxuIFxcdFxcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCwgXFxcIm92ZXJzaXplZCBzaWduYXR1cmUgcmVqZWN0ZWRcXFwiKTtcXG4gXFx0fVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuQEAgLTUxNSw3ICs1NTAsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYmFkX2tleXJpbmcodm9pZClcXG4gXFx0XFx0ICogbGFyZ2UgcG9zaXRpdmUgc2VyaWFsIHRha2VzIHRoZSB1c2VyLWtleXJpbmcgcGF0aCBhbmQgd29uJ3QgZXhpc3QuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxcbi1cXHRcXHRcXHRcXHQgc2l6ZW9mKGp1bmspLCBJTlRfTUFYKTtcXG4rXFx0XFx0XFx0XFx0IHNpemVvZihqdW5rKSwgSU5UX01BWCwgMCk7XFxuIFxcdFxcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCwgXFxcInNpZ25hdHVyZSB3aXRoIGJhZCBrZXlyaW5nX2lkIHJlamVjdGVkXFxcIik7XFxuIFxcdH1cXG4gXFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXFx1MDAyNmYpO1xcbkBAIC01NzUsNyArNjEwLDcgQEAgc3RhdGljIHZvaWQgbWV0YWRhdGFfY3R4X21heF9lbnRyaWVzX2lnbm9yZWQodm9pZClcXG4gXFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xcbiBcXG4gXFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcXG4tXFx0XFx0XFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCB0cnVlLCBjdHgsIGN0eF9zeiwgXFx1MDAyNnJhbik7XFxuK1xcdFxcdFxcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgY3R4LCBjdHhfc3osIFxcdTAwMjZyYW4pO1xcbiBcXHRpZiAoIUFTU0VSVF9UUlVFKHJhbiwgXFxcImxvYWRlciByYW5cXFwiKSB8fFxcbiBcXHQgICAgIUFTU0VSVF9FUShyLCAwLCBcXFwibG9hZGVyIHJldHZhbFxcXCIpKVxcbiBcXHRcXHRnb3RvIGZyZWVfYmxvYjtcXG5AQCAtNjYxLDcgKzY5Niw3IEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX2N0eF9pbml0aWFsX3ZhbHVlX2lnbm9yZWQodm9pZClcXG4gXFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xcbiBcXG4gXFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcXG4tXFx0XFx0XFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCB0cnVlLCBjdHgsIGN0eF9zeiwgXFx1MDAyNnJhbik7XFxuK1xcdFxcdFxcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgY3R4LCBjdHhfc3osIFxcdTAwMjZyYW4pO1xcbiBcXHRpZiAoIUFTU0VSVF9UUlVFKHJhbiwgXFxcImxvYWRlciByYW5cXFwiKSB8fFxcbiBcXHQgICAgIUFTU0VSVF9FUShyLCAwLCBcXFwibG9hZGVyIHJldHZhbFxcXCIpKVxcbiBcXHRcXHRnb3RvIGZyZWVfYmxvYjtcXG5AQCAtNzE0LDYgKzc0OSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXFxuIFxcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF0sIHNpZ1s4MTkyXTtcXG4gXFx0X191MzIgc2lnX3N6ID0gc2l6ZW9mKHNpZyksIGluc25zX3N6LCBkYXRhX3N6LCBjdHhfc3o7XFxuIFxcdHVuc2lnbmVkIGNoYXIgKmluc25zID0gTlVMTCwgKnRhbXBlcmVkID0gTlVMTCwgKmJsb2IgPSBOVUxMO1xcbitcXHR1bnNpZ25lZCBjaGFyICpzaWduYnVmID0gTlVMTDtcXG4gXFx0aW50IG5yX21hcHMgPSAwLCBucl9wcm9ncyA9IDAsIHI7XFxuIFxcdHN0cnVjdCBicGZfcHJvZ3JhbSAqcDtcXG4gXFx0c3RydWN0IGJwZl9tYXAgKm07XFxuQEAgLTc2MCwyOSArNzk2LDQ2IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXFxuIFxcdG1lbWNweShibG9iLCBnb3B0cy5kYXRhLCBkYXRhX3N6KTtcXG4gXFx0bGliYnBmX3NoYTI1NihpbnNucywgaW5zbnNfc3osIGV4Y2wpO1xcbiBcXG4tXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgaW5zbnNfc3osIHNpZywgXFx1MDAyNnNpZ19zeiksIFxcXCJzaWduLWZpbGVcXFwiKSlcXG4rXFx0c2lnbmJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICsgZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihzaWduYnVmLCBcXFwic2lnbmJ1ZlxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdG1lbWNweShzaWduYnVmLCBpbnNucywgaW5zbnNfc3opO1xcbitcXHRtZW1jcHkoc2lnbmJ1ZiArIGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBzaWduYnVmLCBpbnNuc19zeiArIGRhdGFfc3osIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuIFxcdFxcdGdvdG8gY2xlYW51cDtcXG4gXFxuIFxcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuIFxcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuIFxcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4tXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4gXFx0QVNTRVJUX1RSVUUocmFuLCBcXFwidmFsaWQgc2lnbmF0dXJlOiBsb2FkZXIgbG9hZGVkIGFuZCByYW5cXFwiKTtcXG4gXFx0QVNTRVJUX0VRKHIsIDAsIFxcXCJ2YWxpZCBzaWduYXR1cmUgYWNjZXB0ZWRcXFwiKTtcXG4gXFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XFxuIFxcbiBcXHRtZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7XFxuIFxcdHRhbXBlcmVkW2luc25zX3N6IC8gMl0gXj0gMHhmZjtcXG4rXFx0LypcXG4rXFx0ICogQmluZCB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSB0YW1wZXJlZCBsb2FkZXIncyBvd24gZGlnZXN0LCBzbyB0aGVcXG4rXFx0ICogdmVyaWZpZXIncyBleGNsdXNpdmUtbWFwIGNoZWNrIChleGNsX3Byb2dfc2hhID09IHByb2ctXFx1MDAzZWRpZ2VzdCkgcGFzc2VzXFxuK1xcdCAqIGFuZCB0aGUgc2lnbmF0dXJlIC0gdmVyaWZpZWQgYWZ0ZXIgdGhlIG1hcHMgYXJlIHJlc29sdmVkIC0gaXMgd2hhdFxcbitcXHQgKiByZWplY3RzIHRoZSBsb2FkLiBUaGlzIGlzIHRoZSBhdHRhY2tlcidzIGJlc3QgY2FzZTogZXZlbiBhZnRlclxcbitcXHQgKiByZS1iaW5kaW5nIHRoZSBleGNsdXNpdmUgbWFwIHRvIHRoZWlyIHRhbXBlcmVkIGxvYWRlciwgdGhlIHNpZ25hdHVyZVxcbitcXHQgKiBvdmVyIHRoZSBvcmlnaW5hbCBpbnNucyB8fCBtZXRhZGF0YSBzdGlsbCBmYWlscy4gKExlYXZpbmcgdGhlIG1hcFxcbitcXHQgKiBib3VuZCB0byB0aGUgb3JpZ2luYWwgZGlnZXN0IHdvdWxkIGluc3RlYWQgdHJpcCB0aGUgZXhjbCBjaGVjayBmaXJzdC4pXFxuK1xcdCAqL1xcbitcXHRsaWJicGZfc2hhMjU2KHRhbXBlcmVkLCBpbnNuc19zeiwgZXhjbCk7XFxuIFxcdG1lbXNldChjdHgsIDAsIGN0eF9zeik7XFxuIFxcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuIFxcdHIgPSBydW5fZ2VuX2xvYWRlcih0YW1wZXJlZCwgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcXG4tXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIHRydWUsIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4rXFx0XFx0XFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcXHUwMDI2cmFuKTtcXG4gXFx0QVNTRVJUX0ZBTFNFKHJhbiwgXFxcInRhbXBlcmVkIGxvYWRlciByZWplY3RlZCBiZWZvcmUgcnVuXFxcIik7XFxuIFxcdEFTU0VSVF9FUShyLCAtRUtFWVJFSkVDVEVELCBcXFwic2lnbmF0dXJlIGlzIGJvdW5kIHRvIHRoZSBpbnN0cnVjdGlvbnNcXFwiKTtcXG4gY2xlYW51cDpcXG4gXFx0ZnJlZShpbnNucyk7XFxuIFxcdGZyZWUodGFtcGVyZWQpO1xcbiBcXHRmcmVlKGJsb2IpO1xcbitcXHRmcmVlKHNpZ25idWYpO1xcbiBcXHRmcmVlKGN0eCk7XFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcXG4gXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG5AQCAtMTAwNywxMCArMTA2MCwxMSBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcXG4ge1xcbiBcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyX2xzbVhYWFhYWFxcXCIsICpkaXIgPSBOVUxMO1xcbiBcXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX2xzbSAqbHNtID0gTlVMTDtcXG4rXFx0X191MzIgc2lnX3N6ID0gODE5MiwgbXNpZ19zeiA9IDgxOTI7XFxuIFxcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xO1xcbiBcXHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJ1ZjtcXG4gXFx0X19zMzIgc2VzX3NlcmlhbDtcXG4gXFx0X191OCBzaWdbODE5Ml07XFxuIFxcbkBAIC0xMDI5LDcgKzEwODMsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcXG4gXFx0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibWV0YV9tYXBfdW5zaWduZWRcXFwiKSlcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcdGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzZWVuID0gMDtcXG4tXFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCk7XFxuK1xcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIE5VTEwsIDAsIDAsIDApO1xcbiBcXHRjbG9zZShtYXBfZmQpO1xcbiBcXHRtYXBfZmQgPSAtMTtcXG4gXFx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXFxcInVuc2lnbmVkIGxvYWRlciBsb2FkXFxcIikpXFxuQEAgLTEwNjIsMjIgKzExMTYsNTEgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXFxuIFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2VlbiA9IDA7XFxuIFxcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcXG4tXFx0XFx0XFx0ICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRcXHRcXHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XFxuIFxcdGNsb3NlKG1hcF9mZCk7XFxuIFxcdG1hcF9mZCA9IC0xO1xcbi1cXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcXFwic2lnbmVkIGxvYWRlciBsb2FkXFxcIikpXFxuLVxcdFxcdGdvdG8gb3V0O1xcbi1cXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0QVNTRVJUX0VRKHByb2dfZmQsIC1FQUNDRVMsIFxcXCJ1bmZvbGRlZCBtZXRhZGF0YSByZWplY3RlZFxcXCIpO1xcbitcXHRpZiAocHJvZ19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4gXFx0cHJvZ19mZCA9IC0xO1xcbiBcXG4gXFx0c2VzX3NlcmlhbCA9IHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9HRVRfS0VZUklOR19JRCxcXG4gXFx0XFx0XFx0ICAgICBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xcbiBcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNlZW4sIDEsIFxcXCJzaWduZWQ6IG9uZSBvYnNlcnZlZCBsb2FkXFxcIik7XFxuLVxcdEFTU0VSVF9FUShsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2lnX3ZlcmRpY3QsIEJQRl9TSUdfVkVSSUZJRUQsIFxcXCJzaWduZWQgdmVyZGljdFxcXCIpO1xcbitcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELFxcbitcXHRcXHQgIFxcXCJhZG1pc3Npb24gc2F3IGEgdmFsaWQgc2lnbmF0dXJlXFxcIik7XFxuIFxcdEFTU0VSVF9FUShsc20tXFx1MDAzZWJzcy1cXHUwMDNlc2lnX2tleXJpbmdfdHlwZSwgQlBGX1NJR19LRVlSSU5HX1VTRVIsIFxcXCJzaWduZWQga2V5cmluZyB0eXBlXFxcIik7XFxuIFxcdEFTU0VSVF9HVChzZXNfc2VyaWFsLCAwLCBcXFwic2Vzc2lvbiBrZXlyaW5nIHNlcmlhbCByZXNvbHZlZFxcXCIpO1xcbiBcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNpZ19rZXlyaW5nX3NlcmlhbCwgc2VzX3NlcmlhbCxcXG4gXFx0XFx0ICBcXFwic2lnbmVkOiB2YWxpZGF0ZWQgYWdhaW5zdCBzZXNzaW9uIGtleXJpbmdcXFwiKTtcXG4rXFxuK1xcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcXFwibWV0YV9zaWduYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcXG4rXFx0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osXFxuK1xcdFxcdFxcdFxcdHNpZywgXFx1MDAyNm1zaWdfc3opLCBcXFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcXFwiKSkge1xcbitcXHRcXHRmcmVlKGJ1Zik7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGZyZWUoYnVmKTtcXG4rXFxuK1xcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFxcdTAwMjZmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcXFwibWV0YV9tYXBfYm91bmRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzZWVuID0gMDtcXG4rXFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgc2lnLFxcbitcXHRcXHRcXHQgICAgICBtc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xcbitcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRtYXBfZmQgPSAtMTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQocHJvZ19mZCwgXFxcIm1ldGFkYXRhLWJvdW5kIGxvYWRlciBsb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRjbG9zZShwcm9nX2ZkKTtcXG4rXFx0cHJvZ19mZCA9IC0xO1xcbitcXHRBU1NFUlRfRVEobHNtLVxcdTAwM2Vic3MtXFx1MDAzZXNlZW4sIDEsIFxcXCJtZXRhZGF0YTogb25lIG9ic2VydmVkIGxvYWRcXFwiKTtcXG4rXFx0QVNTRVJUX0VRKGxzbS1cXHUwMDNlYnNzLVxcdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcXG4rXFx0XFx0ICBcXFwibWV0YWRhdGEtYm91bmQgdmVyZGljdFxcXCIpO1xcbiBvdXQ6XFxuIFxcdGlmIChtYXBfZmQgXFx1MDAzZT0gMClcXG4gXFx0XFx0Y2xvc2UobWFwX2ZkKTtcXG5AQCAtMTA5MCwyMCArMTE3Myw0NjIgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpXFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9sc21fX2Rlc3Ryb3kobHNtKTtcXG4gfVxcbiBcXG4rLypcXG4rICogTG9hZC10aW1lIG1ldGFkYXRhIHZlcmlmaWNhdGlvbjogdGhlIGtlcm5lbCBmb2xkcyB0aGUgZnJvemVuIG1ldGFkYXRhIG1hcFxcbisgKiBpbnRvIHRoZSBzaWduYXR1cmUgKGluc25zIHx8IG1ldGFkYXRhKSBhbmQgY2hlY2tzIGl0IGF0IEJQRl9QUk9HX0xPQUQgdmlhXFxuKyAqIGZkX2FycmF5X2NudCwgcmF0aGVyIHRoYW4gdGhlIGxvYWRlciBjaGVja2luZyBmcm9tIHdpdGhpbiBCUEYuIFNpZ24gdGhhdFxcbisgKiBjb25jYXRlbmF0aW9uLCBoYW5kIHRoZSBrZXJuZWwgdGhlIG1hcCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25lZCBsb2FkZXIgbG9hZHMsXFxuKyAqIHJ1bnMsIGFuZCBpbnN0YWxscyBpdHMgdGFyZ2V0LlxcbisgKi9cXG4rc3RhdGljIGludCBsb2FkdGltZV9kcml2ZShjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcXG4rXFx0XFx0XFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LCBjb25zdCBfX3U4ICpleGNsLFxcbitcXHRcXHRcXHQgIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBpbnQgKmxvYWRfcmV0LCBib29sICpyYW4pXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXFxuK1xcdFxcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxcbitcXHRcXHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGtleSA9IDA7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuK1xcdF9fdTggc2lnWzgxOTJdO1xcbitcXG4rXFx0KnJhbiA9IGZhbHNlO1xcbitcXHQqbG9hZF9yZXQgPSAwO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTWV0YWRhdGEgbWFwLCBib3VuZCB0byB0aGUgbG9hZGVyIGRpZ2VzdCBhbmQgZnJvemVuLCBleGFjdGx5IGFzXFxuK1xcdCAqIHNrZWxfaW50ZXJuYWwuaCdzIGJwZl9sb2FkX2FuZF9ydW4oKSBzZXRzIGl0IHVwLlxcbitcXHQgKi9cXG4rXFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwiX19sb2FkZXIubWFwXFxcIiwgNCxcXG4rXFx0XFx0XFx0XFx0ZGF0YV9zeiwgMSwgXFx1MDAyNm1vcHRzKTtcXG4rXFx0aWYgKG1hcF9mZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiAtZXJybm87XFxuK1xcdGlmIChicGZfbWFwX3VwZGF0ZV9lbGVtKG1hcF9mZCwgXFx1MDAyNmtleSwgZGF0YSwgMCkgfHwgYnBmX21hcF9mcmVlemUobWFwX2ZkKSkge1xcbitcXHRcXHRyZXQgPSAtZXJybm87XFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2lnbiBpbnNucyB8fCBtZXRhZGF0YSwgdGhlIHNhbWUgYnl0ZXMgdGhlIGtlcm5lbCByZWNvbnN0cnVjdHMuICovXFxuK1xcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWluc25zX3N6ICsgZGF0YV9zeik7XFxuK1xcdGlmICghYnVmKSB7XFxuK1xcdFxcdHJldCA9IC1FTk9NRU07XFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0fVxcbitcXHRtZW1jcHkoYnVmLCBpbnNucywgaW5zbnNfc3opO1xcbitcXHRtZW1jcHkoYnVmICsgaW5zbnNfc3osIGRhdGEsIGRhdGFfc3opO1xcbitcXHRyZXQgPSBzaWduX2J1ZihkaXIsIGJ1ZiwgaW5zbnNfc3ogKyBkYXRhX3N6LCBzaWcsIFxcdTAwMjZzaWdfc3opO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRnb3RvIG91dF9tYXA7XFxuK1xcbitcXHRtZW1zZXQoXFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XFxuK1xcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xcbitcXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XFxuK1xcdGF0dHIuaW5zbl9jbnQgPSBpbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcXHUwMDI2bWFwX2ZkKTtcXG4rXFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuK1xcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuK1xcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSAxO1xcbitcXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFxcXCJfX2xvYWRlci5wcm9nXFxcIiwgc2l6ZW9mKFxcXCJfX2xvYWRlci5wcm9nXFxcIikpO1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdCpsb2FkX3JldCA9IC1lcnJubztcXG4rXFx0XFx0cmV0ID0gLWVycm5vO1xcbitcXHRcXHRnb3RvIG91dF9tYXA7XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci50ZXN0LnByb2dfZmQgPSBwcm9nX2ZkO1xcbitcXHRhdHRyLnRlc3QuY3R4X2luID0gcHRyX3RvX3U2NChjdHgpO1xcbitcXHRhdHRyLnRlc3QuY3R4X3NpemVfaW4gPSBjdHhfc3o7XFxuK1xcdGlmIChzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19SVU4sIFxcdTAwMjZhdHRyLFxcbitcXHRcXHQgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIHRlc3QpKSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0cmV0ID0gLWVycm5vO1xcbitcXHRcXHRnb3RvIG91dF9wcm9nO1xcbitcXHR9XFxuK1xcdCpyYW4gPSB0cnVlO1xcbitcXHRyZXQgPSAoaW50KWF0dHIudGVzdC5yZXR2YWw7XFxuK291dF9wcm9nOlxcbitcXHRjbG9zZShwcm9nX2ZkKTtcXG4rb3V0X21hcDpcXG4rXFx0ZnJlZShidWYpO1xcbitcXHRjbG9zZShtYXBfZmQpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxcbit7XFxuK1xcdExJQkJQRl9PUFRTKGdlbl9sb2FkZXJfb3B0cywgZ29wdHMsIC5nZW5faGFzaCA9IHRydWUpO1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYXFxcIiwgKmRpciA9IE5VTEw7XFxuK1xcdGludCBucl9tYXBzID0gMCwgbnJfcHJvZ3MgPSAwLCBsb2FkX3JldCA9IDAsIHI7XFxuK1xcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF07XFxuK1xcdHN0cnVjdCBicGZfcHJvZ19kZXNjICpwZDtcXG4rXFx0c3RydWN0IGJwZl9tYXBfZGVzYyAqbWQ7XFxuK1xcdHVuc2lnbmVkIGNoYXIgKmJsb2IgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgYnBmX3Byb2dyYW0gKnA7XFxuK1xcdHN0cnVjdCBicGZfbWFwICptO1xcbitcXHRfX3UzMiBjdHhfc3osIGRhdGFfc3o7XFxuK1xcdHZvaWQgKmN0eCA9IE5VTEw7XFxuK1xcdGJvb2wgcmFuID0gZmFsc2U7XFxuK1xcbitcXHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFxcXCJrZXlyaW5nXFxcIiwgXFxcIl91aWQuMFxcXCIsIE5VTEwsXFxuK1xcdFxcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XFxuK1xcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdFxcdHJtZGlyKGRpcik7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFBU1NFUlRfT0soYnBmX29iamVjdF9fZ2VuX2xvYWRlcihvYmosIFxcdTAwMjZnb3B0cyksIFxcXCJnZW5fbG9hZGVyXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19sb2FkKG9iaiksIFxcXCJnZW5fbG9hZFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJwZl9vYmplY3RfX2Zvcl9lYWNoX3Byb2dyYW0ocCwgb2JqKVxcbitcXHRcXHRucl9wcm9ncysrO1xcbitcXHRicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobSwgb2JqKVxcbitcXHRcXHRucl9tYXBzKys7XFxuK1xcdGlmICghQVNTRVJUX0VRKG5yX21hcHMsIGV4cGVjdF9tYXBzLCBcXFwiZml4dHVyZSBtYXAgY291bnRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRjdHhfc3ogPSBzaXplb2Yoc3RydWN0IGJwZl9sb2FkZXJfY3R4KSArXFxuK1xcdFxcdCBucl9tYXBzICogc2l6ZW9mKHN0cnVjdCBicGZfbWFwX2Rlc2MpICtcXG4rXFx0XFx0IG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTtcXG4rXFx0Y3R4ID0gY2FsbG9jKDEsIGN0eF9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihjdHgsIFxcXCJjdHhfYWxsb2NcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cXHUwMDNlc3ogPSBjdHhfc3o7XFxuK1xcbitcXHRkYXRhX3N6ID0gZ29wdHMuZGF0YV9zejtcXG4rXFx0YmxvYiA9IG1hbGxvYyhkYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsIFxcXCJibG9iX2FsbG9jXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XFxuK1xcbitcXHQvKiBleGNsX3Byb2dfaGFzaCA9IFNIQTI1Nihsb2FkZXIgaW5zbnMpID09IHRoZSBsb2FkZXIncyBwcm9nLVxcdTAwM2VkaWdlc3QuICovXFxuK1xcdGxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTtcXG4rXFxuK1xcdHIgPSBsb2FkdGltZV9kcml2ZShkaXIsIGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcXG4rXFx0XFx0XFx0ICAgZXhjbCwgY3R4LCBjdHhfc3osIFxcdTAwMjZsb2FkX3JldCwgXFx1MDAyNnJhbik7XFxuK1xcdEFTU0VSVF9PSyhsb2FkX3JldCwgXFxcInNpZ25lZCBsb2FkZXIgbG9hZGVkIChpbnNucyB8fCBtZXRhZGF0YSlcXFwiKTtcXG4rXFx0QVNTRVJUX1RSVUUocmFuLCBcXFwibG9hZGVyIHJhblxcXCIpO1xcbitcXHRBU1NFUlRfRVEociwgMCwgXFxcImxvYWRlciBpbnN0YWxsZWQgaXRzIHRhcmdldFxcXCIpO1xcbitcXG4rXFx0bWQgPSAoc3RydWN0IGJwZl9tYXBfZGVzYyAqKSgoY2hhciAqKWN0eCArIHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTtcXG4rXFx0cGQgPSAoc3RydWN0IGJwZl9wcm9nX2Rlc2MgKikobWQgKyBucl9tYXBzKTtcXG4rXFx0QVNTRVJUX0dUKHBkWzBdLnByb2dfZmQsIDAsIFxcXCJ0YXJnZXQgcHJvZ3JhbSBpbnN0YWxsZWRcXFwiKTtcXG4rXFx0aWYgKG5yX21hcHMpXFxuK1xcdFxcdEFTU0VSVF9HVChtZFswXS5tYXBfZmQsIDAsIFxcXCJ0YXJnZXQgbWFwIGluc3RhbGxlZFxcXCIpO1xcbitcXG4rXFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XFxuK291dDpcXG4rXFx0ZnJlZShibG9iKTtcXG4rXFx0ZnJlZShjdHgpO1xcbitcXHRpZiAoZGlyKVxcbitcXHRcXHRydW5fc2V0dXAoXFxcImNsZWFudXBcXFwiLCBkaXIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBsb2FkdGltZV9ub19tYXAodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsID0gdGVzdF9zaWduZWRfbG9hZGVyX19vcGVuKCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVxcdTAwM2VvYmosIDApO1xcbitcXHR0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpXFxuK3tcXG4rXFx0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXAgKnNrZWwgPSB0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19vcGVuKCk7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcInNrZWxfb3BlblxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGxvYWR0aW1lX3ZlcmlmeShza2VsLVxcdTAwM2VvYmosIDEpO1xcbitcXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTExcXG4rICogcHJvZ3JhbSB3aXRoIG5vIGZkX2FycmF5IGlzIHNpZ25lZCBvdmVyIGl0cyBpbnN0cnVjdGlvbnMgYWxvbmU6IHRoZSBrZXJuZWxcXG4rICogdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSwgZm9sZHMgbm8gbWV0YWRhdGEsIGFuZCB0aGUgcHJvZ3JhbSBsb2Fkcy4gRXhlcmNpc2VcXG4rICogdGhlIGZkX2FycmF5ID09IE5VTEwgLyBmZF9hcnJheV9jbnQgPT0gMCBwYXRoLCBhbmQgY29uZmlybSB0aGUgc2lnbmF0dXJlXFxuKyAqIHN0aWxsIGF1dGhlbnRpY2F0ZXMgdGhlIGluc3RydWN0aW9ucyAoYSB0YW1wZXJlZCBjb3B5IGlzIHJlamVjdGVkKS5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHNpZ25lZF9ub19mZF9hcnJheSh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXFxuK1xcdFxcdEJQRl9FWElUX0lOU04oKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlclhYWFhYWFxcXCIsICpkaXI7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XFxuK1xcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuK1xcdF9fdTggc2lnWzgxOTJdO1xcbitcXHRpbnQgcHJvZ19mZCwgZXJyO1xcbitcXG4rXFx0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcXFwia2V5cmluZ1xcXCIsIFxcXCJfdWlkLjBcXFwiLCBOVUxMLFxcbitcXHRcXHRLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xcbitcXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXFxcIm1rZHRlbXBcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRcXHRybWRpcihkaXIpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdC8qIE5vIG1ldGFkYXRhIG1hcDogdGhlIHNpZ25lZCBwYXlsb2FkIGlzIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuICovXFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuK1xcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4rXFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4rXFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHQvKiBmZF9hcnJheSBhbmQgZmRfYXJyYXlfY250IGRlbGliZXJhdGVseSBsZWZ0IE5VTEwvMC4gKi9cXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX25vbWFwXFxcIiwgc2l6ZW9mKFxcXCJzaWduZWRfbm9tYXBcXFwiKSk7XFxuK1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocHJvZ19mZCwgMCwgXFxcIm1hcC1sZXNzIHNpZ25lZCBwcm9ncmFtIGxvYWRlZFxcXCIpKSB7XFxuK1xcdFxcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFx0Y2xvc2UocHJvZ19mZCk7XFxuK1xcbitcXHQvKiBUaGUgc2lnbmF0dXJlIGNvdmVycyB0aGUgaW5zdHJ1Y3Rpb25zLCBzbyB0YW1wZXJpbmcgbXVzdCBiZSByZWplY3RlZC4gKi9cXG4rXFx0aW5zbnNbMF0uaW1tID0gMTtcXG4rXFx0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbitcXHRcXHRcXHQgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuK1xcdGVyciA9IHByb2dfZmQgXFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZDtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXFxcInRhbXBlcmVkIG1hcC1sZXNzIHByb2dyYW0gcmVqZWN0ZWRcXFwiKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK2NsZWFudXA6XFxuK1xcdHJ1bl9zZXR1cChcXFwiY2xlYW51cFxcXCIsIGRpcik7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIGZkX2FycmF5IGluZGljZXMsIHNvIHRoZSBrZXJuZWxcXG4rICogZm9sZHMgKGFuZCB0aHVzIGF0dGVzdHMpIHRoZW0uIEEgZGlyZWN0IEJQRl9QU0VVRE9fTUFQX0ZEIHJlZmVyZW5jZSAtIGEgcmF3LFxcbisgKiB1bmZvbGRlZCBmZCBiYWtlZCBpbnRvIHRoZSBzaWduZWQgaW5zdHJ1Y3Rpb25zIC0gaXMgcmVqZWN0ZWQgYnkgdGhlIHZlcmlmaWVyLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksXFxuK1xcdFxcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcXG4rXFx0XFx0QlBGX0VYSVRfSU5TTigpLFxcbitcXHR9O1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9zaWduZWRfbG9hZGVyWFhYWFhYXFxcIiwgKmRpcjtcXG4rXFx0X191MzIgc2lnX3N6ID0gODE5MjtcXG4rXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4rXFx0X191OCBzaWdbODE5Ml07XFxuK1xcdGludCBtYXBfZmQsIHByb2dfZmQsIGVycjtcXG4rXFxuK1xcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXFxcInNpZ19tYXBmZFxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aW5zbnNbMF0uaW1tID0gbWFwX2ZkO1xcdC8qIGJha2UgdGhlIHJhdyBtYXAgZmQgaW50byB0aGUgbGRfaW1tNjQgKi9cXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0Z290byBvdXRfbWFwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMsIHJhdyBtYXAgZmQgYW5kIGFsbC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcXHUwMDI2c2lnX3N6KSxcXG4rXFx0XFx0ICAgICAgIFxcXCJzaWduLWZpbGVcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbitcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4rXFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xcbitcXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XFxuK1xcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbitcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuK1xcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xcbitcXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xcbitcXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XFxuK1xcdC8qIE5vIGZkX2FycmF5OiB0aGUgbWFwIGlzIHJlYWNoZWQgYnkgYSByYXcgZmQgaW4gdGhlIGluc3RydWN0aW9ucy4gKi9cXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX21hcGZkXFxcIiwgc2l6ZW9mKFxcXCJzaWduZWRfbWFwZmRcXFwiKSk7XFxuK1xcbitcXHRwcm9nX2ZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuK1xcdFxcdFxcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4rXFx0ZXJyID0gcHJvZ19mZCBcXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUlOVkFMLCBcXFwic2lnbmVkIHByb2dyYW0gcmVmZXJlbmNpbmcgYSBtYXAgYnkgZmQgcmVqZWN0ZWRcXFwiKTtcXG4rXFx0aWYgKHByb2dfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UocHJvZ19mZCk7XFxuK2NsZWFudXA6XFxuK1xcdHJ1bl9zZXR1cChcXFwiY2xlYW51cFxcXCIsIGRpcik7XFxuK291dF9tYXA6XFxuK1xcdGNsb3NlKG1hcF9mZCk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIHRoZSBjb250aW51b3VzIGZkX2FycmF5LCBzbyB0aGVcXG4rICoga2VybmVsIGZvbGRzIChhbmQgdGh1cyBhdHRlc3RzKSB0aGVtLiBSZWZlcmVuY2luZyBhIG1hcCBieSBmZF9hcnJheSAqaW5kZXgqXFxuKyAqIHdoaWxlIGxlYXZpbmcgZmRfYXJyYXlfY250IGF0IDAgc2VsZWN0cyB0aGUgc3BhcnNlIHBhdGgsIHdoaWNoIHJlc29sdmVzIGEgbWFwXFxuKyAqIHRoZSBzaWduYXR1cmUgbmV2ZXIgY292ZXJlZDsgdGhlIHZlcmlmaWVyIHJlamVjdHMgaXQgdXAgZnJvbnQgd2l0aCAtRUFDQ0VTLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfTERfSU1NNjRfUkFXKEJQRl9SRUdfMSwgQlBGX1BTRVVET19NQVBfSURYLCAwKSxcXG4rXFx0XFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxcbitcXHRcXHRCUEZfRVhJVF9JTlNOKCksXFxuK1xcdH07XFxuK1xcdGNoYXIgZGlyX3RtcGxbXSA9IFxcXCIvdG1wL3NpZ25lZF9sb2FkZXJfc3BYWFhYWFhcXFwiLCAqZGlyO1xcbitcXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xcbitcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbitcXHRfX3U4IHNpZ1s4MTkyXTtcXG4rXFx0aW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyO1xcbitcXG4rXFx0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcXFwic2lnX3NwYXJzZVxcXCIsIDQsIDQsIDEsIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFxcXCJtYXBfY3JlYXRlXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0X21hcDtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0Z290byBvdXRfbWFwO1xcbitcXHR9XFxuK1xcbitcXHQvKiBTaWduIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmU7IHRoZSBzcGFyc2UgbWFwIGlzIG5vdCBmb2xkZWQuICovXFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuK1xcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcXHUwMDI2bWFwX2ZkKTtcXG4rXFx0YXR0ci5mZF9hcnJheV9jbnQgPSAwOyAvKiBzcGFyc2U6IGZvcmNlIGxhenkgbWFwIHJlc29sdXRpb24gKi9cXG4rXFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XFxuK1xcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XFxuK1xcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcXG4rXFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcXFwic2lnbmVkX3NwYXJzZVxcXCIsIHNpemVvZihcXFwic2lnbmVkX3NwYXJzZVxcXCIpKTtcXG4rXFxuK1xcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcXHUwMDI2YXR0cixcXG4rXFx0XFx0XFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xcbitcXHRlcnIgPSBwcm9nX2ZkIFxcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFxcXCJzaWduZWQgcHJvZ3JhbSBiaW5kaW5nIGEgc3BhcnNlIGZkX2FycmF5IG1hcCByZWplY3RlZFxcXCIpO1xcbitcXHRpZiAocHJvZ19mZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRjbG9zZShwcm9nX2ZkKTtcXG4rY2xlYW51cDpcXG4rXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rb3V0X21hcDpcXG4rXFx0Y2xvc2UobWFwX2ZkKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xcbitcXHRcXHRCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLFxcbitcXHRcXHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXFxuK1xcdFxcdEJQRl9FWElUX0lOU04oKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBkaXJfdG1wbFtdID0gXFxcIi90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFhcXFwiLCAqZGlyO1xcbitcXHRpbnQgbWFwX2ZkID0gLTEsIHByb2dfZmQsIGVyciwgZmRzWzJdO1xcbitcXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xcbitcXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xcbitcXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xcbitcXHRfX3U4IHNpZ1s4MTkyXTtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0XFx0cm1kaXIoZGlyKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXFx1MDAyNnNpZ19zeiksXFxuK1xcdFxcdCAgICAgICBcXFwic2lnbi1maWxlXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXFxcImJ0Zl9uZXdfZW1wdHlcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRidGZfX2FkZF9pbnQoYnRmLCBcXFwiaW50XFxcIiwgNCwgQlRGX0lOVF9TSUdORUQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXFxcImJ0Zl9sb2FkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0ZmRzWzBdID0gLTE7XFxuK1xcdGZkc1sxXSA9IGJ0Zl9fZmQoYnRmKTtcXG4rXFxuK1xcdG1lbXNldChcXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcXG4rXFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XFxuK1xcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcXG4rXFx0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xcbitcXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFxcXCJEdWFsIEJTRC9HUExcXFwiKTtcXG4rXFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xcbitcXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChmZHMpO1xcbitcXHRhdHRyLmZkX2FycmF5X2NudCA9IDA7IC8qIHNwYXJzZTogZm9yY2UgbGF6eSBrZnVuYyBCVEYgcmVzb2x1dGlvbiAqL1xcbitcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4rXFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4rXFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbitcXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFxcXCJzaWduZWRfa2Z1bmNcXFwiLCBzaXplb2YoXFxcInNpZ25lZF9rZnVuY1xcXCIpKTtcXG4rXFxuK1xcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcXHUwMDI2YXR0cixcXG4rXFx0XFx0XFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xcbitcXHRlcnIgPSBwcm9nX2ZkIFxcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XFxuK1xcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXFxcIm1vZHVsZSBrZnVuYyBCVEYgaW4gc2lnbmVkIHByb2dyYW0gcmVqZWN0ZWRcXFwiKTtcXG4rY2xlYW51cDpcXG4rXFx0aWYgKGJ0ZilcXG4rXFx0XFx0YnRmX19mcmVlKGJ0Zik7XFxuK1xcdGlmIChtYXBfZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0Y2xvc2UobWFwX2ZkKTtcXG4rXFx0cnVuX3NldHVwKFxcXCJjbGVhbnVwXFxcIiwgZGlyKTtcXG4rfVxcbitcXG4gdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcXG4ge1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfY2hlY2tfc2hhcGVcXFwiKSlcXG4tXFx0XFx0bWV0YWRhdGFfY2hlY2tfc2hhcGUoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxvYWR0aW1lX25vX21hcFxcXCIpKVxcbitcXHRcXHRsb2FkdGltZV9ub19tYXAoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImxvYWR0aW1lX3dpdGhfbWFwXFxcIikpXFxuK1xcdFxcdGxvYWR0aW1lX3dpdGhfbWFwKCk7XFxuIFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtZXRhZGF0YV9tYXRjaFxcXCIpKVxcbiBcXHRcXHRtZXRhZGF0YV9tYXRjaCgpO1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfc2hhX21pc21hdGNoXFxcIikpXFxuLVxcdFxcdG1ldGFkYXRhX3NoYV9taXNtYXRjaCgpO1xcbi1cXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfbm90X2V4Y2x1c2l2ZVxcXCIpKVxcbi1cXHRcXHRtZXRhZGF0YV9ub3RfZXhjbHVzaXZlKCk7XFxuLVxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZFxcXCIpKVxcbi1cXHRcXHRtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmF0dXJlX2VuZm9yY2VkXFxcIikpXFxuIFxcdFxcdHNpZ25hdHVyZV9lbmZvcmNlZCgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfbm9uYXJyYXlfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCgpO1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZFxcXCIpKVxcbitcXHRcXHRzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaWduYXR1cmVfZmFpbHVyZV9sb2dzXFxcIikpXFxuK1xcdFxcdHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3MoKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25hdHVyZV90b29fbGFyZ2VcXFwiKSlcXG4gXFx0XFx0c2lnbmF0dXJlX3Rvb19sYXJnZSgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwic2lnbmF0dXJlX2JhZF9rZXlyaW5nXFxcIikpXFxuQEAgLTExMzIsNCArMTY1NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxcbiBcXHRcXHRtYXBfaGFzaF91bnN1cHBvcnRlZF90eXBlKCk7XFxuIFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJsc21fc2lnbmF0dXJlX3ZlcmRpY3RcXFwiKSlcXG4gXFx0XFx0bHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaWduZWRfbm9fZmRfYXJyYXlcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX25vX2ZkX2FycmF5KCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkXFxcIikpXFxuK1xcdFxcdHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25lZF9zcGFyc2VfZmRfYXJyYXlfcmVqZWN0ZWRcXFwiKSlcXG4rXFx0XFx0c2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpO1xcbiB9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjA4LjM1NjA4OTE0OFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTM4MjE4OTYzNzU5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWVNcIixcbiAgICBcIlNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlwiLFxuICAgIFwiRlNfVkVSSVRZXCIsXG4gICAgXCJGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfc3BhcnNlXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeFwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlXCIsXG4gICAgXCJhZGRfZmRfZnJvbV9mZF9hcnJheVwiLFxuICAgIFwiYnBmX2NsYXNzaWZ5X2tleXJpbmdcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBJdCBtb3ZlcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmcm9tIGBicGZfcHJvZ19sb2FkYCB0byBgYnBmX2NoZWNrYCBpbnNpZGUgdGhlIHZlcmlmaWVyLCBhbmQgY2hhbmdlcyBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKHN1cHBvcnRpbmcgY29udGludW91cyBhbmQgc3BhcnNlIGFycmF5cykuIEl0IGFkZHMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgYGZkX2FycmF5YCByZXNvbHV0aW9uIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzbyB0aGV5IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuXG4gICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuXG4gICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXRcbiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSxcbiAgIGFuZCBETyBOT1QgYWRkIGEgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2I4NDM0M2QwZGY2MTEyOTNiZmIwMTMyNDUyNzk1YzI0Zjg5NzM2NFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgSnVsIDIgMTc6MjI6MDUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9pbmRleC5yc3RcbmluZGV4IDBkNWM2ZjY1OTI2NjdhLi42MzhhMDBkNDJiYzJhMSAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYnBmL2luZGV4LnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9icGYvaW5kZXgucnN0XG5AQCAtMjgsNiArMjgsNyBAQCB0aGF0IGdvZXMgaW50byBncmVhdCB0ZWNobmljYWwgZGVwdGggYWJvdXQgdGhlIEJQRiBBcmNoaXRlY3R1cmUuXG4gICAgY2xhc3NpY192c19leHRlbmRlZC5yc3RcbiAgICBicGZfaXRlcmF0b3JzXG4gICAgYnBmX2xpY2Vuc2luZ1xuKyAgIHNpZ25pbmdcbiAgICB0ZXN0X2RlYnVnXG4gICAgY2xhbmctbm90ZXNcbiAgICBsaW51eC1ub3Rlc1xuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3Rcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwMC4uMDFmYTRhMWVlMDE0Zjdcbi0tLSAvZGV2L251bGxcbisrKyBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XG5AQCAtMCwwICsxLDQ5MCBAQFxuKy4uIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rXG4rPT09PT09PT09PT09XG4rQlBGIHNpZ25pbmdcbis9PT09PT09PT09PT1cbitcbitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgQlBGIHByb2dyYW1zIGFyZSBjcnlwdG9ncmFwaGljYWxseSBzaWduZWQsIGhvdyB0aGVcbitrZXJuZWwgdmVyaWZpZXMgdGhlbSBhdCBsb2FkIHRpbWUsIGFuZCBob3cgTGludXggU2VjdXJpdHkgTW9kdWxlcyAoTFNNcykgLVxuK2luY2x1ZGluZyB0aGUgQlBGIExTTSAtIHVzZSB0aGUgcmVzdWx0aW5nIHZlcmRpY3QgdG8gZW5mb3JjZSBwb2xpY3kuIEl0IGlzXG4rd3JpdHRlbiBmb3IgZGV2ZWxvcGVycyB3aG8gd2FudCB0byBwcm9kdWNlIHNpZ25lZCBCUEYgb2JqZWN0cywgdW5kZXJzdGFuZCB3aGF0XG4rdGhlIHNpZ25hdHVyZSBhY3R1YWxseSBndWFyYW50ZWVzLCBvciBidWlsZCBhIHBvbGljeSBvbiB0b3Agb2YgaXQuXG4rXG4rTW90aXZhdGlvblxuKz09PT09PT09PT1cbitcbitBIHNpZ25lZCBCUEYgcHJvZ3JhbSBsZXRzIHRoZSBrZXJuZWwgZXN0YWJsaXNoIHRoYXQgdGhlIGJ5dGVjb2RlIGJlaW5nIGxvYWRlZFxuK29yaWdpbmF0ZXMgZnJvbSBhIHRydXN0ZWQgcHJvZHVjZXIgYW5kIHdhcyBub3QgbW9kaWZpZWQgaW4gdHJhbnNpdC4gT24gaXRzIG93blxuK3RoZSBrZXJuZWwgZG9lcyBub3QgKnJlcXVpcmUqIHNpZ25hdHVyZXMgLSBhbiB1bnNpZ25lZCBwcm9ncmFtIGxvYWRzIGV4YWN0bHkgYXNcbitiZWZvcmUgLSBidXQgaXQgcmVjb3JkcyBhIHZlcmRpY3QgKHNlZSBgVGhlIHZlcmRpY3RgXykgdGhhdCBhbiBMU00gY2FuIGdhdGUgb24uXG4rVGhpcyBpcyB0aGUgYnVpbGRpbmcgYmxvY2sgZm9yIHBvbGljaWVzIHN1Y2ggYXMgXCJvbmx5IHJ1biBCUEYgdGhhdCB3YXMgc2lnbmVkIGJ5XG4rYSBrZXkgaW4gdGhlIHRydXN0ZWQga2V5cmluZ1wiLCBhcyBlbmZvcmNlZCBmb3IgaW5zdGFuY2UgYnkgSVBFLlxuK1xuK1NpZ25pbmcgaXMgb3J0aG9nb25hbCB0byB0aGUgZXhpc3RpbmcgcGVybWlzc2lvbiBtb2RlbDogaXQgZG9lcyBub3QgcmVwbGFjZSB0aGVcbitjYXBhYmlsaXR5IGNoZWNrcyBvciB0aGUgdmVyaWZpZXIuIEEgc2lnbmVkIGxvYWQgc3RpbGwgcmVxdWlyZXMgdGhlIHVzdWFsXG4rcHJpdmlsZWdlcyAoYGBDQVBfQlBGYGAgYW5kIGFueSBwcm9ncmFtLXR5cGUtc3BlY2lmaWMgY2FwYWJpbGl0eSwgc3ViamVjdCB0b1xuK2Bga2VybmVsLnVucHJpdmlsZWdlZF9icGZfZGlzYWJsZWRgYCksIGFuZCB0aGUgbG9hZGVyJ3MgaW5zdHJ1Y3Rpb25zIGFyZSBzdGlsbFxuK2NoZWNrZWQgYnkgdGhlIHZlcmlmaWVyIGxpa2UgYW55IG90aGVyIHByb2dyYW0uIEEgdmFsaWQgc2lnbmF0dXJlIGVzdGFibGlzaGVzXG4rKm9yaWdpbiBhbmQgaW50ZWdyaXR5Kiwgbm90IHNhZmV0eSAtIGl0IGxldHMgYSBwb2xpY3kgdHJ1c3Qgd2hlcmUgdGhlIGJ5dGVjb2RlXG4rY2FtZSBmcm9tLCBpdCBkb2VzIG5vdCBsZXQgYSBsb2FkIHNraXAgYW55IGNoZWNrIGl0IHdvdWxkIG90aGVyd2lzZSBmYWNlLlxuK1xuK1RoZSBoYXJkIHBhcnQgaXMgKndoYXQqIGdldHMgc2lnbmVkLiBBIG5haXZlIHNjaGVtZSB3b3VsZCBzaWduIGEgcHJvZ3JhbSdzXG4raW5zdHJ1Y3Rpb24gYnVmZmVyIGF0IGJ1aWxkIHRpbWUgYW5kIHZlcmlmeSB0aGF0IHNpZ25hdHVyZSBhdFxuK2BgQlBGX1BST0dfTE9BRGBgLiBUaGF0IGRvZXMgbm90IHN1cnZpdmUgY29udGFjdCB3aXRoIHJlYWwgQlBGIG9iamVjdHMsIGJlY2F1c2Vcbit0aGUgYnl0ZXMgdGhlIGtlcm5lbCBmaW5hbGx5IGxvYWRzIGFyZSBub3QgdGhlIGJ5dGVzIHRoZSBkZXZlbG9wZXIgYnVpbHQgYW5kXG4rc2lnbmVkLiBCZXR3ZWVuIHRoZSB0d28sIGxpYmJwZiBhbmQgdGhlIGtlcm5lbCByZXdyaXRlIHRoZSBwcm9ncmFtOlxuK1xuKy0gKiptYXAgZmlsZSBkZXNjcmlwdG9ycyoqIGFyZSBwYXRjaGVkIGludG8gYGBsZF9pbW02NGBgIGluc3RydWN0aW9uc1xuKyAgKGBgQlBGX1BTRVVET19NQVBfRkRgYCksIGFuZCBhIG1hcCdzIGZkIGlzIGFzc2lnbmVkIGF0IGxvYWQgdGltZSwgc28gaXRcbisgIGRpZmZlcnMgb24gZXZlcnkgcnVuO1xuKy0gKipDTy1SRSByZWxvY2F0aW9ucyoqIHJld3JpdGUgZmllbGQgb2Zmc2V0cywgc2l6ZXMgYW5kIGV4aXN0ZW5jZSBmbGFncyBhZ2FpbnN0XG4rICB0aGUgKnJ1bm5pbmcqIGtlcm5lbCdzIEJURiwgc28gdGhlIHJlc3VsdCBkaWZmZXJzIGZyb20gb25lIGtlcm5lbCB0byB0aGUgbmV4dDtcbistICoqa2Z1bmMgYW5kIGtzeW0gcmVmZXJlbmNlcyoqIGFyZSByZXNvbHZlZCB0byBpZHMvYWRkcmVzc2VzIGluIHRoZSBydW5uaW5nXG4rICBrZXJuZWw7XG4rLSAqKmdsb2JhbCBkYXRhKiogKGBgLnJvZGF0YWBgL2BgLmRhdGFgYC9gYC5ic3NgYCkgaXMgY3JlYXRlZCBhbmQgc2VlZGVkIGFzIG1hcHNcbisgIGF0IGxvYWQuXG4rXG4rU28gYSBzaWduYXR1cmUgb3ZlciB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb25zIGNhbm5vdCBtYXRjaCB0aGUgcmVsb2NhdGVkXG4raW5zdHJ1Y3Rpb25zIHRoZSB2ZXJpZmllciBlbmRzIHVwIGNoZWNraW5nLCBhbmQgdGhlIHJlbG9jYXRlZCBmb3JtIGNhbm5vdCBiZVxuK3Byb2R1Y2VkIGFoZWFkIG9mIHRpbWUgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSB0YXJnZXQga2VybmVsLiBUaGVyZSBpcyBub1xuK2ZpeGVkIGJ5dGUgc3RyaW5nIHRoYXQgaXMgYm90aCBzaWduYWJsZSBhdCBidWlsZCB0aW1lIGFuZCB3aGF0IHRoZSBrZXJuZWxcbithY3R1YWxseSBsb2FkcyAtIHdoaWNoIGlzIHdoeSBhIHByb2dyYW0gY2Fubm90IHNpbXBseSBiZSBzaWduZWQgYW5kIGxvYWRlZFxuK2RpcmVjdGx5LlxuK1xuK1RoZSB0cnVzdGVkIGxvYWRlclxuKz09PT09PT09PT09PT09PT09PVxuK1xuK1RoZSBzb2x1dGlvbiBpcyB0byBtb3ZlIHRoYXQgc2V0dXAgd29yayAqaW50byogYSBzbWFsbCBCUEYgcHJvZ3JhbSAtIHRoZVxuKyoqbG9hZGVyKiogLSBhbmQgc2lnbiB0aGUgbG9hZGVyIGluc3RlYWQgb2YgdGhlIGluZGl2aWR1YWwgcHJvZ3JhbXMuIGxpYmJwZidzXG4rYGBnZW5fbG9hZGVyYGAgbWFjaGluZXJ5IChgYGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MYGAsIHRoZSBcImxpZ2h0IHNrZWxldG9uXCIpXG4rZW1pdHMgYSBgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGBgIHByb2dyYW0gd2hvc2UgYm9keSBwZXJmb3JtcyB0aGUgYnBmKCkgc3lzY2FsbHNcbit0aGF0IGNyZWF0ZSBtYXBzLCBhcHBseSByZWxvY2F0aW9ucywgYW5kIGxvYWQgdGhlIHJlYWwgcHJvZ3JhbXMuIFRoZSBwYXlsb2FkIGl0XG4raW5zdGFsbHMgLSB0aGUgc2VyaWFsaXplZCBwcm9ncmFtcywgbWFwIGRlc2NyaXB0aW9ucywgcmVsb2NhdGlvbiBkYXRhIGFuZFxuK2luaXRpYWwgdmFsdWVzIC0gbGl2ZXMgaW4gYSBzZXBhcmF0ZSBhcnJheSBtYXAsIHRoZSAqKm1ldGFkYXRhIG1hcCoqXG4rKGBgX19sb2FkZXIubWFwYGApLlxuK1xuK1NvIHRoZSB1bml0IG9mIHRydXN0IGlzIHRoZSBsb2FkZXIsIGFuZCB0aGUgc2lnbmluZyBjb250cmFjdCBpczo6XG4rXG4rICAgIFNpZyhJX2xvYWRlciB8fCBEX21ldGEpXG4rXG4rd2hlcmUgYGBJX2xvYWRlcmBgIGlzIHRoZSBsb2FkZXIncyBpbnN0cnVjdGlvbiBzdHJlYW0gYW5kIGBgRF9tZXRhYGAgaXMgdGhlXG4rY29udGVudCBvZiB0aGUgbWV0YWRhdGEgbWFwLiBWZXJpZnlpbmcgdGhlIGxvYWRlcidzIHNpZ25hdHVyZSBlc3RhYmxpc2hlcyB0aGF0XG4rYm90aCB0aGUgbG9hZGVyICphbmQqIHRoZSBwYXlsb2FkIGl0IGlzIGFib3V0IHRvIGluc3RhbGwgYXJlIGF1dGhlbnRpYy4gVGhlXG4rbG9hZGVyIGlzIHJlcHJvZHVjaWJsZTogYGBnZW5fbG9hZGVyYGAgYnVpbGRzIGl0IGZyb20gcHJpbWl0aXZlcyBzbyB0aGUgc2FtZVxuK29iamVjdCB5aWVsZHMgdGhlIHNhbWUgYnl0ZXMgb24gYW55IGJ1aWxkIGhvc3QuXG4rXG4rV2h5IHRoZSBsb2FkZXIgaXMgc2lnbmFibGUgd2hlbiB0aGUgcHJvZ3JhbSBpcyBub3RcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuK1xuK1RoZSBsb2FkZXIgc2lkZXN0ZXBzIGV2ZXJ5IHJld3JpdGUgbGlzdGVkIGFib3ZlLCBiZWNhdXNlIHRoZSBieXRlcyB0aGF0IGFyZVxuK3NpZ25lZCBhcmUgKnJlbG9jYXRpb24taW52YXJpYW50KjpcbitcbistIFRoZSBsb2FkZXIncyBvd24gaW5zdHJ1Y3Rpb25zIGFyZSBhIGZpeGVkIHNlcXVlbmNlIG9mIGJwZigpIHN5c2NhbGxzIGVtaXR0ZWRcbisgIGJ5IGBgZ2VuX2xvYWRlcmBgOyB0aGV5IGNhcnJ5IG5vIENPLVJFIHJlbG9jYXRpb25zIGFuZCByZXNvbHZlIG5vIGtzeW1zLCBzb1xuKyAgdGhleSBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IGtlcm5lbC4gVGhlIG1ldGFkYXRhIG1hcCBpcyByZWZlcmVuY2VkIGJ5ICppbmRleCpcbisgIGludG8gYGBmZF9hcnJheWBgIChgYEJQRl9QU0VVRE9fTUFQX0lEWGBgKSwgbm90IGJ5IGEgYmFrZWQtaW4gZmlsZSBkZXNjcmlwdG9yLFxuKyAgc28gZXZlbiB0aGF0IHJlZmVyZW5jZSBkb2VzIG5vdCBjaGFuZ2UgYmV0d2VlbiBidWlsZCBhbmQgbG9hZC4gVGhlIGxvYWRlclxuKyAgaW5zdHJ1Y3Rpb24gYnl0ZXMgdGhlIGtlcm5lbCB2ZXJpZmllcyBhcmUgZXhhY3RseSB0aGUgYnl0ZXMgdGhhdCB3ZXJlIHNpZ25lZC5cbistIFRoZSBtZXRhZGF0YSBtYXAgaXMgb3BhcXVlLCBmcm96ZW4gZGF0YSAtIHRoZSBzZXJpYWxpemVkIHRhcmdldCBwcm9ncmFtcyxcbisgIHRoZWlyIHJlbG9jYXRpb24gcmVjb3JkcywgbWFwIGRlc2NyaXB0aW9ucyBhbmQgaW5pdGlhbCB2YWx1ZXMuIEl0cyBieXRlcyBhcmVcbisgIGlkZW50aWNhbCBhdCBidWlsZCB0aW1lIGFuZCBhdCBsb2FkIHRpbWUsIHNvIHRoZXkgYXJlIHNpbXBseSBhcHBlbmRlZCB0byB0aGVcbisgIGluc3RydWN0aW9ucyBhbmQgY292ZXJlZCBieSB0aGUgc2FtZSBzaWduYXR1cmUgKHRoZXJlIGlzIG5vIHNlcGFyYXRlIG1ldGFkYXRhXG4rICBoYXNoIHRvIGNvbXB1dGUgb3IgY29tcGFyZSkuXG4rXG4rQWxsIHRoZSBob3N0LXNwZWNpZmljIHJld3JpdGluZyAtIGNyZWF0aW5nIG1hcHMsIHBhdGNoaW5nIHRoZWlyIGZkcyBpbnRvIHRoZVxuK3RhcmdldCBwcm9ncmFtcywgYXBwbHlpbmcgQ08tUkUsIHJlc29sdmluZyBrc3ltcywgc2VlZGluZyBnbG9iYWwgZGF0YSAtIHN0aWxsXG4raGFwcGVucywgYnV0IGl0IGhhcHBlbnMgKmluc2lkZSB0aGUgbG9hZGVyIGF0IHJ1bnRpbWUqLCBvbiB0aGUgdmVyaWZpZWRcbittZXRhZGF0YSwgKiphZnRlcioqIHRoZSBrZXJuZWwgaGFzIHZlcmlmaWVkIHRoZSBgYGluc25zIHx8IG1ldGFkYXRhYGAgc2lnbmF0dXJlLlxuK1RoZSBrZXJuZWwgbmV2ZXIgaGFzIHRvIHZlcmlmeSB0aGUgcmVsb2NhdGVkIHRhcmdldCBwcm9ncmFtczogaXQgdmVyaWZpZXMgdGhlXG4rbG9hZGVyIGFuZCBpdHMgaW5wdXRzIG9uY2UsIGFuZCB0cnVzdCB0cmFuc2ZlcnMgdG8gd2hhdGV2ZXIgdGhhdCBub3ctdHJ1c3RlZCxcbitkZXRlcm1pbmlzdGljIGxvYWRlciBpbnN0YWxscy4gVGhlIHJlbG9jYXRpb24gc3RlcCBpcyBtb3ZlZCBmcm9tIFwiYmVmb3JlIHRoZVxuK3NpZ25hdHVyZSBjYW4gYmUgY2hlY2tlZFwiIHRvIFwiYWZ0ZXIgYSB0cnVzdGVkIHByb2dyYW0gcnVuc1wiIC0gd2hpY2ggaXMgZXhhY3RseVxuK3doYXQgbWFrZXMgaXQgc2lnbmFibGUuXG4rXG4rQmVjYXVzZSB0aGUgbWV0YWRhdGEgbWFwIGlzIHRoZSBsb2FkZXIncyBvbmx5IHVudHJ1c3RlZCBpbnB1dCwgdHdvIGV4aXN0aW5nIG1hcFxuK3Byb3BlcnRpZXMgYXJlIHJldXNlZCB0byBrZWVwIGl0IHRydXN0d29ydGh5IGFjcm9zcyB0aGUgbG9hZDpcbitcbitFeGNsdXNpdmUgbWFwc1xuKyAgICBBIG1hcCBjcmVhdGVkIHdpdGggYGBleGNsX3Byb2dfaGFzaGBgIChzZWUgYGBCUEZfTUFQX0NSRUFURWBgKSBtYXkgb25seSBiZVxuKyAgICBhY2Nlc3NlZCBieSBhIHByb2dyYW0gd2hvc2UgZGlnZXN0IG1hdGNoZXMgdGhhdCBoYXNoLiBUaGUgdmVyaWZpZXIgZW5mb3JjZXNcbisgICAgYGBtYXAtXHUwMDNlZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdGBgIGZvciBldmVyeSBtYXAgYSBwcm9ncmFtIHVzZXMsIHNvIHRoZVxuKyAgICBtZXRhZGF0YSBtYXAgaXMgYm91bmQgdG8gZXhhY3RseSB0aGUgc2lnbmVkIGxvYWRlciBhbmQgY2Fubm90IGJlIHNoYXJlZCB3aXRoXG4rICAgIG9yIG11dGF0ZWQgYnkgYW5vdGhlciBwcm9ncmFtLlxuK1xuK0Zyb3plbiBtYXBzXG4rICAgIFRoZSBtZXRhZGF0YSBtYXAgaXMgZnJvemVuIChgYEJQRl9NQVBfRlJFRVpFYGApIGJlZm9yZSB0aGUgbG9hZGVyIGlzIGxvYWRlZC5cbisgICAgRnJlZXppbmcgYmxvY2tzIGZ1cnRoZXIgdXNlcnNwYWNlIHdyaXRlcywgc28gdGhlIGJ5dGVzIGZvbGRlZCBpbnRvIHRoZVxuKyAgICBzaWduYXR1cmUgY2Fubm90IGNoYW5nZSBiZWZvcmUgdGhlIGxvYWRlciBydW5zLiAoRnJlZXppbmcgZG9lcyBub3QgbWFrZSB0aGVcbisgICAgbWFwIHJlYWQtb25seSB0byB0aGUgbG9hZGVyIHByb2dyYW0gaXRzZWxmLCB3aGljaCBzdGlsbCB3cml0ZXMgY3JlYXRlZCBmaWxlXG4rICAgIGRlc2NyaXB0b3JzIGJhY2sgaW50byB0aGUgYmxvYidzIHNjcmF0Y2ggYXJlYS4pXG4rXG4rTG9hZC10aW1lIHZlcmlmaWNhdGlvblxuKz09PT09PT09PT09PT09PT09PT09PT09XG4rXG4rUmF0aGVyIHRoYW4gaGF2ZSB0aGUgbG9hZGVyIGNoZWNrIGl0cyBvd24gbWV0YWRhdGEgZnJvbSB3aXRoaW4gQlBGLCB0aGUga2VybmVsXG4rdmVyaWZpZXMgaXQgZGlyZWN0bHkgYXQgYGBCUEZfUFJPR19MT0FEYGAsIHdpdGggbm8gbmV3IFVBUEkuIFRoZSBtZWNoYW5pc21cbityZXVzZXMgdGhlIGV4aXN0aW5nIGBgZmRfYXJyYXlgYDpcbitcbisjLiBVc2Vyc3BhY2UgY3JlYXRlcyB0aGUgbWV0YWRhdGEgbWFwIHdpdGggYGBleGNsX3Byb2dfaGFzaGBgIHNldCB0byB0aGVcbisgICBsb2FkZXIncyBkaWdlc3QsIHBvcHVsYXRlcyBpdCwgYW5kIGZyZWV6ZXMgaXQuXG4rIy4gVGhlIGxvYWRlciBpcyBsb2FkZWQgd2l0aCBgYHNpZ25hdHVyZWBgL2Bgc2lnbmF0dXJlX3NpemVgYC9gYGtleXJpbmdfaWRgYFxuKyAgIHNldCwgdGhlIG1ldGFkYXRhIG1hcCByZWZlcmVuY2VkIHRocm91Z2ggYGBmZF9hcnJheWBgLCBhbmQgYGBmZF9hcnJheV9jbnRgYFxuKyAgIHNldCBzbyB0aGUga2VybmVsIGtub3dzIHRoZSBhcnJheSdzIGxlbmd0aC5cbisjLiBTaWduYXR1cmUgdmVyaWZpY2F0aW9uIHJ1bnMgaW5zaWRlIHRoZSB2ZXJpZmllciAoYGBicGZfY2hlY2soKWBgKSwgb25jZSBpdFxuKyAgIGhhcyByZXNvbHZlZCB0aGUgYGBmZF9hcnJheWBgIGVudHJpZXMgaW50byB0aGUgcHJvZ3JhbSdzIGBgdXNlZF9tYXBzYGAuIFRoZVxuKyAgIG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlcmVmb3JlIHRoZSB2ZXJ5IG9iamVjdHMgdGhlIHByb2dyYW1cbisgICBiaW5kcyAtIGEgc2luZ2xlIHJlc29sdXRpb24gb2YgYGBmZF9hcnJheWBgLCBub3QgYSBzZXBhcmF0ZSByZWFkLCBzbyB0aGVcbisgICB2ZXJpZmllZCBieXRlcyBjYW5ub3QgYmUgc3dhcHBlZCBmb3IgYSBkaWZmZXJlbnQgbWFwIGFmdGVyIHRoZSBjaGVjayAobm9cbisgICB0aW1lLW9mLWNoZWNrL3RpbWUtb2YtdXNlIHdpbmRvdykuIEVhY2ggZm9sZGVkIG1hcCBtdXN0IGJlIGV4Y2x1c2l2ZSAoY2FycnlcbisgICBgYGV4Y2xfcHJvZ19zaGFgYCkgYW5kIGEgcGxhaW4gYXJyYXkgbWFwIChgYEJQRl9NQVBfVFlQRV9BUlJBWWBgKTsgb25seSBhblxuKyAgIGFycmF5IG1hcCBleHBvc2VzIGl0cyB2YWx1ZSBidWZmZXIgdGhyb3VnaCBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpYGAgYXMgYVxuKyAgIGtlcm5lbCBhZGRyZXNzIHNwYW5uaW5nIGBgdmFsdWVfc2l6ZWBgIGJ5dGVzLiBBIG1hcCB0aGF0IGlzIG5vdCBleGNsdXNpdmUsIG5vdFxuKyAgIGZyb3plbiwgb3Igbm90IGEgcGxhaW4gYXJyYXkgaXMgcmVqZWN0ZWQsIHdpdGggYSB2ZXJpZmllciBsb2cgbWVzc2FnZSBuYW1pbmdcbisgICB0aGUgb2ZmZW5kaW5nIG1hcC4gVGhlIGtlcm5lbCBhcHBlbmRzIGVhY2ggbWFwJ3MgZnJvemVuXG4rICAgY29udGVudHMgdG8gdGhlIGluc3RydWN0aW9uIGJ1ZmZlciBhbmQgdmVyaWZpZXMgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb3ZlciB0aGVcbisgICBjb25jYXRlbmF0aW9uIGBgaW5zbnMgfHwgbWV0YWRhdGFfMCB8fCBtZXRhZGF0YV8xIHx8IC4uLmBgIGluIGBgdXNlZF9tYXBzYGBcbisgICBvcmRlciwgYmVmb3JlIGl0IHJld3JpdGVzIHRoZSAoc2lnbmVkKSBpbnN0cnVjdGlvbnMuXG4rXG4rQSBzaWduZWQgcHJvZ3JhbSB0aGVyZWZvcmUgdGFrZXMgb25lIG9mIGV4YWN0bHkgdHdvIHNoYXBlcywgYm90aCBmdWxseVxuK3N1cHBvcnRlZDpcbitcbistICoqTm8gYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCA9PSAwYGApOiB0aGVyZSBpcyBub3RoaW5nIHRvIGFwcGVuZCwgc28gdGhlXG4rICBrZXJuZWwgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgYWxvbmUuIEEgdmFsaWQgc2lnbmF0dXJlXG4rICB5aWVsZHMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBUaGlzIGlzIHRoZSBvcmRpbmFyeSBjYXNlXG4rICBmb3IgYSBkaXJlY3RseS1sb2FkZWQgc2lnbmVkIHByb2dyYW0gd2l0aCBubyBzZXBhcmF0ZSBwYXlsb2FkOyBpdCBpcyAqbm90KlxuKyAgcmVqZWN0ZWQgZm9yIFwibWlzc2luZ1wiIG1ldGFkYXRhLCBiZWNhdXNlIGl0IGhhcyBub25lIHRvIGNvdmVyLlxuKy0gKipFeGNsdXNpdmUgYm91bmQgbWFwcyoqIChgYGZkX2FycmF5X2NudCBcdTAwM2UgMGBgKTogZXZlcnkgZW50cnkgaXMgZXhjbHVzaXZlIGFuZFxuKyAgZm9sZGVkLCBzbyB0aGUgc2lnbmF0dXJlIGNvdmVycyBgYGluc25zIHx8IG1ldGFkYXRhYGAuXG4rXG4rVGhlcmUgaXMgbm8gdGhpcmQgc2hhcGU6IGEgbm9uLWV4Y2x1c2l2ZSBtYXAgaW4gYSBzaWduZWQgcHJvZ3JhbSdzIGBgZmRfYXJyYXlgYFxuK2lzIHJlamVjdGVkIHJhdGhlciB0aGFuIHNpbGVudGx5IGxlZnQgb3V0IG9mIHRoZSBzaWduYXR1cmUsIHNvIGEgcHJvZ3JhbSBib3VuZFxuK3RvIGEgc2lnbmVkIGxvYWRlciBuZXZlciBoYXMgYSBtYXAgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3Zlci5cbitcbitUaGUgZGlnZXN0IGJpbmRpbmcgKGBgZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdGBgKSBpcyBlbmZvcmNlZCBieSB0aGVcbit2ZXJpZmllciBhcyB1c3VhbDsgYmVjYXVzZSB0aGF0IGNoZWNrIHJ1bnMgd2hpbGUgYGBmZF9hcnJheWBgIGlzIHJlc29sdmVkIC1cbitiZWZvcmUgdGhlIHZlcmlmaWVyIHdvdWxkIG90aGVyd2lzZSBjb21wdXRlIHRoZSB0YWcgLSBgYHByb2ctXHUwMDNlZGlnZXN0YGAgaXNcbitjb21wdXRlZCB1cCBmcm9udCBpbiB0aGUgdmVyaWZpZXIsIG92ZXIgdGhlIHVubW9kaWZpZWQgKHNpZ25hdHVyZS1jb3ZlcmVkKVxuK2luc3RydWN0aW9ucywgZm9yIGFueSBzaWduZWQgbG9hZC5cbitcbitDb3ZlcmFnZSBpcyB0aGVuIGVuZm9yY2VkIGFzIHRoZSB2ZXJpZmllciByZXNvbHZlcyBpbnN0cnVjdGlvbnMsIGF0IHRoZSBwb2ludFxuK2VhY2ggb2JqZWN0IGlzIGJvdW5kIHJhdGhlciB0aGFuIGJ5IGEgY291bnQgdGFrZW4gYWZ0ZXJ3YXJkcy4gT25jZSB0aGUgc2lnbmF0dXJlXG4raGFzIGJlZW4gdmVyaWZpZWQsIGJpbmRpbmcgYW55IGZ1cnRoZXIgbWFwIGlzIHJlZnVzZWQ6IGEgbWFwIHJlYWNoZWQgYnkgYVxuK2RpcmVjdGx5LXJlZmVyZW5jZWQgZmQsIG9yIGEgbWFwIHN3YXBwZWQgaW50byBhbiBgYGZkX2FycmF5YGAgc2xvdCB0aGUgbG9hZGVyXG4rcmVhZHMsIGlzIG5vdCBhbW9uZyB0aG9zZSBhbHJlYWR5IGZvbGRlZCwgc28gaXQgaXMgcmVqZWN0ZWQgdGhlIG1vbWVudCB0aGVcbit2ZXJpZmllciB0cmllcyB0byBiaW5kIGl0LiBBIEJURiBpcyByZWZ1c2VkIG91dHJpZ2h0IGZvciBhIHNpZ25lZCBwcm9ncmFtIC0gYVxuK2tzeW0gb3IgYSBCVEYgZmQgaW4gYGBmZF9hcnJheWBgLCB3aGV0aGVyIHJlc29sdmVkIHVwIGZyb250IG9yIGxhemlseSBmb3IgYVxuK21vZHVsZSBrZnVuYywgaXMgcmVqZWN0ZWQgd2hlbiBpdCB3b3VsZCBiZSBib3VuZC4gVG9nZXRoZXIgd2l0aCB0aGUgZm9sZCBydWxlXG4rYWJvdmUgdGhpcyBrZWVwcyB0aGUgdmVyZGljdCBiaW5hcnk6IGEgc2lnbmVkIHByb2dyYW0gY2Fubm90IHVzZSBhIG1hcCBpdHNcbitzaWduYXR1cmUgZG9lcyBub3QgY292ZXIsIGFuZCBhIGRpZmZlcmVudCBidXQgZXF1YWxseSBkaWdlc3QtYm91bmQgbWFwIGNhbm5vdCBiZVxuK3N1YnN0aXR1dGVkIGF0IGFuIGBgZmRfYXJyYXlgYCBzbG90LiBOb24tZXhjbHVzaXZlIG1hcHMgYXJlIG5ldmVyIGZvbGRlZCwgc28gYVxuK3NpZ25lZCBwcm9ncmFtIGNhbm5vdCB1c2Ugb25lIGF0IGFsbC5cbitcbitUaGUgdmVyZGljdFxuKz09PT09PT09PT09XG4rXG4rQSBwcm9ncmFtIGlzIGVpdGhlciB1bnNpZ25lZCBvciBmdWxseSB2ZXJpZmllZCAtIHRoZXJlIGlzIG5vIGludGVybWVkaWF0ZVxuK3N0YXRlLiBUaGUgb3V0Y29tZSBpcyByZWNvcmRlZCBpbiBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0YGA6XG4rXG4rLi4gY29kZS1ibG9jazo6IGNcbitcbisgICAgZW51bSBicGZfc2lnX3ZlcmRpY3Qge1xuKyAgICAgICAgICAgIEJQRl9TSUdfVU5TSUdORUQgPSAwLFxuKyAgICAgICAgICAgIEJQRl9TSUdfVkVSSUZJRUQsXG4rICAgIH07XG4rXG4rYGBCUEZfU0lHX1ZFUklGSUVEYGAgbWVhbnMgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCBhbmQgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnNcbisqYW5kKiB0aGUgZnJvemVuIGNvbnRlbnRzIG9mIGV2ZXJ5IGV4Y2x1c2l2ZSBtYXAgdGhlIHByb2dyYW0gdXNlczpcbitcbistIEZvciBhbiBvcmRpbmFyeSwgZGlyZWN0bHktbG9hZGVkIHNpZ25lZCBwcm9ncmFtIHRoZSBpbnN0cnVjdGlvbnMgYXJlIHRoZSB3aG9sZVxuKyAgYXJ0aWZhY3QgYW5kIGl0IHVzZXMgbm8gZXhjbHVzaXZlIG1hcHMsIHNvIGEgdmFsaWQgaW5zdHJ1Y3Rpb24gc2lnbmF0dXJlIGlzXG4rICB0aGUgY29tcGxldGUgdmVyaWZpY2F0aW9uLlxuKy0gRm9yIGEgc2lnbmVkIGxvYWRlciB0aGUgbWV0YWRhdGEgbWFwIGlzIGV4Y2x1c2l2ZSwgc28gaXRzIGNvbnRlbnRzIGFyZSBmb2xkZWRcbisgIGluIGFuZCB0aGUgc2lnbmF0dXJlIGNvdmVycyBgYGluc25zIHx8IG1ldGFkYXRhYGAuXG4rXG4rVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIFwiaW5zdHJ1Y3Rpb25zIHZlcmlmaWVkIGJ1dCBtZXRhZGF0YSBub3RcIiB2ZXJkaWN0OiBhXG4rc2lnbmVkIGxvYWRlciB0aGF0IGZhaWxzIHRvIGNvdmVyIGl0cyBtZXRhZGF0YSBpcyAqcmVqZWN0ZWQqIChzZWUgYWJvdmUpLCBub3RcbityZWNvcmRlZCB3aXRoIGEgd2Vha2VyIHZlcmRpY3QuIGBgQlBGX1NJR19WRVJJRklFRGBgIHRoZXJlZm9yZSBhbHdheXMgbWVhbnMgdGhlXG4rcHJvZ3JhbSBhbmQgZXZlcnl0aGluZyB0aGUgc2lnbmF0dXJlIGlzIHJlc3BvbnNpYmxlIGZvciBhcmUgYXV0aGVudGljLCB3aGljaCBpc1xuK3doYXQgYSBwb2xpY3kgY2FuIHJlbHkgb24uXG4rXG4rQWxvbmdzaWRlIHRoZSB2ZXJkaWN0IHRoZSBrZXJuZWwgcmVjb3JkcyB3aGljaCBrZXlyaW5nIHZhbGlkYXRlZCB0aGUgc2lnbmF0dXJlO1xuK3NlZSBgS2V5cmluZ3NgXy5cbitcbitFbmZvcmNlbWVudCB2aWEgTFNNc1xuKz09PT09PT09PT09PT09PT09PT09XG4rXG4rU2lnbmluZyBvbmx5ICpyZWNvcmRzKiBhIHZlcmRpY3Q7IGFuIExTTSB0dXJucyBpdCBpbnRvIHBvbGljeS4gVGhlIHZlcmRpY3QgYW5kXG4ra2V5cmluZyBmaWVsZHMgbGl2ZSBpbiBgYHN0cnVjdCBicGZfcHJvZ19hdXhgYCwgc28gYSBCUEYgTFNNIHByb2dyYW0gY2FuIHJlYWRcbit0aGVtIGRpcmVjdGx5IChzZWUgRG9jdW1lbnRhdGlvbi9icGYvcHJvZ19sc20ucnN0IGZvciB3cml0aW5nIGFuZCBhdHRhY2hpbmcgQlBGXG4rTFNNIHByb2dyYW1zKTsgdGhlIHNhbWUgZmllbGRzIGFyZSBlcXVhbGx5IGF2YWlsYWJsZSB0byBpbi10cmVlIExTTXMgc3VjaCBhc1xuK0lQRS4gVHdvIGhvb2tzIGFyZSB1c2VmdWwgYXQgZGlmZmVyZW50IHBvaW50cyBvZiB0aGUgbG9hZDogdGhlIGRlZGljYXRlZFxuK2Bgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGAgZ2F0ZXMgYWRtaXNzaW9uIGJlZm9yZSB0aGUgbWFpbiB2ZXJpZmljYXRpb24gd29yayxcbithbmQgdGhlIGV4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIG9ic2VydmVzIGEgcHJvZ3JhbSB0aGF0IGhhcyBmdWxseVxuK2xvYWRlZC5cbitcbitBZG1pc3Npb246IGBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZCgpYGBcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbitcbitUaGlzIGhvb2sgZ2F0ZXMgYWRtaXNzaW9uICoqZm9yIGV2ZXJ5IGxvYWQqKiwgZnJvbSBhIHNpbmdsZSBjYWxsIHNpdGUgaW5zaWRlIHRoZVxuK3ZlcmlmaWVyIChgYGJwZl9jaGVjaygpYGApLCBiZWZvcmUgdGhlIG1haW4gdmVyaWZpY2F0aW9uIHdvcmsuIEl0IHJ1bnMgYWZ0ZXIgdGhlXG4rb3B0aW9uYWwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgc28gdGhlIHZlcmRpY3QgYW5kIGtleXJpbmcgZmllbGRzIGFyZSBmaW5hbCAtIHRoZVxuK2hvb2sgY2FuIHNlZSB3aGV0aGVyLCBhbmQgaG93IHN0cm9uZ2x5LCB0aGUgcHJvZ3JhbSB3YXMgc2lnbmVkLCB3aGljaCBrZXlyaW5nXG4rdmFsaWRhdGVkIGl0LCB0aGUgbG9hZCBgYGF0dHJgYCwgdGhlIEJQRiB0b2tlbiBhbmQgd2hldGhlciB0aGUgbG9hZCBjYW1lIGZyb20gdGhlXG4ra2VybmVsLiBGb3IgYSBzaWduZWQgbG9hZCB0aGUgdmVyZGljdCBpcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBoZXJlICh0aGUgc2lnbmF0dXJlXG4raGFzIGp1c3QgYmVlbiBjaGVja2VkKTsgZm9yIGFuIHVuc2lnbmVkIGxvYWQgaXQgaXMgYGBCUEZfU0lHX1VOU0lHTkVEYGAuXG4rXG4rVGhpcyBpcyB0aGUgcGxhY2UgZm9yICpjb2Fyc2UgYWRtaXNzaW9uKiB0aGF0IG11c3QgYWxzbyBzZWUgdW5zaWduZWQgYW5kXG4rbm90LXlldC12ZXJpZmllZCBsb2FkczogcmVxdWlyZSBhIHNpZ25hdHVyZSBhdCBhbGwsIHJlc3RyaWN0IHRoZSBhY2NlcHRhYmxlXG4ra2V5cmluZywgcmVzdHJpY3Qgd2hpY2ggdG9rZW4vY3JlZGVudGlhbHMgbWF5IGxvYWQgQlBGLCBhcHBseSBwZXItcHJvZ3JhbS10eXBlXG4rcnVsZXMsIG9yIGF1ZGl0IGV2ZXJ5IGF0dGVtcHQuIEl0IGlzIHRoZSBwcmltYXJ5IGRlbnkgcG9pbnQuXG4rXG4rT25lIHN1YnRsZXR5OiB0aGlzIGhvb2sgcnVucyAqYmVmb3JlKiB0aGUgdmVyaWZpZXIgZmluaXNoZXMgaXRzIHdvcmssIHNvXG4rYGBCUEZfU0lHX1ZFUklGSUVEYGAgKmhlcmUqIG1lYW5zIG9ubHkgXCJ2YWxpZGx5IHNpZ25lZFwiIC0gbm90IFwibG9hZGVkXCIuIEFsbG93aW5nXG4rYSBsb2FkIGF0IHRoaXMgcG9pbnQgbGV0cyBpdCAqcHJvY2VlZCo7IGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgcHJvZ3JhbSB3aWxsXG4rbG9hZC4gQSB2YWxpZGx5IHNpZ25lZCBwcm9ncmFtIGNhbiBzdGlsbCBiZSByZWplY3RlZCBhZnRlcndhcmRzIG9uIHR3b1xuK2luZGVwZW5kZW50IGdyb3VuZHM6IHRoZSB2ZXJpZmllciBtYXkgcmVqZWN0IGl0IGxpa2UgYW55IG90aGVyIHByb2dyYW0gKHVuc2FmZVxuK21lbW9yeSBhY2Nlc3MsIGJhZCBjb250cm9sIGZsb3csIHJlc291cmNlIGxpbWl0cywgLi4uKSwgYW5kIHRoZSBrZXJuZWwgc2VwYXJhdGVseVxuK3JlZnVzZXMgLSBhcyB0aGUgdmVyaWZpZXIgcmVzb2x2ZXMgaW5zdHJ1Y3Rpb25zIGFuZCBiaW5kcyBlYWNoIG9iamVjdCAtIGFueSBtYXBcbit0aGUgc2lnbmF0dXJlIGRvZXMgbm90IGNvdmVyIG9yIGFueSBCVEYgYXQgYWxsLCByZWdhcmRsZXNzIG9mIHdoYXQgdGhpcyBob29rXG4rcmV0dXJuZWQuIE9ubHkgYWZ0ZXIgdGhlIHByb2dyYW0gaGFzIGZ1bGx5IGxvYWRlZCwgYXQgdGhlIG5leHQgaG9va1xuKyhgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCksIGRvZXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgY2FycnkgaXRzIGZ1bGwgbWVhbmluZzpcbit2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC5cbitcbitBIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiBcImlzIGl0IHNpZ25lZCBhdCBhbGxcIjogYWNjZXB0IHByb2dyYW1zXG4rc2lnbmVkIGJ5IGEgc3lzdGVtIGtleXJpbmcsIGFjY2VwdCBhIHVzZXIta2V5cmluZyBzaWduYXR1cmUgb25seSBpZiB0aGVcbitrZXkva2V5cmluZyBpdCB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGFcbit0YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmVcbithdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKVxuK1xuKy4uIGNvZGUtYmxvY2s6OiBjXG4rXG4rICAgIC8qIFNlcmlhbHMgb2YgdXNlciBrZXlzL2tleXJpbmdzIHdlIGFkZGl0aW9uYWxseSB0cnVzdC4gKi9cbisgICAgc3RydWN0IHtcbisgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpO1xuKyAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi9cbisgICAgICAgICAgICBfX3R5cGUodmFsdWUsIF9fdTgpO1xuKyAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNjQpO1xuKyAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQyhcIi5tYXBzXCIpO1xuK1xuKyAgICAvKiBBdWRpdCBzdHJlYW0gY29uc3VtZWQgYnkgYSB1c2Vyc3BhY2UgbG9nZ2VyLiAqL1xuKyAgICBzdHJ1Y3Qge1xuKyAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCAxIFx1MDAzY1x1MDAzYyAxNik7XG4rICAgIH0gYXVkaXQgU0VDKFwiLm1hcHNcIik7XG4rXG4rICAgIHN0cnVjdCBkZWNpc2lvbiB7IF9fdTMyIHByb2dfdHlwZSwgdmVyZGljdCwga3R5cGU7IF9fczMyIHNlcmlhbCwgcmV0OyB9O1xuK1xuKyAgICBTRUMoXCJsc20vYnBmX3Byb2dfbG9hZFwiKVxuKyAgICBpbnQgQlBGX1BST0coYWRtaXQsIHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIsXG4rICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnBmX3Rva2VuICp0b2tlbiwgYm9vbCBrZXJuZWwpXG4rICAgIHtcbisgICAgICAgICAgICBfX3UzMiB2ZXJkaWN0ID0gcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3Q7XG4rICAgICAgICAgICAgX191MzIga3R5cGUgICA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGU7XG4rICAgICAgICAgICAgX19zMzIgc2VyaWFsICA9IHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbDtcbisgICAgICAgICAgICBzdHJ1Y3QgZGVjaXNpb24gKmQ7XG4rICAgICAgICAgICAgaW50IHJldCA9IDA7XG4rXG4rICAgICAgICAgICAgaWYgKGtlcm5lbClcbisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXG4rXG4rICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRClcbisgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyogbXVzdCBiZSB2YWxpZGx5IHNpZ25lZCAqL1xuKyAgICAgICAgICAgIGVsc2UgaWYgKGt0eXBlID09IEJQRl9TSUdfS0VZUklOR19VU0VSIFx1MDAyNlx1MDAyNlxuKyAgICAgICAgICAgICAgICAgICAgICFicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNnRydXN0ZWRfdXNlcl9rZXlzLCBcdTAwMjZzZXJpYWwpKVxuKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi9cbitcbisgICAgICAgICAgICBkID0gYnBmX3JpbmdidWZfcmVzZXJ2ZShcdTAwMjZhdWRpdCwgc2l6ZW9mKCpkKSwgMCk7XG4rICAgICAgICAgICAgaWYgKGQpIHtcbisgICAgICAgICAgICAgICAgICAgIGQtXHUwMDNlcHJvZ190eXBlID0gYXR0ci1cdTAwM2Vwcm9nX3R5cGU7XG4rICAgICAgICAgICAgICAgICAgICBkLVx1MDAzZXZlcmRpY3QgPSB2ZXJkaWN0O1xuKyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2VrdHlwZSA9IGt0eXBlO1xuKyAgICAgICAgICAgICAgICAgICAgZC1cdTAwM2VzZXJpYWwgPSBzZXJpYWw7XG4rICAgICAgICAgICAgICAgICAgICBkLVx1MDAzZXJldCA9IHJldDtcbisgICAgICAgICAgICAgICAgICAgIGJwZl9yaW5nYnVmX3N1Ym1pdChkLCAwKTsgICAgICAgLyogcmVjb3JkIGFsbG93ICphbmQqIGRlbnkgKi9cbisgICAgICAgICAgICB9XG4rICAgICAgICAgICAgcmV0dXJuIHJldDtcbisgICAgfVxuK1xuK09ic2VydmluZyBhIHZlcmlmaWVkIGxvYWQ6IGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbitcbitUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2VwYXJhdGUgXCJtZXRhZGF0YSBhdHRlc3RlZFwiIGhvb2suIFRoZSBjb3ZlcmFnZSBjaGVja1xuK2Fib3ZlIGlzIGVuZm9yY2VkIGJ5IHRoZSBrZXJuZWwgdW5jb25kaXRpb25hbGx5LCBzbyBhIHNpZ25lZCBsb2FkZXIgdGhhdCBmYWlsc1xuK3RvIGNvdmVyIGl0cyBtZXRhZGF0YSBuZXZlciBsb2FkcyBhbmQgYW4gTFNNIG5ldmVyIGhhcyB0byByZS1lc3RhYmxpc2ggdGhhdFxuK2ZhY3QuIFRvICphY3Qgb24qIGEgcHJvZ3JhbSB0aGF0IGhhcyBzdWNjZXNzZnVsbHkgYW5kIGZ1bGx5IGxvYWRlZCwgdXNlIHRoZVxuK2V4aXN0aW5nIGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgIGhvb2sgKGBgbHNtL2JwZl9wcm9nYGApLCB3aGljaCBmaXJlcyBmcm9tXG4rYGBicGZfcHJvZ19uZXdfZmQoKWBgIC0gYWZ0ZXIgdGhlIHZlcmlmaWVyLCBhZnRlciB0aGUgY292ZXJhZ2UgY2hlY2ssIGFuZCBhZnRlclxuK2BgYnBmX3Byb2dfYWxsb2NfaWQoKWBgLiBSZWxhdGl2ZSB0byB0aGUgYWRtaXNzaW9uIGhvb2sgdGhpcyBwb2ludCBpcyBzdHJpY3RseVxuK2xhdGVyIGFuZCBzdHJvbmdlcjpcbitcbistIHRoZSBwcm9ncmFtIGhhcyBhbiBpZCAoYGBwcm9nLVx1MDAzZWF1eC1cdTAwM2VpZGBgKSwgc28gaXQgY2FuIGJlIHJlY29yZGVkIG9yIGNvcnJlbGF0ZWRcbisgIHdpdGggbGF0ZXIgZXZlbnRzO1xuKy0gYGB2ZXJkaWN0ID09IEJQRl9TSUdfVkVSSUZJRURgYCAqaGVyZSogbWVhbnMgKipmdWxseSoqIHZlcmlmaWVkIC0gYSBwcm9ncmFtXG4rICB0aGF0IHVzZWQgYSBtYXAgdGhlIHNpZ25hdHVyZSBkb2VzIG5vdCBjb3ZlciB3YXMgYWxyZWFkeSByZWplY3RlZCwgc28gaXQgY2Fubm90XG4rICByZWFjaCB0aGlzIHBvaW50O1xuKy0gaXQgb2JzZXJ2ZXMgb25seSBwcm9ncmFtcyB0aGF0IGFjdHVhbGx5IGxvYWRlZDsgYSBmYWlsZWQgbG9hZCBuZXZlciBtaW50cyBhblxuKyAgZmQsIHNvIGl0IG5ldmVyIHJlYWNoZXMgdGhpcyBob29rLlxuK1xuK0l0IHRha2VzIG9ubHkgdGhlIGBgcHJvZ2BgIGFuZCBhIG5vbi16ZXJvIHJldHVybiBzdGlsbCBhYm9ydHMgKHRoZSBmZCBpcyBub3RcbitoYW5kZWQgb3V0KSwgc28gaXQgY2FuIHZldG8gYXMgd2VsbCBhcyBvYnNlcnZlLiBPbmUgd3JpbmtsZTogaXQgYWxzbyBmaXJlcyBvblxuK290aGVyIHBhdGhzIHRoYXQgbWludCBhIG5ldyBwcm9ncmFtIGZkIC0gbm90YWJseSBgYGJwZl9wcm9nX2dldF9mZF9ieV9pZCgpYGAgLVxuK25vdCBqdXN0IG9uIGEgZnJlc2ggbG9hZC4gQmVjYXVzZSB0aGUgcHJvZ3JhbSBhbHJlYWR5IGhhcyBpdHMgaWQgaGVyZSwgYW4gTFNNXG4rY2FuIHRlbGwgdGhlIHR3byBhcGFydCB3aXRoIGEgc21hbGwgaGFzaCBtYXA6IHRoZSAqZmlyc3QqIHRpbWUgYW4gaWQgaXMgc2VlbiBpc1xuK3RoZSBsb2FkOyBhIGxhdGVyIHNpZ2h0aW5nIG9mIHRoZSBzYW1lIGlkIGlzIGp1c3QgYW5vdGhlciBmZCB0byBhIHByb2dyYW0gdGhhdFxuK2FscmVhZHkgZXhpc3RzLlxuK1xuK1RvIGJvdW5kIHRoZSBtYXAgYW5kIGxldCBhIHJldXNlZCBpZCByZWFkIGFzIGEgZnJlc2ggbG9hZCwgdGhpcyBjYW4gYmUgcGFpcmVkXG4rd2l0aCBgYHNlY3VyaXR5X2JwZl9wcm9nX2ZyZWUoKWBgIChgYGxzbS9icGZfcHJvZ19mcmVlYGApLCB3aGljaCBkZWxldGVzIHRoZVxuK2VudHJ5IG9uIHRlYXJkb3duIC0ga2V5ZWQgYnkgdGhlIHNhbWUgYGBwcm9nYGAgcG9pbnRlciwgc2luY2VcbitgYGJwZl9wcm9nX2ZyZWVfaWQoKWBgIGhhcyBhbHJlYWR5IGNsZWFyZWQgYGBwcm9nLVx1MDAzZWF1eC1cdTAwM2VpZGBgIHRvIGBgMGBgIGJ5IHRoZSB0aW1lXG4rdGhhdCBob29rIHJ1bnMuIChJbGx1c3RyYXRpdmUgLSBwcml2aWxlZ2VkIExTTSwgZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbitcbisuLiBjb2RlLWJsb2NrOjogY1xuK1xuKyAgICBzdHJ1Y3QgcmVjIHsgX191MzIgaWQsIGt0eXBlOyBfX3MzMiBzZXJpYWw7IH07XG4rXG4rICAgIHN0cnVjdCB7XG4rICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcbisgICAgICAgICAgICBfX3R5cGUoa2V5LCBfX3U2NCk7ICAgICAgICAgICAgIC8qIHN0cnVjdCBicGZfcHJvZyAqIC0tIHN0YWJsZSBpZCAqL1xuKyAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgc3RydWN0IHJlYyk7XG4rICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA0MDk2KTtcbisgICAgfSBsaXZlIFNFQyhcIi5tYXBzXCIpO1xuK1xuKyAgICBTRUMoXCJsc20vYnBmX3Byb2dcIikgICAgICAgICAgICAvKiBmaXJlcyBhZnRlciBsb2FkIGFuZCBvbiBldmVyeSBsYXRlciBmZCAqL1xuKyAgICBpbnQgQlBGX1BST0cob2JzZXJ2ZSwgc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuKyAgICB7XG4rICAgICAgICAgICAgX191NjQga2V5ID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXByb2c7XG4rICAgICAgICAgICAgc3RydWN0IHJlYyByO1xuK1xuKyAgICAgICAgICAgIGlmIChwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKVxuKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4rICAgICAgICAgICAgaWYgKGJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2bGl2ZSwgXHUwMDI2a2V5KSlcbisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgIC8qIHNlZW4gYmVmb3JlOiBhIGxhdGVyIGZkLCBub3QgYSBsb2FkICovXG4rXG4rICAgICAgICAgICAgLyogRmlyc3Qgc2lnaHRpbmcgPT0gdGhpcyBwcm9ncmFtIGp1c3QgbG9hZGVkOyBpZCBpcyB2YWxpZCBoZXJlLiAqL1xuKyAgICAgICAgICAgIHIuaWQgICAgID0gcHJvZy1cdTAwM2VhdXgtXHUwMDNlaWQ7XG4rICAgICAgICAgICAgci5rdHlwZSAgPSBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcua2V5cmluZ190eXBlO1xuKyAgICAgICAgICAgIHIuc2VyaWFsID0gcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsO1xuKyAgICAgICAgICAgIGJwZl9tYXBfdXBkYXRlX2VsZW0oXHUwMDI2bGl2ZSwgXHUwMDI2a2V5LCBcdTAwMjZyLCBCUEZfTk9FWElTVCk7XG4rICAgICAgICAgICAgLyogLi4uIG5ld2x5LWxvYWRlZCB2ZXJpZmllZC1wcm9ncmFtIGFjdGlvbiwgZS5nLiByZWNvcmQgci5pZCAuLi4gKi9cbisgICAgICAgICAgICByZXR1cm4gMDtcbisgICAgfVxuK1xuK1B1dHRpbmcgdGhlbSB0b2dldGhlcjogdG8gKnJlcXVpcmUqIHZlcmlmaWVkIEJQRiwgZGVueSBhdCB0aGUgYWRtaXNzaW9uIGhvb2tcbit1bmxlc3MgdGhlIHZlcmRpY3QgaXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgKGFuZCwgaWYgZGVzaXJlZCwgcmVzdHJpY3QgdGhlXG4ra2V5cmluZykuIFRoZSBrZXJuZWwgdGhlbiBndWFyYW50ZWVzIHRoYXQgYW55IHByb2dyYW0gd2hpY2ggYWN0dWFsbHkgbG9hZHMgd2l0aFxuK3RoYXQgdmVyZGljdCBjb3ZlcmVkIGFsbCBvZiBpdHMgZXhjbHVzaXZlIG1hcHMsIHJlamVjdGluZyBhbnkgdGhhdCBkaWQgbm90IC0gc29cbithIGRlbnktYnktZGVmYXVsdCBhZG1pc3Npb24gcG9saWN5IG5lZWRzIG5vIHNlY29uZCBlbmZvcmNlbWVudCBwb2ludC4gVXNlXG4rYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxuK3RoZXkgY2FycnkgYW4gaWQuIFRoZSBgYHZlcmRpY3RgYCwgYGBrZXlyaW5nX3R5cGVgYCBhbmQgYGBrZXlyaW5nX3NlcmlhbGBgIGZpZWxkc1xuK2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCwgZm9yIGV4YW1wbGUsIFwidmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5XCJcbitmcm9tIFwidmVyaWZpZWQgYnkgYSB1c2VyIGtleVwiLiBQb2xpY3kgTFNNcyBzdWNoIGFzIElQRSBjb25zdW1lIHRoZSBzYW1lIGhvb2tzIHRvXG4rZW5mb3JjZSBzeXN0ZW0gcG9saWN5IHdpdGhvdXQgd3JpdGluZyBhbnkgQlBGLlxuK1xuK0tleXJpbmdzXG4rPT09PT09PT1cbitcbitgYGtleXJpbmdfaWRgYCBzZWxlY3RzIHRoZSB0cnVzdGVkIGtleXJpbmcgdGhlIFBLQ1MjNyBzaWduYXR1cmUgaXMgdmVyaWZpZWRcbithZ2FpbnN0LiBUaGUgd2VsbC1rbm93biBpZHMgYGAwYGAgKGJ1aWx0aW4pLCBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYFxuK2FuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XG4rYW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgdGhlIHNlcmlhbCBvZiBhIHVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZy5cbitUaGUga2V5cmluZyBpcyBsb29rZWQgdXAgZmlyc3QsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGJ5dGVzIGFyZSBleGFtaW5lZCwgc28gYVxuK3NpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXG4rdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIHNvIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoIGFcbitzaWduYXR1cmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxuK1xuK1R3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxuK1xuK2Bga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbisgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6XG4rICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW1cbisgICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbisgICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLlxuK1xuK2Bga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbisgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlXG4rICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZVxuKyAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcbisgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZ1xuKyAgICBgYEtFWV9TUEVDX1NFU1NJT05fS0VZUklOR2BgLCBmb3IgZXhhbXBsZSwgcmVjb3JkcyB0aGUgc2Vzc2lvbiBrZXlyaW5nJ3NcbisgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kIGV4cG9zZSBubyBzZXJpYWxcbisgICAgaGVyZSwgc28gdGhlIHNlcmlhbCBpcyBgYDBgYCBmb3IgYnVpbHRpbiwgc2Vjb25kYXJ5IGFuZCBwbGF0Zm9ybVxuKyAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVyb1xuKyAgICBgYGtleXJpbmdfc2VyaWFsYGAgaXMgZXhhY3RseSBcInZlcmlmaWVkIGFnYWluc3QgdGhlIHVzZXIga2V5L2tleXJpbmcgd2l0aFxuKyAgICB0aGlzIHNlcmlhbFwiLlxuK1xuKy4uIGxpc3QtdGFibGU6OlxuKyAgIDpoZWFkZXItcm93czogMVxuK1xuKyAgICogLSBgYGtleXJpbmdfaWRgYFxuKyAgICAgLSBgYGtleXJpbmdfdHlwZWBgXG4rICAgICAtIGBga2V5cmluZ19zZXJpYWxgYFxuKyAgICogLSAobm8gc2lnbmF0dXJlKVxuKyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19OT05FYGBcbisgICAgIC0gYGAwYGBcbisgICAqIC0gYGAwYGBcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTmBgXG4rICAgICAtIGBgMGBgXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWWBgXG4rICAgICAtIGBgMGBgXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYFxuKyAgICAgLSBgYDBgYFxuKyAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfVVNFUmBgXG4rICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmdcbitcbitQcm9kdWNpbmcgYSBzaWduZWQgb2JqZWN0XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT1cbitcbitgYGJwZnRvb2xgYCBnZW5lcmF0ZXMgYW5kIHNpZ25zIGEgbGlnaHQgc2tlbGV0b24gaW4gb25lIHN0ZXA6OlxuK1xuKyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBcdTAwM2Nwcml2YXRlX2tleS5wZW1cdTAwM2UgLWkgXHUwMDNjY2VydGlmaWNhdGUueDUwOVx1MDAzZSBcXFxuKyAgICAgICAgICAgIG9iai5icGYubyBcdTAwM2Ugb2JqLmxza2VsLmhcbitcbitgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlc1xuK3NpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS5cbitgYGJwZnRvb2xgYCBzaWducyBgYGluc25zIHx8IG1ldGFkYXRhYGAgLSB0aGUgZXhhY3QgYnl0ZXMgdGhlIGtlcm5lbFxuK3JlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXJcbitpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSxcbitjZXJ0aWZpY2F0ZSBhbmQgaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IGxvYWRpbmcgdGhlIHNrZWxldG9uXG4rcGVyZm9ybXMgdGhlIGNyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXG4rXG4rQXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvclxuK2V4YW1wbGUgYWRkZWQgdG8gdGhlIHNlc3Npb24ga2V5cmluZywgb3IgYnVpbHQgaW50byB0aGUga2VybmVsJ3MgYnVpbHRpbiB0cnVzdGVkXG4ra2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLlxuK1xuK1VBUEkgcmVmZXJlbmNlXG4rPT09PT09PT09PT09PT1cbitcbitgYEJQRl9QUk9HX0xPQURgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcbitcbitgYHNpZ25hdHVyZWBgLCBgYHNpZ25hdHVyZV9zaXplYGBcbisgICAgUG9pbnRlciB0byBhbmQgbGVuZ3RoIG9mIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IuXG4rXG4rYGBrZXlyaW5nX2lkYGBcbisgICAgVHJ1c3RlZCBrZXlyaW5nIHNlbGVjdG9yIChzZWUgYEtleXJpbmdzYF8pLlxuK1xuK2BgZmRfYXJyYXlgYCwgYGBmZF9hcnJheV9jbnRgYFxuKyAgICBBcnJheSBvZiBtYXAgZmlsZSBkZXNjcmlwdG9ycyBib3VuZCB0byB0aGUgcHJvZ3JhbS4gYGBmZF9hcnJheV9jbnRgYCBtdXN0IGJlXG4rICAgIHNldCBmb3IgdGhlIGtlcm5lbCB0byBzY2FuIHRoZSBhcnJheS4gV2hlbiBhIHNpZ25hdHVyZSBpcyBwcmVzZW50LCBldmVyeSBtYXBcbisgICAgaW4gdGhlIGFycmF5IG11c3QgYmUgZXhjbHVzaXZlOyBpdHMgZnJvemVuIGNvbnRlbnRzIGFyZSBmb2xkZWQgaW50byB0aGVcbisgICAgdmVyaWZpZWQgYnVmZmVyLCBhbmQgYSBub24tZXhjbHVzaXZlIGVudHJ5IGlzIHJlamVjdGVkLlxuK1xuK2BgQlBGX01BUF9DUkVBVEVgYCAoYGB1bmlvbiBicGZfYXR0cmBgKTpcbitcbitgYGV4Y2xfcHJvZ19oYXNoYGAsIGBgZXhjbF9wcm9nX2hhc2hfc2l6ZWBgXG4rICAgIFNIQS0yNTYgZGlnZXN0IG9mIHRoZSBwcm9ncmFtIHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyAoZXhjbHVzaXZlKSBtYXAuIFRoaXNcbisgICAgYmluZHMgdGhlIG1ldGFkYXRhIG1hcCB0byB0aGUgbG9hZGVyOyBpdCBpcyBub3QgYSBoYXNoIG9mIHRoZSBtYXAgKmNvbnRlbnQqLlxuKyAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLFxuKyAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXG4rXG4rTm90ZXMgYW5kIGxpbWl0YXRpb25zXG4rPT09PT09PT09PT09PT09PT09PT09PVxuK1xuKy0gVGhlIGluc3RydWN0aW9ucyBwbHVzIGZvbGRlZCBtZXRhZGF0YSBhcmUgdmVyaWZpZWQgYXMgb25lIGBgYnBmX2R5bnB0cmBgLFxuKyAgd2hpY2ggYm91bmRzIHRoZSBjb21iaW5lZCBzaXplIChjdXJyZW50bHkgfjE2IE1pQik7IHZlcnkgbGFyZ2Ugb2JqZWN0cyBjYW5cbisgIGV4Y2VlZCBpdC5cbistIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2hcbisgIGBgbWFwX2RpcmVjdF92YWx1ZV9hZGRyYGAuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaCBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbmluZGV4IDc2YjhiNzYyN2ExMDg1Li45NjFlZmI5MDMxNDFjYyAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmX3ZlcmlmaWVyLmhcbkBAIC04OTgsNiArODk4LDE0IEBAIHN0cnVjdCBicGZfc2NjX2luZm8ge1xuIFxuIHN0cnVjdCBicGZfbGl2ZW5lc3M7XG4gXG4rc3RydWN0IGJwZl9mZF9hcnJheSB7XG4rXHR1bmlvbiB7XG4rXHRcdHN0cnVjdCBicGZfbWFwICptYXA7XG4rXHRcdHN0cnVjdCBidGYgKmJ0ZjtcbitcdFx0dW5zaWduZWQgbG9uZyB2YWw7XG4rXHR9O1xuK307XG4rXG4gLyogc2luZ2xlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHNcbiAgKiBvbmUgdmVyaWZpZXJfZW52IHBlciBicGZfY2hlY2soKSBjYWxsXG4gICovXG5AQCAtOTM5LDYgKzk0Nyw3IEBAIHN0cnVjdCBicGZfdmVyaWZpZXJfZW52IHtcbiBcdGJvb2wgYnlwYXNzX3NwZWNfdjQ7XG4gXHRib29sIHNlZW5fZGlyZWN0X3dyaXRlO1xuIFx0Ym9vbCBzZWVuX2V4Y2VwdGlvbjtcbitcdGJvb2wgc2lnbmF0dXJlO1xuIFx0c3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhICppbnNuX2F1eF9kYXRhOyAvKiBhcnJheSBvZiBwZXItaW5zbiBzdGF0ZSAqL1xuIFx0Y29uc3Qgc3RydWN0IGJwZl9saW5lX2luZm8gKnByZXZfbGluZm87XG4gXHRzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyBsb2c7XG5AQCAtOTg5LDcgKzk5OCwxOSBAQCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiB7XG4gXHR1MzIgZnJlZV9saXN0X3NpemU7XG4gXHR1MzIgZXhwbG9yZWRfc3RhdGVzX3NpemU7XG4gXHR1MzIgbnVtX2JhY2tlZGdlcztcbi1cdGJwZnB0cl90IGZkX2FycmF5O1xuK1x0LypcbitcdCAqIFRoZSBwcm9ncmFtJ3MgZmRfYXJyYXkgY29tZXMgaW4gdHdvIHNoYXBlcywgdG9sZCBhcGFydCBieSB3aGV0aGVyXG4rXHQgKiB0aGUgY2FsbGVyIHBhc3NlZCBmZF9hcnJheV9jbnQuIFRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTpcbitcdCAqICAtIGNvbnRpbnVvdXMgKGZkX2FycmF5X2NudCBnaXZlbik6IC1cdTAwM2VmZF9hcnJheSBob2xkcyBldmVyeSBlbnRyeVxuK1x0ICogICAgcmVzb2x2ZWQgdG8gaXRzIG9iamVjdCB1cCBmcm9udCwgaW5kZXhlZCBieSBmZF9hcnJheSBwb3NpdGlvbixcbitcdCAqICAgIHdpdGggLVx1MDAzZWZkX2FycmF5X2NudCBzbG90czsgLVx1MDAzZWZkX2FycmF5X3JhdyBpcyB1bnVzZWQuXG4rXHQgKiAgLSBzcGFyc2UgKG5vIGZkX2FycmF5X2NudCk6IC1cdTAwM2VmZF9hcnJheSBpcyBOVUxMLCBhbmQgZW50cmllcyBhcmVcbitcdCAqICAgIHJlYWQgZnJvbSAtXHUwMDNlZmRfYXJyYXlfcmF3ICh0aGUgY2FsbGVyJ3MgZmRfYXJyYXkpIGFuZCByZXNvbHZlZFxuK1x0ICogICAgbGF6aWx5IG9uIGZpcnN0IHJlZmVyZW5jZS5cbitcdCAqL1xuK1x0c3RydWN0IGJwZl9mZF9hcnJheSAqZmRfYXJyYXk7XG4rXHR1MzIgZmRfYXJyYXlfY250O1xuK1x0YnBmcHRyX3QgZmRfYXJyYXlfcmF3O1xuIFxuIFx0LyogYml0IG1hc2sgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIGEgcmVnaXN0ZXIgaGFzIGJlZW4gYWNjZXNzZWRcbiBcdCAqIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGZ1bmN0aW9uIHN0YXRlIHdhcyBwcmludGVkXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9zeXNjYWxsLmMgYi9rZXJuZWwvYnBmL3N5c2NhbGwuY1xuaW5kZXggNmRiMzA2ZDIzYjQ3OWYuLmM0OTZjNzNhODQ4MzJjIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9zeXNjYWxsLmNcbisrKyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jXG5AQCAtNDAsNyArNDAsNiBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3RyYWNlcG9pbnQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L292ZXJmbG93LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jb29raWUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3ZlcmlmaWNhdGlvbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXHUwMDNjbmV0L25ldGZpbHRlci9uZl9icGZfbGluay5oXHUwMDNlXG5AQCAtMTYwMCwxMSArMTU5OSw2IEBAIHN0YXRpYyBpbnQgbWFwX2NyZWF0ZV9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfdmVyXG4gXHRcdFx0Z290byBmcmVlX21hcDtcbiBcdFx0fVxuIFxuLVx0XHQvKiBTZWUgbGliYnBmOiBlbWl0X3NpZ25hdHVyZV9tYXRjaCgpICovXG4tXHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgZXhjbCkgIT0gU0hBMjU2X0RJR0VTVF9TSVpFKTtcbi1cdFx0QlVJTERfQlVHX09OKCFfX3NhbWVfdHlwZShtYXAtXHUwMDNlZXhjbCwgdTMyKSk7XG4tXHRcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYnBmX21hcCwgc2hhKSAgIT0gMCk7XG4tXHRcdEJVSUxEX0JVR19PTighX19zYW1lX3R5cGUobWFwLVx1MDAzZXNoYSwgdThbU0hBMjU2X0RJR0VTVF9TSVpFXSkpO1xuIFx0XHRtYXAtXHUwMDNlZXhjbCA9IDE7XG4gXHR9IGVsc2UgaWYgKGF0dHItXHUwMDNlZXhjbF9wcm9nX2hhc2hfc2l6ZSkge1xuIFx0XHRicGZfbG9nKGxvZywgXCJJbnZhbGlkIGV4Y2xfcHJvZ19oYXNoX3NpemUuXFxuXCIpO1xuQEAgLTI4ODYsNjQgKzI4ODAsNiBAQCBzdGF0aWMgYm9vbCBpc19wZXJmbW9uX3Byb2dfdHlwZShlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlKVxuIFx0fVxuIH1cbiBcbi1zdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXG4te1xuLVx0c3dpdGNoIChrZXlyaW5nX2lkKSB7XG4tXHRjYXNlIDA6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjtcbi1cdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HOlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTtcbi1cdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XG4tXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XG4tXHRkZWZhdWx0OlxuLVx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1VTRVI7XG4tXHR9XG4tfVxuLVxuLXN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3Byb2cgKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLFxuLVx0XHRcdFx0ICAgICBib29sIGlzX2tlcm5lbCwgczMyICprZXlyaW5nX3NlcmlhbClcbi17XG4tXHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XG4tXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGluc25zX3B0cjtcbi1cdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xuLVx0dm9pZCAqc2lnO1xuLVx0aW50IGVyciA9IDA7XG4tXG4tXHQvKlxuLVx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuLVx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4tXHQgKi9cbi1cdGlmIChhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cbi1cdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpID09IDApXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0ZWxzZVxuLVx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4tXG4tXHRpZiAoIWtleSlcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4tXG4tXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4tXHRpZiAoSVNfRVJSKHNpZykpIHtcbi1cdFx0YnBmX2tleV9wdXQoa2V5KTtcbi1cdFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcbi1cdH1cbi1cbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZzaWdfcHRyLCBzaWcsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCxcbi1cdFx0XHRhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbi1cdGJwZl9keW5wdHJfaW5pdChcdTAwMjZpbnNuc19wdHIsIHByb2ctXHUwMDNlaW5zbnNpLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4tXHRcdFx0cHJvZy1cdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXG4tXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZpbnNuc19wdHIsXG4tXHRcdFx0XHRcdCAoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZzaWdfcHRyLCBrZXkpO1xuLVx0aWYgKCFlcnIpXG4tXHRcdCprZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XG4tXHRicGZfa2V5X3B1dChrZXkpO1xuLVx0a3ZmcmVlKHNpZyk7XG4tXHRyZXR1cm4gZXJyO1xuLX1cbi1cbiBzdGF0aWMgaW50IGJwZl9wcm9nX21hcmtfaW5zbl9hcnJheXNfcmVhZHkoc3RydWN0IGJwZl9wcm9nICpwcm9nKVxuIHtcbiBcdGludCBlcnI7XG5AQCAtMzEzMywxNyArMzA2OSw4IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXG4gXHQvKiBlQlBGIHByb2dyYW1zIG11c3QgYmUgR1BMIGNvbXBhdGlibGUgdG8gdXNlIEdQTC1lZCBmdW5jdGlvbnMgKi9cbiBcdHByb2ctXHUwMDNlZ3BsX2NvbXBhdGlibGUgPSBsaWNlbnNlX2lzX2dwbF9jb21wYXRpYmxlKGxpY2Vuc2UpID8gMSA6IDA7XG4tXHRpZiAoYXR0ci1cdTAwM2VzaWduYXR1cmUpIHtcbi1cdFx0ZXJyID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShwcm9nLCBhdHRyLCB1YXR0ci5pc19rZXJuZWwsXG4tXHRcdFx0XHRcdFx0XHUwMDI2cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfc2VyaWFsKTtcbi1cdFx0aWYgKGVycilcbi1cdFx0XHRnb3RvIGZyZWVfcHJvZztcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcbi1cdH0gZWxzZSB7XG4tXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBCUEZfU0lHX0tFWVJJTkdfTk9ORTtcbi1cdFx0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuLVx0fVxuK1x0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IEJQRl9TSUdfS0VZUklOR19OT05FO1xuK1x0cHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPSBCUEZfU0lHX1VOU0lHTkVEO1xuIFx0cHJvZy1cdTAwM2VvcmlnX3Byb2cgPSBOVUxMO1xuIFx0cHJvZy1cdTAwM2VqaXRlZCA9IDA7XG4gXG5AQCAtMzE4OSwxMCArMzExNiw2IEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfbG9hZCh1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsIHN0cnVjdCBicGZfbG9nX2F0XG4gXHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRnb3RvIGZyZWVfcHJvZztcbiBcbi1cdGVyciA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQocHJvZywgYXR0ciwgdG9rZW4sIHVhdHRyLmlzX2tlcm5lbCk7XG4tXHRpZiAoZXJyKVxuLVx0XHRnb3RvIGZyZWVfcHJvZztcbi1cbiBcdC8qIHJ1biBlQlBGIHZlcmlmaWVyICovXG4gXHRlcnIgPSBicGZfY2hlY2soXHUwMDI2cHJvZywgYXR0ciwgdWF0dHIsIGF0dHJfbG9nKTtcbiBcdGlmIChlcnIgXHUwMDNjIDApXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5pbmRleCAyNWFlYTQyNzFjZDA4OS4uMTYwOTA1M2EwZWViZjIgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTIyLDYgKzIyLDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9jdHlwZS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyb3ItaW5qZWN0aW9uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGZfbHNtLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zZWN1cml0eS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvdmVyaWZpY2F0aW9uLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9wb2lzb24uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG5AQCAtMjQ5MCw2ICsyNDkyLDgzIEBAIGludCBicGZfZ2V0X2tmdW5jX2FkZHIoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nLCB1MzIgZnVuY19pZCxcbiBcdHJldHVybiAwO1xuIH1cbiBcbisjZGVmaW5lIEJQRl9GRF9TTE9UX0JURlx0MVVMXG4rXG4rc3RhdGljIHZvaWQgZmRfc2xvdF9zZXRfbWFwKHN0cnVjdCBicGZfZmRfYXJyYXkgKnNsb3QsIHN0cnVjdCBicGZfbWFwICptYXApXG4re1xuK1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZyltYXA7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGZkX3Nsb3Rfc2V0X2J0ZihzdHJ1Y3QgYnBmX2ZkX2FycmF5ICpzbG90LCBzdHJ1Y3QgYnRmICpidGYpXG4re1xuK1x0c2xvdC1cdTAwM2V2YWwgPSAodW5zaWduZWQgbG9uZylidGYgfCBCUEZfRkRfU0xPVF9CVEY7XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqZmRfc2xvdF9tYXAoc3RydWN0IGJwZl9mZF9hcnJheSBzbG90KVxuK3tcbitcdGlmIChzbG90LnZhbCBcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHJldHVybiAoc3RydWN0IGJwZl9tYXAgKilzbG90LnZhbDtcbit9XG4rXG4rc3RhdGljIHN0cnVjdCBidGYgKmZkX3Nsb3RfYnRmKHN0cnVjdCBicGZfZmRfYXJyYXkgc2xvdClcbit7XG4rXHRpZiAoIShzbG90LnZhbCBcdTAwMjYgQlBGX0ZEX1NMT1RfQlRGKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRyZXR1cm4gKHN0cnVjdCBidGYgKikoc2xvdC52YWwgXHUwMDI2IH5CUEZfRkRfU0xPVF9CVEYpO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXG4rZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4re1xuK1x0c3RydWN0IGJ0ZiAqYnRmO1xuK1xuK1x0aWYgKGlkeCBcdTAwM2U9IGVudi1cdTAwM2VmZF9hcnJheV9jbnQpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgZmRfaWR4ICV1IG91dCBvZiBib3VuZHMsIGZkX2FycmF5X2NudCAldVxcblwiLFxuK1x0XHRcdGlkeCwgZW52LVx1MDAzZWZkX2FycmF5X2NudCk7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuK1x0fVxuK1x0YnRmID0gZmRfc2xvdF9idGYoZW52LVx1MDAzZWZkX2FycmF5W2lkeF0pO1xuK1x0aWYgKCFidGYpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgZmRfaWR4ICV1IGlzIG5vdCBhIG1vZHVsZSBCVEZcXG5cIiwgaWR4KTtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXHR9XG4rXHRidGZfZ2V0KGJ0Zik7XG4rXHRyZXR1cm4gYnRmO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqXG4rZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2Uoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbit7XG4rXHRzdHJ1Y3QgYnRmICpidGY7XG4rXHRpbnQgYnRmX2ZkO1xuK1xuK1x0aWYgKGNvcHlfZnJvbV9icGZwdHJfb2Zmc2V0KFx1MDAyNmJ0Zl9mZCwgZW52LVx1MDAzZWZkX2FycmF5X3JhdyxcbitcdFx0XHRcdCAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihidGZfZmQpLCBzaXplb2YoYnRmX2ZkKSkpXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuK1x0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuK1x0aWYgKElTX0VSUihidGYpKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImludmFsaWQgbW9kdWxlIEJURiBmZCBzcGVjaWZpZWRcXG5cIik7XG4rXHRcdHJldHVybiBidGY7XG4rXHR9XG4rXHRyZXR1cm4gYnRmO1xuK31cbitcbitzdGF0aWMgc3RydWN0IGJ0ZiAqZmRfYXJyYXlfZ2V0X2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuK3tcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cIik7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FQUNDRVMpO1xuK1x0fVxuK1x0aWYgKGVudi1cdTAwM2VmZF9hcnJheSlcbitcdFx0cmV0dXJuIGZkX2FycmF5X2dldF9idGZfY29udGludW91cyhlbnYsIGlkeCk7XG4rXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheV9yYXcpKVxuK1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UoZW52LCBpZHgpO1xuK1xuK1x0dmVyYm9zZShlbnYsIFwia2Z1bmMgb2Zmc2V0IFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbitcdHJldHVybiBFUlJfUFRSKC1FUFJPVE8pO1xuK31cbitcbiBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRcdFx0XHRcdCBzMTYgb2Zmc2V0KVxuIHtcbkBAIC0yNDk4LDcgKzI1NzcsNiBAQCBzdGF0aWMgc3RydWN0IGJ0ZiAqX19maW5kX2tmdW5jX2Rlc2NfYnRmKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHRzdHJ1Y3QgYnBmX2tmdW5jX2J0ZiAqYjtcbiBcdHN0cnVjdCBtb2R1bGUgKm1vZDtcbiBcdHN0cnVjdCBidGYgKmJ0Zjtcbi1cdGludCBidGZfZmQ7XG4gXG4gXHR0YWIgPSBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNla2Z1bmNfYnRmX3RhYjtcbiBcdGIgPSBic2VhcmNoKFx1MDAyNmtmX2J0ZiwgdGFiLVx1MDAzZWRlc2NzLCB0YWItXHUwMDNlbnJfZGVzY3MsXG5AQCAtMjUwOSwyMiArMjU4Nyw5IEBAIHN0YXRpYyBzdHJ1Y3QgYnRmICpfX2ZpbmRfa2Z1bmNfZGVzY19idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuIFx0XHR9XG4gXG4tXHRcdGlmIChicGZwdHJfaXNfbnVsbChlbnYtXHUwMDNlZmRfYXJyYXkpKSB7XG4tXHRcdFx0dmVyYm9zZShlbnYsIFwia2Z1bmMgb2Zmc2V0IFx1MDAzZSAwIHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRVBST1RPKTtcbi1cdFx0fVxuLVxuLVx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2YnRmX2ZkLCBlbnYtXHUwMDNlZmRfYXJyYXksXG4tXHRcdFx0XHRcdCAgICBvZmZzZXQgKiBzaXplb2YoYnRmX2ZkKSxcbi1cdFx0XHRcdFx0ICAgIHNpemVvZihidGZfZmQpKSlcbi1cdFx0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1cbi1cdFx0YnRmID0gYnRmX2dldF9ieV9mZChidGZfZmQpO1xuLVx0XHRpZiAoSVNfRVJSKGJ0ZikpIHtcbi1cdFx0XHR2ZXJib3NlKGVudiwgXCJpbnZhbGlkIG1vZHVsZSBCVEYgZmQgc3BlY2lmaWVkXFxuXCIpO1xuK1x0XHRidGYgPSBmZF9hcnJheV9nZXRfYnRmKGVudiwgb2Zmc2V0KTtcbitcdFx0aWYgKElTX0VSUihidGYpKVxuIFx0XHRcdHJldHVybiBidGY7XG4tXHRcdH1cbi1cbiBcdFx0aWYgKCFidGZfaXNfbW9kdWxlKGJ0ZikpIHtcbiBcdFx0XHR2ZXJib3NlKGVudiwgXCJCVEYgZmQgZm9yIGtmdW5jIGlzIG5vdCBhIG1vZHVsZSBCVEZcXG5cIik7XG4gXHRcdFx0YnRmX3B1dChidGYpO1xuQEAgLTE3NTc3LDYgKzE3NjQyLDExIEBAIHN0YXRpYyBpbnQgX19hZGRfdXNlZF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJ0ZiAqYnRmKVxuIFx0XHRpZiAoZW52LVx1MDAzZXVzZWRfYnRmc1tpXS5idGYgPT0gYnRmKVxuIFx0XHRcdGdvdG8gcmV0X3B1dDtcbiBcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25lZCBwcm9ncmFtIGNhbm5vdCBiaW5kIGFueSBCVEZcXG5cIik7XG4rXHRcdHJldCA9IC1FQUNDRVM7XG4rXHRcdGdvdG8gcmV0X3B1dDtcbitcdH1cbiBcdGlmIChlbnYtXHUwMDNldXNlZF9idGZfY250IFx1MDAzZT0gTUFYX1VTRURfQlRGUykge1xuIFx0XHR2ZXJib3NlKGVudiwgXCJUaGUgdG90YWwgbnVtYmVyIG9mIGJ0ZnMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCIsXG4gXHRcdFx0TUFYX1VTRURfQlRGUyk7XG5AQCAtMTc4NTksNiArMTc5MjksMTIgQEAgc3RhdGljIGludCBfX2FkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0XHRpZiAoZW52LVx1MDAzZXVzZWRfbWFwc1tpXSA9PSBtYXApXG4gXHRcdFx0cmV0dXJuIGk7XG4gXG4rXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSBcdTAwMjZcdTAwMjZcbitcdCAgICBlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnLnZlcmRpY3QgPT0gQlBGX1NJR19WRVJJRklFRCkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgYmluZCBtYXAgJyVzJyBub3QgY292ZXJlZCBieSB0aGUgc2lnbmF0dXJlXFxuXCIsXG4rXHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuK1x0XHRyZXR1cm4gLUVBQ0NFUztcbitcdH1cbiBcdGlmIChlbnYtXHUwMDNldXNlZF9tYXBfY250IFx1MDAzZT0gTUFYX1VTRURfTUFQUykge1xuIFx0XHR2ZXJib3NlKGVudiwgXCJUaGUgdG90YWwgbnVtYmVyIG9mIG1hcHMgcGVyIHByb2dyYW0gaGFzIHJlYWNoZWQgdGhlIGxpbWl0IG9mICV1XFxuXCIsXG4gXHRcdFx0TUFYX1VTRURfTUFQUyk7XG5AQCAtMTc5MTEsNiArMTc5ODcsNDggQEAgc3RhdGljIGludCBhZGRfdXNlZF9tYXAoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZkKVxuIFx0cmV0dXJuIF9fYWRkX3VzZWRfbWFwKGVudiwgbWFwKTtcbiB9XG4gXG4rc3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXG4re1xuK1x0c3RydWN0IGJwZl9tYXAgKm1hcDtcbitcbitcdGlmIChpZHggXHUwMDNlPSBlbnYtXHUwMDNlZmRfYXJyYXlfY250KSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImZkX2lkeCAldSBvdXQgb2YgYm91bmRzLCBmZF9hcnJheV9jbnQgJXVcXG5cIixcbitcdFx0XHRpZHgsIGVudi1cdTAwM2VmZF9hcnJheV9jbnQpO1xuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdH1cbitcdG1hcCA9IGZkX3Nsb3RfbWFwKGVudi1cdTAwM2VmZF9hcnJheVtpZHhdKTtcbitcdGlmICghbWFwKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcImZkX2lkeCAldSBpcyBub3QgYSBtYXBcXG5cIiwgaWR4KTtcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHR9XG4rXHRyZXR1cm4gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuK31cbitcbitzdGF0aWMgaW50IGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxuK3tcbitcdGludCBmZDtcbitcbitcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZmZCwgZW52LVx1MDAzZWZkX2FycmF5X3JhdyxcbitcdFx0XHRcdCAgICAoc2l6ZV90KWlkeCAqIHNpemVvZihmZCksIHNpemVvZihmZCkpKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcdHJldHVybiBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHgoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcbit7XG4rXHRpZiAoZW52LVx1MDAzZWZkX2FycmF5KVxuK1x0XHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhlbnYsIGlkeCk7XG4rXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBtdXN0IGJpbmQgbWFwcyB2aWEgYSBjb250aW51b3VzIGZkX2FycmF5IChmZF9hcnJheV9jbnQpXFxuXCIpO1xuK1x0XHRyZXR1cm4gLUVBQ0NFUztcbitcdH1cbitcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVx1MDAzZWZkX2FycmF5X3JhdykpXG4rXHRcdHJldHVybiBmZF9hcnJheV9nZXRfbWFwX2lkeF9zcGFyc2UoZW52LCBpZHgpO1xuK1xuK1x0dmVyYm9zZShlbnYsIFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbitcdHJldHVybiAtRVBST1RPO1xuK31cbitcbiBzdGF0aWMgaW50IGNoZWNrX2FsdV9maWVsZHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKVxuIHtcbiBcdHU4IGNsYXNzID0gQlBGX0NMQVNTKGluc24tXHUwMDNlY29kZSk7XG5AQCAtMTgxMjgsNyArMTgyNDYsNiBAQCBzdGF0aWMgaW50IGNoZWNrX2FuZF9yZXNvbHZlX2luc25zKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpXG4gXHRcdFx0c3RydWN0IGJwZl9tYXAgKm1hcDtcbiBcdFx0XHRpbnQgbWFwX2lkeDtcbiBcdFx0XHR1NjQgYWRkcjtcbi1cdFx0XHR1MzIgZmQ7XG4gXG4gXHRcdFx0aWYgKGkgPT0gaW5zbl9jbnQgLSAxIHx8IGluc25bMV0uY29kZSAhPSAwIHx8XG4gXHRcdFx0ICAgIGluc25bMV0uZHN0X3JlZyAhPSAwIHx8IGluc25bMV0uc3JjX3JlZyAhPSAwIHx8XG5AQCAtMTgxODAsMjEgKzE4Mjk3LDE3IEBAIHN0YXRpYyBpbnQgY2hlY2tfYW5kX3Jlc29sdmVfaW5zbnMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudilcbiBcdFx0XHRzd2l0Y2ggKGluc25bMF0uc3JjX3JlZykge1xuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYX1ZBTFVFOlxuIFx0XHRcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYOlxuLVx0XHRcdFx0aWYgKGJwZnB0cl9pc19udWxsKGVudi1cdTAwM2VmZF9hcnJheSkpIHtcbi1cdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwiZmRfaWR4IHdpdGhvdXQgZmRfYXJyYXkgaXMgaW52YWxpZFxcblwiKTtcbi1cdFx0XHRcdFx0cmV0dXJuIC1FUFJPVE87XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheSxcbi1cdFx0XHRcdFx0XHRcdCAgICBpbnNuWzBdLmltbSAqIHNpemVvZihmZCksXG4tXHRcdFx0XHRcdFx0XHQgICAgc2l6ZW9mKGZkKSkpXG4tXHRcdFx0XHRcdHJldHVybiAtRUZBVUxUO1xuK1x0XHRcdFx0bWFwX2lkeCA9IGZkX2FycmF5X2dldF9tYXBfaWR4KGVudiwgaW5zblswXS5pbW0pO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0ZGVmYXVsdDpcbi1cdFx0XHRcdGZkID0gaW5zblswXS5pbW07XG4rXHRcdFx0XHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xuK1x0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBjYW5ub3QgcmVmZXJlbmNlIGEgbWFwIGJ5IGZkLCBvbmx5IHZpYSBmZF9hcnJheSBpbmRleFxcblwiKTtcbitcdFx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdFx0XHR9XG4rXHRcdFx0XHRtYXBfaWR4ID0gYWRkX3VzZWRfbWFwKGVudiwgaW5zblswXS5pbW0pO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdG1hcF9pZHggPSBhZGRfdXNlZF9tYXAoZW52LCBmZCk7XG4gXHRcdFx0aWYgKG1hcF9pZHggXHUwMDNjIDApXG4gXHRcdFx0XHRyZXR1cm4gbWFwX2lkeDtcbiBcdFx0XHRtYXAgPSBlbnYtXHUwMDNldXNlZF9tYXBzW21hcF9pZHhdO1xuQEAgLTE5NDY5LDcgKzE5NTgyLDcgQEAgc3RydWN0IGJ0ZiAqYnBmX2dldF9idGZfdm1saW51eCh2b2lkKVxuICAqIHRoaXMgY2FzZSBleHBlY3QgdGhhdCBldmVyeSBmaWxlIGRlc2NyaXB0b3IgaW4gdGhlIGFycmF5IGlzIGVpdGhlciBhIG1hcCBvclxuICAqIGEgQlRGLiBFdmVyeXRoaW5nIGVsc2UgaXMgY29uc2lkZXJlZCB0byBiZSB0cmFzaC5cbiAgKi9cbi1zdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbitzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgsIGludCBmZClcbiB7XG4gXHRzdHJ1Y3QgYnBmX21hcCAqbWFwO1xuIFx0c3RydWN0IGJ0ZiAqYnRmO1xuQEAgLTE5NDgxLDUxICsxOTU5NCw2OSBAQCBzdGF0aWMgaW50IGFkZF9mZF9mcm9tX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBmZClcbiBcdFx0ZXJyID0gX19hZGRfdXNlZF9tYXAoZW52LCBtYXApO1xuIFx0XHRpZiAoZXJyIFx1MDAzYyAwKVxuIFx0XHRcdHJldHVybiBlcnI7XG4rXHRcdGZkX3Nsb3Rfc2V0X21hcChcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgbWFwKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4gXHRidGYgPSBfX2J0Zl9nZXRfYnlfZmQoZik7XG4gXHRpZiAoIUlTX0VSUihidGYpKSB7XG4gXHRcdGJ0Zl9nZXQoYnRmKTtcbi1cdFx0cmV0dXJuIF9fYWRkX3VzZWRfYnRmKGVudiwgYnRmKTtcbitcdFx0ZXJyID0gX19hZGRfdXNlZF9idGYoZW52LCBidGYpO1xuK1x0XHRpZiAoZXJyIFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXHRcdGZkX3Nsb3Rfc2V0X2J0ZihcdTAwMjZlbnYtXHUwMDNlZmRfYXJyYXlbaWR4XSwgYnRmKTtcbitcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG4gXHR2ZXJib3NlKGVudiwgXCJmZCAlZCBpcyBub3QgcG9pbnRpbmcgdG8gdmFsaWQgYnBmX21hcCBvciBidGZcXG5cIiwgZmQpO1xuIFx0cmV0dXJuIFBUUl9FUlIobWFwKTtcbiB9XG4gXG4tc3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcbisjZGVmaW5lIE1BWF9GRF9BUlJBWV9DTlQgKE1BWF9VU0VEX01BUFMgKyBNQVhfS0ZVTkNfQlRGUylcbitcbitzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuK1x0XHRcdFx0ICAgICAgIGJwZnB0cl90IGZkX2FycmF5LCB1MzIgY250KVxuIHtcbi1cdHNpemVfdCBzaXplID0gc2l6ZW9mKGludCk7XG4tXHRpbnQgcmV0O1xuLVx0aW50IGZkO1xuK1x0aW50IGZkLCByZXQ7XG4gXHR1MzIgaTtcbiBcbi1cdGVudi1cdTAwM2VmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XG4tXG4tXHQvKlxuLVx0ICogVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCAobm8gZmRfYXJyYXlfY250IGlzIGdpdmVuKSBhbmQgbmV3XG4tXHQgKiBBUElzIGlzIHRoYXQgaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBmZF9hcnJheSBpcyBleHBlY3RlZCB0byBiZVxuLVx0ICogY29udGludW91cyBhbmQgaXMgc2Nhbm5lZCBmb3IgbWFwIGZkcyByaWdodCBhd2F5XG4tXHQgKi9cbi1cdGlmICghYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpXG4tXHRcdHJldHVybiAwO1xuLVxuLVx0LyogQ2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi9cbi1cdGlmIChhdHRyLVx1MDAzZWZkX2FycmF5X2NudCBcdTAwM2U9IChVMzJfTUFYIC8gc2l6ZSkpIHtcbi1cdFx0dmVyYm9zZShlbnYsIFwiZmRfYXJyYXlfY250IGlzIHRvbyBiaWcgKCV1KVxcblwiLCBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4tXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0aWYgKGNudCBcdTAwM2UgTUFYX0ZEX0FSUkFZX0NOVCkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJmZF9hcnJheSBoYXMgdG9vIG1hbnkgZW50cmllcyAoJXUsIG1heCAldSlcXG5cIixcbitcdFx0XHRjbnQsIE1BWF9GRF9BUlJBWV9DTlQpO1xuK1x0XHRyZXR1cm4gLUUyQklHO1xuIFx0fVxuIFxuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQ7IGkrKykge1xuLVx0XHRpZiAoY29weV9mcm9tX2JwZnB0cl9vZmZzZXQoXHUwMDI2ZmQsIGVudi1cdTAwM2VmZF9hcnJheSwgaSAqIHNpemUsIHNpemUpKVxuK1x0ZW52LVx1MDAzZWZkX2FycmF5ID0ga3ZjYWxsb2MoY250LCBzaXplb2YoKmVudi1cdTAwM2VmZF9hcnJheSksIEdGUF9LRVJORUwpO1xuK1x0aWYgKCFlbnYtXHUwMDNlZmRfYXJyYXkpXG4rXHRcdHJldHVybiAtRU5PTUVNO1xuK1x0ZW52LVx1MDAzZWZkX2FycmF5X2NudCA9IGNudDtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGNudDsgaSsrKSB7XG4rXHRcdGlmIChjb3B5X2Zyb21fYnBmcHRyX29mZnNldChcdTAwMjZmZCwgZmRfYXJyYXksXG4rXHRcdFx0XHRcdCAgICAoc2l6ZV90KWkgKiBzaXplb2YoZmQpLCBzaXplb2YoZmQpKSlcbiBcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbi1cbi1cdFx0cmV0ID0gYWRkX2ZkX2Zyb21fZmRfYXJyYXkoZW52LCBmZCk7XG4rXHRcdHJldCA9IGFkZF9mZF9mcm9tX2ZkX2FycmF5KGVudiwgaSwgZmQpO1xuIFx0XHRpZiAocmV0KVxuIFx0XHRcdHJldHVybiByZXQ7XG4gXHR9XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBwcm9jZXNzX2ZkX2FycmF5KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4rXHRcdFx0ICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcbit7XG4rXHRicGZwdHJfdCBmZF9hcnJheSA9IG1ha2VfYnBmcHRyKGF0dHItXHUwMDNlZmRfYXJyYXksIHVhdHRyLmlzX2tlcm5lbCk7XG4gXG4rXHRpZiAoYnBmcHRyX2lzX251bGwoZmRfYXJyYXkpKVxuK1x0XHRyZXR1cm4gMDtcbitcdC8qXG4rXHQgKiBOZXcgQVBJOiB0aGUgY2FsbGVyIHBhc3NlcyBmZF9hcnJheV9jbnQgYW5kIGEgY29udGludW91cyBhcnJheSB0aGF0XG4rXHQgKiBpcyByZXNvbHZlZCBhbmQgYm91bmQgdXAgZnJvbnQuIExlZ2FjeSBBUEkgKG5vIGZkX2FycmF5X2NudCk6IGtlZXBcbitcdCAqIHRoZSBjYWxsZXIncyBhcnJheSBhbmQgcmVzb2x2ZSBlbnRyaWVzIGxhemlseSwgb24gZmlyc3QgcmVmZXJlbmNlLlxuK1x0ICovXG4rXHRpZiAoYXR0ci1cdTAwM2VmZF9hcnJheV9jbnQpXG4rXHRcdHJldHVybiBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXMoZW52LCBmZF9hcnJheSxcbitcdFx0XHRcdFx0XHQgICBhdHRyLVx1MDAzZWZkX2FycmF5X2NudCk7XG4rXHRlbnYtXHUwMDNlZmRfYXJyYXlfcmF3ID0gZmRfYXJyYXk7XG4gXHRyZXR1cm4gMDtcbiB9XG4gXG5AQCAtMTk3NDAsNiArMTk4NzEsMTM5IEBAIGludCBicGZfZml4dXBfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuK3tcbitcdHN3aXRjaCAoa2V5cmluZ19pZCkge1xuK1x0Y2FzZSAwOlxuK1x0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JVSUxUSU47XG4rXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORzpcbitcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XG4rXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxuK1x0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19VU0VSO1xuK1x0fVxuK31cbitcbisvKlxuKyAqIFZlcmlmeSB0aGUgUEtDUyM3IHNpZ25hdHVyZSBvZiBhIGxvYWRlZCBwcm9ncmFtLiBDYWxsZWQgZnJvbSBicGZfY2hlY2soKVxuKyAqIG9uY2UgdGhlIHByb2dyYW0ncyBtZXRhZGF0YSBtYXBzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvIHVzZWRfbWFwcywgc29cbisgKiB0aGUgZXhhY3QgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGUgb25lcyB0aGUgcHJvZ3JhbSBiaW5kcy5cbisgKlxuKyAqIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgdGhlIGZyb3plbiBjb250ZW50cyBvZlxuKyAqIGVhY2ggbWFwLCBpbiBAbWFwcyBvcmRlcjogaW5zbnMgfHwgbWFwXzAgfHwgbWFwXzEgfHwgWy4uLl0uIE9uIHN1Y2Nlc3MgdGhlXG4rICogdmVyZGljdCBhbmQga2V5cmluZyBpbmZvIGFyZSByZWNvcmRlZCBvbiBwcm9nLVx1MDAzZWF1eC5cbisgKi9cbitzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbitcdFx0XHRcdCAgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJvb2wgaXNfa2VybmVsKVxuK3tcbitcdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcbitcdHN0cnVjdCBicGZfZHlucHRyX2tlcm4gc2lnX3B0ciwgZGF0YV9wdHI7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtXHUwMDNlcHJvZztcbitcdHN0cnVjdCBicGZfbWFwICoqbWFwcyA9IGVudi1cdTAwM2V1c2VkX21hcHM7XG4rXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcbitcdHZvaWQgKnNpZywgKmRhdGEgPSBOVUxMO1xuK1x0dTMyIG1hcF9jbnQgPSBlbnYtXHUwMDNldXNlZF9tYXBfY250O1xuK1x0dTMyIGksIG9mZiwgaW5zbnNfc3o7XG4rXHR1NjQgZGF0YV9zejtcbitcdGludCBlcnIgPSAwO1xuK1xuK1x0LypcbitcdCAqIERvbid0IGF0dGVtcHQgdG8gdXNlIGttYWxsb2NfbGFyZ2Ugb3Igdm1hbGxvYyBmb3Igc2lnbmF0dXJlcy5cbitcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxuK1x0ICovXG4rXHRpZiAoYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSBcdTAwM2UgS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxuK1x0XHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbitcdGVsc2VcbitcdFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQsIDApO1xuK1x0aWYgKCFrZXkpIHtcbitcdFx0dmVyYm9zZShlbnYsIFwiY2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwiLFxuK1x0XHRcdGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuK1x0aWYgKElTX0VSUihzaWcpKSB7XG4rXHRcdGJwZl9rZXlfcHV0KGtleSk7XG4rXHRcdHJldHVybiBQVFJfRVJSKHNpZyk7XG4rXHR9XG4rXG4rXHRpbnNuc19zeiA9IHByb2ctXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4rXHRkYXRhX3N6ID0gaW5zbnNfc3o7XG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXBfY250OyBpKyspIHtcbitcdFx0c3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07XG4rXG4rXHRcdGlmIChtYXAtXHUwMDNlbWFwX3R5cGUgIT0gQlBGX01BUF9UWVBFX0FSUkFZIHx8XG4rXHRcdCAgICAhbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGFuIGFycmF5XFxuXCIsXG4rXHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4rXHRcdFx0ZXJyID0gLUVJTlZBTDtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRpZiAoIVJFQURfT05DRShtYXAtXHUwMDNlZnJvemVuKSkge1xuK1x0XHRcdHZlcmJvc2UoZW52LCBcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIG11c3QgYmUgZnJvemVuXFxuXCIsXG4rXHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4rXHRcdFx0ZXJyID0gLUVQRVJNO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXHRcdGlmICghbWFwLVx1MDAzZWV4Y2xfcHJvZ19zaGEpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGV4Y2x1c2l2ZVxcblwiLFxuK1x0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuK1x0XHRcdGVyciA9IC1FUEVSTTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRkYXRhX3N6ICs9IG1hcC1cdTAwM2V2YWx1ZV9zaXplO1xuK1x0fVxuK1x0aWYgKGJwZl9keW5wdHJfY2hlY2tfc2l6ZShkYXRhX3N6KSkge1xuK1x0XHR2ZXJib3NlKGVudiwgXCJzaWduZWQgcGF5bG9hZCB0b28gbGFyZ2U6ICVsbHUgYnl0ZXNcXG5cIiwgZGF0YV9zeik7XG4rXHRcdGVyciA9IC1FMkJJRztcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRkYXRhID0ga3ZtYWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pO1xuK1x0aWYgKCFkYXRhKSB7XG4rXHRcdGVyciA9IC1FTk9NRU07XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1x0bWVtY3B5KGRhdGEsIHByb2ctXHUwMDNlaW5zbnNpLCBpbnNuc19zeik7XG4rXHRvZmYgPSBpbnNuc19zejtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xuK1x0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbitcdFx0dTY0IGFkZHI7XG4rXG4rXHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgMCk7XG4rXHRcdGlmIChlcnIpIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICclcyc6ICVkXFxuXCIsXG4rXHRcdFx0XHRtYXAtXHUwMDNlbmFtZSwgZXJyKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1x0XHRtZW1jcHkoZGF0YSArIG9mZiwgKHZvaWQgKikodW5zaWduZWQgbG9uZylhZGRyLFxuK1x0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuK1x0XHRvZmYgKz0gbWFwLVx1MDAzZXZhbHVlX3NpemU7XG4rXHR9XG4rXG4rXHRicGZfZHlucHRyX2luaXQoXHUwMDI2ZGF0YV9wdHIsIGRhdGEsIEJQRl9EWU5QVFJfVFlQRV9MT0NBTCwgMCwgZGF0YV9zeik7XG4rXHRicGZfZHlucHRyX2luaXQoXHUwMDI2c2lnX3B0ciwgc2lnLCBCUEZfRFlOUFRSX1RZUEVfTE9DQUwsIDAsXG4rXHRcdFx0YXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG4rXG4rXHRlcnIgPSBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgoc3RydWN0IGJwZl9keW5wdHIgKilcdTAwMjZkYXRhX3B0cixcbitcdFx0XHRcdFx0IChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVx1MDAyNnNpZ19wdHIsIGtleSk7XG4rXHRpZiAoZXJyKSB7XG4rXHRcdHZlcmJvc2UoZW52LCBcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkOiAlZFxcblwiLCBlcnIpO1xuK1x0fSBlbHNlIHtcbitcdFx0dmVyYm9zZShlbnYsIFwic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwYXNzZWRcXG5cIik7XG4rXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XG4rXHRcdHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZy5rZXlyaW5nX3R5cGUgPSBicGZfY2xhc3NpZnlfa2V5cmluZyhhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuK1x0XHRwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWcudmVyZGljdCA9IEJQRl9TSUdfVkVSSUZJRUQ7XG4rXHR9XG4rb3V0OlxuK1x0a3ZmcmVlKGRhdGEpO1xuK1x0YnBmX2tleV9wdXQoa2V5KTtcbitcdGt2ZnJlZShzaWcpO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHQgICAgICBzdHJ1Y3QgYnBmX2xvZ19hdHRyICphdHRyX2xvZylcbiB7XG5AQCAtMTk3ODIsNiArMjAwNDYsNyBAQCBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbiBcdGVudi1cdTAwM2VieXBhc3Nfc3BlY192MSA9IGJwZl9ieXBhc3Nfc3BlY192MShlbnYtXHUwMDNlcHJvZy1cdTAwM2VhdXgtXHUwMDNldG9rZW4pO1xuIFx0ZW52LVx1MDAzZWJ5cGFzc19zcGVjX3Y0ID0gYnBmX2J5cGFzc19zcGVjX3Y0KGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbik7XG4gXHRlbnYtXHUwMDNlYnBmX2NhcGFibGUgPSBpc19wcml2ID0gYnBmX3Rva2VuX2NhcGFibGUoZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuLCBDQVBfQlBGKTtcbitcdGVudi1cdTAwM2VzaWduYXR1cmUgPSBhdHRyLVx1MDAzZXNpZ25hdHVyZTtcbiBcbiBcdGJwZl9nZXRfYnRmX3ZtbGludXgoKTtcbiBcbkBAIC0xOTc5NSwxMSArMjAwNjAsMjcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRyZXQgPSBicGZfdmxvZ19pbml0KFx1MDAyNmVudi1cdTAwM2Vsb2csIGF0dHJfbG9nLVx1MDAzZWxldmVsLCBhdHRyX2xvZy1cdTAwM2V1YnVmLCBhdHRyX2xvZy1cdTAwM2VzaXplKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyX3VubG9jaztcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHJldCA9IGJwZl9wcm9nX2NhbGNfdGFnKGVudi1cdTAwM2Vwcm9nKTtcbitcdFx0aWYgKHJldCBcdTAwM2MgMClcbitcdFx0XHRnb3RvIHNraXBfZnVsbF9jaGVjaztcbitcdH1cbiBcbiBcdHJldCA9IHByb2Nlc3NfZmRfYXJyYXkoZW52LCBhdHRyLCB1YXR0cik7XG4gXHRpZiAocmV0KVxuIFx0XHRnb3RvIHNraXBfZnVsbF9jaGVjaztcbiBcbitcdGlmIChlbnYtXHUwMDNlc2lnbmF0dXJlKSB7XG4rXHRcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xuK1x0XHRpZiAocmV0KVxuK1x0XHRcdGdvdG8gc2tpcF9mdWxsX2NoZWNrO1xuK1x0fVxuK1xuK1x0cmV0ID0gc2VjdXJpdHlfYnBmX3Byb2dfbG9hZChlbnYtXHUwMDNlcHJvZywgYXR0ciwgZW52LVx1MDAzZXByb2ctXHUwMDNlYXV4LVx1MDAzZXRva2VuLFxuK1x0XHRcdFx0ICAgICB1YXR0ci5pc19rZXJuZWwpO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBza2lwX2Z1bGxfY2hlY2s7XG4rXG4gXHRtYXJrX3ZlcmlmaWVyX3N0YXRlX2NsZWFuKGVudik7XG4gXG4gXHRpZiAoSVNfRVJSKGJ0Zl92bWxpbnV4KSkge1xuQEAgLTIwMDI3LDYgKzIwMzA4LDcgQEAgaW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXG4gXHRicGZfY2xlYXJfaW5zbl9hdXhfZGF0YShlbnYsIDAsIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWxlbik7XG4gXHR2ZnJlZShlbnYtXHUwMDNlaW5zbl9hdXhfZGF0YSk7XG4gZXJyX2ZyZWVfZW52OlxuK1x0a3ZmcmVlKGVudi1cdTAwM2VmZF9hcnJheSk7XG4gXHRicGZfc3RhY2tfbGl2ZW5lc3NfZnJlZShlbnYpO1xuIFx0a3ZmcmVlKGVudi1cdTAwM2VjZmcuaW5zbl9wb3N0b3JkZXIpO1xuIFx0a3ZmcmVlKGVudi1cdTAwM2VzY2NfaW5mbyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmMgYi90b29scy9icGYvYnBmdG9vbC9nZW4uY1xuaW5kZXggNmFlNzI2MmViZTBjMWQuLmEwMWQwNmQyMmQxYTNiIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvZ2VuLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL2dlbi5jXG5AQCAtNzkzLDYgKzc5Myw4IEBAIHN0YXRpYyBpbnQgZ2VuX3RyYWNlKHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm9ial9uYW1lLCBjb25zdCBjaGFyICpoXG4gXHRpZiAoc2lnbl9wcm9ncykge1xuIFx0XHRzb3B0cy5pbnNucyA9IG9wdHMuaW5zbnM7XG4gXHRcdHNvcHRzLmluc25zX3N6ID0gb3B0cy5pbnNuc19zejtcbitcdFx0c29wdHMuZGF0YSA9IG9wdHMuZGF0YTtcbitcdFx0c29wdHMuZGF0YV9zeiA9IG9wdHMuZGF0YV9zejtcbiBcdFx0c29wdHMuZXhjbF9wcm9nX2hhc2ggPSBwcm9nX3NoYTtcbiBcdFx0c29wdHMuZXhjbF9wcm9nX2hhc2hfc3ogPSBzaXplb2YocHJvZ19zaGEpO1xuIFx0XHRzb3B0cy5zaWduYXR1cmUgPSBzaWdfYnVmO1xuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuaW5kZXggZjliNzQyZjRiYjEwNGIuLjdjYzk5MWM2OWRjMmM4IDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbkBAIC0xMzUsOSArMTM1LDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0Q01TX0NvbnRlbnRJbmZvICpjbXMgPSBOVUxMO1xuIFx0bG9uZyBhY3R1YWxfc2lnX2xlbiA9IDA7XG4gXHRYNTA5ICp4NTA5ID0gTlVMTDtcbitcdHZvaWQgKmRhdGEgPSBOVUxMO1xuK1x0c2l6ZV90IGRhdGFfc3o7XG4gXHRpbnQgZXJyID0gMDtcbiBcbi1cdGJkX2luID0gQklPX25ld19tZW1fYnVmKG9wdHMtXHUwMDNlaW5zbnMsIG9wdHMtXHUwMDNlaW5zbnNfc3opO1xuK1x0ZGF0YV9zeiA9IChzaXplX3Qpb3B0cy1cdTAwM2VpbnNuc19zeiArIG9wdHMtXHUwMDNlZGF0YV9zejtcbitcdGRhdGEgPSBtYWxsb2MoZGF0YV9zeik7XG4rXHRpZiAoIWRhdGEpIHtcbitcdFx0ZXJyID0gLUVOT01FTTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1x0bWVtY3B5KGRhdGEsIG9wdHMtXHUwMDNlaW5zbnMsIG9wdHMtXHUwMDNlaW5zbnNfc3opO1xuK1x0aWYgKG9wdHMtXHUwMDNlZGF0YV9zeilcbitcdFx0bWVtY3B5KChjaGFyICopZGF0YSArIG9wdHMtXHUwMDNlaW5zbnNfc3osIG9wdHMtXHUwMDNlZGF0YSwgb3B0cy1cdTAwM2VkYXRhX3N6KTtcbitcbitcdGJkX2luID0gQklPX25ld19tZW1fYnVmKGRhdGEsIGRhdGFfc3opO1xuIFx0aWYgKCFiZF9pbikge1xuIFx0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIGNsZWFudXA7XG5AQCAtMTc4LDcgKzE5MCw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0RVZQX0RpZ2VzdChvcHRzLVx1MDAzZWluc25zLCBvcHRzLVx1MDAzZWluc25zX3N6LCBvcHRzLVx1MDAzZWV4Y2xfcHJvZ19oYXNoLFxuIFx0XHQgICBcdTAwMjZvcHRzLVx1MDAzZWV4Y2xfcHJvZ19oYXNoX3N6LCBFVlBfc2hhMjU2KCksIE5VTEwpO1xuIFxuLVx0XHRiZF9vdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKTtcbitcdGJkX291dCA9IEJJT19uZXcoQklPX3NfbWVtKCkpO1xuIFx0aWYgKCFiZF9vdXQpIHtcbiBcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBjbGVhbnVwO1xuQEAgLTIxMiw2ICsyMjQsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiBcdFg1MDlfZnJlZSh4NTA5KTtcbiBcdEVWUF9QS0VZX2ZyZWUocHJpdmF0ZV9rZXkpO1xuIFx0QklPX2ZyZWUoYmRfaW4pO1xuK1x0ZnJlZShkYXRhKTtcbiBcdERJU1BMQVlfT1NTTF9FUlIoZXJyIFx1MDAzYyAwKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9icGZfZ2VuX2ludGVybmFsLmhcbmluZGV4IDQ5YWY0MjYwYjhlNmI3Li4wNDI1NjkxODc3NTIxNyAxMDA2NDRcbi0tLSBhL3Rvb2xzL2xpYi9icGYvYnBmX2dlbl9pbnRlcm5hbC5oXG4rKysgYi90b29scy9saWIvYnBmL2JwZl9nZW5faW50ZXJuYWwuaFxuQEAgLTUxLDcgKzUxLDYgQEAgc3RydWN0IGJwZl9nZW4ge1xuIFx0X191MzIgbnJfa3N5bXM7XG4gXHRpbnQgZmRfYXJyYXk7XG4gXHRpbnQgbnJfZmRfYXJyYXk7XG4tXHRpbnQgaGFzaF9pbnNuX29mZnNldFtTSEEyNTZfRFdPUkRfU0laRV07XG4gfTtcbiBcbiB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcyk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmMgYi90b29scy9saWIvYnBmL2dlbl9sb2FkZXIuY1xuaW5kZXggYzdmMmQyYWM3YmIzNWYuLjZlM2RkNTI0Mjc2MTgzIDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9nZW5fbG9hZGVyLmNcbisrKyBiL3Rvb2xzL2xpYi9icGYvZ2VuX2xvYWRlci5jXG5AQCAtMTExLDcgKzExMSw2IEBAIHN0YXRpYyB2b2lkIGVtaXQyKHN0cnVjdCBicGZfZ2VuICpnZW4sIHN0cnVjdCBicGZfaW5zbiBpbnNuMSwgc3RydWN0IGJwZl9pbnNuIGluXG4gXG4gc3RhdGljIGludCBhZGRfZGF0YShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBzaXplKTtcbiBzdGF0aWMgdm9pZCBlbWl0X3N5c19jbG9zZV9ibG9iKHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBibG9iX29mZik7XG4tc3RhdGljIHZvaWQgZW1pdF9zaWduYXR1cmVfbWF0Y2goc3RydWN0IGJwZl9nZW4gKmdlbik7XG4gXG4gdm9pZCBicGZfZ2VuX19pbml0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGludCBsb2dfbGV2ZWwsIGludCBucl9wcm9ncywgaW50IG5yX21hcHMpXG4ge1xuQEAgLTE1NCw4ICsxNTMsNiBAQCB2b2lkIGJwZl9nZW5fX2luaXQoc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IGxvZ19sZXZlbCwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwc1xuIFx0LyogUjcgY29udGFpbnMgdGhlIGVycm9yIGNvZGUgZnJvbSBzeXNfYnBmLiBDb3B5IGl0IGludG8gUjAgYW5kIGV4aXQuICovXG4gXHRlbWl0KGdlbiwgQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfNykpO1xuIFx0ZW1pdChnZW4sIEJQRl9FWElUX0lOU04oKSk7XG4tXHRpZiAoT1BUU19HRVQoZ2VuLVx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXG4tXHRcdGVtaXRfc2lnbmF0dXJlX21hdGNoKGdlbik7XG4gfVxuIFxuIHN0YXRpYyBpbnQgYWRkX2RhdGEoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgc2l6ZSlcbkBAIC0zNzcsOCArMzc0LDYgQEAgc3RhdGljIHZvaWQgZW1pdF9zeXNfY2xvc2VfYmxvYihzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgYmxvYl9vZmYpXG4gXHRfX2VtaXRfc3lzX2Nsb3NlKGdlbik7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGNvbXB1dGVfc2hhX3VwZGF0ZV9vZmZzZXRzKHN0cnVjdCBicGZfZ2VuICpnZW4pO1xuLVxuIGludCBicGZfZ2VuX19maW5pc2goc3RydWN0IGJwZl9nZW4gKmdlbiwgaW50IG5yX3Byb2dzLCBpbnQgbnJfbWFwcylcbiB7XG4gXHRpbnQgaTtcbkBAIC00MDgsOSArNDAzLDYgQEAgaW50IGJwZl9nZW5fX2ZpbmlzaChzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbnJfcHJvZ3MsIGludCBucl9tYXBzKVxuIFx0aWYgKCFnZW4tXHUwMDNlZXJyb3IpIHtcbiBcdFx0c3RydWN0IGdlbl9sb2FkZXJfb3B0cyAqb3B0cyA9IGdlbi1cdTAwM2VvcHRzO1xuIFxuLVx0XHRpZiAoT1BUU19HRVQob3B0cywgZ2VuX2hhc2gsIGZhbHNlKSlcbi1cdFx0XHRjb21wdXRlX3NoYV91cGRhdGVfb2Zmc2V0cyhnZW4pO1xuLVxuIFx0XHRvcHRzLVx1MDAzZWluc25zID0gZ2VuLVx1MDAzZWluc25fc3RhcnQ7XG4gXHRcdG9wdHMtXHUwMDNlaW5zbnNfc3ogPSBnZW4tXHUwMDNlaW5zbl9jdXIgLSBnZW4tXHUwMDNlaW5zbl9zdGFydDtcbiBcdFx0b3B0cy1cdTAwM2VkYXRhID0gZ2VuLVx1MDAzZWRhdGFfc3RhcnQ7XG5AQCAtNDYwLDIyICs0NTIsNiBAQCB2b2lkIGJwZl9nZW5fX2ZyZWUoc3RydWN0IGJwZl9nZW4gKmdlbilcbiBcdF92YWw7XHRcdFx0XHRcdFx0XHRcXFxuIH0pXG4gXG4tc3RhdGljIHZvaWQgY29tcHV0ZV9zaGFfdXBkYXRlX29mZnNldHMoc3RydWN0IGJwZl9nZW4gKmdlbilcbi17XG4tXHRfX3U2NCBzaGFbU0hBMjU2X0RXT1JEX1NJWkVdO1xuLVx0X191NjQgc2hhX2R3O1xuLVx0aW50IGk7XG4tXG4tXHRsaWJicGZfc2hhMjU2KGdlbi1cdTAwM2VkYXRhX3N0YXJ0LCBnZW4tXHUwMDNlZGF0YV9jdXIgLSBnZW4tXHUwMDNlZGF0YV9zdGFydCwgKF9fdTggKilzaGEpO1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgU0hBMjU2X0RXT1JEX1NJWkU7IGkrKykge1xuLVx0XHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPVxuLVx0XHRcdChzdHJ1Y3QgYnBmX2luc24gKikoZ2VuLVx1MDAzZWluc25fc3RhcnQgKyBnZW4tXHUwMDNlaGFzaF9pbnNuX29mZnNldFtpXSk7XG4tXHRcdHNoYV9kdyA9IHRndF9lbmRpYW4oc2hhW2ldKTtcbi1cdFx0aW5zblswXS5pbW0gPSAoX191MzIpc2hhX2R3O1xuLVx0XHRpbnNuWzFdLmltbSA9IHNoYV9kdyBcdTAwM2VcdTAwM2UgMzI7XG4tXHR9XG4tfVxuLVxuIHZvaWQgYnBmX2dlbl9fbG9hZF9idGYoc3RydWN0IGJwZl9nZW4gKmdlbiwgY29uc3Qgdm9pZCAqYnRmX3Jhd19kYXRhLFxuIFx0XHQgICAgICAgX191MzIgYnRmX3Jhd19zaXplKVxuIHtcbkBAIC01NTcsOCArNTMzLDkgQEAgdm9pZCBicGZfZ2VuX19tYXBfY3JlYXRlKHN0cnVjdCBicGZfZ2VuICpnZW4sXG4gXHQgKiBDb25kaXRpb25hbGx5IHVwZGF0ZSBtYXhfZW50cmllcyBmcm9tIHRoZSBob3N0LXN1cHBsaWVkIGxvYWRlclxuIFx0ICogY3R4LiBUaGlzIHNpemVzIHRoZSBtYXAgYXQgcnVudGltZSwgYnV0IGZvciBhIHNpZ25lZCBsb2FkZXJcbiBcdCAqIChnZW5faGFzaCkgaXQgd291bGQgbGV0IGFuIHVudHJ1c3RlZCBob3N0IHJlLWRpbWVuc2lvbiB0aGVcbi1cdCAqIHByb2dyYW0ncyBtYXBzIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKCksIG91dHNpZGUgd2hhdCB0aGVcbi1cdCAqIHNpZ25hdHVyZSBhdHRlc3RzIHRvLiBLZWVwIHRoZSBzaWduZXItcHJvdmlkZWQgbWF4X2VudHJpZXNcbitcdCAqIHByb2dyYW0ncyBtYXBzLCBvdXRzaWRlIHdoYXQgdGhlIHNpZ25hdHVyZSBhdHRlc3RzIHRvOiB0aGVcbitcdCAqIG1ldGFkYXRhIGJsb2IgaXMgY292ZXJlZCBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUgYW5kIHZlcmlmaWVkXG4rXHQgKiBieSB0aGUga2VybmVsIGF0IGxvYWQgdGltZS4gS2VlcCB0aGUgc2lnbmVyLXByb3ZpZGVkIG1heF9lbnRyaWVzXG4gXHQgKiBiYWtlZCBpbnRvIHRoZSBibG9iIGluIHRoYXQgY2FzZS5cbiBcdCAqL1xuIFx0aWYgKG1hcF9pZHggXHUwMDNlPSAwIFx1MDAyNlx1MDAyNiAhT1BUU19HRVQoZ2VuLVx1MDAzZW9wdHMsIGdlbl9oYXNoLCBmYWxzZSkpXG5AQCAtNTk2LDQ1ICs1NzMsNiBAQCB2b2lkIGJwZl9nZW5fX21hcF9jcmVhdGUoc3RydWN0IGJwZl9nZW4gKmdlbixcbiBcdFx0ZW1pdF9zeXNfY2xvc2Vfc3RhY2soZ2VuLCBzdGFja19vZmYoaW5uZXJfbWFwX2ZkKSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGVtaXRfc2lnbmF0dXJlX21hdGNoKHN0cnVjdCBicGZfZ2VuICpnZW4pXG4te1xuLVx0X19zNjQgb2ZmO1xuLVx0aW50IGk7XG4tXG4tXHQvKlxuLVx0ICogUmVqZWN0IGlmIHRoZSBtZXRhZGF0YSBtYXAgaXMgbm90IGV4Y2x1c2l2ZS4gV2l0aG91dCBleGNsdXNpdml0eVxuLVx0ICogdGhlIGNhY2hlZCBtYXAtXHUwMDNlc2hhW10gdmVyaWZpZWQgYWJvdmUgY2FuIGJlIHN0YWxlOiBhbm90aGVyIEJQRlxuLVx0ICogcHJvZ3JhbSB3aXRoIG1hcCBhY2Nlc3MgY291bGQgaGF2ZSBtdXRhdGVkIHRoZSBjb250ZW50cyBiZXR3ZWVuXG4tXHQgKiBCUEZfT0JKX0dFVF9JTkZPX0JZX0ZEIGFuZCBsb2FkZXIgZXhlY3V0aW9uLlxuLVx0ICovXG4tXHRlbWl0MihnZW4sIEJQRl9MRF9JTU02NF9SQVdfRlVMTChCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCxcbi1cdFx0XHRcdFx0IDAsIDAsIDAsIDApKTtcbi1cdGVtaXQoZ2VuLCBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIFNIQTI1Nl9ESUdFU1RfTEVOR1RIKSk7XG4tXHRvZmYgPSAtKGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0IC0gZ2VuLVx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XG4tXHRpZiAoaXNfc2ltbTE2KG9mZikpIHtcbi1cdFx0ZW1pdChnZW4sIEJQRl9NT1Y2NF9JTU0oQlBGX1JFR183LCAtRUlOVkFMKSk7XG4tXHRcdGVtaXQoZ2VuLCBCUEZfSk1QX0lNTShCUEZfSk5FLCBCUEZfUkVHXzIsIDEsIG9mZikpO1xuLVx0fSBlbHNlIHtcbi1cdFx0Z2VuLVx1MDAzZWVycm9yID0gLUVSQU5HRTtcbi1cdH1cbi1cbi1cdGZvciAoaSA9IDA7IGkgXHUwMDNjIFNIQTI1Nl9EV09SRF9TSVpFOyBpKyspIHtcbi1cdFx0ZW1pdDIoZ2VuLCBCUEZfTERfSU1NNjRfUkFXX0ZVTEwoQlBGX1JFR18xLCBCUEZfUFNFVURPX01BUF9JRFgsXG4tXHRcdFx0XHRcdFx0IDAsIDAsIDAsIDApKTtcbi1cdFx0ZW1pdChnZW4sIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsIGkgKiBzaXplb2YoX191NjQpKSk7XG4tXHRcdGdlbi1cdTAwM2VoYXNoX2luc25fb2Zmc2V0W2ldID0gZ2VuLVx1MDAzZWluc25fY3VyIC0gZ2VuLVx1MDAzZWluc25fc3RhcnQ7XG4tXHRcdGVtaXQyKGdlbiwgQlBGX0xEX0lNTTY0X1JBV19GVUxMKEJQRl9SRUdfMywgMCwgMCwgMCwgMCwgMCkpO1xuLVxuLVx0XHRvZmYgPSAtKGdlbi1cdTAwM2VpbnNuX2N1ciAtIGdlbi1cdTAwM2VpbnNuX3N0YXJ0IC0gZ2VuLVx1MDAzZWNsZWFudXBfbGFiZWwpIC8gOCAtIDI7XG4tXHRcdGlmIChpc19zaW1tMTYob2ZmKSkge1xuLVx0XHRcdGVtaXQoZ2VuLCBCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNywgLUVJTlZBTCkpO1xuLVx0XHRcdGVtaXQoZ2VuLCBCUEZfSk1QX1JFRyhCUEZfSk5FLCBCUEZfUkVHXzIsIEJQRl9SRUdfMywgb2ZmKSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0Z2VuLVx1MDAzZWVycm9yID0gLUVSQU5HRTtcbi1cdFx0fVxuLVx0fVxuLX1cbi1cbiB2b2lkIGJwZl9nZW5fX3JlY29yZF9hdHRhY2hfdGFyZ2V0KHN0cnVjdCBicGZfZ2VuICpnZW4sIGNvbnN0IGNoYXIgKmF0dGFjaF9uYW1lLFxuIFx0XHRcdFx0ICAgZW51bSBicGZfYXR0YWNoX3R5cGUgdHlwZSlcbiB7XG5AQCAtMTIxMSwxMCArMTE0OSwxMCBAQCB2b2lkIGJwZl9nZW5fX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX2dlbiAqZ2VuLCBpbnQgbWFwX2lkeCwgdm9pZCAqcHZhbHVlLFxuIFx0ICogfVxuIFx0ICpcbiBcdCAqIFRoZSBydW50aW1lIGluaXRpYWxfdmFsdWUgY29tZXMgZnJvbSB0aGUgaG9zdC1zdXBwbGllZCBsb2FkZXJcbi1cdCAqIGN0eCBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBibG9iIHZhbHVlIGFmdGVyIGVtaXRfc2lnbmF0dXJlX21hdGNoKClcbi1cdCAqIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCBtYXAtXHUwMDNlc2hhW10uIEZvciBhIHNpZ25lZCBsb2FkZXIgKGdlbl9oYXNoKVxuLVx0ICogdGhlIGF0dGVzdGVkIGJsb2IgdmFsdWUgbXVzdCBiZSBhdXRob3JpdGF0aXZlLCBzbyBza2lwIHRoZSBvdmVycmlkZVxuLVx0ICogYW5kIGxlYXZlIHRoZSBoYXNoZWQgdmFsdWUgaW4gcGxhY2UuXG4rXHQgKiBjdHggYW5kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgYmxvYiB2YWx1ZSB0aGF0IHRoZSBwcm9ncmFtIHNpZ25hdHVyZVxuK1x0ICogY292ZXJzIGFuZCB0aGUga2VybmVsIHZlcmlmaWVzIGF0IGxvYWQgdGltZS4gRm9yIGEgc2lnbmVkIGxvYWRlclxuK1x0ICogKGdlbl9oYXNoKSB0aGUgYXR0ZXN0ZWQgYmxvYiB2YWx1ZSBtdXN0IGJlIGF1dGhvcml0YXRpdmUsIHNvIHNraXBcbitcdCAqIHRoZSBvdmVycmlkZSBhbmQgbGVhdmUgdGhlIHNpZ25lZCB2YWx1ZSBpbiBwbGFjZS5cbiBcdCAqL1xuIFx0aWYgKCFPUFRTX0dFVChnZW4tXHUwMDNlb3B0cywgZ2VuX2hhc2gsIGZhbHNlKSkge1xuIFx0XHRlbWl0KGdlbiwgQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzMsIEJQRl9SRUdfNixcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL2xpYmJwZl9pbnRlcm5hbC5oIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxuaW5kZXggMDRjZDMwM2ZiNWE4NzkuLmQ1YjdkYjcwM2IzZmU5IDEwMDY0NFxuLS0tIGEvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvbGliL2JwZi9saWJicGZfaW50ZXJuYWwuaFxuQEAgLTc2OCw3ICs3NjgsNiBAQCBpbnQgZWxmX3Jlc29sdmVfcGF0dGVybl9vZmZzZXRzKGNvbnN0IGNoYXIgKmJpbmFyeV9wYXRoLCBjb25zdCBjaGFyICpwYXR0ZXJuLFxuIGludCBwcm9iZV9mZChpbnQgZmQpO1xuIFxuICNkZWZpbmUgU0hBMjU2X0RJR0VTVF9MRU5HVEggMzJcbi0jZGVmaW5lIFNIQTI1Nl9EV09SRF9TSVpFIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIC8gc2l6ZW9mKF9fdTY0KVxuIFxuIHZvaWQgbGliYnBmX3NoYTI1Nihjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBfX3U4IG91dFtTSEEyNTZfRElHRVNUX0xFTkdUSF0pO1xuIGludCBwcm9iZV9zeXNfYnBmX2V4dCh2b2lkKTtcbmRpZmYgLS1naXQgYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaCBiL3Rvb2xzL2xpYi9icGYvc2tlbF9pbnRlcm5hbC5oXG5pbmRleCA3NDUwM2QzNThiYzhhNS4uODU1NWFiOGFmNTU0YzMgMTAwNjQ0XG4tLS0gYS90b29scy9saWIvYnBmL3NrZWxfaW50ZXJuYWwuaFxuKysrIGIvdG9vbHMvbGliL2JwZi9za2VsX2ludGVybmFsLmhcbkBAIC0zMjAsMjUgKzMyMCw2IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNrZWxfbGlua19jcmVhdGUoaW50IHByb2dfZmQsIGludCB0YXJnZXRfZmQsXG4gXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9MSU5LX0NSRUFURSwgXHUwMDI2YXR0ciwgYXR0cl9zeik7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgaW50IHNrZWxfb2JqX2dldF9pbmZvX2J5X2ZkKGludCBmZClcbi17XG4tXHRjb25zdCBzaXplX3QgYXR0cl9zeiA9IG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBpbmZvKTtcbi1cdF9fdTggc2hhW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTtcbi1cdHN0cnVjdCBicGZfbWFwX2luZm8gaW5mbztcbi1cdF9fdTMyIGluZm9fbGVuID0gc2l6ZW9mKGluZm8pO1xuLVx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbi1cbi1cdG1lbXNldChcdTAwMjZpbmZvLCAwLCBzaXplb2YoaW5mbykpO1xuLVx0aW5mby5oYXNoID0gKGxvbmcpIFx1MDAyNnNoYTtcbi1cdGluZm8uaGFzaF9zaXplID0gU0hBMjU2X0RJR0VTVF9MRU5HVEg7XG4tXG4tXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgYXR0cl9zeik7XG4tXHRhdHRyLmluZm8uYnBmX2ZkID0gZmQ7XG4tXHRhdHRyLmluZm8uaW5mbyA9IChsb25nKSBcdTAwMjZpbmZvO1xuLVx0YXR0ci5pbmZvLmluZm9fbGVuID0gaW5mb19sZW47XG4tXHRyZXR1cm4gc2tlbF9zeXNfYnBmKEJQRl9PQkpfR0VUX0lORk9fQllfRkQsIFx1MDAyNmF0dHIsIGF0dHJfc3opO1xuLX1cbi1cbiBzdGF0aWMgaW5saW5lIGludCBza2VsX21hcF9mcmVlemUoaW50IGZkKVxuIHtcbiBcdGNvbnN0IHNpemVfdCBhdHRyX3N6ID0gb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIG1hcF9mZCk7XG5AQCAtMzg0LDEyICszNjUsNiBAQCBzdGF0aWMgaW5saW5lIGludCBicGZfbG9hZF9hbmRfcnVuKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gXHRcdHNldF9lcnI7XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuLVx0ZXJyID0gc2tlbF9vYmpfZ2V0X2luZm9fYnlfZmQobWFwX2ZkKTtcbi1cdGlmIChlcnIgXHUwMDNjIDApIHtcbi1cdFx0b3B0cy1cdTAwM2VlcnJzdHIgPSBcImZhaWxlZCB0byBmZXRjaCBvYmogaW5mb1wiO1xuLVx0XHRzZXRfZXJyO1xuLVx0XHRnb3RvIG91dDtcbi1cdH1cbiAjZW5kaWZcbiBcbiBcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBwcm9nX2xvYWRfYXR0cl9zeik7XG5AQCAtNDAwLDYgKzM3NSw4IEBAIHN0YXRpYyBpbmxpbmUgaW50IGJwZl9sb2FkX2FuZF9ydW4oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiAjaWZuZGVmIF9fS0VSTkVMX19cbiBcdGF0dHIuc2lnbmF0dXJlID0gKGxvbmcpIG9wdHMtXHUwMDNlc2lnbmF0dXJlO1xuIFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IG9wdHMtXHUwMDNlc2lnbmF0dXJlX3N6O1xuK1x0aWYgKG9wdHMtXHUwMDNlc2lnbmF0dXJlKVxuK1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gI2Vsc2VcbiBcdGlmIChvcHRzLVx1MDAzZXNpZ25hdHVyZSB8fCBvcHRzLVx1MDAzZXNpZ25hdHVyZV9zeilcbiBcdFx0cHJfd2FybihcInNpZ25hdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZnJvbSBicGZfcHJlbG9hZFxcblwiKTtcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbmluZGV4IDVmYzQxN2UzMWZjNjE1Li5iM2FjM2Q5YjBlMzE2ZCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG5AQCAtMTEsNiArMTEsOCBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2tleWN0bC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbisjaW5jbHVkZSBcdTAwM2NicGYvYnRmLmhcdTAwM2VcbitcbiAjaW5jbHVkZSBcImJwZi9saWJicGZfaW50ZXJuYWwuaFwiIC8qIGZvciBsaWJicGZfc2hhMjU2KCkgKi9cbiAjaW5jbHVkZSBcImJwZi9za2VsX2ludGVybmFsLmhcIlx0IC8qIGZvciBsb2FkZXIgY3R4IGxheW91dCAoYnBmX2xvYWRlcl9jdHggZXRjKSAqL1xuIFxuQEAgLTE5LDggKzIxLDYgQEBcbiAjaW5jbHVkZSBcInRlc3Rfc2lnbmVkX2xvYWRlcl9kYXRhLnNrZWwuaFwiXG4gI2luY2x1ZGUgXCJ0ZXN0X3NpZ25lZF9sb2FkZXJfbHNtLnNrZWwuaFwiXG4gXG4tI2RlZmluZSBTSUdfTUFUQ0hfSU5TTlMgMzMgLyogZXhjbCAoNSkgKyA0ICogc2hhLWR3b3JkICg3KSAqL1xuLVxuIGVudW0ge1xuIFx0QlBGX1NJR19VTlNJR05FRCA9IDAsXG4gXHRCUEZfU0lHX1ZFUklGSUVELFxuQEAgLTM1LDcgKzM1LDggQEAgZW51bSB7XG4gfTtcbiBcbiBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbi1cdFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkKVxuK1x0XHQgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsXG4rXHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4ge1xuIFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBmZDtcbkBAIC01Miw2ICs1Myw3IEBAIHN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxuIFx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuIFx0XHRhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkO1xuIFx0fVxuK1x0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XG4gXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbiBcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiBcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuQEAgLTYyLDE0ICs2NCwxMiBAQCBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeixcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKmRhdGEsIF9fdTMyIGRhdGFfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpleGNsLCBfX3UzMiBleGNsX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osXG4tXHRcdFx0ICBib29sIGdldF9oYXNoLCB2b2lkICpjdHgsIF9fdTMyIGN0eF9zeiwgYm9vbCAqbG9hZGVyX3JhbilcbitcdFx0XHQgIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBib29sICpsb2FkZXJfcmFuKVxuIHtcbiBcdExJQkJQRl9PUFRTKGJwZl9tYXBfY3JlYXRlX29wdHMsIG1vcHRzLFxuIFx0XHQgICAgLmV4Y2xfcHJvZ19oYXNoID0gZXhjbCxcbiBcdFx0ICAgIC5leGNsX3Byb2dfaGFzaF9zaXplID0gZXhjbF9zeik7XG4tXHRfX3U4IGhidWZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdO1xuLVx0c3RydWN0IGJwZl9tYXBfaW5mbyBpbmZvO1xuLVx0X191MzIgaWxlbiA9IHNpemVvZihpbmZvKSwga2V5ID0gMDtcbitcdF9fdTMyIGtleSA9IDA7XG4gXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IG1hcF9mZCwgcHJvZ19mZCwgcmV0O1xuIFxuQEAgLTg3LDE1ICs4Nyw2IEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxuIFx0XHRyZXQgPSAtZXJybm87XG4gXHRcdGdvdG8gb3V0X21hcDtcbiBcdH1cbi1cdGlmIChnZXRfaGFzaCkge1xuLVx0XHRtZW1zZXQoXHUwMDI2aW5mbywgMCwgc2l6ZW9mKGluZm8pKTtcbi1cdFx0aW5mby5oYXNoID0gcHRyX3RvX3U2NChoYnVmKTtcbi1cdFx0aW5mby5oYXNoX3NpemUgPSBzaXplb2YoaGJ1Zik7XG4tXHRcdGlmIChicGZfbWFwX2dldF9pbmZvX2J5X2ZkKG1hcF9mZCwgXHUwMDI2aW5mbywgXHUwMDI2aWxlbikpIHtcbi1cdFx0XHRyZXQgPSAtZXJybm87XG4tXHRcdFx0Z290byBvdXRfbWFwO1xuLVx0XHR9XG4tXHR9XG4gXG4gXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbiBcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuQEAgLTEwOCw2ICs5OSw3IEBAIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxuIFx0XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbiBcdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbiBcdFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuK1x0XHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4gXHR9XG4gXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbiBcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuQEAgLTIzNiw3OSArMjI4LDYgQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4tc3RhdGljIHZvaWQgY2hlY2tfc2lnX21hdGNoX3NoYXBlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqaW4sIGludCBuKVxuLXtcbi1cdGludCBhID0gLTEsIGNsZWFudXAgPSAtMSwgaSwgYmFzZSwgdCwgYnJbNV0sIG5iID0gMDtcbi1cbi1cdC8qIEJQRl9QU0VVRE9fTUFQX0lEWCAodGhlIHN0cnVjdCBicGZfbWFwICogZm9ybSkgaXMgdXNlZCBvbmx5IGhlcmUuICovXG4tXHRmb3IgKGkgPSAwOyBpICsgMSBcdTAwM2MgbjsgaSsrKSB7XG4tXHRcdGlmIChpbltpXS5jb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2ldLnNyY19yZWcgPT0gQlBGX1BTRVVET19NQVBfSURYKSB7XG4tXHRcdFx0YSA9IGk7XG4tXHRcdFx0YnJlYWs7XG4tXHRcdH1cbi1cdH1cbi1cdGlmICghQVNTRVJUX0dFKGEsIDAsIFwiZW1pdF9zaWduYXR1cmVfbWF0Y2ggcHJlc2VudFwiKSlcbi1cdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfTEUoYSArIFNJR19NQVRDSF9JTlNOUywgbiwgXCJibG9jayBmaXRzIGluIHByb2dyYW1cIikpXG4tXHRcdHJldHVybjtcbi1cbi1cdC8qIGV4Y2wgY2hlY2s6IHIyID0gKih1MzIgKikobWFwICsgMzIpOyBpZiByMiAhPSAxIGdvdG8gY2xlYW51cCAqL1xuLVx0QVNTRVJUX0VRKGluW2EgKyAyXS5jb2RlLCAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVyksIFwiZXhjbCBsb2FkIHdpZHRoXCIpO1xuLVx0QVNTRVJUX0VRKGluW2EgKyAyXS5vZmYsIFNIQTI1Nl9ESUdFU1RfTEVOR1RILCBcImV4Y2wgZmllbGQgb2Zmc2V0XCIpO1xuLVx0QVNTRVJUX0VRKGluW2EgKyA0XS5jb2RlLCAoQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSyksIFwiZXhjbCBicmFuY2ggb3BcIik7XG4tXHRBU1NFUlRfRVEoaW5bYSArIDRdLmltbSwgMSwgXCJleGNsIGNvbXBhcmVkIHRvIDFcIik7XG4tXHRicltuYisrXSA9IGEgKyA0O1xuLVxuLVx0LyogNCBzaGEtZHdvcmQgY2hlY2tzOiByMiA9ICoodTY0ICopKG1hcCArIGkqOCk7IGlmIHIyICE9IHIzIGdvdG8gY2xlYW51cCAqL1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgNDsgaSsrKSB7XG4tXHRcdGJhc2UgPSBhICsgNSArIGkgKiA3O1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSArIDJdLmNvZGUsIChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVyksIFwic2hhIGxvYWQgd2lkdGhcIik7XG4tXHRcdEFTU0VSVF9FUShpbltiYXNlICsgMl0ub2ZmLCBpICogOCwgXCJzaGEgZHdvcmQgb2Zmc2V0XCIpO1xuLVx0XHRBU1NFUlRfRVEoaW5bYmFzZSArIDNdLmNvZGUsIChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSwgXCJzaGEgaW1tNjQgKEhfbWV0YSlcIik7XG4tXHRcdEFTU0VSVF9FUShpbltiYXNlICsgNl0uY29kZSwgKEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1gpLCBcInNoYSBicmFuY2ggb3BcIik7XG4tXHRcdGJyW25iKytdID0gYmFzZSArIDY7XG4tXHR9XG4tXG4tXHQvKlxuLVx0ICogTG9jYXRlIHRoZSByZWFsIGNsZWFudXAgbGFiZWwgc28gd2UgY2FuIHBpbiB0aGUgZXhhY3QganVtcCB0YXJnZXQsXG4tXHQgKiBub3QganVzdCBcInNvbWUgYmFja3dhcmQgbGFiZWxcIi4gYnBmX2dlbl9faW5pdCgpIGVtaXRzIHRoZSBjbGVhbnVwXG4tXHQgKiBibG9jayBhcyBhIHByb2ctZmQgY2xvc2UgbG9vcCB3aG9zZSBmaXJzdCBpbnN0cnVjdGlvbiBpcyB0aGUgbGFiZWxcbi1cdCAqIGV2ZXJ5IGVycm9yIGJyYW5jaCBqdW1wcyB0by5cbi1cdCAqL1xuLVx0Zm9yIChpID0gMDsgaSArIDIgXHUwMDNjIGE7IGkrKykge1xuLVx0XHRpZiAoaW5baV0uY29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfVykgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcdTAwMjZcdTAwMjYgaW5baV0uc3JjX3JlZyA9PSBCUEZfUkVHXzEwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSArIDFdLmNvZGUgPT0gKEJQRl9KTVAgfCBCUEZfSlNMRSB8IEJQRl9LKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIGluW2kgKyAxXS5kc3RfcmVnID09IEJQRl9SRUdfMSBcdTAwMjZcdTAwMjYgaW5baSArIDFdLmltbSA9PSAwIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSArIDFdLm9mZiA9PSAxIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgaW5baSArIDJdLmNvZGUgPT0gKEJQRl9KTVAgfCBCUEZfQ0FMTCkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBpbltpICsgMl0uaW1tID09IEJQRl9GVU5DX3N5c19jbG9zZSkge1xuLVx0XHRcdGNsZWFudXAgPSBpO1xuLVx0XHRcdGJyZWFrO1xuLVx0XHR9XG4tXHR9XG4tXHRpZiAoIUFTU0VSVF9HRShjbGVhbnVwLCAwLCBcImNsZWFudXAgbGFiZWwgbG9jYXRlZFwiKSlcbi1cdFx0cmV0dXJuO1xuLVx0Zm9yIChpID0gMDsgaSBcdTAwM2MgbmI7IGkrKykge1xuLVx0XHR0ID0gYnJbaV0gKyAxICsgaW5bYnJbaV1dLm9mZjtcbi1cdFx0QVNTRVJUX0VRKHQsIGNsZWFudXAsIFwic2lnLW1hdGNoIGxhbmRzIG9uIGNsZWFudXBcIik7XG4tXHR9XG4tXHQvKlxuLVx0ICogU2FtZSBpbnZhcmlhbnQgZm9yIGV2ZXJ5IG90aGVyIGNsZWFudXAtYm91bmQganVtcCBpbiB0aGUgcHJvZ3JhbTpcbi1cdCAqIGVtaXRfY2hlY2tfZXJyKCkgaXMgdGhlIG9ubHkgc291cmNlIG9mIFwiaWYgKHI3IFx1MDAzYyAwKSBnb3RvIGNsZWFudXBcIixcbi1cdCAqIHNvIGVhY2ggb2YgdGhvc2UgbXVzdCBhbHNvIHJlc29sdmUgZXhhY3RseSB0byBjbGVhbnVwLlxuLVx0ICovXG4tXHRmb3IgKGkgPSAwLCB0ID0gMDsgaSBcdTAwM2MgbjsgaSsrKSB7XG4tXHRcdGlmIChpbltpXS5jb2RlICE9IChCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfSykgfHxcbi1cdFx0ICAgIGluW2ldLmRzdF9yZWcgIT0gQlBGX1JFR183IHx8IGluW2ldLmltbSAhPSAwIHx8IGluW2ldLm9mZiBcdTAwM2U9IDApXG4tXHRcdFx0Y29udGludWU7XG4tXHRcdEFTU0VSVF9FUShpICsgMSArIGluW2ldLm9mZiwgY2xlYW51cCwgXCJlcnItY2hlY2sgbGFuZHMgb24gY2xlYW51cFwiKTtcbi1cdFx0dCsrO1xuLVx0fVxuLVx0QVNTRVJUX0dUKHQsIDAsIFwiZm91bmQgZW1pdF9jaGVja19lcnIganVtcHNcIik7XG4tfVxuLVxuIHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUge1xuIFx0c3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbDtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgZ29wdHM7XG5AQCAtMzcyLDE2ICsyOTEsNiBAQCBzdGF0aWMgdm9pZCBnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmKVxuIFx0dGVzdF9zaWduZWRfbG9hZGVyX19kZXN0cm95KGYtXHUwMDNlc2tlbCk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIG1ldGFkYXRhX2NoZWNrX3NoYXBlKHZvaWQpXG4te1xuLVx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVxuLVx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApXG4tXHRcdGNoZWNrX3NpZ19tYXRjaF9zaGFwZSgoY29uc3Qgc3RydWN0IGJwZl9pbnNuICopZi5nb3B0cy5pbnNucyxcbi1cdFx0XHRcdCAgICAgIGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKSk7XG4tXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbi19XG4tXG4gc3RhdGljIHZvaWQgbWV0YWRhdGFfbWF0Y2godm9pZClcbiB7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG5AQCAtMzkxLDk0ICszMDAsMjIwIEBAIHN0YXRpYyB2b2lkIG1ldGFkYXRhX21hdGNoKHZvaWQpXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxuIFx0XHRcdFx0ICAgZi5kYXRhX3N6LCBmLmV4Y2wsIHNpemVvZihmLmV4Y2wpLCBOVUxMLCAwLFxuLVx0XHRcdFx0ICAgdHJ1ZSwgZi5jdHgsIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuK1x0XHRcdFx0ICAgZi5jdHgsIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0XHRBU1NFUlRfVFJVRShyYW4sIFwibG9hZGVyIHJhblwiKTtcbiBcdFx0QVNTRVJUX0VRKHIsIDAsIFwiaG9uZXN0IGxvYWRlciByZXR2YWxcIik7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgbWV0YWRhdGFfc2hhX21pc21hdGNoKHZvaWQpXG4rc3RhdGljIHZvaWQgc2lnbmF0dXJlX2VuZm9yY2VkKHZvaWQpXG4ge1xuK1x0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4tXHRib29sIHJhbjtcbi1cdGludCByO1xuK1x0aW50IGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogYmxvYlswXSBsaXZlcyBpbiB0aGUgbG9hZGVyJ3MgZmRfYXJyYXkgc2NyYXRjaCAoZmlyc3QgYWRkX2RhdGEgaW5cbi1cdFx0ICogYnBmX2dlbl9faW5pdCk7IGEgMC1tYXAgcHJvZ3JhbSBuZXZlciByZWFkcyBpdCwgc28gZmxpcHBpbmcgaXRcbi1cdFx0ICogY2hhbmdlcyBvbmx5IG1hcC1cdTAwM2VzaGEuIFRoZSBtZXRhZGF0YSBjaGVjayBpcyB0aGUgb25seSB0aGluZyB0aGF0XG4tXHRcdCAqIGNhbiBub3RpY2UgLVx1MDAzZSBpc29sYXRlcyBlbWl0X3NpZ25hdHVyZV9tYXRjaC5cbitcdFx0ICogQSBwcmVzZW50LWJ1dC1pbnZhbGlkIHNpZ25hdHVyZSAodGhlIGNlcnQgYnl0ZXMgYXJlIG5vdCBhXG4rXHRcdCAqIFBLQ1MjNyBzaWduYXR1cmUpIG11c3QgYmUgcmVqZWN0ZWQgYXQgbG9hZDogdGhlIHNpZ25hdHVyZVxuK1x0XHQgKiBwYXRoIGlzIGhvbm9yZWQsIG5vdCBpZ25vcmVkLiAoVGhlIHZhbGlkIHBhdGggaXMgY292ZXJlZCBieVxuK1x0XHQgKiB0aGUgc2lnbmVkIGxza2Vscy4pXG4gXHRcdCAqL1xuLVx0XHRmLmJsb2JbMF0gXj0gMHhmZjtcbi1cdFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYixcbi1cdFx0XHRcdCAgIGYuZGF0YV9zeiwgZi5leGNsLCBzaXplb2YoZi5leGNsKSwgTlVMTCwgMCxcbi1cdFx0XHRcdCAgIHRydWUsIGYuY3R4LCBmLmN0eF9zeiwgXHUwMDI2cmFuKTtcbi1cdFx0QVNTRVJUX1RSVUUocmFuLCBcImxvYWRlciByYW5cIik7XG4tXHRcdEFTU0VSVF9FUShyLCAtRUlOVkFMLCBcInRhbXBlcmVkIGJsb2IgcmVqZWN0ZWQgYnkgZW1pdF9zaWduYXR1cmVfbWF0Y2hcIik7XG4rXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4rXHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuK1x0XHRBU1NFUlRfTFQoZmQsIDAsIFwiaW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZFwiKTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9ub3RfZXhjbHVzaXZlKHZvaWQpXG4rc3RhdGljIHZvaWQgc2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiB7XG4rXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdGJvb2wgcmFuO1xuLVx0aW50IHI7XG4rXHRpbnQgbWFwX2ZkLCBmZDtcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4gXHRcdC8qXG4tXHRcdCAqIENvcnJlY3QgYmxvYiBidXQgYSBub24tZXhjbHVzaXZlIG1ldGFkYXRhIG1hcDogdGhlIHZlcmlmaWVyIGRvZXNcbi1cdFx0ICogbm90IHJlamVjdCAoZXhjbF9wcm9nX3NoYSB1bnNldCksIHNvIHRoZSBydW50aW1lIG1hcC1cdTAwM2VleGNsID09IDFcbi1cdFx0ICogY2hlY2sgaW4gdGhlIGxvYWRlciBtdXN0LlxuK1x0XHQgKiBBIHNpZ25lZCBwcm9ncmFtIG1heSBvbmx5IGJpbmQgZXhjbHVzaXZlIG1hcHMgdGhyb3VnaCBmZF9hcnJheVxuK1x0XHQgKiAodGhlaXIgY29udGVudHMgYXJlIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUpLiBCaW5kaW5nIGFcbitcdFx0ICogbm9uLWV4Y2x1c2l2ZSBtYXAgaXMgcmVqZWN0ZWQsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGlzIGV2ZW5cbitcdFx0ICogZXhhbWluZWQuXG4gXHRcdCAqL1xuLVx0XHRyID0gcnVuX2dlbl9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLFxuLVx0XHRcdFx0ICAgZi5kYXRhX3N6LCBOVUxMLCAwLCBOVUxMLCAwLCB0cnVlLCBmLmN0eCxcbi1cdFx0XHRcdCAgIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuLVx0XHRBU1NFUlRfVFJVRShyYW4sIFwibG9hZGVyIHJhblwiKTtcbi1cdFx0QVNTRVJUX0VRKHIsIC1FSU5WQUwsIFwibm9uLWV4Y2x1c2l2ZSBtZXRhZGF0YSBtYXAgcmVqZWN0ZWRcIik7XG4rXHRcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCJub25leGNsXCIsIDQsXG4rXHRcdFx0XHRcdGYuZGF0YV9zeiwgMSwgTlVMTCk7XG4rXHRcdGlmIChBU1NFUlRfT0tfRkQobWFwX2ZkLCBcIm5vbmV4Y2xfbWFwXCIpKSB7XG4rXHRcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsXG4rXHRcdFx0XHRcdCBqdW5rLCBzaXplb2YoanVuayksXG4rXHRcdFx0XHRcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xuK1x0XHRcdEFTU0VSVF9FUShmZCwgLUVQRVJNLFxuK1x0XHRcdFx0ICBcIm5vbi1leGNsdXNpdmUgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFwiKTtcbitcdFx0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdFx0Y2xvc2UoZmQpO1xuK1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRcdH1cbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZCh2b2lkKVxuK3N0YXRpYyB2b2lkIHNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIHtcbitcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMpO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0Ym9vbCByYW47XG4tXHRpbnQgcjtcbitcdGludCBtYXBfZmQsIGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogQ29ycmVjdCwgZXhjbHVzaXZlLCBmcm96ZW4gbWFwLCBidXQgaXRzIGhhc2ggd2FzIG5ldmVyIGNvbXB1dGVkXG4tXHRcdCAqIChubyBPQkpfR0VUX0lORk9fQllfRkQpLCBzbyBtYXAtXHUwMDNlc2hhIHN0YXlzIHplcm8uIFRoZSBsb2FkZXIgbXVzdFxuLVx0XHQgKiBmYWlsIGNsb3NlZCByYXRoZXIgdGhhbiB0cmVhdCBhbiB1bnNldCBoYXNoIGFzIGEgbWF0Y2guXG4rXHRcdCAqIE9ubHkgYSBwbGFpbiBCUEZfTUFQX1RZUEVfQVJSQVkgbWF5IGJlIGZvbGRlZCBpbnRvIHRoZVxuK1x0XHQgKiBzaWduYXR1cmUuIEFuIGV4Y2x1c2l2ZSBtYXAgb2YgYW55IG90aGVyIHR5cGUgaXMgcmVqZWN0ZWRcbitcdFx0ICogKC1FSU5WQUwpIHJhdGhlciB0aGFuIGZvbGRlZCAtIHRoaXMgaXMgdGhlIHR5cGUgZ2F0ZSB0aGF0XG4rXHRcdCAqIGtlZXBzIGFyZW5hIG1hcHMgKG1hcF9kaXJlY3RfdmFsdWVfYWRkcigpIHJldHVybnMgYSB1c2VyXG4rXHRcdCAqIGFkZHJlc3MpIGFuZCBpbnNuLWFycmF5IG1hcHMgKGJ1ZmZlciBzbWFsbGVyIHRoYW4gdmFsdWVfc2l6ZSlcbitcdFx0ICogb3V0IG9mIHRoZSBoYXNoZWQgcmVnaW9uLCB3aGVyZSB0aGUgb2xkIGNvZGUgd291bGQgaGF2ZVxuK1x0XHQgKiBtZW1jcHkoKSdkIGZyb20gdGhlbS4gQSBoYXNoIG1hcCBzdGFuZHMgaW4gaGVyZTogaXQgaXNcbitcdFx0ICogZXhjbHVzaXZlIChib3VuZCB0byB0aGUgbG9hZGVyIGRpZ2VzdCkgYnV0IG5vdCBhbiBhcnJheS5cbiBcdFx0ICovXG4tXHRcdHIgPSBydW5fZ2VuX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsXG4tXHRcdFx0XHQgICBmLmRhdGFfc3osIGYuZXhjbCwgc2l6ZW9mKGYuZXhjbCksIE5VTEwsIDAsXG4tXHRcdFx0XHQgICBmYWxzZSwgZi5jdHgsIGYuY3R4X3N6LCBcdTAwMjZyYW4pO1xuLVx0XHRBU1NFUlRfVFJVRShyYW4sIFwibG9hZGVyIHJhblwiKTtcbi1cdFx0QVNTRVJUX0VRKHIsIC1FSU5WQUwsIFwidW5jb21wdXRlZCBtZXRhZGF0YSBoYXNoIHJlamVjdGVkXCIpO1xuK1x0XHRtb3B0cy5leGNsX3Byb2dfaGFzaCA9IGYuZXhjbDtcbitcdFx0bW9wdHMuZXhjbF9wcm9nX2hhc2hfc2l6ZSA9IHNpemVvZihmLmV4Y2wpO1xuK1x0XHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfSEFTSCwgXCJleGNsX2hhc2hcIiwgNCwgNCwgMSxcbitcdFx0XHRcdFx0XHUwMDI2bW9wdHMpO1xuK1x0XHRpZiAoQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCJleGNsX2hhc2hfbWFwXCIpKSB7XG4rXHRcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsXG4rXHRcdFx0XHRcdCBqdW5rLCBzaXplb2YoanVuayksXG4rXHRcdFx0XHRcdCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xuK1x0XHRcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCxcbitcdFx0XHRcdCAgXCJub24tYXJyYXkgbWFwIGluIHNpZ25lZCBmZF9hcnJheSByZWplY3RlZFwiKTtcbitcdFx0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdFx0Y2xvc2UoZmQpO1xuK1x0XHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRcdH1cbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBzaWduYXR1cmVfZW5mb3JjZWQodm9pZClcbitzdGF0aWMgaW50IHNldHVwX21ldGFfbWFwKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYpO1xuK1xuK3N0YXRpYyB2b2lkIHNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbit7XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlcl9idGZYWFhYWFhcIiwgKmRpciA9IE5VTEw7XG4rXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuK1x0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7XG4rXHR1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMO1xuK1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuK1x0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcbitcdHN0cnVjdCBidGYgKmJ0ZiA9IE5VTEw7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0aW50IGZkc1syXTtcbitcdF9fdTggc2lnWzgxOTJdO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpICE9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1x0aGF2ZV9maXh0dXJlID0gdHJ1ZTtcbitcbitcdC8qXG4rXHQgKiBmZF9hcnJheSBiaW5kcyBtYXBzIGFuZCBCVEZzIGFsaWtlLCBidXQgb25seSBleGNsdXNpdmUgYXJyYXkgbWFwcyBhcmVcbitcdCAqIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUuIEJ1aWxkIGFuIG90aGVyd2lzZSBnZW51aW5lbHkgc2lnbmVkIGxvYWQgLVxuK1x0ICogaW5zbnMgfHwgbWV0YWRhdGEsIGV4Y2x1c2l2ZSBmcm96ZW4gbWFwIGF0IGZkX2FycmF5WzBdIC0gdGhlbiBzbXVnZ2xlXG4rXHQgKiBhbiBleHRyYSBCVEYgaW50byBmZF9hcnJheVsxXS4gQSBzaWduZWQgcHJvZ3JhbSBtYXkgbm90IGJpbmQgYW55IEJURixcbitcdCAqIHNvIHJlc29sdmluZyB0aGUgZmRfYXJyYXkgZW50cmllcyByZWplY3RzIHRoZSBCVEYgd2l0aCAtRUFDQ0VTIChpblxuK1x0ICogX19hZGRfdXNlZF9idGYoKSwgYmVmb3JlIHRoZSBzaWduYXR1cmUgaXMgZXZlbiB2ZXJpZmllZCkuXG4rXHQgKi9cbitcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXCJzaWduYnVmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuK1x0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6LCBzaWcsXG4rXHRcdFx0ICAgICAgIFx1MDAyNnNpZ19zeiksIFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoXHUwMDI2Zik7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFwibWV0YV9tYXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0YnRmID0gYnRmX19uZXdfZW1wdHkoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihidGYsIFwiYnRmX25ld19lbXB0eVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJidGZfbG9hZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRmZHNbMF0gPSBtYXBfZmQ7XG4rXHRmZHNbMV0gPSBidGZfX2ZkKGJ0Zik7XG4rXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbitcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuK1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XG4rXHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuK1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbitcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbitcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KGZkcyk7XG4rXHRhdHRyLmZkX2FycmF5X2NudCA9IDI7XG4rXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbitcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4rXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbitcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdEFTU0VSVF9FUShwcm9nX2ZkIFx1MDAzYyAwID8gLWVycm5vIDogcHJvZ19mZCwgLUVBQ0NFUyxcbitcdFx0ICBcIkJURiBpbiBzaWduZWQgZmRfYXJyYXkgcmVqZWN0ZWQgcG9zdC12ZXJpZmllclwiKTtcbitcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UocHJvZ19mZCk7XG4rb3V0OlxuK1x0aWYgKGJ0ZilcbitcdFx0YnRmX19mcmVlKGJ0Zik7XG4rXHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UobWFwX2ZkKTtcbitcdGlmIChoYXZlX2ZpeHR1cmUpXG4rXHRcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuK1x0aWYgKGRpcilcbitcdFx0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK1x0ZnJlZShidWYpO1xuK31cbitcbitzdGF0aWMgdm9pZCBzaWduYXR1cmVfZmFpbHVyZV9sb2dzKHZvaWQpXG4ge1xuIFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XG4rXHRjaGFyIGxvZ19idWZbMTAyNF0gPSB7fTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuIFx0XHQvKlxuLVx0XHQgKiBBIHByZXNlbnQtYnV0LWludmFsaWQgc2lnbmF0dXJlICh0aGUgY2VydCBieXRlcyBhcmUgbm90IGFcbi1cdFx0ICogUEtDUyM3IHNpZ25hdHVyZSkgbXVzdCBiZSByZWplY3RlZCBhdCBsb2FkOiB0aGUgc2lnbmF0dXJlXG4tXHRcdCAqIHBhdGggaXMgaG9ub3JlZCwgbm90IGlnbm9yZWQuIChUaGUgdmFsaWQgcGF0aCBpcyBjb3ZlcmVkIGJ5XG4tXHRcdCAqIHRoZSBzaWduZWQgbHNrZWxzLilcbitcdFx0ICogU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBub3cgcnVucyBpbnNpZGUgYnBmX2NoZWNrKCksIHNvIGFcbitcdFx0ICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtXG4rXHRcdCAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LlxuIFx0XHQgKi9cbi1cdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbi1cdFx0XHRcdCBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuK1x0XHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XG4rXHRcdGF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4rXHRcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4rXHRcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbitcdFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KGp1bmspO1xuK1x0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2l6ZW9mKGp1bmspO1xuK1x0XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rXHRcdGF0dHIubG9nX2xldmVsID0gMTtcbitcdFx0YXR0ci5sb2dfYnVmID0gcHRyX3RvX3U2NChsb2dfYnVmKTtcbitcdFx0YXR0ci5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcbitcdFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcIl9fbG9hZGVyLnByb2dcIiwgc2l6ZW9mKFwiX19sb2FkZXIucHJvZ1wiKSk7XG4rXG4rXHRcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbitcdFx0XHQgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4gXHRcdEFTU0VSVF9MVChmZCwgMCwgXCJpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkXCIpO1xuK1x0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkKTtcbitcdFx0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZFwiLFxuK1x0XHRcdFx0ICBcInZlcmlmaWVyIGxvZ3Mgc2lnbmF0dXJlIGZhaWx1cmVcIik7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG5AQCAtNDk1LDcgKzUzMCw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV90b29fbGFyZ2Uodm9pZClcbiBcdFx0ICogaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXIgaXMgcmVhZC5cbiBcdFx0ICovXG4gXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4tXHRcdFx0XHQgNjQgXHUwMDNjXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuK1x0XHRcdFx0IDY0IFx1MDAzY1x1MDAzYyAyMCwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbiBcdFx0QVNTRVJUX0VRKGZkLCAtRUlOVkFMLCBcIm92ZXJzaXplZCBzaWduYXR1cmUgcmVqZWN0ZWRcIik7XG4gXHR9XG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbkBAIC01MTUsNyArNTUwLDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2JhZF9rZXlyaW5nKHZvaWQpXG4gXHRcdCAqIGxhcmdlIHBvc2l0aXZlIHNlcmlhbCB0YWtlcyB0aGUgdXNlci1rZXlyaW5nIHBhdGggYW5kIHdvbid0IGV4aXN0LlxuIFx0XHQgKi9cbiBcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbi1cdFx0XHRcdCBzaXplb2YoanVuayksIElOVF9NQVgpO1xuK1x0XHRcdFx0IHNpemVvZihqdW5rKSwgSU5UX01BWCwgMCk7XG4gXHRcdEFTU0VSVF9FUShmZCwgLUVJTlZBTCwgXCJzaWduYXR1cmUgd2l0aCBiYWQga2V5cmluZ19pZCByZWplY3RlZFwiKTtcbiBcdH1cbiBcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuQEAgLTU3NSw3ICs2MTAsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCh2b2lkKVxuIFx0bWVtY3B5KGJsb2IsIGdvcHRzLmRhdGEsIGRhdGFfc3opO1xuIFxuIFx0ciA9IHJ1bl9nZW5fbG9hZGVyKGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcbi1cdFx0XHQgICBleGNsLCBzaXplb2YoZXhjbCksIE5VTEwsIDAsIHRydWUsIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuK1x0XHRcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4gXHRpZiAoIUFTU0VSVF9UUlVFKHJhbiwgXCJsb2FkZXIgcmFuXCIpIHx8XG4gXHQgICAgIUFTU0VSVF9FUShyLCAwLCBcImxvYWRlciByZXR2YWxcIikpXG4gXHRcdGdvdG8gZnJlZV9ibG9iO1xuQEAgLTY2MSw3ICs2OTYsNyBAQCBzdGF0aWMgdm9pZCBtZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkKHZvaWQpXG4gXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4gXG4gXHRyID0gcnVuX2dlbl9sb2FkZXIoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBibG9iLCBkYXRhX3N6LFxuLVx0XHRcdCAgIGV4Y2wsIHNpemVvZihleGNsKSwgTlVMTCwgMCwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgZXhjbCwgc2l6ZW9mKGV4Y2wpLCBOVUxMLCAwLCBjdHgsIGN0eF9zeiwgXHUwMDI2cmFuKTtcbiBcdGlmICghQVNTRVJUX1RSVUUocmFuLCBcImxvYWRlciByYW5cIikgfHxcbiBcdCAgICAhQVNTRVJUX0VRKHIsIDAsIFwibG9hZGVyIHJldHZhbFwiKSlcbiBcdFx0Z290byBmcmVlX2Jsb2I7XG5AQCAtNzE0LDYgKzc0OSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRfX3U4IGV4Y2xbU0hBMjU2X0RJR0VTVF9MRU5HVEhdLCBzaWdbODE5Ml07XG4gXHRfX3UzMiBzaWdfc3ogPSBzaXplb2Yoc2lnKSwgaW5zbnNfc3osIGRhdGFfc3osIGN0eF9zejtcbiBcdHVuc2lnbmVkIGNoYXIgKmluc25zID0gTlVMTCwgKnRhbXBlcmVkID0gTlVMTCwgKmJsb2IgPSBOVUxMO1xuK1x0dW5zaWduZWQgY2hhciAqc2lnbmJ1ZiA9IE5VTEw7XG4gXHRpbnQgbnJfbWFwcyA9IDAsIG5yX3Byb2dzID0gMCwgcjtcbiBcdHN0cnVjdCBicGZfcHJvZ3JhbSAqcDtcbiBcdHN0cnVjdCBicGZfbWFwICptO1xuQEAgLTc2MCwyOSArNzk2LDQ2IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4gXHRsaWJicGZfc2hhMjU2KGluc25zLCBpbnNuc19zeiwgZXhjbCk7XG4gXG4tXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGluc25zLCBpbnNuc19zeiwgc2lnLCBcdTAwMjZzaWdfc3opLCBcInNpZ24tZmlsZVwiKSlcbitcdHNpZ25idWYgPSBtYWxsb2MoKHNpemVfdClpbnNuc19zeiArIGRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNpZ25idWYsIFwic2lnbmJ1ZlwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0bWVtY3B5KHNpZ25idWYsIGluc25zLCBpbnNuc19zeik7XG4rXHRtZW1jcHkoc2lnbmJ1ZiArIGluc25zX3N6LCBibG9iLCBkYXRhX3N6KTtcbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgc2lnbmJ1ZiwgaW5zbnNfc3ogKyBkYXRhX3N6LCBzaWcsIFx1MDAyNnNpZ19zeiksXG4rXHRcdCAgICAgICBcInNpZ24tZmlsZVwiKSlcbiBcdFx0Z290byBjbGVhbnVwO1xuIFxuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcihpbnNucywgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX1RSVUUocmFuLCBcInZhbGlkIHNpZ25hdHVyZTogbG9hZGVyIGxvYWRlZCBhbmQgcmFuXCIpO1xuIFx0QVNTRVJUX0VRKHIsIDAsIFwidmFsaWQgc2lnbmF0dXJlIGFjY2VwdGVkXCIpO1xuIFx0Y2xvc2VfbG9hZGVyX2N0eF9mZHMoY3R4LCBucl9tYXBzLCBucl9wcm9ncyk7XG4gXG4gXHRtZW1jcHkodGFtcGVyZWQsIGluc25zLCBpbnNuc19zeik7XG4gXHR0YW1wZXJlZFtpbnNuc19zeiAvIDJdIF49IDB4ZmY7XG4rXHQvKlxuK1x0ICogQmluZCB0aGUgbWV0YWRhdGEgbWFwIHRvIHRoZSB0YW1wZXJlZCBsb2FkZXIncyBvd24gZGlnZXN0LCBzbyB0aGVcbitcdCAqIHZlcmlmaWVyJ3MgZXhjbHVzaXZlLW1hcCBjaGVjayAoZXhjbF9wcm9nX3NoYSA9PSBwcm9nLVx1MDAzZWRpZ2VzdCkgcGFzc2VzXG4rXHQgKiBhbmQgdGhlIHNpZ25hdHVyZSAtIHZlcmlmaWVkIGFmdGVyIHRoZSBtYXBzIGFyZSByZXNvbHZlZCAtIGlzIHdoYXRcbitcdCAqIHJlamVjdHMgdGhlIGxvYWQuIFRoaXMgaXMgdGhlIGF0dGFja2VyJ3MgYmVzdCBjYXNlOiBldmVuIGFmdGVyXG4rXHQgKiByZS1iaW5kaW5nIHRoZSBleGNsdXNpdmUgbWFwIHRvIHRoZWlyIHRhbXBlcmVkIGxvYWRlciwgdGhlIHNpZ25hdHVyZVxuK1x0ICogb3ZlciB0aGUgb3JpZ2luYWwgaW5zbnMgfHwgbWV0YWRhdGEgc3RpbGwgZmFpbHMuIChMZWF2aW5nIHRoZSBtYXBcbitcdCAqIGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBkaWdlc3Qgd291bGQgaW5zdGVhZCB0cmlwIHRoZSBleGNsIGNoZWNrIGZpcnN0LilcbitcdCAqL1xuK1x0bGliYnBmX3NoYTI1Nih0YW1wZXJlZCwgaW5zbnNfc3osIGV4Y2wpO1xuIFx0bWVtc2V0KGN0eCwgMCwgY3R4X3N6KTtcbiBcdCgoc3RydWN0IGJwZl9sb2FkZXJfY3R4ICopY3R4KS1cdTAwM2VzeiA9IGN0eF9zejtcbiBcdHIgPSBydW5fZ2VuX2xvYWRlcih0YW1wZXJlZCwgaW5zbnNfc3osIGJsb2IsIGRhdGFfc3osIGV4Y2wsIHNpemVvZihleGNsKSxcbi1cdFx0XHQgICBzaWcsIHNpZ19zeiwgdHJ1ZSwgY3R4LCBjdHhfc3osIFx1MDAyNnJhbik7XG4rXHRcdFx0ICAgc2lnLCBzaWdfc3osIGN0eCwgY3R4X3N6LCBcdTAwMjZyYW4pO1xuIFx0QVNTRVJUX0ZBTFNFKHJhbiwgXCJ0YW1wZXJlZCBsb2FkZXIgcmVqZWN0ZWQgYmVmb3JlIHJ1blwiKTtcbiBcdEFTU0VSVF9FUShyLCAtRUtFWVJFSkVDVEVELCBcInNpZ25hdHVyZSBpcyBib3VuZCB0byB0aGUgaW5zdHJ1Y3Rpb25zXCIpO1xuIGNsZWFudXA6XG4gXHRmcmVlKGluc25zKTtcbiBcdGZyZWUodGFtcGVyZWQpO1xuIFx0ZnJlZShibG9iKTtcbitcdGZyZWUoc2lnbmJ1Zik7XG4gXHRmcmVlKGN0eCk7XG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfX2Rlc3Ryb3koc2tlbCk7XG4gXHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG5AQCAtMTAwNywxMCArMTA2MCwxMSBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiB7XG4gXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlcl9sc21YWFhYWFhcIiwgKmRpciA9IE5VTEw7XG4gXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX2xzbSAqbHNtID0gTlVMTDtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIG1zaWdfc3ogPSA4MTkyO1xuIFx0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTE7XG4gXHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0X191MzIgc2lnX3N6ID0gODE5MjtcbitcdHVuc2lnbmVkIGNoYXIgKmJ1ZjtcbiBcdF9fczMyIHNlc19zZXJpYWw7XG4gXHRfX3U4IHNpZ1s4MTkyXTtcbiBcbkBAIC0xMDI5LDcgKzEwODMsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiBcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCJtZXRhX21hcF91bnNpZ25lZFwiKSlcbiBcdFx0Z290byBvdXQ7XG4gXHRsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4gPSAwO1xuLVx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgTlVMTCwgMCwgMCk7XG4rXHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBOVUxMLCAwLCAwLCAwKTtcbiBcdGNsb3NlKG1hcF9mZCk7XG4gXHRtYXBfZmQgPSAtMTtcbiBcdGlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsIFwidW5zaWduZWQgbG9hZGVyIGxvYWRcIikpXG5AQCAtMTA2MiwyMiArMTExNiw1MSBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiBcdFx0Z290byBvdXQ7XG4gXHRsc20tXHUwMDNlYnNzLVx1MDAzZXNlZW4gPSAwO1xuIFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgc2lnLFxuLVx0XHRcdCAgICAgIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdFx0XHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XG4gXHRjbG9zZShtYXBfZmQpO1xuIFx0bWFwX2ZkID0gLTE7XG4tXHRpZiAoIUFTU0VSVF9PS19GRChwcm9nX2ZkLCBcInNpZ25lZCBsb2FkZXIgbG9hZFwiKSlcbi1cdFx0Z290byBvdXQ7XG4tXHRjbG9zZShwcm9nX2ZkKTtcbitcdEFTU0VSVF9FUShwcm9nX2ZkLCAtRUFDQ0VTLCBcInVuZm9sZGVkIG1ldGFkYXRhIHJlamVjdGVkXCIpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbiBcdHByb2dfZmQgPSAtMTtcbiBcbiBcdHNlc19zZXJpYWwgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfR0VUX0tFWVJJTkdfSUQsXG4gXHRcdFx0ICAgICBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuIFx0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiwgMSwgXCJzaWduZWQ6IG9uZSBvYnNlcnZlZCBsb2FkXCIpO1xuLVx0QVNTRVJUX0VRKGxzbS1cdTAwM2Vic3MtXHUwMDNlc2lnX3ZlcmRpY3QsIEJQRl9TSUdfVkVSSUZJRUQsIFwic2lnbmVkIHZlcmRpY3RcIik7XG4rXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfdmVyZGljdCwgQlBGX1NJR19WRVJJRklFRCxcbitcdFx0ICBcImFkbWlzc2lvbiBzYXcgYSB2YWxpZCBzaWduYXR1cmVcIik7XG4gXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzaWdfa2V5cmluZ190eXBlLCBCUEZfU0lHX0tFWVJJTkdfVVNFUiwgXCJzaWduZWQga2V5cmluZyB0eXBlXCIpO1xuIFx0QVNTRVJUX0dUKHNlc19zZXJpYWwsIDAsIFwic2Vzc2lvbiBrZXlyaW5nIHNlcmlhbCByZXNvbHZlZFwiKTtcbiBcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ19rZXlyaW5nX3NlcmlhbCwgc2VzX3NlcmlhbCxcbiBcdFx0ICBcInNpZ25lZDogdmFsaWRhdGVkIGFnYWluc3Qgc2Vzc2lvbiBrZXlyaW5nXCIpO1xuK1xuK1x0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcIm1ldGFfc2lnbmJ1ZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcbitcdG1lbWNweShidWYgKyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeixcbitcdFx0XHRcdHNpZywgXHUwMDI2bXNpZ19zeiksIFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcIikpIHtcbitcdFx0ZnJlZShidWYpO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcdGZyZWUoYnVmKTtcbitcbitcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcIm1ldGFfbWFwX2JvdW5kXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGxzbS1cdTAwM2Vic3MtXHUwMDNlc2VlbiA9IDA7XG4rXHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsXG4rXHRcdFx0ICAgICAgbXNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTtcbitcdGNsb3NlKG1hcF9mZCk7XG4rXHRtYXBfZmQgPSAtMTtcbitcdGlmICghQVNTRVJUX09LX0ZEKHByb2dfZmQsIFwibWV0YWRhdGEtYm91bmQgbG9hZGVyIGxvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2xvc2UocHJvZ19mZCk7XG4rXHRwcm9nX2ZkID0gLTE7XG4rXHRBU1NFUlRfRVEobHNtLVx1MDAzZWJzcy1cdTAwM2VzZWVuLCAxLCBcIm1ldGFkYXRhOiBvbmUgb2JzZXJ2ZWQgbG9hZFwiKTtcbitcdEFTU0VSVF9FUShsc20tXHUwMDNlYnNzLVx1MDAzZXNpZ192ZXJkaWN0LCBCUEZfU0lHX1ZFUklGSUVELFxuK1x0XHQgIFwibWV0YWRhdGEtYm91bmQgdmVyZGljdFwiKTtcbiBvdXQ6XG4gXHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbiBcdFx0Y2xvc2UobWFwX2ZkKTtcbkBAIC0xMDkwLDIwICsxMTczLDQ2MiBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiBcdHRlc3Rfc2lnbmVkX2xvYWRlcl9sc21fX2Rlc3Ryb3kobHNtKTtcbiB9XG4gXG4rLypcbisgKiBMb2FkLXRpbWUgbWV0YWRhdGEgdmVyaWZpY2F0aW9uOiB0aGUga2VybmVsIGZvbGRzIHRoZSBmcm96ZW4gbWV0YWRhdGEgbWFwXG4rICogaW50byB0aGUgc2lnbmF0dXJlIChpbnNucyB8fCBtZXRhZGF0YSkgYW5kIGNoZWNrcyBpdCBhdCBCUEZfUFJPR19MT0FEIHZpYVxuKyAqIGZkX2FycmF5X2NudCwgcmF0aGVyIHRoYW4gdGhlIGxvYWRlciBjaGVja2luZyBmcm9tIHdpdGhpbiBCUEYuIFNpZ24gdGhhdFxuKyAqIGNvbmNhdGVuYXRpb24sIGhhbmQgdGhlIGtlcm5lbCB0aGUgbWFwLCBhbmQgY29uZmlybSB0aGUgc2lnbmVkIGxvYWRlciBsb2FkcyxcbisgKiBydW5zLCBhbmQgaW5zdGFsbHMgaXRzIHRhcmdldC5cbisgKi9cbitzdGF0aWMgaW50IGxvYWR0aW1lX2RyaXZlKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxuK1x0XHRcdCAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeiwgY29uc3QgX191OCAqZXhjbCxcbitcdFx0XHQgIHZvaWQgKmN0eCwgX191MzIgY3R4X3N6LCBpbnQgKmxvYWRfcmV0LCBib29sICpyYW4pXG4re1xuK1x0TElCQlBGX09QVFMoYnBmX21hcF9jcmVhdGVfb3B0cywgbW9wdHMsXG4rXHRcdCAgICAuZXhjbF9wcm9nX2hhc2ggPSBleGNsLFxuK1x0XHQgICAgLmV4Y2xfcHJvZ19oYXNoX3NpemUgPSBTSEEyNTZfRElHRVNUX0xFTkdUSCk7XG4rXHRfX3UzMiBzaWdfc3ogPSA4MTkyLCBrZXkgPSAwO1xuK1x0dW5zaWduZWQgY2hhciAqYnVmID0gTlVMTDtcbitcdGludCBtYXBfZmQsIHByb2dfZmQsIHJldCA9IDA7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0X191OCBzaWdbODE5Ml07XG4rXG4rXHQqcmFuID0gZmFsc2U7XG4rXHQqbG9hZF9yZXQgPSAwO1xuK1xuK1x0LypcbitcdCAqIE1ldGFkYXRhIG1hcCwgYm91bmQgdG8gdGhlIGxvYWRlciBkaWdlc3QgYW5kIGZyb3plbiwgZXhhY3RseSBhc1xuK1x0ICogc2tlbF9pbnRlcm5hbC5oJ3MgYnBmX2xvYWRfYW5kX3J1bigpIHNldHMgaXQgdXAuXG4rXHQgKi9cbitcdG1hcF9mZCA9IGJwZl9tYXBfY3JlYXRlKEJQRl9NQVBfVFlQRV9BUlJBWSwgXCJfX2xvYWRlci5tYXBcIiwgNCxcbitcdFx0XHRcdGRhdGFfc3osIDEsIFx1MDAyNm1vcHRzKTtcbitcdGlmIChtYXBfZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtZXJybm87XG4rXHRpZiAoYnBmX21hcF91cGRhdGVfZWxlbShtYXBfZmQsIFx1MDAyNmtleSwgZGF0YSwgMCkgfHwgYnBmX21hcF9mcmVlemUobWFwX2ZkKSkge1xuK1x0XHRyZXQgPSAtZXJybm87XG4rXHRcdGdvdG8gb3V0X21hcDtcbitcdH1cbitcbitcdC8qIFNpZ24gaW5zbnMgfHwgbWV0YWRhdGEsIHRoZSBzYW1lIGJ5dGVzIHRoZSBrZXJuZWwgcmVjb25zdHJ1Y3RzLiAqL1xuK1x0YnVmID0gbWFsbG9jKChzaXplX3QpaW5zbnNfc3ogKyBkYXRhX3N6KTtcbitcdGlmICghYnVmKSB7XG4rXHRcdHJldCA9IC1FTk9NRU07XG4rXHRcdGdvdG8gb3V0X21hcDtcbitcdH1cbitcdG1lbWNweShidWYsIGluc25zLCBpbnNuc19zeik7XG4rXHRtZW1jcHkoYnVmICsgaW5zbnNfc3osIGRhdGEsIGRhdGFfc3opO1xuK1x0cmV0ID0gc2lnbl9idWYoZGlyLCBidWYsIGluc25zX3N6ICsgZGF0YV9zeiwgc2lnLCBcdTAwMjZzaWdfc3opO1xuK1x0aWYgKHJldClcbitcdFx0Z290byBvdXRfbWFwO1xuK1xuK1x0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4rXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcbitcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGluc25zKTtcbitcdGF0dHIuaW5zbl9jbnQgPSBpbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuK1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbitcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbitcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KFx1MDAyNm1hcF9mZCk7XG4rXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbitcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4rXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rXHRhdHRyLmZkX2FycmF5X2NudCA9IDE7XG4rXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbitcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdGlmIChwcm9nX2ZkIFx1MDAzYyAwKSB7XG4rXHRcdCpsb2FkX3JldCA9IC1lcnJubztcbitcdFx0cmV0ID0gLWVycm5vO1xuK1x0XHRnb3RvIG91dF9tYXA7XG4rXHR9XG4rXG4rXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbitcdGF0dHIudGVzdC5wcm9nX2ZkID0gcHJvZ19mZDtcbitcdGF0dHIudGVzdC5jdHhfaW4gPSBwdHJfdG9fdTY0KGN0eCk7XG4rXHRhdHRyLnRlc3QuY3R4X3NpemVfaW4gPSBjdHhfc3o7XG4rXHRpZiAoc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfUlVOLCBcdTAwMjZhdHRyLFxuK1x0XHQgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIHRlc3QpKSBcdTAwM2MgMCkge1xuK1x0XHRyZXQgPSAtZXJybm87XG4rXHRcdGdvdG8gb3V0X3Byb2c7XG4rXHR9XG4rXHQqcmFuID0gdHJ1ZTtcbitcdHJldCA9IChpbnQpYXR0ci50ZXN0LnJldHZhbDtcbitvdXRfcHJvZzpcbitcdGNsb3NlKHByb2dfZmQpO1xuK291dF9tYXA6XG4rXHRmcmVlKGJ1Zik7XG4rXHRjbG9zZShtYXBfZmQpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9hZHRpbWVfdmVyaWZ5KHN0cnVjdCBicGZfb2JqZWN0ICpvYmosIGludCBleHBlY3RfbWFwcylcbit7XG4rXHRMSUJCUEZfT1BUUyhnZW5fbG9hZGVyX29wdHMsIGdvcHRzLCAuZ2VuX2hhc2ggPSB0cnVlKTtcbitcdGNoYXIgZGlyX3RtcGxbXSA9IFwiL3RtcC9zaWduZWRfbG9hZGVyX2x0WFhYWFhYXCIsICpkaXIgPSBOVUxMO1xuK1x0aW50IG5yX21hcHMgPSAwLCBucl9wcm9ncyA9IDAsIGxvYWRfcmV0ID0gMCwgcjtcbitcdF9fdTggZXhjbFtTSEEyNTZfRElHRVNUX0xFTkdUSF07XG4rXHRzdHJ1Y3QgYnBmX3Byb2dfZGVzYyAqcGQ7XG4rXHRzdHJ1Y3QgYnBmX21hcF9kZXNjICptZDtcbitcdHVuc2lnbmVkIGNoYXIgKmJsb2IgPSBOVUxMO1xuK1x0c3RydWN0IGJwZl9wcm9ncmFtICpwO1xuK1x0c3RydWN0IGJwZl9tYXAgKm07XG4rXHRfX3UzMiBjdHhfc3osIGRhdGFfc3o7XG4rXHR2b2lkICpjdHggPSBOVUxMO1xuK1x0Ym9vbCByYW4gPSBmYWxzZTtcbitcbitcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCJrZXlyaW5nXCIsIFwiX3VpZC4wXCIsIE5VTEwsXG4rXHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRcdHJtZGlyKGRpcik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmICghQVNTRVJUX09LKGJwZl9vYmplY3RfX2dlbl9sb2FkZXIob2JqLCBcdTAwMjZnb3B0cyksIFwiZ2VuX2xvYWRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PSyhicGZfb2JqZWN0X19sb2FkKG9iaiksIFwiZ2VuX2xvYWRcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnBmX29iamVjdF9fZm9yX2VhY2hfcHJvZ3JhbShwLCBvYmopXG4rXHRcdG5yX3Byb2dzKys7XG4rXHRicGZfb2JqZWN0X19mb3JfZWFjaF9tYXAobSwgb2JqKVxuK1x0XHRucl9tYXBzKys7XG4rXHRpZiAoIUFTU0VSVF9FUShucl9tYXBzLCBleHBlY3RfbWFwcywgXCJmaXh0dXJlIG1hcCBjb3VudFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRjdHhfc3ogPSBzaXplb2Yoc3RydWN0IGJwZl9sb2FkZXJfY3R4KSArXG4rXHRcdCBucl9tYXBzICogc2l6ZW9mKHN0cnVjdCBicGZfbWFwX2Rlc2MpICtcbitcdFx0IG5yX3Byb2dzICogc2l6ZW9mKHN0cnVjdCBicGZfcHJvZ19kZXNjKTtcbitcdGN0eCA9IGNhbGxvYygxLCBjdHhfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGN0eCwgXCJjdHhfYWxsb2NcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0KChzdHJ1Y3QgYnBmX2xvYWRlcl9jdHggKiljdHgpLVx1MDAzZXN6ID0gY3R4X3N6O1xuK1xuK1x0ZGF0YV9zeiA9IGdvcHRzLmRhdGFfc3o7XG4rXHRibG9iID0gbWFsbG9jKGRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJsb2IsIFwiYmxvYl9hbGxvY1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRtZW1jcHkoYmxvYiwgZ29wdHMuZGF0YSwgZGF0YV9zeik7XG4rXG4rXHQvKiBleGNsX3Byb2dfaGFzaCA9IFNIQTI1Nihsb2FkZXIgaW5zbnMpID09IHRoZSBsb2FkZXIncyBwcm9nLVx1MDAzZWRpZ2VzdC4gKi9cbitcdGxpYmJwZl9zaGEyNTYoZ29wdHMuaW5zbnMsIGdvcHRzLmluc25zX3N6LCBleGNsKTtcbitcbitcdHIgPSBsb2FkdGltZV9kcml2ZShkaXIsIGdvcHRzLmluc25zLCBnb3B0cy5pbnNuc19zeiwgYmxvYiwgZGF0YV9zeixcbitcdFx0XHQgICBleGNsLCBjdHgsIGN0eF9zeiwgXHUwMDI2bG9hZF9yZXQsIFx1MDAyNnJhbik7XG4rXHRBU1NFUlRfT0sobG9hZF9yZXQsIFwic2lnbmVkIGxvYWRlciBsb2FkZWQgKGluc25zIHx8IG1ldGFkYXRhKVwiKTtcbitcdEFTU0VSVF9UUlVFKHJhbiwgXCJsb2FkZXIgcmFuXCIpO1xuK1x0QVNTRVJUX0VRKHIsIDAsIFwibG9hZGVyIGluc3RhbGxlZCBpdHMgdGFyZ2V0XCIpO1xuK1xuK1x0bWQgPSAoc3RydWN0IGJwZl9tYXBfZGVzYyAqKSgoY2hhciAqKWN0eCArIHNpemVvZihzdHJ1Y3QgYnBmX2xvYWRlcl9jdHgpKTtcbitcdHBkID0gKHN0cnVjdCBicGZfcHJvZ19kZXNjICopKG1kICsgbnJfbWFwcyk7XG4rXHRBU1NFUlRfR1QocGRbMF0ucHJvZ19mZCwgMCwgXCJ0YXJnZXQgcHJvZ3JhbSBpbnN0YWxsZWRcIik7XG4rXHRpZiAobnJfbWFwcylcbitcdFx0QVNTRVJUX0dUKG1kWzBdLm1hcF9mZCwgMCwgXCJ0YXJnZXQgbWFwIGluc3RhbGxlZFwiKTtcbitcbitcdGNsb3NlX2xvYWRlcl9jdHhfZmRzKGN0eCwgbnJfbWFwcywgbnJfcHJvZ3MpO1xuK291dDpcbitcdGZyZWUoYmxvYik7XG4rXHRmcmVlKGN0eCk7XG4rXHRpZiAoZGlyKVxuK1x0XHRydW5fc2V0dXAoXCJjbGVhbnVwXCIsIGRpcik7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGxvYWR0aW1lX25vX21hcCh2b2lkKVxuK3tcbitcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWwgPSB0ZXN0X3NpZ25lZF9sb2FkZXJfX29wZW4oKTtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0bG9hZHRpbWVfdmVyaWZ5KHNrZWwtXHUwMDNlb2JqLCAwKTtcbitcdHRlc3Rfc2lnbmVkX2xvYWRlcl9fZGVzdHJveShza2VsKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgbG9hZHRpbWVfd2l0aF9tYXAodm9pZClcbit7XG4rXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyX21hcCAqc2tlbCA9IHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXBfX29wZW4oKTtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcInNrZWxfb3BlblwiKSlcbitcdFx0cmV0dXJuO1xuK1x0bG9hZHRpbWVfdmVyaWZ5KHNrZWwtXHUwMDNlb2JqLCAxKTtcbitcdHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXBfX2Rlc3Ryb3koc2tlbCk7XG4rfVxuK1xuKy8qXG4rICogQSBzaWduZWQgcHJvZ3JhbSBuZWVkIG5vdCBiaW5kIGFueSBtYXAuIEEgcGxhaW4gQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4rICogcHJvZ3JhbSB3aXRoIG5vIGZkX2FycmF5IGlzIHNpZ25lZCBvdmVyIGl0cyBpbnN0cnVjdGlvbnMgYWxvbmU6IHRoZSBrZXJuZWxcbisgKiB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlLCBmb2xkcyBubyBtZXRhZGF0YSwgYW5kIHRoZSBwcm9ncmFtIGxvYWRzLiBFeGVyY2lzZVxuKyAqIHRoZSBmZF9hcnJheSA9PSBOVUxMIC8gZmRfYXJyYXlfY250ID09IDAgcGF0aCwgYW5kIGNvbmZpcm0gdGhlIHNpZ25hdHVyZVxuKyAqIHN0aWxsIGF1dGhlbnRpY2F0ZXMgdGhlIGluc3RydWN0aW9ucyAoYSB0YW1wZXJlZCBjb3B5IGlzIHJlamVjdGVkKS5cbisgKi9cbitzdGF0aWMgdm9pZCBzaWduZWRfbm9fZmRfYXJyYXkodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbitcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuK1x0XHRCUEZfRVhJVF9JTlNOKCksXG4rXHR9O1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJYWFhYWFhcIiwgKmRpcjtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0X191OCBzaWdbODE5Ml07XG4rXHRpbnQgcHJvZ19mZCwgZXJyO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0LyogTm8gbWV0YWRhdGEgbWFwOiB0aGUgc2lnbmVkIHBheWxvYWQgaXMgdGhlIGluc3RydWN0aW9ucyBhbG9uZS4gKi9cbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbitcdFx0ICAgICAgIFwic2lnbi1maWxlXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbitcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuK1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuK1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuK1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbitcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbitcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuK1x0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcbitcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbitcdC8qIGZkX2FycmF5IGFuZCBmZF9hcnJheV9jbnQgZGVsaWJlcmF0ZWx5IGxlZnQgTlVMTC8wLiAqL1xuK1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcInNpZ25lZF9ub21hcFwiLCBzaXplb2YoXCJzaWduZWRfbm9tYXBcIikpO1xuK1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0aWYgKCFBU1NFUlRfR0UocHJvZ19mZCwgMCwgXCJtYXAtbGVzcyBzaWduZWQgcHJvZ3JhbSBsb2FkZWRcIikpIHtcbitcdFx0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXHRjbG9zZShwcm9nX2ZkKTtcbitcbitcdC8qIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMsIHNvIHRhbXBlcmluZyBtdXN0IGJlIHJlamVjdGVkLiAqL1xuK1x0aW5zbnNbMF0uaW1tID0gMTtcbitcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdGVyciA9IHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXCJ0YW1wZXJlZCBtYXAtbGVzcyBwcm9ncmFtIHJlamVjdGVkXCIpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitjbGVhbnVwOlxuK1x0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK31cbitcbisvKlxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIGZkX2FycmF5IGluZGljZXMsIHNvIHRoZSBrZXJuZWxcbisgKiBmb2xkcyAoYW5kIHRodXMgYXR0ZXN0cykgdGhlbS4gQSBkaXJlY3QgQlBGX1BTRVVET19NQVBfRkQgcmVmZXJlbmNlIC0gYSByYXcsXG4rICogdW5mb2xkZWQgZmQgYmFrZWQgaW50byB0aGUgc2lnbmVkIGluc3RydWN0aW9ucyAtIGlzIHJlamVjdGVkIGJ5IHRoZSB2ZXJpZmllci5cbisgKi9cbitzdGF0aWMgdm9pZCBzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKHZvaWQpXG4re1xuK1x0c3RydWN0IGJwZl9pbnNuIGluc25zW10gPSB7XG4rXHRcdEJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSxcbitcdFx0QlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLFxuK1x0XHRCUEZfRVhJVF9JTlNOKCksXG4rXHR9O1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL3NpZ25lZF9sb2FkZXJYWFhYWFhcIiwgKmRpcjtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTI7XG4rXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuK1x0X191OCBzaWdbODE5Ml07XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkLCBlcnI7XG4rXG4rXHRtYXBfZmQgPSBicGZfbWFwX2NyZWF0ZShCUEZfTUFQX1RZUEVfQVJSQVksIFwic2lnX21hcGZkXCIsIDQsIDQsIDEsIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfR0UobWFwX2ZkLCAwLCBcIm1hcF9jcmVhdGVcIikpXG4rXHRcdHJldHVybjtcbitcdGluc25zWzBdLmltbSA9IG1hcF9mZDtcdC8qIGJha2UgdGhlIHJhdyBtYXAgZmQgaW50byB0aGUgbGRfaW1tNjQgKi9cbitcbitcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCJrZXlyaW5nXCIsIFwiX3VpZC4wXCIsIE5VTEwsXG4rXHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0Z290byBvdXRfbWFwO1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRcdHJtZGlyKGRpcik7XG4rXHRcdGdvdG8gb3V0X21hcDtcbitcdH1cbitcbitcdC8qIFNpZ24gdGhlIGluc3RydWN0aW9ucywgcmF3IG1hcCBmZCBhbmQgYWxsLiAqL1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcdTAwMjZzaWdfc3opLFxuK1x0XHQgICAgICAgXCJzaWduLWZpbGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuK1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4rXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4rXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XG4rXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwiRHVhbCBCU0QvR1BMXCIpO1xuK1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuK1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4rXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuK1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuK1x0LyogTm8gZmRfYXJyYXk6IHRoZSBtYXAgaXMgcmVhY2hlZCBieSBhIHJhdyBmZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zLiAqL1xuK1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcInNpZ25lZF9tYXBmZFwiLCBzaXplb2YoXCJzaWduZWRfbWFwZmRcIikpO1xuK1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUlOVkFMLCBcInNpZ25lZCBwcm9ncmFtIHJlZmVyZW5jaW5nIGEgbWFwIGJ5IGZkIHJlamVjdGVkXCIpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitjbGVhbnVwOlxuK1x0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK291dF9tYXA6XG4rXHRjbG9zZShtYXBfZmQpO1xuK31cbitcbisvKlxuKyAqIEEgc2lnbmVkIHByb2dyYW0gbWF5IHJlYWNoIG1hcHMgb25seSB0aHJvdWdoIHRoZSBjb250aW51b3VzIGZkX2FycmF5LCBzbyB0aGVcbisgKiBrZXJuZWwgZm9sZHMgKGFuZCB0aHVzIGF0dGVzdHMpIHRoZW0uIFJlZmVyZW5jaW5nIGEgbWFwIGJ5IGZkX2FycmF5ICppbmRleCpcbisgKiB3aGlsZSBsZWF2aW5nIGZkX2FycmF5X2NudCBhdCAwIHNlbGVjdHMgdGhlIHNwYXJzZSBwYXRoLCB3aGljaCByZXNvbHZlcyBhIG1hcFxuKyAqIHRoZSBzaWduYXR1cmUgbmV2ZXIgY292ZXJlZDsgdGhlIHZlcmlmaWVyIHJlamVjdHMgaXQgdXAgZnJvbnQgd2l0aCAtRUFDQ0VTLlxuKyAqL1xuK3N0YXRpYyB2b2lkIHNpZ25lZF9zcGFyc2VfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2luc24gaW5zbnNbXSA9IHtcbitcdFx0QlBGX0xEX0lNTTY0X1JBVyhCUEZfUkVHXzEsIEJQRl9QU0VVRE9fTUFQX0lEWCwgMCksXG4rXHRcdEJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSxcbitcdFx0QlBGX0VYSVRfSU5TTigpLFxuK1x0fTtcbitcdGNoYXIgZGlyX3RtcGxbXSA9IFwiL3RtcC9zaWduZWRfbG9hZGVyX3NwWFhYWFhYXCIsICpkaXI7XG4rXHRfX3UzMiBzaWdfc3ogPSA4MTkyO1xuK1x0dW5pb24gYnBmX2F0dHIgYXR0cjtcbitcdF9fdTggc2lnWzgxOTJdO1xuK1x0aW50IG1hcF9mZCwgcHJvZ19mZCwgZXJyO1xuK1xuK1x0bWFwX2ZkID0gYnBmX21hcF9jcmVhdGUoQlBGX01BUF9UWVBFX0FSUkFZLCBcInNpZ19zcGFyc2VcIiwgNCwgNCwgMSwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9HRShtYXBfZmQsIDAsIFwibWFwX2NyZWF0ZVwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dF9tYXA7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdFx0cm1kaXIoZGlyKTtcbitcdFx0Z290byBvdXRfbWFwO1xuK1x0fVxuK1xuK1x0LyogU2lnbiB0aGUgaW5zdHJ1Y3Rpb25zIGFsb25lOyB0aGUgc3BhcnNlIG1hcCBpcyBub3QgZm9sZGVkLiAqL1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBpbnNucywgc2l6ZW9mKGluc25zKSwgc2lnLCBcdTAwMjZzaWdfc3opLFxuK1x0XHQgICAgICAgXCJzaWduLWZpbGVcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdG1lbXNldChcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xuK1x0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4rXHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChpbnNucyk7XG4rXHRhdHRyLmluc25fY250ID0gQVJSQVlfU0laRShpbnNucyk7XG4rXHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwiRHVhbCBCU0QvR1BMXCIpO1xuK1x0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuK1x0YXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoXHUwMDI2bWFwX2ZkKTtcbitcdGF0dHIuZmRfYXJyYXlfY250ID0gMDsgLyogc3BhcnNlOiBmb3JjZSBsYXp5IG1hcCByZXNvbHV0aW9uICovXG4rXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcbitcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4rXHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwic2lnbmVkX3NwYXJzZVwiLCBzaXplb2YoXCJzaWduZWRfc3BhcnNlXCIpKTtcbitcbitcdHByb2dfZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuK1x0XHRcdCAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdGVyciA9IHByb2dfZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBwcm9nX2ZkO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJzaWduZWQgcHJvZ3JhbSBiaW5kaW5nIGEgc3BhcnNlIGZkX2FycmF5IG1hcCByZWplY3RlZFwiKTtcbitcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UocHJvZ19mZCk7XG4rY2xlYW51cDpcbitcdHJ1bl9zZXR1cChcImNsZWFudXBcIiwgZGlyKTtcbitvdXRfbWFwOlxuK1x0Y2xvc2UobWFwX2ZkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxuK3tcbitcdHN0cnVjdCBicGZfaW5zbiBpbnNuc1tdID0ge1xuK1x0XHRCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCBCUEZfUFNFVURPX0tGVU5DX0NBTEwsIDEsIDEpLFxuK1x0XHRCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksXG4rXHRcdEJQRl9FWElUX0lOU04oKSxcbitcdH07XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvc2lnbmVkX2xvYWRlcl9rZm5YWFhYWFhcIiwgKmRpcjtcbitcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCwgZXJyLCBmZHNbMl07XG4rXHRzdHJ1Y3QgYnRmICpidGYgPSBOVUxMO1xuK1x0X191MzIgc2lnX3N6ID0gODE5MjtcbitcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4rXHRfX3U4IHNpZ1s4MTkyXTtcbitcbitcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCJrZXlyaW5nXCIsIFwiX3VpZC4wXCIsIE5VTEwsXG4rXHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRcdHJtZGlyKGRpcik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgaW5zbnMsIHNpemVvZihpbnNucyksIHNpZywgXHUwMDI2c2lnX3N6KSxcbitcdFx0ICAgICAgIFwic2lnbi1maWxlXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRidGYgPSBidGZfX25ld19lbXB0eSgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ0ZiwgXCJidGZfbmV3X2VtcHR5XCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRidGZfX2FkZF9pbnQoYnRmLCBcImludFwiLCA0LCBCVEZfSU5UX1NJR05FRCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhidGZfX2xvYWRfaW50b19rZXJuZWwoYnRmKSwgXCJidGZfbG9hZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0ZmRzWzBdID0gLTE7XG4rXHRmZHNbMV0gPSBidGZfX2ZkKGJ0Zik7XG4rXG4rXHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbitcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuK1x0YXR0ci5pbnNucyA9IHB0cl90b191NjQoaW5zbnMpO1xuK1x0YXR0ci5pbnNuX2NudCA9IEFSUkFZX1NJWkUoaW5zbnMpO1xuK1x0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbitcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbitcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KGZkcyk7XG4rXHRhdHRyLmZkX2FycmF5X2NudCA9IDA7IC8qIHNwYXJzZTogZm9yY2UgbGF6eSBrZnVuYyBCVEYgcmVzb2x1dGlvbiAqL1xuK1x0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4rXHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuK1x0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuK1x0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcInNpZ25lZF9rZnVuY1wiLCBzaXplb2YoXCJzaWduZWRfa2Z1bmNcIikpO1xuK1xuK1x0cHJvZ19mZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4rXHRcdFx0ICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0ZXJyID0gcHJvZ19mZCBcdTAwM2MgMCA/IC1lcnJubyA6IHByb2dfZmQ7XG4rXHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJtb2R1bGUga2Z1bmMgQlRGIGluIHNpZ25lZCBwcm9ncmFtIHJlamVjdGVkXCIpO1xuK2NsZWFudXA6XG4rXHRpZiAoYnRmKVxuK1x0XHRidGZfX2ZyZWUoYnRmKTtcbitcdGlmIChtYXBfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShtYXBfZmQpO1xuK1x0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK31cbitcbiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIHtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWV0YWRhdGFfY2hlY2tfc2hhcGVcIikpXG4tXHRcdG1ldGFkYXRhX2NoZWNrX3NoYXBlKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxvYWR0aW1lX25vX21hcFwiKSlcbitcdFx0bG9hZHRpbWVfbm9fbWFwKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxvYWR0aW1lX3dpdGhfbWFwXCIpKVxuK1x0XHRsb2FkdGltZV93aXRoX21hcCgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9tYXRjaFwiKSlcbiBcdFx0bWV0YWRhdGFfbWF0Y2goKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWV0YWRhdGFfc2hhX21pc21hdGNoXCIpKVxuLVx0XHRtZXRhZGF0YV9zaGFfbWlzbWF0Y2goKTtcbi1cdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWV0YWRhdGFfbm90X2V4Y2x1c2l2ZVwiKSlcbi1cdFx0bWV0YWRhdGFfbm90X2V4Y2x1c2l2ZSgpO1xuLVx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9oYXNoX25vdF9jb21wdXRlZFwiKSlcbi1cdFx0bWV0YWRhdGFfaGFzaF9ub3RfY29tcHV0ZWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmF0dXJlX2VuZm9yY2VkXCIpKVxuIFx0XHRzaWduYXR1cmVfZW5mb3JjZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX25vbmV4Y2xfZmRfYXJyYXlfcmVqZWN0ZWRcIikpXG4rXHRcdHNpZ25lZF9ub25leGNsX2ZkX2FycmF5X3JlamVjdGVkKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9ub25hcnJheV9mZF9hcnJheV9yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX25vbmFycmF5X2ZkX2FycmF5X3JlamVjdGVkKCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWRcIikpXG4rXHRcdHNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduYXR1cmVfZmFpbHVyZV9sb2dzXCIpKVxuK1x0XHRzaWduYXR1cmVfZmFpbHVyZV9sb2dzKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25hdHVyZV90b29fbGFyZ2VcIikpXG4gXHRcdHNpZ25hdHVyZV90b29fbGFyZ2UoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmF0dXJlX2JhZF9rZXlyaW5nXCIpKVxuQEAgLTExMzIsNCArMTY1NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIFx0XHRtYXBfaGFzaF91bnN1cHBvcnRlZF90eXBlKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImxzbV9zaWduYXR1cmVfdmVyZGljdFwiKSlcbiBcdFx0bHNtX3NpZ25hdHVyZV92ZXJkaWN0KCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9ub19mZF9hcnJheVwiKSlcbitcdFx0c2lnbmVkX25vX2ZkX2FycmF5KCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWRcIikpXG4rXHRcdHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZFwiKSlcbitcdFx0c2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCgpO1xuIH1cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjA4LjM1NjEwMDE1OFoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExMDg3MzYxMDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQlBGIFNpZ25pbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGludHJvZHVjaW5nIEJQRiBzaWduaW5nLiBJdCBzZWVtcyBsaWtlIGEgcHJldHR5IHNpZ25pZmljYW50IGNoYW5nZSwgdG91Y2hpbmcgc2V2ZXJhbCBrZXkgYXJlYXMuIEkgc2VlIHRoYXQgaXQncyBtb2RpZnlpbmcgZG9jdW1lbnRhdGlvbiAoYERvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0YCksIGltcG9ydGFudCBpbmNsdWRlIGZpbGVzIChgaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaGApLCB0aGUgQlBGIHN5c2NhbGwgaGFuZGxlciAoYGtlcm5lbC9icGYvc3lzY2FsbC5jYCksIHRoZSB2ZXJpZmllciBpdHNlbGYgKGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgKSwgYW5kIGEgYnVuY2ggb2YgdGhlIHVzZXItc3BhY2UgdG9vbHMgKGBicGZ0b29sYCBhbmQgYGxpYmJwZmApLiBUaGlzIGlzIGZhaXJseSBjb21wcmVoZW5zaXZlLlxuXG5UaGUgY29yZSBvZiB0aGUgY2hhbmdlIHNlZW1zIHRvIGJlIG1vdmluZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZyb20gdGhlIGBicGZfcHJvZ19sb2FkYCBmdW5jdGlvbiB0byB0aGUgYGJwZl9jaGVja2AgZnVuY3Rpb24gd2l0aGluIHRoZSB2ZXJpZmllci4gVGhhdCdzIGludGVyZXN0aW5nLCBhbmQgbWFrZXMgc2Vuc2UgbG9naWNhbGx5OyB2ZXJpZmljYXRpb24gc2hvdWxkIGJlIGRvbmUgKmJlZm9yZSogbG9hZGluZywgd2hpY2ggdGhlIHZlcmlmaWVyIGhhbmRsZXMuIEkgc2VlIHRoYXQgdGhlIGBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudmAgc3RydWN0IGlzIGJlaW5nIGV4cGFuZGVkIHRvIGhvbGQgdGhlIHNpZ25hdHVyZSBhbmQgc29tZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciBhcnJheSBpbmZvcm1hdGlvbi4gVGhpcyBpbXBhY3RzIGhvdyB0aGUgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgaW4gYHByb2Nlc3NfZmRfYXJyYXlgLCBhbmQgdGhlcmUgaXMgYSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgZnVuY3Rpb24gYmVpbmcgYWRkZWQgaW4gdGhlIHZlcmlmaWVyIGNvZGUuIFRoYXQgZnVuY3Rpb24gYXBwZWFycyB0byBoYXZlIGJlZW4gKnJlbW92ZWQqIGZyb20gdGhlIHN5c2NhbGwgaGFuZGxlci4gQW5kIHdhaXQsIHRoZSBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZGAgaXMgYWxzbyBtb3ZpbmcgaW50byB0aGUgdmVyaWZpZXIhXG5cbkxldCBtZSBkcmlsbCBkb3duIGludG8gdGhlIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgIGNoYW5nZXMgYSBiaXQgbW9yZSBjbG9zZWx5LiBPa2F5LCBzbyB0aGF0IG5ldyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaXMgb2J2aW91c2x5IGltcG9ydGFudC4gQW5kIHRoZSBgcHJvY2Vzc19mZF9hcnJheWAgZnVuY3Rpb24gaXMgYmVpbmcgbW9kaWZpZWQgdG8gaGFuZGxlIGJvdGggY29udGludW91cyBhbmQgc3BhcnNlIGZpbGUgZGVzY3JpcHRvciBhcnJheXMsIHRoYXQncyBnb29kLiBUaGV5IGFyZSBhZGRpbmcgYGZkX2FycmF5X2dldF9idGZgIGFuZCBgZmRfYXJyYXlfZ2V0X21hcF9pZHhgIGZ1bmN0aW9ucy4gUGx1cywgdGhleSBzZWVtIHRvIGJlIG1ha2luZyB0aGUgdmVyaWZpY2F0aW9uIGRlcGVuZGVudCBvbiBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSG1tLCB0aGF0IGxvb2tzIGxpa2UgaXQgd2lsbCBuZWVkIHNvbWUgY2hlY2tpbmcuXG5cblRoaXMgaXMgYSBmdW5jdGlvbmFsIGNoYW5nZSBkZWVwIGluIHRoZSBCUEYgdmVyaWZpZXIgY29yZSwgd2hpY2ggaXMgcmVhbGx5IGltcG9ydGFudC4gVGhhdCBtZWFucyBpdCBuZWVkcyByb2J1c3QgZnV6emluZywgZGVmaW5pdGVseS4gTGV0IG1lIGlkZW50aWZ5IHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9ucyB0byBmb2N1cyBvbiBmb3IgZnV6emluZy4gSXQnbGwgYmU6XG5cbiogICBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgKG9idmlvdXNseSlcbiogICBgcHJvY2Vzc19mZF9hcnJheWAgYW5kIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIChiZWNhdXNlIHRoZXkgYXJlIGhhbmRsaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IgYXJyYXlzKS5cbiogICBgZmRfYXJyYXlfZ2V0X2J0ZmAgYW5kIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAgKHRoZXkgaGFuZGxlIHRoZSBhcnJheSByZXRyaWV2YWwsIHdoaWNoIGNvdWxkIGJlIGVycm9yIHByb25lKVxuKiAgIGBhZGRfZmRfZnJvbV9mZF9hcnJheWBcblxuSSBzaG91bGQgYWxzbyBjaGVjayB3aGF0IEtjb25maWcgb3B0aW9ucyBhcmUgcmVxdWlyZWQgdG8gZW5hYmxlIEJQRiBzaWduaW5nLiBEb2VzIGl0IGRlcGVuZCBvbiwgc2F5LCBgQ09ORklHX0JQRmAsIGBDT05GSUdfS0VZU2AsIG9yIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYD8gTGV0IG1lIGdyZXAgdGhyb3VnaCB0aGUgY29kZSB0byBmaW5kIG91dC5cblxuT2theSwgbGV0J3Mgc2VlLCBpbiBga2VybmVsL2JwZi9zeXNjYWxsLmNgLCBJIHNlZSBhIGNhbGwgdG8gYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4gQWxyaWdodCwgbGV0IG1lIHRyYWNrIGRvd24gd2hlcmUgdGhhdCBmdW5jdGlvbiBpcyBkZWZpbmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjozODMyNCwiT3V0cHV0VG9rZW5zIjoyNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY4NywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjE5LjQ0MzQ2NjU4NloiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1ODM3MzU4MDE0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvYnBmLmg9MzgyMz12b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTtcXG5pbmNsdWRlL2xpbnV4L2JwZi5oOjM4MjQ6aW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxuaW5jbHVkZS9saW51eC9icGYuaC0zODI1LVxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZi5oPTM4NDM9c3RhdGljIGlubGluZSB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxcbi0tXFxuaW5jbHVkZS9saW51eC9icGYuaC0zODQ2LVxcbmluY2x1ZGUvbGludXgvYnBmLmg6Mzg0NzpzdGF0aWMgaW5saW5lIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbmluY2x1ZGUvbGludXgvYnBmLmgtMzg0OC1cXHRcXHRcXHRcXHRcXHQgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTQyOTc9X19icGZfa2Z1bmMgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMwNjogKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzA3LSAqIEBkYXRhX3A6IGRhdGEgdG8gdmVyaWZ5XFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE1LSAqL1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQzMTY6X19icGZfa2Z1bmMgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDg1Nj1CVEZfSURfRkxBR1MoZnVuYywgYnBmX2tleV9wdXQsIEtGX1JFTEVBU0UpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ4NTg6QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlLCBLRl9TTEVFUEFCTEUpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1OS0jZW5kaWZcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTg5Nz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk4OS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTk5OTA6XFx0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNmRhdGFfcHRyLFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk5MS1cXHRcXHRcXHRcXHRcXHQgKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNnNpZ19wdHIsIGtleSk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oPTc3PWV4dGVybiB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICprZXkpIF9fa3N5bTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2tmdW5jcy5oOjc4OmV4dGVybiBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcHRyLFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfa2Z1bmNzLmgtNzktXFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wdHIsXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYz0yMj1zdGF0aWMgaW50IGxpYmJwZl9wcmludF9jYihlbnVtIGxpYmJwZl9wcmludF9sZXZlbCBsZXZlbCwgY29uc3QgY2hhciAqZm10LFxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM6Mjg6XFx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXFxcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXFxcIikpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtMjktXFx0XFx0cmV0dXJuIDA7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9rZnVuY19keW5wdHJfcGFyYW0uYz0zNT1zdGF0aWMgYm9vbCBoYXNfcGtjczdfa2Z1bmNfc3VwcG9ydCh2b2lkKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTItXFx0XFx0ZnByaW50ZihzdGRlcnIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmM6NTM6XFx0XFx0ICBcXFwiJXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMva2Z1bmNfZHlucHRyX3BhcmFtLmMtNTQtXFx0XFx0ICBfX2Z1bmNfXyk7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM9NDY9c3RhdGljIGludCBsaWJicGZfcHJpbnRfY2IoZW51bSBsaWJicGZfcHJpbnRfbGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCxcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy01NC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmM6NTU6XFx0aWYgKHN0cmNtcCh2YV9hcmcoYXJncywgY2hhciAqKSwgXFxcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXFxcIikpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTU2LVxcdFxcdHJldHVybiAwO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jPTI0Mj1zdGF0aWMgdm9pZCB0ZXN0X3ZlcmlmeV9wa2NzN19zaWdfZnJvbV9tYXAodm9pZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYy0yNzMtXFx0XFx0cHJpbnRmKFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYzoyNzQ6XFx0XFx0ICBcXFwiJXM6U0tJUDpicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIGtmdW5jIG5vdCBzdXBwb3J0ZWRcXFxcblxcXCIsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jLTI3NS1cXHRcXHQgIF9fZnVuY19fKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTM0PWludCBCUEZfUFJPRyhub3RfdmFsaWRfZHlucHRyLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtMzctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6Mzg6XFx0cmV0dXJuIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKChzdHJ1Y3QgYnBmX2R5bnB0ciAqKVxcdTAwMjZ2YWwsXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtMzktXFx0XFx0XFx0XFx0XFx0ICAoc3RydWN0IGJwZl9keW5wdHIgKilcXHUwMDI2dmFsLCBOVUxMKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTQ0PWludCBCUEZfUFJPRyhub3RfcHRyX3RvX3N0YWNrLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNDctXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NDg6XFx0cmV0dXJuIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFxcdTAwMjZ2YWwsIFxcdTAwMjZ2YWwsIE5VTEwpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jLTQ5LX1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X2tmdW5jX2R5bnB0cl9wYXJhbS5jPTUyPWludCBCUEZfUFJPRyhkeW5wdHJfZGF0YV9udWxsLCBpbnQgY21kLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHNpemUsIGJvb2wga2VybmVsKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmMtNzQtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfa2Z1bmNfZHlucHRyX3BhcmFtLmM6NzU6XFx0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXFx1MDAyNnB0ciwgXFx1MDAyNnB0ciwgdHJ1c3RlZF9rZXlyaW5nKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9rZnVuY19keW5wdHJfcGFyYW0uYy03Ni1cXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jPTQ2PWludCBCUEZfUFJPRyh0ZXN0X2ZpbGVfb3Blbiwgc3RydWN0IGZpbGUgKmYpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF9zaWdfaW5feGF0dHIuYy03OS1cXHQvKiBWZXJpZnkgc2lnbmF0dXJlICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3Rfc2lnX2luX3hhdHRyLmM6ODA6XFx0cmV0ID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoXFx1MDAyNmRpZ2VzdF9wdHIsIFxcdTAwMjZzaWdfcHRyLCB0cnVzdGVkX2tleXJpbmcpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy90ZXN0X3NpZ19pbl94YXR0ci5jLTgxLVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jPTQwPWludCBCUEZfUFJPRyhicGYsIGludCBjbWQsIHVuaW9uIGJwZl9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSwgYm9vbCBrZXJuZWwpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdGVzdF92ZXJpZnlfcGtjczdfc2lnLmMtODMtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jOjg0OlxcdHJldCA9IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKFxcdTAwMjZkYXRhX3B0ciwgXFx1MDAyNnNpZ19wdHIsIHRydXN0ZWRfa2V5cmluZyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3Rlc3RfdmVyaWZ5X3BrY3M3X3NpZy5jLTg1LVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMjoyNS4yODA4MzM2MloiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQzNzc2Mjg0MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqSW52ZXN0aWdhdGluZyBCUEYgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbioqXG5cbk9rYXksIHNvIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaXMgbG9jYXRlZCBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLCBhbmQgSSBzZWUgaXQncyBvbmx5IGluY2x1ZGVkIHdoZW4gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGVuYWJsZWQuIFRoYXQgbWFrZXMgc2Vuc2UsIGtlZXBpbmcgdGhpbmdzIG1vZHVsYXIuIE5vdywgaGVyZSdzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIEkgcmVtZW1iZXIgc2VlaW5nIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYCwgYW5kIEkgKnRoaW5rKiBpdCBjYWxscyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgLiBCdXQgdGhlIGtleSBxdWVzdGlvbiBmb3IgbWUgaXM6IGlzIHRoaXMgZGVwZW5kZW5jeSAqYWx3YXlzKiBwcmVzZW50IHdoZW4gSSBleHBlY3QgaXQ/IEkgbmVlZCB0byBxdWlja2x5IGNvbmZpcm0gd2hldGhlciB0aGUgdmVyaWZpZXIgY29kZSBoYXMgYSBjb25kaXRpb25hbCBvbiBpdHMgc2lkZS4gSSdsbCBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlIGluIGJvdGggYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AgYW5kIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AgdG8gYmUgY29tcGxldGVseSBzdXJlIG9mIHRoZSBjYWxsJ3MgYXZhaWxhYmlsaXR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjEyMiwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMjoyOS42NTg0NjQ5OTNaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE3MjMyMzcyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGVscGVycy5jPTQyOTc9X19icGZfa2Z1bmMgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDUtLyoqXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMwNjogKiBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSAtIHZlcmlmeSBhIFBLQ1MjNyBzaWduYXR1cmVcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzA3LSAqIEBkYXRhX3A6IGRhdGEgdG8gdmVyaWZ5XFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE1LSAqL1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQzMTY6X19icGZfa2Z1bmMgaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMxNy1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDg1Nj1CVEZfSURfRkxBR1MoZnVuYywgYnBmX2tleV9wdXQsIEtGX1JFTEVBU0UpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Ny0jaWZkZWYgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ4NTg6QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlLCBLRl9TTEVFUEFCTEUpXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1OS0jZW5kaWZcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTg5Nz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk4OS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTk5OTA6XFx0ZXJyID0gYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNmRhdGFfcHRyLFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk5MS1cXHRcXHRcXHRcXHRcXHQgKHN0cnVjdCBicGZfZHlucHRyICopXFx1MDAyNnNpZ19wdHIsIGtleSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjI5Ljc3NTcwMTgzNVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQxMjI5Mzk5OTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCBwcmVzZW50ZWQgYXMgYSBzdHJlYW0gb2YgdGhvdWdodDpcblxuKipDaGVja2luZyB0aGUgQlBGIENvZGUqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZ2V0IHRvIHRoZSBib3R0b20gb2YgdGhpcy4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gZGl2ZSBpbnRvIHRoZSBrZXJuZWwgaGVhZGVycyDigJMgc3BlY2lmaWNhbGx5LCBgaW5jbHVkZS9saW51eC9icGYuaGAuIEknbSBpbnRlcmVzdGVkIGluIHVuZGVyc3RhbmRpbmcgaG93IHRoaXMgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBvciwgYXQgdGhlIHZlcnkgbGVhc3QsIGRlZmluZWQuIEknbSBnb2luZyB0byBsb29rIGZvciB0aGUgZGVjbGFyYXRpb24gYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gb3IgY29tbWVudHMgdGhhdCBtaWdodCBwcm92aWRlIGNsdWVzIGFib3V0IGl0cyBwdXJwb3NlLCBhcmd1bWVudHMsIHJldHVybiB2YWx1ZXMsIGFuZCBob3cgaXQgZml0cyBpbnRvIHRoZSBicm9hZGVyIEJQRiBlY29zeXN0ZW0uIEkgZXhwZWN0IHRoaXMgaGVhZGVyIHRvIGxheSB0aGUgZ3JvdW5kd29yaywgb3V0bGluaW5nIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgYW5kIGFueSByZWxhdGVkIGRhdGEgc3RydWN0dXJlcyBpdCB1dGlsaXplcy4gSG9wZWZ1bGx5LCB0aGUgaGVhZGVyIGZpbGUgaW5jbHVkZXMgc29tZSByZWxldmFudCBpbmxpbmUgZG9jdW1lbnRhdGlvbiB0aGF0IGNhbiBjbGFyaWZ5IGl0cyByb2xlIGluIHRoZSBzeXN0ZW0uIEkgYWxzbyB3YW50IHRvIHNlZSBpZiB0aGUgZnVuY3Rpb24gaXMgZXhwb3J0ZWQsIG9yIGlmIGl0IGlzIGludGVybmFsIHRvIHRoZSBCUEYgc3Vic3lzdGVtLiBMZXQncyBzdGFydCB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDI5MzMsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMjozMy44OTg2NDYwMTZaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mzk2ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9icGYuaFwiLFxuICBcIkZpcnN0TGluZVwiOiAzODIwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIzODIwOlxcdCNpZiBkZWZpbmVkKENPTkZJR19LRVlTKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClcXG4zODIxOlxcdHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3VzZXJfa2V5KHMzMiBzZXJpYWwsIHU2NCBmbGFncyk7XFxuMzgyMjpcXHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCk7XFxuMzgyMzpcXHR2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTtcXG4zODI0OlxcdGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbjM4MjU6XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG4zODI2OlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnBmX2tleSAqdHJ1c3RlZF9rZXlyaW5nKTtcXG4zODI3OlxcdFxcbjM4Mjg6XFx0c3RhdGljIGlubGluZSBzMzIgYnBmX2tleV9zZXJpYWwoY29uc3Qgc3RydWN0IGJwZl9rZXkgKmtleSlcXG4zODI5OlxcdHtcXG4zODMwOlxcdFxcdHJldHVybiBrZXktXFx1MDAzZWhhc19yZWYgPyBrZXktXFx1MDAzZWtleS1cXHUwMDNlc2VyaWFsIDogMDtcXG4zODMxOlxcdH1cXG4zODMyOlxcdCNlbHNlXFxuMzgzMzpcXHRzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3VzZXJfa2V5KHUzMiBzZXJpYWwsIHU2NCBmbGFncylcXG4zODM0OlxcdHtcXG4zODM1OlxcdFxcdHJldHVybiBOVUxMO1xcbjM4MzY6XFx0fVxcbjM4Mzc6XFx0XFxuMzgzODpcXHRzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKVxcbjM4Mzk6XFx0e1xcbjM4NDA6XFx0XFx0cmV0dXJuIE5VTEw7XFxuMzg0MTpcXHR9XFxuMzg0MjpcXHRcXG4zODQzOlxcdHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSlcXG4zODQ0OlxcdHtcXG4zODQ1OlxcdH1cXG4zODQ2OlxcdFxcbjM4NDc6XFx0c3RhdGljIGlubGluZSBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcXG4zODQ4OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKnNpZ19wLFxcbjM4NDk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX2tleSAqdHJ1c3RlZF9rZXlyaW5nKVxcbjM4NTA6XFx0e1xcbjM4NTE6XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbjM4NTI6XFx0fVxcbjM4NTM6XFx0XFxuMzg1NDpcXHRzdGF0aWMgaW5saW5lIHMzMiBicGZfa2V5X3NlcmlhbChjb25zdCBzdHJ1Y3QgYnBmX2tleSAqa2V5KVxcbjM4NTU6XFx0e1xcbjM4NTY6XFx0XFx0cmV0dXJuIDA7XFxuMzg1NzpcXHR9XFxuMzg1ODpcXHQjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfS0VZUykgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfQlBGX1NZU0NBTEwpICovXFxuMzg1OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6MzMuODk5MDg4MTk2WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NTUwNDE2NTM2NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0IG1lIHRoaW5rIHRoaXMgdGhyb3VnaC5cblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBEZXBlbmRlbmN5IG9mIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKipcblxuQWxyaWdodCwgc28gdGhlIGZ1bmN0aW9uIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgZGVwZW5kcyBvbiBgQ09ORklHX0tFWVNgLCB0aGF0J3MgdGhlIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCBob3cgdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIEl0IHNlZW1zIHBvaW50bGVzcyBpZiBpdCdzIG5vdCBhY3R1YWxseSBpbmNsdWRlZCB3aGVuIHRoZSBrZXJuZWwgaXMgYnVpbHQuXG5cbk15IGZpcnN0IHRob3VnaHQgaXMgdG8gY2hlY2sgd2hlcmUgaXQncyBkZWZpbmVkLiBSaWdodCwgaXQncyBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBOb3csIHRoZSBrZXkgaXMgZmlndXJpbmcgb3V0IHRoZSBidWlsZCBwcm9jZXNzLiBJIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoYXQgcGFydGljdWxhciBmaWxlIGlzIGNvbXBpbGVkLiBXaGVyZSB3b3VsZCBJIGZpbmQgdGhhdD8gVGhlIGBNYWtlZmlsZWAgaW4gdGhlIGBrZXJuZWwvYnBmYCBkaXJlY3RvcnkgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQgbG9va2luZywgb3IgcGVyaGFwcyB0aGUgYGhlbHBlcnMuY2AgZmlsZSBpdHNlbGYgY29udGFpbnMgaGludHMuIFRpbWUgdG8gZGl2ZSBpbnRvIHRob3NlIGFuZCB0cmFjZSB0aGUgYnVpbGQgZGVwZW5kZW5jaWVzLiBMZXQncyBzZWUgd2hhdCB0aGUgYnVpbGQgc3lzdGVtIHRlbGxzIHVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0Mzg1MSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6MzkuNDAzMjU4MjQyWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODE0NDY2MTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmM9NDI5Nz1fX2JwZl9rZnVuYyB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDMwNS0vKipcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MzA2OiAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMDctICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQzMTUtICovXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDMxNjpfX2JwZl9rZnVuYyBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzE3LVxcdFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00ODU2PUJURl9JRF9GTEFHUyhmdW5jLCBicGZfa2V5X3B1dCwgS0ZfUkVMRUFTRSlcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU3LSNpZmRlZiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDg1ODpCVEZfSURfRkxBR1MoZnVuYywgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUsIEtGX1NMRUVQQUJMRSlcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00ODU5LSNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMjozOS41ODQ3MTExNFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNzE3NjMyNjY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIEJQRiBWZXJpZmljYXRpb24gTG9naWMqKlxuXG5BbHJpZ2h0LCBsZXQncyBkaXZlIGluLiBJJ20gdGFraW5nIGEgbG9vayBhdCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIHdpdGhpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgLiBNeSBpbml0aWFsIHRob3VnaHQgaXMsIFwiV2FpdCBhIHNlY29uZCwgaXNuJ3QgdGhpcyBmdW5jdGlvbidzIGF2YWlsYWJpbGl0eSBjb250cm9sbGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBgI2lmIGRlZmluZWQoQ09ORklHX0tFWVMpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClgP1wiIFRoYXQncyBhIGtleSBkZXRhaWwgdG8gdW5kZXJzdGFuZCBpdHMgYmVoYXZpb3IuIFRvIGNvbmZpcm0gbXkgc3VzcGljaW9uIGFuZCBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSSBuZWVkIHRvIHNlZSB3aGVyZSB0aGVzZSBjb25kaXRpb25zIGFyZSBhcHBsaWVkLCBlc3BlY2lhbGx5IHRvIHRoZSBjb2RlIHN1cnJvdW5kaW5nIHRoZSBkZWNsYXJhdGlvbiBhbmQgdXNlIG9mIHRoaXMgZnVuY3Rpb24uIFNvLCBJJ20gZ29pbmcgdG8gbmF2aWdhdGUgdG8gYGtlcm5lbC9icGYvaGVscGVycy5jYCBhbmQgc3BlY2lmaWNhbGx5IHBpbnBvaW50IGFyb3VuZCBsaW5lIDQzMTYuIFRoYXQgc2hvdWxkIHJldmVhbCB3aGV0aGVyIHRoZSBwcmVwcm9jZXNzb3IgbG9naWMgaXMgYXBwbGllZCwgYW5kIGNsYXJpZnkgdGhlIGNvbnRleHQgd2l0aGluIHdoaWNoIHRoaXMgUEtDUzcgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiByb3V0aW5lIGFjdHVhbGx5IGZ1bmN0aW9ucy4gVGhpcyB3aWxsIGhlbHAgbWUgdW5kZXJzdGFuZCBpdHMgZGVwZW5kZW5jaWVzIGFuZCB3aGV0aGVyIGl0J3MgZW5hYmxlZCBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NDUxNSwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjQzLjMwMjM0ODI4N1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzEzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDMwMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDMwMDpcXHRcXHRcXHRrZXlfcHV0KGJrZXktXFx1MDAzZWtleSk7XFxuNDMwMTpcXHRcXG40MzAyOlxcdFxcdGtmcmVlKGJrZXkpO1xcbjQzMDM6XFx0fVxcbjQzMDQ6XFx0XFxuNDMwNTpcXHQvKipcXG40MzA2OlxcdCAqIGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlIC0gdmVyaWZ5IGEgUEtDUyM3IHNpZ25hdHVyZVxcbjQzMDc6XFx0ICogQGRhdGFfcDogZGF0YSB0byB2ZXJpZnlcXG40MzA4OlxcdCAqIEBzaWdfcDogc2lnbmF0dXJlIG9mIHRoZSBkYXRhXFxuNDMwOTpcXHQgKiBAdHJ1c3RlZF9rZXlyaW5nOiBrZXlyaW5nIHdpdGgga2V5cyB0cnVzdGVkIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXFxuNDMxMDpcXHQgKlxcbjQzMTE6XFx0ICogVmVyaWZ5IHRoZSBQS0NTIzcgc2lnbmF0dXJlICpzaWdfcHRyKiBhZ2FpbnN0IHRoZSBzdXBwbGllZCAqZGF0YV9wdHIqXFxuNDMxMjpcXHQgKiB3aXRoIGtleXMgaW4gYSBrZXlyaW5nIHJlZmVyZW5jZWQgYnkgKnRydXN0ZWRfa2V5cmluZyouXFxuNDMxMzpcXHQgKlxcbjQzMTQ6XFx0ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuXFxuNDMxNTpcXHQgKi9cXG40MzE2OlxcdF9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbjQzMTc6XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG40MzE4OlxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgYnBmX2tleSAqdHJ1c3RlZF9rZXlyaW5nKVxcbjQzMTk6XFx0e1xcbjQzMjA6XFx0I2lmZGVmIENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG40MzIxOlxcdFxcdGNvbnN0IHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKmRhdGFfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilkYXRhX3A7XFxuNDMyMjpcXHRcXHRjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuICpzaWdfcHRyID0gKHN0cnVjdCBicGZfZHlucHRyX2tlcm4gKilzaWdfcDtcXG40MzIzOlxcdFxcdGNvbnN0IHZvaWQgKmRhdGEsICpzaWc7XFxuNDMyNDpcXHRcXHR1MzIgZGF0YV9sZW4sIHNpZ19sZW47XFxuNDMyNTpcXHRcXHRpbnQgcmV0O1xcbjQzMjY6XFx0XFxuNDMyNzpcXHRcXHRpZiAodHJ1c3RlZF9rZXlyaW5nLVxcdTAwM2VoYXNfcmVmKSB7XFxuNDMyODpcXHRcXHRcXHQvKlxcbjQzMjk6XFx0XFx0XFx0ICogRG8gdGhlIHBlcm1pc3Npb24gY2hlY2sgZGVmZXJyZWQgaW4gYnBmX2xvb2t1cF91c2VyX2tleSgpLlxcbjQzMzA6XFx0XFx0XFx0ICogU2VlIGJwZl9sb29rdXBfdXNlcl9rZXkoKSBmb3IgbW9yZSBkZXRhaWxzLlxcbjQzMzE6XFx0XFx0XFx0ICpcXG40MzMyOlxcdFxcdFxcdCAqIEEgY2FsbCB0byBrZXlfdGFza19wZXJtaXNzaW9uKCkgaGVyZSB3b3VsZCBiZSByZWR1bmRhbnQsIGFzXFxuNDMzMzpcXHRcXHRcXHQgKiBpdCBpcyBhbHJlYWR5IGRvbmUgYnkga2V5cmluZ19zZWFyY2goKSBjYWxsZWQgYnlcXG40MzM0OlxcdFxcdFxcdCAqIGZpbmRfYXN5bW1ldHJpY19rZXkoKS5cXG40MzM1OlxcdFxcdFxcdCAqL1xcbjQzMzY6XFx0XFx0XFx0cmV0ID0ga2V5X3ZhbGlkYXRlKHRydXN0ZWRfa2V5cmluZy1cXHUwMDNla2V5KTtcXG40MzM3OlxcdFxcdFxcdGlmIChyZXQgXFx1MDAzYyAwKVxcbjQzMzg6XFx0XFx0XFx0XFx0cmV0dXJuIHJldDtcXG40MzM5OlxcdFxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6NDMuMzAyNjIxNjM4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2NzQ4NjQzNjAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKktlcm5lbCBDb25maWd1cmF0aW9uIGFuZCBTaWduYXR1cmUgVmVyaWZpY2F0aW9uKipcblxuUmlnaHQsIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3MgbGlrZSBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgYWJzb2x1dGVseSAqY3JpdGljYWwqIGZvciBpdCB0byBhY3R1YWxseSBkbyBhbnl0aGluZyBtZWFuaW5nZnVsLiBJZiB0aGF0J3Mgbm90IGVuYWJsZWQsIEknbSBiZXR0aW5nIGl0IGp1c3QgYmFpbHMgb3V0IHdpdGggYW4gYC1FT1BOT1RTVVBQYCBvciBzaW1pbGFyIGVycm9yIGNvZGUsIGVmZmVjdGl2ZWx5IGRpc2FibGluZyB0aGUgc2lnbmF0dXJlIGNoZWNrLiBObyBwb2ludCBpbiBwcm9jZWVkaW5nIHdpdGhvdXQgdGhhdCwgcmlnaHQ/IE5vdywgbGV0IG1lIHF1aWNrbHkgZ2xhbmNlIGF0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBlbnN1cmUgdGhhdCBJIGRpZCBub3QgbWlzcyBhbnl0aGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDU1MDAsIk91dHB1dFRva2VucyI6MzcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjQ2Ljk3NzQ4NzY2OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzU0ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9oZWxwZXJzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNDM0MCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNDM0MDpcXHRcXG40MzQxOlxcdFxcdGRhdGFfbGVuID0gX19icGZfZHlucHRyX3NpemUoZGF0YV9wdHIpO1xcbjQzNDI6XFx0XFx0ZGF0YSA9IF9fYnBmX2R5bnB0cl9kYXRhKGRhdGFfcHRyLCBkYXRhX2xlbik7XFxuNDM0MzpcXHRcXHRpZiAoIWRhdGEpXFxuNDM0NDpcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG40MzQ1OlxcdFxcbjQzNDY6XFx0XFx0c2lnX2xlbiA9IF9fYnBmX2R5bnB0cl9zaXplKHNpZ19wdHIpO1xcbjQzNDc6XFx0XFx0c2lnID0gX19icGZfZHlucHRyX2RhdGEoc2lnX3B0ciwgc2lnX2xlbik7XFxuNDM0ODpcXHRcXHRpZiAoIXNpZylcXG40MzQ5OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjQzNTA6XFx0XFxuNDM1MTpcXHRcXHRyZXR1cm4gdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShkYXRhLCBkYXRhX2xlbiwgc2lnLCBzaWdfbGVuLFxcbjQzNTI6XFx0XFx0XFx0XFx0XFx0ICAgICAgdHJ1c3RlZF9rZXlyaW5nLVxcdTAwM2VrZXksXFxuNDM1MzpcXHRcXHRcXHRcXHRcXHQgICAgICBWRVJJRllJTkdfQlBGX1NJR05BVFVSRSwgTlVMTCxcXG40MzU0OlxcdFxcdFxcdFxcdFxcdCAgICAgIE5VTEwpO1xcbjQzNTU6XFx0I2Vsc2VcXG40MzU2OlxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG40MzU3OlxcdCNlbmRpZiAvKiBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OICovXFxuNDM1ODpcXHR9XFxuNDM1OTpcXHQjZW5kaWYgLyogQ09ORklHX0tFWVMgKi9cXG40MzYwOlxcdFxcbjQzNjE6XFx0dHlwZWRlZiBpbnQgKCpicGZfdGFza193b3JrX2NhbGxiYWNrX3QpKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUpO1xcbjQzNjI6XFx0XFxuNDM2MzpcXHRlbnVtIGJwZl90YXNrX3dvcmtfc3RhdGUge1xcbjQzNjQ6XFx0XFx0LyogYnBmX3Rhc2tfd29yayBpcyByZWFkeSB0byBiZSB1c2VkICovXFxuNDM2NTpcXHRcXHRCUEZfVFdfU1RBTkRCWSA9IDAsXFxuNDM2NjpcXHRcXHQvKiBpcnEgd29yayBzY2hlZHVsaW5nIGluIHByb2dyZXNzICovXFxuNDM2NzpcXHRcXHRCUEZfVFdfUEVORElORyxcXG40MzY4OlxcdFxcdC8qIHRhc2sgd29yayBzY2hlZHVsaW5nIGluIHByb2dyZXNzICovXFxuNDM2OTpcXHRcXHRCUEZfVFdfU0NIRURVTElORyxcXG40MzcwOlxcdFxcdC8qIHRhc2sgd29yayBpcyBzY2hlZHVsZWQgc3VjY2Vzc2Z1bGx5ICovXFxuNDM3MTpcXHRcXHRCUEZfVFdfU0NIRURVTEVELFxcbjQzNzI6XFx0XFx0LyogY2FsbGJhY2sgaXMgcnVubmluZyAqL1xcbjQzNzM6XFx0XFx0QlBGX1RXX1JVTk5JTkcsXFxuNDM3NDpcXHRcXHQvKiBhc3NvY2lhdGVkIEJQRiBtYXAgdmFsdWUgaXMgZGVsZXRlZCAqL1xcbjQzNzU6XFx0XFx0QlBGX1RXX0ZSRUVELFxcbjQzNzY6XFx0fTtcXG40Mzc3OlxcdFxcbjQzNzg6XFx0c3RydWN0IGJwZl90YXNrX3dvcmtfY3R4IHtcXG40Mzc5OlxcdFxcdGVudW0gYnBmX3Rhc2tfd29ya19zdGF0ZSBzdGF0ZTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6NDYuOTc3NzI0ODc4WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU1NzUyNzY4NDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgZnJvbSBteSBleHBlcnQgcGVyc3BlY3RpdmU6XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gYW5kIEJQRiBWZXJpZmljYXRpb24qKlxuXG5SaWdodCwgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGFic29sdXRlbHkgY3J1Y2lhbC4gV2UgbmVlZCB0aGF0IGVuYWJsZWQuIEJ1dCBob2xkIG9uIGEgc2Vjb25kLi4uIEkgcmVjYWxsIHNlZWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIEFuZCB0aGF0IGZ1bmN0aW9uLCBpZiBtZW1vcnkgc2VydmVzLCBjYWxscyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgLiBOb3csIHRoYXQncyBpbnRlcmVzdGluZy4gR2l2ZW4gdGhlIGNvbnRleHQsIEkgc2hvdWxkIHF1aWNrbHkgdmVyaWZ5IGlmIHRoZSB1c2Ugb2YgdGhvc2Ugc2lnbmF0dXJlIGZ1bmN0aW9ucyBpcyBzb21laG93IGNvbmRpdGlvbmFsLiBTbywgbGV0IG1lIGp1c3QgZG91YmxlLWNoZWNrIHRoZSBjb2RlLCBzcGVjaWZpY2FsbHkgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsIHRvIHNlZSBpZiB0aGUgY2FsbHMgdG8gdGhvc2Ugc2lnbmF0dXJlIHZlcmlmaWNhdGlvbnMgYXJlIGd1YXJkZWQgYnkgYW5vdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbiBvciBzb21lIG90aGVyIGxvZ2ljLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZnVsbCBjb250ZXh0IGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ2MzYzLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMjo1Mi41NTMwMDM4NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMDUzOTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTg5MCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTk4OTA6XFx0ICogb25jZSB0aGUgcHJvZ3JhbSdzIG1ldGFkYXRhIG1hcHMgaGF2ZSBiZWVuIHJlc29sdmVkIGludG8gdXNlZF9tYXBzLCBzb1xcbjE5ODkxOlxcdCAqIHRoZSBleGFjdCBtYXBzIGZvbGRlZCBpbnRvIHRoZSBzaWduYXR1cmUgYXJlIHRoZSBvbmVzIHRoZSBwcm9ncmFtIGJpbmRzLlxcbjE5ODkyOlxcdCAqXFxuMTk4OTM6XFx0ICogVGhlIHNpZ25hdHVyZSBjb3ZlcnMgdGhlIGluc3RydWN0aW9ucyBmb2xsb3dlZCBieSB0aGUgZnJvemVuIGNvbnRlbnRzIG9mXFxuMTk4OTQ6XFx0ICogZWFjaCBtYXAsIGluIEBtYXBzIG9yZGVyOiBpbnNucyB8fCBtYXBfMCB8fCBtYXBfMSB8fCBbLi4uXS4gT24gc3VjY2VzcyB0aGVcXG4xOTg5NTpcXHQgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctXFx1MDAzZWF1eC5cXG4xOTg5NjpcXHQgKi9cXG4xOTg5NzpcXHRzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4xOTg5ODpcXHRcXHRcXHRcXHRcXHQgICAgIHVuaW9uIGJwZl9hdHRyICphdHRyLCBib29sIGlzX2tlcm5lbClcXG4xOTg5OTpcXHR7XFxuMTk5MDA6XFx0XFx0YnBmcHRyX3QgdXNpZyA9IG1ha2VfYnBmcHRyKGF0dHItXFx1MDAzZXNpZ25hdHVyZSwgaXNfa2VybmVsKTtcXG4xOTkwMTpcXHRcXHRzdHJ1Y3QgYnBmX2R5bnB0cl9rZXJuIHNpZ19wdHIsIGRhdGFfcHRyO1xcbjE5OTAyOlxcdFxcdHN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGVudi1cXHUwMDNlcHJvZztcXG4xOTkwMzpcXHRcXHRzdHJ1Y3QgYnBmX21hcCAqKm1hcHMgPSBlbnYtXFx1MDAzZXVzZWRfbWFwcztcXG4xOTkwNDpcXHRcXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcXG4xOTkwNTpcXHRcXHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcXG4xOTkwNjpcXHRcXHR1MzIgbWFwX2NudCA9IGVudi1cXHUwMDNldXNlZF9tYXBfY250O1xcbjE5OTA3OlxcdFxcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xcbjE5OTA4OlxcdFxcdHU2NCBkYXRhX3N6O1xcbjE5OTA5OlxcdFxcdGludCBlcnIgPSAwO1xcbjE5OTEwOlxcdFxcbjE5OTExOlxcdFxcdC8qXFxuMTk5MTI6XFx0XFx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxcbjE5OTEzOlxcdFxcdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxcbjE5OTE0OlxcdFxcdCAqL1xcbjE5OTE1OlxcdFxcdGlmIChhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSBcXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXFxuMTk5MTY6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMTk5MTc6XFx0XFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpID09IDApXFxuMTk5MTg6XFx0XFx0XFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbjE5OTE5OlxcdFxcdGVsc2VcXG4xOTkyMDpcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbjE5OTIxOlxcdFxcdGlmICgha2V5KSB7XFxuMTk5MjI6XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxcXG5cXFwiLFxcbjE5OTIzOlxcdFxcdFxcdFxcdGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbjE5OTI0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjE5OTI1OlxcdFxcdH1cXG4xOTkyNjpcXHRcXG4xOTkyNzpcXHRcXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xcbjE5OTI4OlxcdFxcdGlmIChJU19FUlIoc2lnKSkge1xcbjE5OTI5OlxcdFxcdFxcdGJwZl9rZXlfcHV0KGtleSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjUyLjU1NTA2MDgyWiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU2OTkwNTU3ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQ29uZmlndXJhdGlvbiBEZXBlbmRlbmN5IEFuYWx5c2lzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHRoaXMgQlBGIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd29ya3MuIElmIGBDT05GSUdfS0VZU2AgaXNuJ3QgZW5hYmxlZCwgdGhlbiB0aGUga2V5IGxvb2t1cCBmdW5jdGlvbnMsIGBicGZfbG9va3VwX3N5c3RlbV9rZXlgIGFuZCBgYnBmX2xvb2t1cF91c2VyX2tleWAsIGFyZSBnb2luZyB0byByZXR1cm4gYE5VTExgLiBUaGF0J3MgYSBwcm9ibGVtIGJlY2F1c2UgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRoZW4gcmV0dXJucyBgLUVJTlZBTGAuIFNvLCBjbGVhcmx5LCBJIG5lZWQgYENPTkZJR19LRVlTYC4gQW5kIHNpbmNlIHdlIGFyZSBkZWFsaW5nIHdpdGggc2lnbmF0dXJlcywgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGFsc28gZXNzZW50aWFsLlxuXG5Ib2xkIG9uLCBJJ3ZlIGFscmVhZHkgY29uZmlybWVkIHRoYXQgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZC4gQXJlIHRoZXJlIGFueSBvdGhlciByZXF1aXJlZCBjb25maWd1cmF0aW9ucz8gSSdkIGJldHRlciBjaGVjayBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGluIGBpbmNsdWRlL2xpbnV4L2JwZi5oYC4gQWgsIHJpZ2h0LCBpdCdzIGRlZmluZWQgd2l0aCBhIGAjaWYgZGVmaW5lZChDT05GSUdfS0VZUykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKWAuIFRoYXQgY29uZmlybXMgbXkgZmlyc3QgdGhvdWdodDogSSAqbmVlZCogYENPTkZJR19LRVlTYC5cblxuQWxzbywgSSdtIHByZXR0eSBzdXJlIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGZyb20gcmV0dXJuaW5nIGAtRU9QTk9UU1VQUGAuIFRoYXQncyB0aGUgZXhwZWN0ZWQgYmVoYXZpb3IuIFdhaXQsIGlzbid0IHRoYXQgZnVuY3Rpb24gZGVmaW5lZCBpbiBga2VybmVsL2JwZi9oZWxwZXJzLmNgPyBMZXQncyB2ZXJpZnkuIFllYWgsIGl0J3MgdGhlcmUsIGJ1dCBpdCdzIGd1YXJkZWQgYnkgYCNpZmRlZiBDT05GSUdfS0VZU2AsIHNvIHRoYXQgbG9va3MgY29ycmVjdC4gSSB0aGluayBJIHdpbGwgZG91YmxlIGNoZWNrIGBrZXJuZWwvYnBmL2hlbHBlcnMuY2AgdG8gbWFrZSBjZXJ0YWluLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NzQyMCwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIyOjU4LjI1NDEyMDEyM1oiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM1OTc4MDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19LRVlTXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvaGVscGVycy5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGVscGVycy5jPTQxOTI9X19icGZfa2Z1bmMgaW50IGJwZl9zdHJuY2FzZXN0cihjb25zdCBjaGFyICpzMV9faWduLCBjb25zdCBjaGFyICpzMl9faWduLFxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDE5Ny1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0MTk4OiNpZmRlZiBDT05GSUdfS0VZU1xcbmtlcm5lbC9icGYvaGVscGVycy5jLTQxOTktLyoqXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00MzE2PV9fYnBmX2tmdW5jIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDM1OC19XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDM1OTojZW5kaWYgLyogQ09ORklHX0tFWVMgKi9cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy00MzYwLVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDg1MT1CVEZfSURfRkxBR1MoZnVuYywgYnBmX3NlbmRfc2lnbmFsX3Rhc2spXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDg1Mi0jZW5kaWZcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0ODUzOiNpZmRlZiBDT05GSUdfS0VZU1xcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ4NTQtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9sb29rdXBfdXNlcl9rZXksIEtGX0FDUVVJUkUgfCBLRl9SRVRfTlVMTCB8IEtGX1NMRUVQQUJMRSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjI6NTguNTkwMTAyOTQxWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzOTcxMTI1ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKk15IENvbmZpZ3VyYXRpb24gQ29uc2lkZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCByaWdodCBvZmYgdGhlIGJhdCwgSSBuZWVkIHRvIGZvY3VzIG9uIGEgY291cGxlIG9mIGtleSBjb25maWd1cmF0aW9uIGVsZW1lbnRzLiBTcGVjaWZpY2FsbHksIEkga25vdyBJJ20gZ29pbmcgdG8gbmVlZCBgQ09ORklHX0tFWVNgIGFuZCBgQ09ORklHX1NZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAuIFRob3NlIGFyZSBnaXZlbnMuIFRoZSByZWFsIHF1ZXN0aW9uIGlzOiBhbSBJIG1pc3NpbmcgYW55dGhpbmcgZWxzZSBjcnVjaWFsIGhlcmU/IExldCBtZSBxdWlja2x5IGNvbnNpZGVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBkZXBlbmRlbmNpZXMgb3IgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBJIG1pZ2h0IGJlIG92ZXJsb29raW5nLiBUaW1lIHRvIGRyaWxsIGRvd24gaW50byB0aG9zZS4gTGV0J3Mgc3RhcnQgd2l0aCBhIHNvbGlkIGxvb2sgYXQgYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIHRvIG1ha2Ugc3VyZSBJJ3ZlIGdvdCBhIGNvbXByZWhlbnNpdmUgZ3Jhc3Agb2Ygd2hhdCdzIGludm9sdmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODM3OCwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIzOjAxLjk4NzIxNzk2WiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzE3MTM0ODQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5pdC9LY29uZmlnPTIxODE9ZW5kbWVudVxcbmluaXQvS2NvbmZpZy0yMTgyLVxcbmluaXQvS2NvbmZpZzoyMTgzOmNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5pbml0L0tjb25maWctMjE4NC1cXHRkZWZfYm9vbCBuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIzOjA0LjMwNDM1Nzg3M1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1Mjk0MjQ0NzUxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIHdpdGggdGhlIGFzc3VtcHRpb24gSSdtIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6XG5cbioqRGlnZ2luZyBpbnRvIHRoYXQgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgRmxhZyoqXG5cblJpZ2h0LCBzbyBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gSSBzZWUgaXQncyBhIGJvb2xlYW4sIGRlZmF1bHRzIHRvIFwiblwiLiBUaGF0IHJhaXNlcyBhIGZsYWcgaW1tZWRpYXRlbHksIGVzcGVjaWFsbHkgZ2l2ZW4gbXkga25vd2xlZGdlIG9mIHRoZSBzeXN0ZW0uIEl0J3MgKnNlbGVjdGVkKiBieSBvdGhlciBjb25maWdzLCBub3Qgc2V0IGRpcmVjdGx5LiBUaGF0IGltcGxpZXMgaXQncyBhIGRlcGVuZGVuY3ksIG9yIGEgZmVhdHVyZSBmbGFnIHRyaWdnZXJlZCBieSBzb21ldGhpbmcgZWxzZS4gV2UgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSB0cmlnZ2VyLiBUaW1lIHRvIHRyYWNlIHRoZSByZWxhdGlvbnNoaXBzLCBmaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCdzIGRlcGVuZGVudCBvbiBpdCBhbmQgKndoeSouIEknbSBnb2luZyB0byBmb2xsb3cgdGhlIHNlbGVjdHMgcGF0aCBhbmQgc2VlIHdoYXQncyBjb250cm9sbGluZyB0aGF0IHZhbHVlLiBUaGUgaW1wbGljYXRpb25zIG9mIHRoaXMgc2V0dGluZyBhcmUgY3J1Y2lhbCBmb3Igc3lzdGVtIGludGVncml0eS4gSXQncyBvZnRlbiBhdCB0aGUgY29yZSBvZiBjb25maWd1cmF0aW9uIGlzc3Vlcywgc28gbGV0J3MgZ2V0IGludG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ4NjU3LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6MDkuNTk4NjA2MDE0WiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMzg4MTM0MDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiYXJjaC9zMzkwL0tjb25maWc9NzU9Y29uZmlnIFMzOTBcXG4tLVxcbmFyY2gvczM5MC9LY29uZmlnLTI3OC1cXHRzZWxlY3QgU1lTQ1RMX0VYQ0VQVElPTl9UUkFDRVxcbmFyY2gvczM5MC9LY29uZmlnOjI3OTpcXHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OIGlmIEtFWEVDX1NJR1xcbmFyY2gvczM5MC9LY29uZmlnLTI4MC1cXHRzZWxlY3QgVEhSRUFEX0lORk9fSU5fVEFTS1xcbi0tXFxuZHJpdmVycy9tZC9LY29uZmlnPTU4MT1jb25maWcgRE1fVkVSSVRZX1ZFUklGWV9ST09USEFTSF9TSUdcXG4tLVxcbmRyaXZlcnMvbWQvS2NvbmZpZy01ODMtXFx0ZGVwZW5kcyBvbiBETV9WRVJJVFlcXG5kcml2ZXJzL21kL0tjb25maWc6NTg0OlxcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5kcml2ZXJzL21kL0tjb25maWctNTg1LVxcdGhlbHBcXG4tLVxcbmZzL3ViaWZzL0tjb25maWc9ODk9Y29uZmlnIFVCSUZTX0ZTX0FVVEhFTlRJQ0FUSU9OXFxuLS1cXG5mcy91Ymlmcy9LY29uZmlnLTkyLVxcdHNlbGVjdCBDUllQVE9fSE1BQ1xcbmZzL3ViaWZzL0tjb25maWc6OTM6XFx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmZzL3ViaWZzL0tjb25maWctOTQtXFx0aGVscFxcbi0tXFxuZnMvdmVyaXR5L0tjb25maWc9MzQ9Y29uZmlnIEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNcXG4tLVxcbmZzL3Zlcml0eS9LY29uZmlnLTM2LVxcdGRlcGVuZHMgb24gRlNfVkVSSVRZXFxuZnMvdmVyaXR5L0tjb25maWc6Mzc6XFx0c2VsZWN0IFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlxcbmZzL3Zlcml0eS9LY29uZmlnLTM4LVxcdGhlbHBcXG4tLVxcbmluaXQvS2NvbmZpZz0yMjY3PWNvbmZpZyBNT0RVTEVfU0lHX0ZPUk1BVFxcbmluaXQvS2NvbmZpZy0yMjY4LVxcdGRlZl9ib29sIG5cXG5pbml0L0tjb25maWc6MjI2OTpcXHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxuaW5pdC9LY29uZmlnLTIyNzAtXFxuLS1cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZz04OT1jb25maWcgQ0ZHODAyMTFfUkVRVUlSRV9TSUdORURfUkVHREJcXG4tLVxcbm5ldC93aXJlbGVzcy9LY29uZmlnLTkxLVxcdGRlZmF1bHQgeVxcbm5ldC93aXJlbGVzcy9LY29uZmlnOjkyOlxcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG5uZXQvd2lyZWxlc3MvS2NvbmZpZy05My1cXHRoZWxwXFxuLS1cXG5zZWN1cml0eS9pcGUvS2NvbmZpZz02PW1lbnVjb25maWcgU0VDVVJJVFlfSVBFXFxuLS1cXG5zZWN1cml0eS9pcGUvS2NvbmZpZy0xMC1cXHRzZWxlY3QgUEtDUzdfTUVTU0FHRV9QQVJTRVJcXG5zZWN1cml0eS9pcGUvS2NvbmZpZzoxMTpcXHRzZWxlY3QgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OXFxuc2VjdXJpdHkvaXBlL0tjb25maWctMTItXFx0c2VsZWN0IElQRV9QUk9QX0RNX1ZFUklUWSBpZiBETV9WRVJJVFlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6MTEuOTg2NzQ1MjQyWiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc3MzcxMTYzOTUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIENvbmZpZ3VyYXRpb24gT3B0aW9ucyBmb3IgRnV6emluZyBJbmZyYXN0cnVjdHVyZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGhvdyB0byBiZXN0IGVuYWJsZSBjZXJ0YWluIGZlYXR1cmVzIGZvciBmdXp6aW5nLCBzcGVjaWZpY2FsbHkgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgYW5kIGBLRVlTYC4gTXkgaW5pdGlhbCB0aG91Z2h0IHdhcyB0byBzaW1wbHkgaW5jbHVkZSBib3RoIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGFuZCBgS0VZU2AgZGlyZWN0bHkgaW4gYEVuYWJsZUNvbmZpZ3NgLiBCdXQgaGFuZyBvbiwgYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgaXMgZGVmaW5lZCBhcyBgZGVmX2Jvb2wgbmAsIG1lYW5pbmcgaXQncyBub3QgYSBkaXJlY3QgdXNlciBzZWxlY3Rpb24uIEl0IGhhcyB0byBiZSAqc2VsZWN0ZWQqIGJ5IHNvbWV0aGluZyBlbHNlLCB3aGljaCBjaGFuZ2VzIHRoaW5ncy5cblxuQWxyaWdodCwgc28gYENPTkZJR19TWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIGEgY29uZmlndXJhdGlvbiBmbGFnLiBJZiBJIGp1c3QgbGlzdCBpdCwgdGhlIGZ1enppbmcgaW5mcmFzdHJ1Y3R1cmUgKmNvdWxkKiBwb3RlbnRpYWxseSBlbmFibGUgaXQgZGlyZWN0bHkuIEhvd2V2ZXIsIGdpdmVuIHRoYXQgYGRlZl9ib29sIG5gLCBpdCdzIG1vcmUgbGlrZWx5IHRoYXQgdGhlIGZ1enppbmcgdG9vbHMgbWlnaHQgbmVlZCB0byBzZWxlY3QgaXQgaW5kaXJlY3RseSwgb3IgdGhhdCBJIG5lZWQgdG8gbGlzdCBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRoYXQgc2VsZWN0cyBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gVGhpbmtpbmcgYWJvdXQgaXQgbm93LCB0aGUgZnV6emluZyBpbmZyYXN0cnVjdHVyZSAqY2FuKiBlbmFibGUgaXQgZGlyZWN0bHkgaWYgaXQncyBpbiB0aGUgY29uZmlndXJhdGlvbiBsaXN0LiBIbW0sIHRoZSBgZGVmX2Jvb2wgbmAgbWVhbnMgaXQncyBub3QgZGlyZWN0bHkgc2VsZWN0YWJsZSB2aWEsIHNheSwgYG1ha2UgZGVmY29uZmlnYCB1bmxlc3MgaXQncyBzZWxlY3RlZCBlbHNld2hlcmUuIFNvIHRoZSBmdXp6aW5nIGluZnJhc3RydWN0dXJlIG1heSBoYXZlIHRvIGVuYWJsZSBpdCBkaXJlY3RseSB3aXRoIG92ZXJyaWRlcyBvciBzb21ldGhpbmcgc2ltaWxhci5cblxuSSBzaG91bGQgdmVyaWZ5IHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IHJlbGF0aW9uc2hpcHMuIFRpbWUgdG8gY2hlY2sgYGluaXQvS2NvbmZpZ2AgdG8gc2VlIHdoYXQgYWN0dWFsbHkgKmRvZXMqIHNlbGVjdCB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGFuZCBwcm9jZWVkIGZyb20gdGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ5NDgyLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTg5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIzOjE5LjcyMzg2NjE4N1oiLCJTZXEiOjI0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTc4NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5pdC9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxODAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIxODA6XFx0XFxuMjE4MTpcXHRlbmRtZW51XFxuMjE4MjpcXHRcXG4yMTgzOlxcdGNvbmZpZyBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG4yMTg0OlxcdFxcdGRlZl9ib29sIG5cXG4yMTg1OlxcdFxcdHNlbGVjdCBTWVNURU1fVFJVU1RFRF9LRVlSSU5HXFxuMjE4NjpcXHRcXHRzZWxlY3QgS0VZU1xcbjIxODc6XFx0XFx0c2VsZWN0IENSWVBUT1xcbjIxODg6XFx0XFx0c2VsZWN0IENSWVBUT19SU0FcXG4yMTg5OlxcdFxcdHNlbGVjdCBBU1lNTUVUUklDX0tFWV9UWVBFXFxuMjE5MDpcXHRcXHRzZWxlY3QgQVNZTU1FVFJJQ19QVUJMSUNfS0VZX1NVQlRZUEVcXG4yMTkxOlxcdFxcdHNlbGVjdCBBU04xXFxuMjE5MjpcXHRcXHRzZWxlY3QgT0lEX1JFR0lTVFJZXFxuMjE5MzpcXHRcXHRzZWxlY3QgWDUwOV9DRVJUSUZJQ0FURV9QQVJTRVJcXG4yMTk0OlxcdFxcdHNlbGVjdCBQS0NTN19NRVNTQUdFX1BBUlNFUlxcbjIxOTU6XFx0XFx0aGVscFxcbjIxOTY6XFx0XFx0ICBQcm92aWRlIFBLQ1MjNyBtZXNzYWdlIHZlcmlmaWNhdGlvbiB1c2luZyB0aGUgY29udGVudHMgb2YgdGhlIHN5c3RlbVxcbjIxOTc6XFx0XFx0ICB0cnVzdGVkIGtleXJpbmcgdG8gcHJvdmlkZSBwdWJsaWMga2V5cy4gIFRoaXMgdGhlbiBjYW4gYmUgdXNlZCBmb3JcXG4yMTk4OlxcdFxcdCAgbW9kdWxlIHZlcmlmaWNhdGlvbiwga2V4ZWMgaW1hZ2UgdmVyaWZpY2F0aW9uIGFuZCBmaXJtd2FyZSBibG9iXFxuMjE5OTpcXHRcXHQgIHZlcmlmaWNhdGlvbi5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6MTkuNzI0MDg2NDU3WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ5MjAxMDAzMjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOlxuXG4qKk5hdmlnYXRpbmcgdGhlIERlcGVuZGVuY3kgV2ViKipcblxuQWxyaWdodCwgc28gYFNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTmAgLSBubyBkaXJlY3QgcHJvbXB0LCB3aGljaCBtZWFucyBJIGNhbid0IGp1c3QgZmxpcCBpdCBvbi4gVGhpcyBpcyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLiBJIG5lZWQgdG8gZmluZCBzb21ldGhpbmcgdGhhdCAqZW5hYmxlcyogaXQsIGEgc3RlcHBpbmcgc3RvbmUsIGlmIHlvdSB3aWxsLiBgTU9EVUxFX1NJR19GT1JNQVRgIGFuZCBgRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU2AgYXJlIHRoZSBsaWtlbHkgY2FuZGlkYXRlcywgdGhleSBzb3VuZCByZWxldmFudC4gSG1tLCB3YWl0IGEgc2Vjb25kLi4uIGBNT0RVTEVfU0lHX0ZPUk1BVGAuLi4gaXNuJ3QgdGhhdCBhIGBkZWZfYm9vbCBuYD8gVGhhdCdzIG5vdCBpZGVhbC4gTGV0J3Mgc2VlIHdoYXQgYE1PRFVMRV9TSUdgIGlzLiBJJ2xsIG5lZWQgdG8gZGlnIGludG8gaXQgZGVlcGVyLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MDI5MCwiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6MjQuNjQ0MTkwOTM0WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyMTQ0NjAxMDA0LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvbmZpZyBNT0RVTEVfU0lHXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImNlcnRzL0tjb25maWc9Mj1tZW51IFxcXCJDZXJ0aWZpY2F0ZXMgZm9yIHNpZ25hdHVyZSBjaGVja2luZ1xcXCJcXG5jZXJ0cy9LY29uZmlnLTMtXFxuY2VydHMvS2NvbmZpZzo0OmNvbmZpZyBNT0RVTEVfU0lHX0tFWVxcbmNlcnRzL0tjb25maWctNS1cXHRzdHJpbmcgXFxcIkZpbGUgbmFtZSBvciBQS0NTIzExIFVSSSBvZiBtb2R1bGUgc2lnbmluZyBrZXlcXFwiXFxuLS1cXG5jZXJ0cy9LY29uZmlnPTE4PWNob2ljZVxcbi0tXFxuY2VydHMvS2NvbmZpZy0yNC1cXG5jZXJ0cy9LY29uZmlnOjI1OmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX1JTQVxcbmNlcnRzL0tjb25maWctMjYtXFx0Ym9vbCBcXFwiUlNBXFxcIlxcbi0tXFxuY2VydHMvS2NvbmZpZy0yOS1cXG5jZXJ0cy9LY29uZmlnOjMwOmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX0VDRFNBXFxuY2VydHMvS2NvbmZpZy0zMS1cXHRib29sIFxcXCJFQ0RTQVxcXCJcXG4tLVxcbmNlcnRzL0tjb25maWctNDEtXFxuY2VydHMvS2NvbmZpZzo0Mjpjb25maWcgTU9EVUxFX1NJR19LRVlfVFlQRV9NTERTQV80NFxcbmNlcnRzL0tjb25maWctNDMtXFx0Ym9vbCBcXFwiTUwtRFNBLTQ0XFxcIlxcbi0tXFxuY2VydHMvS2NvbmZpZy01Mi1cXG5jZXJ0cy9LY29uZmlnOjUzOmNvbmZpZyBNT0RVTEVfU0lHX0tFWV9UWVBFX01MRFNBXzY1XFxuY2VydHMvS2NvbmZpZy01NC1cXHRib29sIFxcXCJNTC1EU0EtNjVcXFwiXFxuLS1cXG5jZXJ0cy9LY29uZmlnLTYzLVxcbmNlcnRzL0tjb25maWc6NjQ6Y29uZmlnIE1PRFVMRV9TSUdfS0VZX1RZUEVfTUxEU0FfODdcXG5jZXJ0cy9LY29uZmlnLTY1LVxcdGJvb2wgXFxcIk1MLURTQS04N1xcXCJcXG4tLVxcbmluaXQvS2NvbmZpZz0yMjYzPWNvbmZpZyBSVF9NVVRFWEVTXFxuLS1cXG5pbml0L0tjb25maWctMjI2Ni1cXG5pbml0L0tjb25maWc6MjI2Nzpjb25maWcgTU9EVUxFX1NJR19GT1JNQVRcXG5pbml0L0tjb25maWctMjI2OC1cXHRkZWZfYm9vbCBuXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc9MjQxPWNvbmZpZyBNT0RVTEVfU1JDVkVSU0lPTl9BTExcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTEtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjI1Mjpjb25maWcgTU9EVUxFX1NJR1xcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yNTMtXFx0Ym9vbCBcXFwiTW9kdWxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjczLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNzQ6Y29uZmlnIE1PRFVMRV9TSUdfRk9SQ0VcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjc1LVxcdGJvb2wgXFxcIlJlcXVpcmUgbW9kdWxlcyB0byBiZSB2YWxpZGx5IHNpZ25lZFxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yODE9aWYgTU9EVUxFX1NJRyB8fCBJTUFfQVBQUkFJU0VfTU9EU0lHXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI4Mi1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MjgzOmNvbmZpZyBNT0RVTEVfU0lHX0FMTFxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0yODQtXFx0Ym9vbCBcXFwiQXV0b21hdGljYWxseSBzaWduIGFsbCBtb2R1bGVzXFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnPTI5Mz1jaG9pY2VcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMDItXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMwMzpjb25maWcgTU9EVUxFX1NJR19TSEEyNTZcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA0LVxcdGJvb2wgXFxcIlNIQS0yNTZcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzA2LVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMDc6Y29uZmlnIE1PRFVMRV9TSUdfU0hBMzg0XFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMwOC1cXHRib29sIFxcXCJTSEEtMzg0XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMxMC1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzExOmNvbmZpZyBNT0RVTEVfU0lHX1NIQTUxMlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTItXFx0Ym9vbCBcXFwiU0hBLTUxMlxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTQtXFxua2VybmVsL21vZHVsZS9LY29uZmlnOjMxNTpjb25maWcgTU9EVUxFX1NJR19TSEEzXzI1Nlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZy0zMTYtXFx0Ym9vbCBcXFwiU0hBMy0yNTZcXFwiXFxuLS1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzE4LVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzozMTk6Y29uZmlnIE1PRFVMRV9TSUdfU0hBM18zODRcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzIwLVxcdGJvb2wgXFxcIlNIQTMtMzg0XFxcIlxcbi0tXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyMi1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzIzOmNvbmZpZyBNT0RVTEVfU0lHX1NIQTNfNTEyXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyNC1cXHRib29sIFxcXCJTSEEzLTUxMlxcXCJcXG4tLVxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZz0zMjc9ZW5kY2hvaWNlXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTMyOC1cXG5rZXJuZWwvbW9kdWxlL0tjb25maWc6MzI5OmNvbmZpZyBNT0RVTEVfU0lHX0hBU0hcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMzMwLVxcdHN0cmluZ1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzoyNi43ODg3OTg0ODhaIiwiU2VxIjoyNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI3NjQ2Nzc2MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipDb25zaWRlcmluZyBLZXJuZWwgTW9kdWxlIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGJlc3QgYXBwcm9hY2ggZm9yIHZlcmlmeWluZyBrZXJuZWwgbW9kdWxlIHNpZ25hdHVyZXMuIGBNT0RVTEVfU0lHYCBpcyBkZWZpbml0ZWx5IGEgc3Ryb25nIGNvbnRlbmRlciwgYW5kIGlmIEkgY2hvb3NlIHRoYXQsIGl0IG1ha2VzIHNlbnNlIHRvIGdvIHdpdGggYE1PRFVMRV9TSUdfRk9STUFUYCwgd2hpY2ggdGhlbiB3b3VsZCBsZWFkIHRvIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBIb3dldmVyLCBJJ20ganVzdCByZWNhbGxpbmcgdGhhdCBgTU9EVUxFX1NJR2AgbWlnaHQgaW52b2x2ZSBrZXkgZ2VuZXJhdGlvbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsIGFuZCB0aGF0IGNhbiBiZSBhIGJpdCBvZiBhIHBhaW4uIEhtbW0uLi4gbWF5YmUgdGhlcmUncyBhIGJldHRlciBvcHRpb24uXG5cbkFscmlnaHQsIHdoYXQgYWJvdXQgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgPyBUaGF0IGNvdWxkIGJlIGEgZ29vZCBjaG9pY2UsIGJ1dCB0aGF0IGRlcGVuZHMgb24gYEZTX1ZFUklUWWAsIHdoaWNoIGlzIGZpbmUsIGJ1dCBJIGJldHRlciB2ZXJpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgIHJpZ2h0IGF3YXkuIFNvLCBJIG5lZWQgdG8gY2hlY2sgb3V0IGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTE1ODIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5MywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzozMS4wNjUyNjg3MzhaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjcyODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiZnMvdmVyaXR5L0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMzAsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgMzA6XFx0XFx0ICBwcm90ZWN0aW9uIGFnYWluc3QgbWFsaWNpb3VzIGRpc2tzIHZzLiBhbiBhaGVhZC1vZi10aW1lIGhhc2guXFxuICAzMTpcXHRcXG4gIDMyOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgTi5cXG4gIDMzOlxcdFxcbiAgMzQ6XFx0Y29uZmlnIEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNcXG4gIDM1OlxcdFxcdGJvb2wgXFxcIkZTIFZlcml0eSBidWlsdGluIHNpZ25hdHVyZSBzdXBwb3J0XFxcIlxcbiAgMzY6XFx0XFx0ZGVwZW5kcyBvbiBGU19WRVJJVFlcXG4gIDM3OlxcdFxcdHNlbGVjdCBTWVNURU1fREFUQV9WRVJJRklDQVRJT05cXG4gIDM4OlxcdFxcdGhlbHBcXG4gIDM5OlxcdFxcdCAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBpbi1rZXJuZWwgdmVyaWZpY2F0aW9uIG9mXFxuICA0MDpcXHRcXHQgIGZzLXZlcml0eSBidWlsdGluIHNpZ25hdHVyZXMuXFxuICA0MTpcXHRcXG4gIDQyOlxcdFxcdCAgUGxlYXNlIHRha2UgZ3JlYXQgY2FyZSBiZWZvcmUgdXNpbmcgdGhpcyBmZWF0dXJlLiAgSXQgaXMgbm90XFxuICA0MzpcXHRcXHQgIHRoZSBvbmx5IHdheSB0byBkbyBzaWduYXR1cmVzIHdpdGggZnMtdmVyaXR5LCBhbmQgdGhlXFxuICA0NDpcXHRcXHQgIGFsdGVybmF0aXZlcyAoc3VjaCBhcyB1c2Vyc3BhY2Ugc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgYW5kXFxuICA0NTpcXHRcXHQgIElNQSBhcHByYWlzYWwpIGNhbiBiZSBtdWNoIGJldHRlci4gIEZvciBkZXRhaWxzIGFib3V0IHRoZVxcbiAgNDY6XFx0XFx0ICBsaW1pdGF0aW9ucyBvZiB0aGlzIGZlYXR1cmUsIHNlZVxcbiAgNDc6XFx0XFx0ICBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2ZzdmVyaXR5LnJzdC5cXG4gIDQ4OlxcdFxcbiAgNDk6XFx0XFx0ICBJZiB1bnN1cmUsIHNheSBOLlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzozMS4wNjUzMzc0NThaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjE0Nzg1NDkwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBGUy1WZXJpdHkgYW5kIEZ1enppbmcgVGFyZ2V0cyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IGVuYWJsaW5nIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYC4gSXQgYXBwZWFycyBxdWl0ZSBzYWZlLCBhbmQgaXQgYXV0b21hdGljYWxseSBzZWxlY3RzIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLCB3aGljaCBpcyBnb29kLiBUaGF0LCBpbiB0dXJuLCBzZWxlY3RzIGBLRVlTYC4gU28sIG15IGluaXRpYWwgdGhvdWdodCBpcywgXCJQZXJmZWN0LCBqdXN0IGVuYWJsZSBgRlNfVkVSSVRZYCBhbmQgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgLlwiIFNlZW1zIGxpa2UgYSBjbGVhbiBhbmQgc3RyYWlnaHRmb3J3YXJkIGFkZGl0aW9uLlxuXG5CdXQgaG9sZCBvbiwgbGV0IG1lIGRvdWJsZS1jaGVjayBhYm91dCBgS0VZU2AuIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gICpkb2VzKiBzZWxlY3QgaXQuIEkgc2hvdWxkIHZlcmlmeSB0aGF0IGBLRVlTYCBpc24ndCBhbHJlYWR5IGVuYWJsZWQgaW4gdGhlIHN5emthbGxlciBjb25maWd1cmF0aW9uLiBJdCBwcm9iYWJseSBpcywgYnV0IGl0J3MgYSBxdWljayBzYW5pdHkgY2hlY2sgdG8gYmUgc3VyZSB3ZSdyZSBub3QgaW50cm9kdWNpbmcgYW55IHJlZHVuZGFuY2llcyBvciBjb25mbGljdHMuIEluIGFueSBjYXNlLCBhZGRpbmcgYEZTX1ZFUklUWWAgYW5kIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBzdGlsbCBzZWVtcyBsaWtlIGEgc29saWQgbW92ZS5cblxuTm93LCBsZXQncyBzd2l0Y2ggZ2VhcnMgdG8gZnV6emluZy4gSSBuZWVkIHRvIGlkZW50aWZ5IHRoZSBrZXkgZnVuY3Rpb25zIHRvIHRhcmdldC4gQmFzZWQgb24gdGhlIGNvbnRleHQsIHRoZXNlIHN0YW5kIG91dDpcbi0gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgXG4tIGBwcm9jZXNzX2ZkX2FycmF5YFxuLSBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYFxuLSBgZmRfYXJyYXlfZ2V0X2J0ZmBcbi0gYGZkX2FycmF5X2dldF9tYXBfaWR4YFxuLSBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgXG5cbkhvbGQgb24uIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gSSBzaG91bGQgcHJvYmFibHkgb3BlbiB0aGF0IGZpbGUgYW5kIGNoZWNrIG15IHVuZGVyc3RhbmRpbmcgb2Ygd2hlcmUgdGhpbmdzIGFyZS4gVGhpcyBpcyBhbGwgdmVyeSBzdGFuZGFyZCBhbmQgSSBjYW4gbW92ZSBmb3J3YXJkIGFjY29yZGluZ2x5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MjE5OSwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI2NSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIzOjM3LjIxMzE5NTg3MVoiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUxNTMzNzAzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5zdGF0aWMuKiBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTk4NzQ9c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5ODk2LSAqL1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTg5NzpzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTk4OTgtXFx0XFx0XFx0XFx0ICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjIzOjM3LjQ2NDczNDQ5NFoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1MzgwOTM3MzY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipFeGFtaW5pbmcgZUJQRiBWZXJpZmljYXRpb24gYW5kIEZEIEFycmF5IEhhbmRsaW5nKipcblxuUmlnaHQsIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBkZWZpbml0ZWx5IHByZXNlbnQuIEkgcmVtZW1iZXIgc2VlaW5nIHRoYXQsIGl0J3MgYSBrZXkgcGFydCBvZiB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuIEJ1dCwgSSdtIG5vdyB0aGlua2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBicm9hZGVyIGNvbnRleHQsIHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCBmaWxlIGRlc2NyaXB0b3IgYXJyYXlzLlxuXG5Ob3csIHdoYXQgYWJvdXQgYHByb2Nlc3NfZmRfYXJyYXlgPyBJJ20gdHJ5aW5nIHRvIHJlY2FsbCB0aGUgc3BlY2lmaWNzIG9mIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyByZWxhdGVkIHRvIHNoYXJpbmcgZmlsZSBkZXNjcmlwdG9ycyB3aXRoaW4gQlBGIHByb2dyYW1zLiBUaGlzIGluY2x1ZGVzIHRoZSB2YWxpZGF0aW9uIGxvZ2ljLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIGhvdyB3ZSBlbnN1cmUgdGhlIHNhZmV0eSBvZiBwcml2aWxlZ2VkIG9wZXJhdGlvbnMgaW52b2tlZCB1c2luZyBhIGdpdmVuIEZEIGFycmF5IGluZGV4LiBJcyBpdCByb2J1c3QgYWdhaW5zdCB2YXJpb3VzIGV4cGxvaXQgYXR0ZW1wdHM/IElzIGl0IHZ1bG5lcmFibGUgdG8gcmFjZXM/IEhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIHZlcmlmaWVyIHJ1bGVzPyBXZSByZWFsbHkgbmVlZCB0byBrbm93IHdoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aC5cblxuSSB3YW50IHRvIGRpdmUgZGVlcGVyIGludG8gdGhlIGNvZGUgcGF0aCB0aGF0IHVzZXMgdGhhdCBmdW5jdGlvbiwgdW5kZXJzdGFuZGluZyBpdHMgc2VjdXJpdHkgYm91bmRhcmllcy4gSSB3YW50IHRvIGNoZWNrIGZvciBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIHRoYXQgbWlnaHQgYWxsb3cgYXJiaXRyYXJ5IG1lbW9yeSBhY2Nlc3Mgb3IgYSBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2suXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzMDEyLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6NDIuODQ1Njc1MDE5WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODQwNzI4NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJec3RhdGljLiogcHJvY2Vzc19mZF9hcnJheVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jPTE5NTg1PXN0YXRpYyBpbnQgYWRkX2ZkX2Zyb21fZmRfYXJyYXkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeCwgaW50IGZkKVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5NjE2LVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTYxNzpzdGF0aWMgaW50IHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTYxOC1cXHRcXHRcXHRcXHQgICAgICAgYnBmcHRyX3QgZmRfYXJyYXksIHUzMiBjbnQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTk2NDMtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE5NjQ0OnN0YXRpYyBpbnQgcHJvY2Vzc19mZF9hcnJheShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTY0NS1cXHRcXHRcXHQgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzo0Mi45MjQwODc0OTRaIiwiU2VxIjozMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mzg5OTU4ODIwOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQ29uc2lkZXJpbmcgdGhlIGBmZF9hcnJheWAgRnVuY3Rpb25zKipcblxuUmlnaHQsIHNvIEknbSBmb2N1c2luZyBvbiB0aGVzZSBgZmRfYXJyYXlgIGZ1bmN0aW9ucy4gU3BlY2lmaWNhbGx5LCBgcHJvY2Vzc19mZF9hcnJheWAgYW5kIGBwcm9jZXNzX2ZkX2FycmF5X2NvbnRpbnVvdXNgIGp1bXAgb3V0IGFzIGJlaW5nIGNlbnRyYWwgdG8gc29tZSwgbGlrZWx5IHBlcmZvcm1hbmNlIGNyaXRpY2FsLCBwcm9jZXNzaW5nLiBUaGUgc3RydWN0dXJlIGFuZCBvcGVyYXRpb24gb2YgdGhlbSBtdXN0IGJlIGludGltYXRlbHkgdW5kZXJzdG9vZC4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGFtIGNvbWZvcnRhYmxlIHdpdGggdGhlaXIgb3BlcmF0aW9uIHVuZGVyIGxvYWQuIElzIHRoZXJlIGFuIGlzc3VlIHdpdGggdGhlaXIgb3BlcmF0aW9uIGFzIEkgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBGRHMgYW5kL29yIGR1cmF0aW9uIHRoZXkgYXJlIG9wZXJhdGluZyBvbj9cblxuQnV0IHRoZW4gSSBnbGFuY2UgYXQgYGZkX2FycmF5X2dldF9idGZgLiBJcyB0aGlzIHJlbGF0ZWQ/IElzIGl0IGp1c3QgYSBoZWxwZXIgZnVuY3Rpb24sIG9yIGRvZXMgaXQgcmVwcmVzZW50IGEgZGlzdGluY3QgcGhhc2UsIG9yIHBlcmhhcHMgZXZlbiBhIGNyaXRpY2FsIGRlcGVuZGVuY3kgZm9yIGhvdyB0aGUgb3RoZXIgdHdvIG9wZXJhdGU/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlLiBJdCB3b3VsZCBiZSBoZWxwZnVsIGlmIGl0IGhhZCBhcHByb3ByaWF0ZSBjb21tZW50cywgYW5kIEkgbmVlZCB0byBkbyBhIGNvZGUgZGl2ZS4gVGhlIHBvdGVudGlhbCBpbnRlcmFjdGlvbiBhbmQgaW5mb3JtYXRpb24gc2hhcmluZyBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBpcyBzb21ldGhpbmcgdGhhdCBJIG5lZWQgdG8ga25vdy5cblxuXG4iLCJJbnB1dFRva2VucyI6NTM1MzUsIk91dHB1dFRva2VucyI6MzksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzo0Ni44MjM2Nzg2OTNaIiwiU2VxIjozNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1NDM0MDUxMCwiRXJyb3IiOiJubyBtYXRjaGVzIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXnN0YXRpYy4qIGZkX2FycmF5X2dldF9idGZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzo0Ni45NzgwMjYzNDNaIiwiU2VxIjozNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzUzNTIxMTczNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3Mgc2VlLiBIZXJlJ3MgaG93IEknZCBhcHByb2FjaCBzdW1tYXJpemluZyB0aG9zZSB0aG91Z2h0czpcblxuKipBbmFseXppbmcgdGhlIGBmZF9hcnJheV9nZXRfYnRmYCBQYXRjaCoqXG5cbkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgaW50byBhbnl0aGluZyBlbHNlLCBJIG5lZWQgdG8gdGFrZSBhIGhhcmQgbG9vayBhdCB0aGF0IHBhdGNoIGZvciBgZmRfYXJyYXlfZ2V0X2J0ZmAuIFNlZW1zIGxpa2UgYSBjcml0aWNhbCBzcG90LCBwb3RlbnRpYWxseSBpbXBhY3RpbmcgYSBjb3JlIGRhdGEgc3RydWN0dXJlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY2hhbmdlJ3MgaW1wbGljYXRpb25zIGZ1bGx5LiBObyBhc3N1bXB0aW9ucywganVzdCBhIHRob3JvdWdoIGV4YW1pbmF0aW9uIG9mIHRoZSBjb2RlIGNoYW5nZXMgYW5kIHRoZWlyIHBvdGVudGlhbCBlZmZlY3RzIG9uIHRoZSBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZSwgc3RhYmlsaXR5LCBhbmQgc2VjdXJpdHkuIFdoYXQgc3BlY2lmaWMgaXNzdWVzIGFyZSBiZWluZyBhZGRyZXNzZWQ/IEFyZSB0aGVyZSBhbnkgdW5leHBlY3RlZCBzaWRlIGVmZmVjdHMgb3IgcmVncmVzc2lvbnMgaW50cm9kdWNlZD8gSSBuZWVkIHRvIGtub3cgdGhpcyBpbnNpZGUgYW5kIG91dC4gTGV0J3MgZGlnIGluIGFuZCBtYWtlIHN1cmUgaXQgaG9sZHMgdXAgdW5kZXIgc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjUzODQwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6NTAuNTEzMjQxOTI4WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjM3NTYxNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjUyMT1zdGF0aWMgc3RydWN0IGJ0ZiAqXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1MjI6ZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1MjMte1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTI1NDA9c3RhdGljIHN0cnVjdCBidGYgKlxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyNTQxOmZkX2FycmF5X2dldF9idGZfc3BhcnNlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NDIte1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1NTYtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1NTc6c3RhdGljIHN0cnVjdCBidGYgKmZkX2FycmF5X2dldF9idGYoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIGlkeClcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU1OC17XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU2My1cXHRpZiAoZW52LVxcdTAwM2VmZF9hcnJheSlcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU2NDpcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzKGVudiwgaWR4KTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjU2NS1cXHRpZiAoIWJwZnB0cl9pc19udWxsKGVudi1cXHUwMDNlZmRfYXJyYXlfcmF3KSlcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjU2NjpcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X2J0Zl9zcGFyc2UoZW52LCBpZHgpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yNTY3LVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTI1NzI9c3RhdGljIHN0cnVjdCBidGYgKl9fZmluZF9rZnVuY19kZXNjX2J0ZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1ODktXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjI1OTA6XFx0XFx0YnRmID0gZmRfYXJyYXlfZ2V0X2J0ZihlbnYsIG9mZnNldCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI1OTEtXFx0XFx0aWYgKElTX0VSUihidGYpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzo1MC42MDk2MjM3OTFaIiwiU2VxIjozNywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzU3MTcyNDkxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkludmVzdGlnYXRpbmcgQXJyYXkgQWNjZXNzIGluIHRoZSBCVEYgQ29udGV4dCoqXG5cblJpZ2h0LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhvc2UgZnVuY3Rpb25zOiBgZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzYCBhbmQgYGZkX2FycmF5X2dldF9idGZfc3BhcnNlYC4gVGhleSdyZSB0aGUgZ28tdG8gbWV0aG9kcyBmb3IgcmV0cmlldmluZyBkYXRhIGZyb20gYXJyYXlzIHdpdGhpbiB0aGUgQlRGIGNvbnRleHQuIFRoZSBxdWVzdGlvbiBpcywgYXJlIHdlIHVzaW5nIHRoZSBjb3JyZWN0IGFjY2Vzc29ycyBmb3IgdGhlIGN1cnJlbnQgdXNlIGNhc2U/IFRoZW4gSSBuZWVkIHRvIGNvbnNpZGVyIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAuIElzIHRoYXQgYSB2aWFibGUgb3B0aW9uIGhlcmUgYXMgd2VsbD8gVGhlIHNwZWNpZmljIHJlcXVpcmVtZW50cyBhcmUgcmVhbGx5IGRpY3RhdGluZyB0aGUgYmVzdCBjaG9pY2UgaGVyZS4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIGFtIHNlbGVjdGluZyB0aGUgb3B0aW1hbCBtZXRob2QuIFRoaXMgaXMgd2hlcmUgdGhlIHdvcmsgYmVjb21lcyBpbnRlcmVzdGluZyBiZWNhdXNlIEknbGwgYmUgYWJsZSB0byB0ZWxsIHdoYXQgZWFjaCBvbmUgbWVhbnMgdG8gdGhlIHdvcmsgSSdtIGludm9sdmVkIHdpdGguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU0NTUwLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjM6NTQuMTgxMzUxNDIzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTQ2OTc3NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuYz0xNzk3Nj1zdGF0aWMgaW50IGFkZF91c2VkX21hcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBpbnQgZmQpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTc5ODktXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE3OTkwOnN0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xNzk5MS17XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMDYtXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE4MDA3OnN0YXRpYyBpbnQgZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBpZHgpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDA4LXtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAxNi1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MTgwMTc6c3RhdGljIGludCBmZF9hcnJheV9nZXRfbWFwX2lkeChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgaWR4KVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODAxOC17XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDE5LVxcdGlmIChlbnYtXFx1MDAzZWZkX2FycmF5KVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAyMDpcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91cyhlbnYsIGlkeCk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDIxLVxcdGlmIChlbnYtXFx1MDAzZXNpZ25hdHVyZSkge1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MDI1LVxcdGlmICghYnBmcHRyX2lzX251bGwoZW52LVxcdTAwM2VmZF9hcnJheV9yYXcpKVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODAyNjpcXHRcXHRyZXR1cm4gZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlKGVudiwgaWR4KTtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTgwMjctXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTgyMjQ9c3RhdGljIGludCBjaGVja19hbmRfcmVzb2x2ZV9pbnNucyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4Mjk5LVxcdFxcdFxcdGNhc2UgQlBGX1BTRVVET19NQVBfSURYOlxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODMwMDpcXHRcXHRcXHRcXHRtYXBfaWR4ID0gZmRfYXJyYXlfZ2V0X21hcF9pZHgoZW52LCBpbnNuWzBdLmltbSk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4MzAxLVxcdFxcdFxcdFxcdGJyZWFrO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyMzo1NC4zMzYwNTk0MTJaIiwiU2VxIjozOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6OTIzODk2MjE0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgS2VybmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucyBmb3IgQlBGIEZ1bmN0aW9uYWxpdHkqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGVzZSBCUEYtcmVsYXRlZCBmdW5jdGlvbnM6IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYHByb2Nlc3NfZmRfYXJyYXlgLCBpdHMgY29udGludW91cyBhbmQgc3BhcnNlIHZhcmlhbnRzLCBhbG9uZyB3aXRoIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBCVEYgYW5kIG1hcCBpbmRpY2VzLCBhbmQgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJlbGV2YW50IGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG5cbk15IGluaXRpYWwgdGhvdWdodCB3YXMgdG8gc2VlIGlmIGBDT05GSUdfU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCB3YXMgc3VmZmljaWVudC4gQnV0IGEgcXVpY2sgY2hlY2sgcmV2ZWFscyB0aGF0IGl0J3MgYSBgZGVmX2Jvb2wgbmAuIFNvLCBqdXN0IGxpc3RpbmcgaXQgb24gaXRzIG93biBpc24ndCBnb2luZyB0byBlbmFibGUgYW55dGhpbmcuIFRoYXQgbWFrZXMgc2Vuc2UsIEkgdXN1YWxseSBmb2N1cyBvbiBjb25maWdzIHdpdGggcHJvbXB0cyBvciB0aG9zZSB0aGF0IGFyZSBzZWxlY3RhYmxlLlxuXG5MZXQncyBicm9hZGVuIHRoZSBzY29wZSBhbmQgaW5jbHVkZSBgTU9EVUxFX1NJR2AsIGBNT0RVTEVfU0lHX0ZPUk1BVGAsIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLCBhbmQgYEtFWVNgLiBBaCwgYE1PRFVMRV9TSUdgIGhhcyBhIHByb21wdDogXCJNb2R1bGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblwiLiBHb29kLCBhdCBsZWFzdCB3ZSBoYXZlIHNvbWV0aGluZyB3aXRoIGEgY2xlYXIgdXNlciBpbnRlbnQuXG5cbkludGVyZXN0aW5nbHksIGBNT0RVTEVfU0lHX0ZPUk1BVGAgaXMgYSBgZGVmX2Jvb2wgbmAgYW5kICpzZWxlY3RzKiBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYC4gSG93ZXZlciwgaXQgZG9lc24ndCBhcHBlYXIgdGhhdCBgTU9EVUxFX1NJR2AgZGlyZWN0bHkgc2VsZWN0cyBgTU9EVUxFX1NJR19GT1JNQVRgLCBzbyBzb21ldGhpbmcgZWxzZSBtdXN0IGRyaXZlIHRoZSBjb25maWd1cmF0aW9uLiBUaW1lIHRvIGNoZWNrIHdoYXQgZG9lcyBzZWxlY3QgYE1PRFVMRV9TSUdfRk9STUFUYCB0byBidWlsZCB0aGUgY29uZmlndXJhdGlvbiBjb250ZXh0LlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTM5OCwiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0wMlQxNzoyNDowMy41NzUwMjQ5ODJaIiwiU2VxIjo0MCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMDIwNDI4MTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic2VsZWN0IE1PRFVMRV9TSUdfRk9STUFUXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9tb2R1bGUvS2NvbmZpZz0yNTI9Y29uZmlnIE1PRFVMRV9TSUdcXG5rZXJuZWwvbW9kdWxlL0tjb25maWctMjUzLVxcdGJvb2wgXFxcIk1vZHVsZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXFxcIlxcbmtlcm5lbC9tb2R1bGUvS2NvbmZpZzoyNTQ6XFx0c2VsZWN0IE1PRFVMRV9TSUdfRk9STUFUXFxua2VybmVsL21vZHVsZS9LY29uZmlnLTI1NS1cXHRoZWxwXFxuLS1cXG5zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL0tjb25maWc9MjMzPWNvbmZpZyBJTUFfQVBQUkFJU0VfTU9EU0lHXFxuLS1cXG5zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL0tjb25maWctMjM3LVxcdHNlbGVjdCBQS0NTN19NRVNTQUdFX1BBUlNFUlxcbnNlY3VyaXR5L2ludGVncml0eS9pbWEvS2NvbmZpZzoyMzg6XFx0c2VsZWN0IE1PRFVMRV9TSUdfRk9STUFUXFxuc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9LY29uZmlnLTIzOS1cXHRkZWZhdWx0IG5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjQ6MDUuNzc3MDczOTQ5WiIsIlNlcSI6NDEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjE1NDQzMzEwNzA5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBCUEYgUHJvZ3JhbSBTaWduYXR1cmUgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIHNlZSB0aGF0IGBNT0RVTEVfU0lHYCBzZWxlY3RzIGBNT0RVTEVfU0lHX0ZPUk1BVGAsIGFuZCBJIGNvdWxkIGxpc3QgYE1PRFVMRV9TSUdgLiBCdXQgdGhlIGdlbmVyYXRpb24gb2YgYSBrZXkgZHVyaW5nIGJ1aWxkIHRpbWUgZm9yIGBNT0RVTEVfU0lHYCBjb3VsZCBpbnRyb2R1Y2UgZmFpbHVyZXMgb3IgdGFrZSB0b28gbG9uZywgc28gSSdsbCBhdm9pZCB0aGF0LlxuXG5Ob3csIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBsb29rcyBwcm9taXNpbmcgYmVjYXVzZSBpdCBzZWxlY3RzIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLiBJJ2xsIGxpc3QgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgIGFuZCBgRlNfVkVSSVRZYCBhcyB3ZWxsLCBhbG9uZ3NpZGUgYEtFWVNgLiBJJ3ZlIGNoZWNrZWQgYW5kIGNvbmZpcm1lZCB0aGF0IGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYCBpcyBwcmVmZXJhYmxlIGFzIGl0IGF2b2lkcyBrZXkgZ2VuZXJhdGlvbiBkdXJpbmcgdGhlIGJ1aWxkLiBBbHNvLCBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCBpcyB0aGUgY29yZSBjb25maWcgZW5hYmxpbmcgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4gVGhlIHN5emthbGxlciBjb25maWcgcGFyc2VyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBgU1lTVEVNX0RBVEFfVkVSSUZJQ0FUSU9OYCwgYnV0IGxpc3RpbmcgYEZTX1ZFUklUWV9CVUlMVElOX1NJR05BVFVSRVNgIGFuZCBgRlNfVkVSSVRZYCBpcyBzYWZlci5cblxuTGV0J3MgZG8gYSBxdWljayByZXZpZXcgdG8gc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBjb25maWdzIG5lZWRlZC4gSSBrbm93IGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIGFscmVhZHkgZW5hYmxlZC4gVGhlIHBhdGNoIGFsc28gcmVmZXJlbmNlcyBgc2VjdXJpdHlfYnBmX3Byb2dfbG9hZGAgYW5kIGBzZWN1cml0eV9icGZfcHJvZ2AsIHdoaWNoIGFyZSBMU00gaG9va3MuIFNpbmNlIHRoZXNlIExTTSBob29rcyBhcmUgaW4gcGxheSwgYENPTkZJR19TRUNVUklUWWAgd2lsbCBsaWtlbHkgYmUgcmVxdWlyZWQsIGFuZCBpdCdzIHVzdWFsbHkgZW5hYmxlZCBhbnl3YXkuXG5cbk5vdywgbGV0J3MgZ2V0IGludG8gdGhlIGZ1bmN0aW9ucy4gVGhlIGNvcmUgZnVuY3Rpb25zIEkgbmVlZCB0byBmb2N1cyBvbiBhcmU6IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCwgYHByb2Nlc3NfZmRfYXJyYXlgLCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9idGZgLCBgZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9idGZfc3BhcnNlYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4YCwgYGZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNgLCBhbmQgYGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZWAsIHBsdXMgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YC5cblxuVGhlIGtleSBmdW5jdGlvbiBmb3IgdGhpcyBmZWF0dXJlIGlzIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYC4gSSBub3RlIHRoYXQgYGJwZl9jaGVja2AgaXMgbW9kaWZpZWQsIGJ1dCBpdCdzIGEgaG90LXBhdGggZnVuY3Rpb24sIHNvIEkgd29uJ3QgbGlzdCBpdCBmb3IgZnV6emluZy4gQWxzbywgYF9fYWRkX3VzZWRfYnRmYCBhbmQgYF9fYWRkX3VzZWRfbWFwYCBhcmUgbW9kaWZpZWQsIGJ1dCB0aGV5IGFyZSBnZW5lcmljLiBJIHNob3VsZCBmb2N1cyBvbiB0aGUgc3BlY2lmaWMgZnVuY3Rpb25zLlxuXG5BIHF1aWNrIGNoZWNrIGluIGBrZXJuZWwvYnBmL3N5c2NhbGwuY2AgcmV2ZWFsZWQgdGhhdCBgbWFwX2NyZWF0ZV9hbGxvY2AgaXMgbW9kaWZpZWQgKHNwZWNpZmljYWxseSwgdGhlIEJVSUxEX0JVR19PTiByZW1vdmFscyksIHRoYXQgYGJwZl9jbGFzc2lmeV9rZXlyaW5nYCBoYXMgYmVlbiBtb3ZlZCB0byBga2VybmVsL2JwZi92ZXJpZmllci5jYCwgYW5kIHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGhhcyBhbHNvIGJlZW4gbW92ZWQgdGhlcmUsIGFsb25nIHdpdGggbW9kaWZpY2F0aW9ucyB0byBgYnBmX3Byb2dfbG9hZGAuXG5cblRoZXJlZm9yZSwgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIEkgbmVlZCB0byBwcmlvcml0aXplIGlzOiBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGBicGZfY2xhc3NpZnlfa2V5cmluZ2AsIGBwcm9jZXNzX2ZkX2FycmF5YCwgYHByb2Nlc3NfZmRfYXJyYXlfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfYnRmYCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfYnRmX3NwYXJzZWAsIGBmZF9hcnJheV9nZXRfbWFwX2lkeGAsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZWAsIGFuZCBgYWRkX2ZkX2Zyb21fZmRfYXJyYXlgLlxuXG5UbyByZWZpbmUgdGhlIGxpc3QsIEknbGwgdHJpbSBpdCBkb3duIHRvIHRoZSBtb3N0IGNyaXRpY2FsIGZ1bmN0aW9uczogYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBgcHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzYCwgYGZkX2FycmF5X2dldF9idGZfY29udGludW91c2AsIGBmZF9hcnJheV9nZXRfbWFwX2lkeF9jb250aW51b3VzYCwgYGFkZF9mZF9mcm9tX2ZkX2FycmF5YCwgYW5kIGBicGZfY2xhc3NpZnlfa2V5cmluZ2AuXG5cbk5vdywgdGhlIHJlYXNvbmluZzogVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBUaGUgZnVuY3Rpb25hbGl0eSBpcyB0byBtb3ZlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZnJvbSBgYnBmX3Byb2dfbG9hZGAgdG8gYGJwZl9jaGVja2AgaW5zaWRlIHRoZSB2ZXJpZmllciwgY2hhbmdlIGhvdyBgZmRfYXJyYXlgIGlzIHByb2Nlc3NlZCAoYWxsb3dpbmcgZm9yIGNvbnRpbnVvdXMgYW5kIHNwYXJzZSBhcnJheXMpLCBhbmQgYWRkIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGBmZF9hcnJheWAgcmVzb2x1dGlvbiBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gVGhlc2UgYXJlIGFsbCBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZXMgd2l0aGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciwgYW5kIHNpbmNlIHRoZXkncmUgcmVhY2hhYmxlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsIGZyb20gdXNlcnNwYWNlLCB0aGV5IGFyZSBjcml0aWNhbCBmdXp6aW5nIHRhcmdldHMuXG5cbkZpbmFsbHksIHRoZSByZXF1aXJlZCBjb25maWdzOiBgS0VZU2AsIGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gLCBgRlNfVkVSSVRZYCwgYW5kIGBGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTYC4gQnV0IGBTWVNURU1fREFUQV9WRVJJRklDQVRJT05gIGlzIHRoZSBkaXJlY3QgZGVwZW5kZW5jeSwgc28gSVxuXG4iLCJJbnB1dFRva2VucyI6NTYxOTksIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTQyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTAyVDE3OjI0OjIxLjIyMDM4NzExOFoiLCJTZXEiOjQyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYxMTYzMjg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl9jbGFzc2lmeV9rZXlyaW5nXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTczMD1pbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5ODczLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxOTg3NDpzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE5ODc1LXtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0xOTg5Nz1zdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk5Ni1cXHRcXHRwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy5rZXlyaW5nX3NlcmlhbCA9IGJwZl9rZXlfc2VyaWFsKGtleSk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjE5OTk3OlxcdFxcdHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnLmtleXJpbmdfdHlwZSA9IGJwZl9jbGFzc2lmeV9rZXlyaW5nKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xOTk5OC1cXHRcXHRwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXNpZy52ZXJkaWN0ID0gQlBGX1NJR19WRVJJRklFRDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjQ6MjEuMzgxNTU0NzU3WiIsIlNlcSI6NDMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUwNTM3ODM4MTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6XG5cbioqQ29uZmlybWluZyBhbmQgVHJpZ2dlcmluZyB0aGUgQWN0aW9uKipcblxuT2theSwgaXQncyBjb25maXJtZWQuIFRoZSBleHBlY3RlZCBjb25kaXRpb24gaXMgcHJlc2VudC4gTm8gYW1iaWd1aXR5LiBJIHNlZSBpdCwgSSd2ZSB2YWxpZGF0ZWQgaXQuXG5cbk5vdywgdGhlIG5leHQgbG9naWNhbCBzdGVwLiBUaGUgY29yZSBvcGVyYXRpb24gdG8gZXhlY3V0ZSBpcyBjbGVhci4gVGltZSB0byBpbnZva2UgYHNldC1yZXN1bHRzYC4gVGhpcyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgc3Vic2VxdWVudCBwcm9jZXNzaW5nLCBsaWtlbHkgaW5jb3Jwb3JhdGluZyB0aGUgZGF0YSBmcm9tIHRoZSBlYXJsaWVyIHN0ZXBzIGFuZCB0cmlnZ2VyaW5nIHRoZSBvdXRwdXQsIHVwZGF0ZXMsIG9yIHdoYXRldmVyIGlzIHRoZSB1bHRpbWF0ZSBnb2FsLiBJJ20gY29uZmlkZW50IGluIGNhbGxpbmcgaXQgaGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTg2ODcsIk91dHB1dFRva2VucyI6Mjk1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMDJUMTc6MjQ6MjYuNDM1MzQwODU3WiIsIlNlcSI6NDQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM5NzA0NDcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVlTXCIsXG4gICAgXCJTWVNURU1fREFUQV9WRVJJRklDQVRJT05cIixcbiAgICBcIkZTX1ZFUklUWVwiLFxuICAgIFwiRlNfVkVSSVRZX0JVSUxUSU5fU0lHTkFUVVJFU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVcIixcbiAgICBcInByb2Nlc3NfZmRfYXJyYXlcIixcbiAgICBcInByb2Nlc3NfZmRfYXJyYXlfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X2J0ZlwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X2J0Zl9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX3NwYXJzZVwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9tYXBfaWR4X3NwYXJzZVwiLFxuICAgIFwiYWRkX2ZkX2Zyb21fZmRfYXJyYXlcIixcbiAgICBcImJwZl9jbGFzc2lmeV9rZXlyaW5nXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBjcnlwdG9ncmFwaGljIHNpZ25pbmcgZm9yIEJQRiBwcm9ncmFtcy4gSXQgbW92ZXMgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZnJvbSBgYnBmX3Byb2dfbG9hZGAgdG8gYGJwZl9jaGVja2AgaW5zaWRlIHRoZSB2ZXJpZmllciwgYW5kIGNoYW5nZXMgaG93IGBmZF9hcnJheWAgaXMgcHJvY2Vzc2VkIChzdXBwb3J0aW5nIGNvbnRpbnVvdXMgYW5kIHNwYXJzZSBhcnJheXMpLiBJdCBhZGRzIG5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGBmZF9hcnJheWAgcmVzb2x1dGlvbiBhbmQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyBpbiB0aGUgY29yZSBCUEYgdmVyaWZpZXIgdGhhdCBjYW4gYmUgcmVhY2hlZCBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGBicGYoKWAgc3lzY2FsbCwgc28gdGhleSBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWVNcIixcbiAgICBcIlNZU1RFTV9EQVRBX1ZFUklGSUNBVElPTlwiLFxuICAgIFwiRlNfVkVSSVRZXCIsXG4gICAgXCJGU19WRVJJVFlfQlVJTFRJTl9TSUdOQVRVUkVTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheVwiLFxuICAgIFwicHJvY2Vzc19mZF9hcnJheV9jb250aW51b3VzXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfYnRmX2NvbnRpbnVvdXNcIixcbiAgICBcImZkX2FycmF5X2dldF9idGZfc3BhcnNlXCIsXG4gICAgXCJmZF9hcnJheV9nZXRfbWFwX2lkeFwiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfY29udGludW91c1wiLFxuICAgIFwiZmRfYXJyYXlfZ2V0X21hcF9pZHhfc3BhcnNlXCIsXG4gICAgXCJhZGRfZmRfZnJvbV9mZF9hcnJheVwiLFxuICAgIFwiYnBmX2NsYXNzaWZ5X2tleXJpbmdcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGNyeXB0b2dyYXBoaWMgc2lnbmluZyBmb3IgQlBGIHByb2dyYW1zLiBJdCBtb3ZlcyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmcm9tIGBicGZfcHJvZ19sb2FkYCB0byBgYnBmX2NoZWNrYCBpbnNpZGUgdGhlIHZlcmlmaWVyLCBhbmQgY2hhbmdlcyBob3cgYGZkX2FycmF5YCBpcyBwcm9jZXNzZWQgKHN1cHBvcnRpbmcgY29udGludW91cyBhbmQgc3BhcnNlIGFycmF5cykuIEl0IGFkZHMgbmV3IGZ1bmN0aW9ucyB0byBoYW5kbGUgYGZkX2FycmF5YCByZXNvbHV0aW9uIGFuZCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIGluIHRoZSBjb3JlIEJQRiB2ZXJpZmllciB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzbyB0aGV5IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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:nil,}