Name: series-workflowxpj42 Phase: Succeeded StartedAt: 2026-08-04 11:27:00 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[0] Phase: Succeeded StartedAt: 2026-08-04 11:27:00 +0000 UTC FinishedAt: 2026-08-04 12:13:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[0].run-triage Phase: Succeeded StartedAt: 2026-08-04 11:27:00 +0000 UTC FinishedAt: 2026-08-04 12:13:28 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "fabfaaa8090a83cbc97836cc70d47c69fa9e8c61", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ENCRYPTED_HIBERNATION", "HIBERNATION_SNAPSHOT_DEV", "HIBERNATION" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "fabfaaa8090a83cbc97836cc70d47c69fa9e8c61", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ENCRYPTED_HIBERNATION", "HIBERNATION_SNAPSHOT_DEV", "HIBERNATION" ], "series_id": "9920218f-c6aa-426c-9b8f-6b119b2d2bd2" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "snapshot_store_encryption_seed", "snapshot_get_encryption_key", "snapshot_set_encryption_key", "snapshot_set_user_key", "snapshot_read_encrypted", "snapshot_write_encrypted", "snapshot_finalize_decrypted_image", "hibernate_snapshot_write_begin", "hibernate_snapshot_write_end", "swsusp_swap_range_allocated", "swapdev_block_to_extent" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VOQ1JZUFRFRF9ISUJFUk5BVElPTiYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYmIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfdXNlcl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3RfcmVhZF9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZSYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4mIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZCYjMzQ7LAogICAgJiMzNDtzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQmIzM0OywKICAgICYjMzQ7c3dhcGRldl9ibG9ja190b19leHRlbnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTAzYzAyMGU3YTJjMmZmZjJlYTJiNGQzODA4N2MwODRkNjY0NTdhYVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDQgMTI6MTI6NTQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXJcbmluZGV4IGQzOGRhMDc3OTA1YTkuLjU3ZjYwNjNlZjg4YzkgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG5AQCAtNDcwLDMgJiM0Mzs0NzAsMTcgQEAgRGVzY3JpcHRpb246XG4gXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogM1xuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkXG4mIzQzO0RhdGU6XHRcdEp1bHkgMjAyNlxuJiM0MztDb250YWN0Olx0bGludXgtcG1Admdlci5rZXJuZWwub3JnXG4mIzQzO0Rlc2NyaXB0aW9uOlxuJiM0MztcdFx0V3JpdGUtb25seSBmaWxlIHByZXNlbnQgd2hlbiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OPXkuXG4mIzQzO1xuJiM0MztcdFx0VHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2Ugd3JpdGVzIGEgMzItYnl0ZSBzZWVkLCBlbmNvZGVkIGFzXG4mIzQzO1x0XHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXG4mIzQzO1x0XHRlbmFibGluZyBlbmNyeXB0ZWQgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy5cbiYjNDM7XG4mIzQzO1x0XHRUaGUgZmlyc3Qgc3VjY2Vzc2Z1bCB3cml0ZSBsb2NrcyB0aGUgc2VlZCB1bnRpbCB0aGUgbmV4dCBib290LlxuJiM0MztcdFx0V3JpdGluZyB0aGUgc2FtZSBzZWVkIGFnYWluIHN1Y2NlZWRzLiBXcml0aW5nIGEgZGlmZmVyZW50IHNlZWRcbiYjNDM7XHRcdGZhaWxzIHdpdGggRVBFUk0uXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG5pbmRleCAxY2Y2MmQ4MGE5Y2ExLi5kZjhlY2E5ZTZlMzYzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcbkBAIC0xMTUsNiAmIzQzOzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxuIFx0dG8gcmVzdW1lIHRoZSBzeXN0ZW0gZnJvbSBSQU0gaWYgdGhlcmUmIzM5O3MgZW5vdWdoIGJhdHRlcnkgcG93ZXIgb3IgcmVzdG9yZVxuIFx0aXRzIHN0YXRlIG9uIHRoZSBiYXNpcyBvZiB0aGUgc2F2ZWQgc3VzcGVuZCBpbWFnZSBvdGhlcndpc2UpXG4gXG4mIzQzO1NOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OXG4mIzQzO1x0RW5hYmxlcyBlbmNyeXB0aW9uIG9mIHRoZSBoaWJlcm5hdGUgaW1hZ2Ugd2l0aGluIHRoZSBrZXJuZWwuIFRydXN0ZWRcbiYjNDM7XHRlYXJseSB1c2Vyc3BhY2UgbXVzdCB3cml0ZSB0aGUgMzItYnl0ZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgdG9cbiYjNDM7XHQvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBpb2N0bC4gVXBvbiBzdXNwZW5kXG4mIzQzO1x0KGllIHdoZW4gdGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nKSwgdGhpcyBpb2N0bCByZXR1cm5zXG4mIzQzO1x0YW4gb3BhcXVlIHdyYXBwZWQga2V5IGJsb2IgYW5kIHRoZSBzdGFydGluZyBub25jZS4gVXBvbiByZXN1bWUgKGllIHdoZW5cbiYjNDM7XHR0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcpLCB0aGlzIGlvY3RsIHJlY2VpdmVzIHRoZVxuJiM0MztcdHNhbWUgYmxvYiBhbmQgbm9uY2UgZnJvbSB1c2VybW9kZSBhZnRlciB0aGUgc2FtZSBzZWVkIGhhcyBiZWVuIHdyaXR0ZW5cbiYjNDM7XHR0byAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQuIFRoZSBwbGFpbnRleHQgaW1hZ2Uga2V5IGlzIGdlbmVyYXRlZCBhbmRcbiYjNDM7XHR1bndyYXBwZWQgaW5zaWRlIHRoZSBrZXJuZWwuXG4mIzQzO1xuJiM0MztTTkFQU0hPVF9TRVRfVVNFUl9LRVlcbiYjNDM7XHRNaXhlcyBhZGRpdGlvbmFsIHVzZXIga2V5IG1hdGVyaWFsIGludG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhbiBlbmNyeXB0ZWRcbiYjNDM7XHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXG4mIzQzO1x0a2V5X2xlbiBtdXN0IGJlIGJldHdlZW4gOCBhbmQgVVNXU1VTUF9VU0VSX0tFWV9TSVpFIGJ5dGVzLCBhbmQgcmVzZXJ2ZWRcbiYjNDM7XHRtdXN0IGJlIHplcm8uIER1cmluZyBoaWJlcm5hdGlvbiB0aGUga2VybmVsIHdyaXRlcyBtZXRhX3NpemUgd2l0aCB0aGVcbiYjNDM7XHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcbiYjNDM7XHRtZXRhX3NpemUgYmFjayBzbyB0aGUga2VybmVsIGNhbiBzd2l0Y2gga2V5cyBhdCB0aGUgbWV0YWRhdGEgYm91bmRhcnlcbiYjNDM7XHRiZWZvcmUgdGhlIHNuYXBzaG90IGhlYWRlciBoYXMgYmVlbiBkZWNyeXB0ZWQuXG4mIzQzO1xuIFRoZSBkZXZpY2UmIzM5O3MgcmVhZCgpIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbVxuIHRoZSBrZXJuZWwuICBJdCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiBcbmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmNcbmluZGV4IDE1NzgzYTYxODBkZWMuLmVmZWI0ODVlOTFlNmMgMTAwNjQ0XG4tLS0gYS9ibG9jay9mb3BzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2ZvcHMuY1xuQEAgLTcyMyw0MyAmIzQzOzcyMyw2NSBAQCBzdGF0aWMgc3NpemVfdCBibGtkZXZfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcbiBcdHN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi1cdTAwM2VraV9maWxwO1xuIFx0c3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGJkZXZfZmlsZV9pbm9kZShmaWxlKTtcbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpO1xuJiM0MztcdGRldl90IGRldiA9IGJkX2lub2RlLVx1MDAzZWlfcmRldjtcbiBcdGJvb2wgYXRvbWljID0gaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgSU9DQl9BVE9NSUM7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGJkZXZfbnJfYnl0ZXMoYmRldik7XG4mIzQzO1x0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgaGliZXJuYXRlX3dyaXRlO1xuJiM0MztcdHNpemVfdCBoaWJlcm5hdGVfbGVuID0gMDtcbiBcdHNpemVfdCBzaG9ydGVkID0gMDtcbiYjNDM7XHRzc2l6ZV90IGhpYmVybmF0ZV93cml0dGVuID0gMDtcbiBcdHNzaXplX3QgcmV0O1xuIFxuIFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFxuLVx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcdTAwMjZcdTAwMjYgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGJkX2lub2RlLVx1MDAzZWlfcmRldikpXG4tXHRcdHJldHVybiAtRVRYVEJTWTtcbiYjNDM7XHRpZiAoSVNfU1dBUEZJTEUoYmRfaW5vZGUpIFx1MDAyNlx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2KSkge1xuJiM0MztcdFx0aWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpIHx8ICFpb2NiX2lzX2RzeW5jKGlvY2IpIHx8XG4mIzQzO1x0XHQgICAgKGlvY2ItXHUwMDNla2lfZmxhZ3MgXHUwMDI2IElPQ0JfRElSRUNUKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FVFhUQlNZO1xuIFxuLVx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSlcbi1cdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHRoaWJlcm5hdGVfbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7XG4mIzQzO1x0XHRoaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLVx1MDAzZWtpX3BvcywgaGliZXJuYXRlX2xlbik7XG4mIzQzO1x0XHRpZiAoaGliZXJuYXRlX3dyaXRlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVUWFRCU1k7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGhpYmVybmF0ZV93cml0ZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0MztcdH1cbiBcbi1cdGlmIChpb2NiLVx1MDAzZWtpX3BvcyBcdTAwM2U9IHNpemUpXG4tXHRcdHJldHVybiAtRU5PU1BDO1xuJiM0MztcdGlmICghaW92X2l0ZXJfY291bnQoZnJvbSkpIHtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4mIzQzO1x0fVxuIFxuLVx0aWYgKChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0aWYgKGlvY2ItXHUwMDNla2lfcG9zIFx1MDAzZT0gc2l6ZSkge1xuJiM0MztcdFx0cmV0ID0gLUVOT1NQQztcbiYjNDM7XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICgoaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgKElPQ0JfTk9XQUlUIHwgSU9DQl9ESVJFQ1QpKSA9PSBJT0NCX05PV0FJVCkge1xuJiM0MztcdFx0cmV0ID0gLUVPUE5PVFNVUFA7XG4mIzQzO1x0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4mIzQzO1x0fVxuIFxuIFx0aWYgKGF0b21pYykge1xuIFx0XHRyZXQgPSBnZW5lcmljX2F0b21pY193cml0ZV92YWxpZChpb2NiLCBmcm9tKTtcbiBcdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4gXHR9XG4gXG4gXHRzaXplIC09IGlvY2ItXHUwMDNla2lfcG9zO1xuIFx0aWYgKGlvdl9pdGVyX2NvdW50KGZyb20pIFx1MDAzZSBzaXplKSB7XG4tXHRcdGlmIChhdG9taWMpXG4tXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRpZiAoYXRvbWljKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiYjNDM7XHRcdH1cbiBcdFx0c2hvcnRlZCA9IGlvdl9pdGVyX2NvdW50KGZyb20pIC0gc2l6ZTtcbiBcdFx0aW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgc2l6ZSk7XG4gXHR9XG4gXG4gXHRyZXQgPSBmaWxlX3VwZGF0ZV90aW1lKGZpbGUpO1xuIFx0aWYgKHJldClcbi1cdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcbiBcdGlmIChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiBJT0NCX0RJUkVDVCkge1xuIFx0XHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xuQEAgLTc3Nyw5ICYjNDM7Nzk5LDE2IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxuIFx0XHRpbm9kZV91bmxvY2tfc2hhcmVkKGJkX2lub2RlKTtcbiBcdH1cbiBcbi1cdGlmIChyZXQgXHUwMDNlIDApXG4mIzQzO1x0aWYgKHJldCBcdTAwM2UgMCkge1xuJiM0MztcdFx0aGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7XG4gXHRcdHJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpO1xuJiM0MztcdH1cbiBcdGlvdl9pdGVyX3JlZXhwYW5kKGZyb20sIGlvdl9pdGVyX2NvdW50KGZyb20pICYjNDM7IHNob3J0ZWQpO1xuJiM0MztcbiYjNDM7b3V0X2hpYmVybmF0ZTpcbiYjNDM7XHRpZiAoaGliZXJuYXRlX2xlbilcbiYjNDM7XHRcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxuJiM0MztcdFx0XHRcdFx0ICAgICBoaWJlcm5hdGVfd3JpdHRlbik7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oXG5pbmRleCBiMDI4NzZmMWFlMzhhLi44MzA4YTY1ODM3NTZjIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oXG5AQCAtNDI2LDEwICYjNDM7NDI2LDMyIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwbV9oaWJlcm5hdGlvbl9tb2RlX2lzX3N1c3BlbmQodm9pZCkgeyByZXR1cm4gZmFsc2U7IH1cbiBcbiBpbnQgYXJjaF9yZXN1bWVfbm9zbXQodm9pZCk7XG4gXG4mIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHtcbiYjNDM7XHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSxcbiYjNDM7XHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0UsXG4mIzQzO1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUixcbiYjNDM7fTtcbiYjNDM7XG4gI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcbiBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KTtcbiYjNDM7ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcbiYjNDM7dm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXG4mIzQzO1x0XHRcdFx0ICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZChlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlLFxuJiM0MztcdFx0XHRcdFx0XHRzaXplX3QgcmVzZXJ2ZWQsXG4mIzQzO1x0XHRcdFx0XHRcdHNzaXplX3Qgd3JpdHRlbilcbiYjNDM7e1xuJiM0Mzt9XG4gI2VuZGlmXG4gXG4gLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTQzOSw2ICYjNDM7NDM5LDkgQEAgZXh0ZXJuIGludCBmaW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldCk7XG4gaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTtcbiBleHRlcm4gdW5zaWduZWQgaW50IGNvdW50X3N3YXBfcGFnZXMoaW50LCBpbnQpO1xuIGV4dGVybiBzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCwgcGdvZmZfdCk7XG4mIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCk7XG4mIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbiYjNDM7XHRcdFx0ICAgIHBnb2ZmX3QgKm5yX3BhZ2VzKTtcbiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XG4gZXh0ZXJuIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpO1xuIGV4dGVybiBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XG5AQCAtNTM1LDYgJiM0Mzs1MzgsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgYWRkX3N3YXBfZXh0ZW50KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4ge1xuIFx0cmV0dXJuIC1FSU5WQUw7XG4gfVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxuJiM0MztcdFx0XHRcdFx0ICBwZ29mZl90ICpvZmZzZXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxuJiM0MztcdFx0XHRcdFx0ICBwZ29mZl90ICpvZmZzZXQsXG4mIzQzO1x0XHRcdFx0XHQgIHBnb2ZmX3QgKm5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO31cbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cbiAjaWZkZWYgQ09ORklHX01FTUNHXG4gc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5pbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5AQCAtMTMsNiAmIzQzOzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHtcbiBcdF9fdTMyIGRldjtcbiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuIFxuJiM0MzsjZGVmaW5lIFVTV1NVU1BfS0VZX05PTkNFX1NJWkUgMTZcbiYjNDM7I2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlXG4mIzQzOyAqIGVuY3J5cHRpb24ga2V5IGFuZCBzdGFydGluZyBub25jZSBpbiBlaXRoZXIgZGlyZWN0aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2Ige1xuJiM0MztcdF9fdTMyIGJsb2JfbGVuO1xuJiM0MztcdF9fdTggYmxvYls1MTJdO1xuJiM0MztcdF9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWxsb3cgdXNlciBtb2RlIHRvIGZvbGQgaW4ga2V5IG1hdGVyaWFsIGZvciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBoaWJlcm5hdGVcbiYjNDM7ICogaW1hZ2UuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB7XG4mIzQzO1x0LyogS2VybmVsIHJldHVybnMgdGhlIG1ldGFkYXRhIHNpemU7IHJlc3VtZSBwYXNzZXMgdGhlIHNhdmVkIHZhbHVlIGluLiAqL1xuJiM0MztcdF9fdTY0IG1ldGFfc2l6ZTtcbiYjNDM7XHRfX3UzMiBrZXlfbGVuO1xuJiM0MztcdF9fdTMyIHJlc2VydmVkO1xuJiM0MztcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuJiM0MztcbiAjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQUdJQ1x0JiMzOTszJiMzOTtcbiAjZGVmaW5lIFNOQVBTSE9UX0ZSRUVaRVx0XHRcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDEpXG4gI2RlZmluZSBTTkFQU0hPVF9VTkZSRUVaRVx0XHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAyKVxuQEAgLTI5LDYgJiM0Mzs1NCwxMCBAQCBzdHJ1Y3QgcmVzdW1lX3N3YXBfYXJlYSB7XG4gI2RlZmluZSBTTkFQU0hPVF9QUkVGX0lNQUdFX1NJWkVcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE4KVxuICNkZWZpbmUgU05BUFNIT1RfQVZBSUxfU1dBUF9TSVpFXHRfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMTksIF9fa2VybmVsX2xvZmZfdClcbiAjZGVmaW5lIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRVx0X0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIwLCBfX2tlcm5lbF9sb2ZmX3QpXG4tI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlJcdDIwXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFxcXG4mIzQzO1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IpXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfU0VUX1VTRVJfS0VZXHRcdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFxcXG4mIzQzO1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXHQyMlxuIFxuICNlbmRpZiAvKiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWdcbmluZGV4IDUzMGM4OTczMTFkNDQuLmE5YmVlNzE1NzFjZmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL0tjb25maWdcbkBAIC0xMTUsNiAmIzQzOzExNSwyMSBAQCBjb25maWcgSElCRVJOQVRJT05fREVGX0NPTVBcbiBcdGhlbHBcbiBcdCAgRGVmYXVsdCBjb21wcmVzc29yIHRvIGJlIHVzZWQgZm9yIGhpYmVybmF0aW9uLlxuIFxuJiM0Mztjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4mIzQzO1x0Ym9vbCBcJiMzNDtFbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBzbmFwc2hvdHNcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlxuJiM0MztcdHNlbGVjdCBDUllQVE9fQUVTXG4mIzQzO1x0c2VsZWN0IENSWVBUT19HQ01cbiYjNDM7XHRzZWxlY3QgQ1JZUFRPX0xJQl9TSEEyNTZcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXG4mIzQzO1x0ICBjcmVhdGVkIGJ5IHVzd3N1c3AgdG9vbHMuIEEgdHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2UgY29tcG9uZW50IG11c3RcbiYjNDM7XHQgIHByb3ZpZGUgdGhlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBiZWZvcmUgZW5hYmxpbmcgZW5jcnlwdGlvbi5cbiYjNDM7XG4mIzQzO1x0ICBTYXkgTiBpZiB1c2Vyc3BhY2UgaGFuZGxlcyB0aGUgaW1hZ2UgZW5jcnlwdGlvbi5cbiYjNDM7XG4mIzQzO1x0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4mIzQzO1xuIGNvbmZpZyBQTV9TVERfUEFSVElUSU9OXG4gXHRzdHJpbmcgXCYjMzQ7RGVmYXVsdCByZXN1bWUgcGFydGl0aW9uXCYjMzQ7XG4gXHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXG5pbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcbkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORClcdFx0JiM0Mzs9IHN1c3BlbmQub1xuIG9iai0kKENPTkZJR19QTV9URVNUX1NVU1BFTkQpXHQmIzQzOz0gc3VzcGVuZF90ZXN0Lm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXHQmIzQzOz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT05fU05BUFNIT1RfREVWKSAmIzQzOz0gdXNlci5vXG4mIzQzO29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICYjNDM7PSBzbmFwZW5jLm9cbiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKVx0JiM0Mzs9IGF1dG9zbGVlcC5vXG4gb2JqLSQoQ09ORklHX1BNX1dBS0VMT0NLUylcdCYjNDM7PSB3YWtlbG9jay5vXG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG5pbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcbkBAIC0zNiw2ICYjNDM7MzYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9wb3dlci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7cG93ZXIuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1c2VyLmhcJiMzNDtcbiBcbiBcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XG5AQCAtMTEzLDYgJiM0MzsxMTQsMTQgQEAgYm9vbCBoaWJlcm5hdGlvbl9hdmFpbGFibGUodm9pZClcbiBcdFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcdTAwMjZcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XG4gfVxuIFxuJiM0Mztib29sIGhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBub2hpYmVybmF0ZSA9PSAwIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0KCFzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTikgfHxcbiYjNDM7XHRcdCBJU19FTkFCTEVEKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCFzZWNyZXRtZW1fYWN0aXZlKCkgXHUwMDI2XHUwMDI2ICFjeGxfbWVtX2FjdGl2ZSgpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGhpYmVybmF0aW9uX3NldF9vcHMgLSBTZXQgdGhlIGdsb2JhbCBoaWJlcm5hdGUgb3BlcmF0aW9ucy5cbiAgKiBAb3BzOiBIaWJlcm5hdGlvbiBvcGVyYXRpb25zIHRvIHVzZSBpbiBzdWJzZXF1ZW50IGhpYmVybmF0aW9uIHRyYW5zaXRpb25zLlxuQEAgLTEzNzYsMTIgJiM0MzsxMzg1LDM1IEBAIHN0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosXG4gXG4gcG93ZXJfYXR0cihyZXNlcnZlZF9zaXplKTtcbiBcbiYjNDM7I2lmZGVmIENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT05cbiYjNDM7c3RhdGljIHNzaXplX3Qgc25hcHNob3Rfc2VlZF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiYjNDM7XHRcdFx0XHQgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsXG4mIzQzO1x0XHRcdFx0ICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbilcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xuJiM0MztcdHJldHVybiByZXQgPyByZXQgOiBuO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHNuYXBzaG90X3NlZWRfYXR0ciA9IHtcbiYjNDM7XHQuYXR0clx0PSB7XG4mIzQzO1x0XHQubmFtZSA9IFwmIzM0O3NuYXBzaG90X3NlZWRcJiMzNDssXG4mIzQzO1x0XHQubW9kZSA9IDAyMDAsXG4mIzQzO1x0fSxcbiYjNDM7XHQuc3RvcmVcdD0gc25hcHNob3Rfc2VlZF9zdG9yZSxcbiYjNDM7fTtcbiYjNDM7I2VuZGlmXG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpnW10gPSB7XG4gXHRcdTAwMjZkaXNrX2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc3VtZV9vZmZzZXRfYXR0ci5hdHRyLFxuIFx0XHUwMDI2cmVzdW1lX2F0dHIuYXR0cixcbiBcdFx1MDAyNmltYWdlX3NpemVfYXR0ci5hdHRyLFxuIFx0XHUwMDI2cmVzZXJ2ZWRfc2l6ZV9hdHRyLmF0dHIsXG4mIzQzOyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4mIzQzO1x0XHUwMDI2c25hcHNob3Rfc2VlZF9hdHRyLmF0dHIsXG4mIzQzOyNlbmRpZlxuIFx0TlVMTCxcbiB9O1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaFxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbkBAIC0xNjAsNiAmIzQzOzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUge1xuIFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7XG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCh2b2lkKTtcbiBleHRlcm4gaW50IHNuYXBzaG90X3JlYWRfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIGV4dGVybiBpbnQgc25hcHNob3Rfd3JpdGVfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIGludCBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuQEAgLTE2Nyw4ICYjNDM7MTY4LDExIEBAIGV4dGVybiBpbnQgc25hcHNob3RfaW1hZ2VfbG9hZGVkKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gXG4gZXh0ZXJuIGJvb2wgaGliZXJuYXRlX2FjcXVpcmUodm9pZCk7XG4gZXh0ZXJuIHZvaWQgaGliZXJuYXRlX3JlbGVhc2Uodm9pZCk7XG4mIzQzO2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTtcbiBcbiBleHRlcm4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCk7XG4mIzQzO2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpO1xuJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcyk7XG4gZXh0ZXJuIHZvaWQgZnJlZV9hbGxfc3dhcF9wYWdlcyhpbnQgc3dhcCk7XG4gZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7XG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBlbmMuYyBiL2tlcm5lbC9wb3dlci9zbmFwZW5jLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jZDI5ODAzZWM2YzVhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXG5AQCAtMCwwICYjNDM7MSw5NDAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL2FlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NjcnlwdG8vZ2NtLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL3NoYTIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NjcnlwdG8vdXRpbHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JhbmRvbS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7cG93ZXIuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1c2VyLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfU0VFRF9TSVpFIFNIQTI1Nl9ESUdFU1RfU0laRVxuJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0tFWV9CTE9CX1ZFUlNJT04gMVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHU4IHNuYXBzaG90X2tleV9ibG9iX21hZ2ljWzhdID0ge1xuJiM0MztcdCYjMzk7UyYjMzk7LCAmIzM5O1cmIzM5OywgJiMzOTtTJiMzOTssICYjMzk7VSYjMzk7LCAmIzM5O1MmIzM5OywgJiMzOTtQJiMzOTssICYjMzk7SyYjMzk7LCAmIzM5OzEmIzM5OyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB7XG4mIzQzO1x0dTggbWFnaWNbc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKV07XG4mIzQzO1x0X19sZTMyIHZlcnNpb247XG4mIzQzO1x0dTggd3JhcF9ub25jZVtHQ01fQUVTX0lWX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHU4IGVuY3J5cHRlZF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0dTggdGFnW1NOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0Mzt9IF9fcGFja2VkO1xuJiM0MztcbiYjNDM7c3RhdGljIERFRklORV9NVVRFWChzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7c3RhdGljIHU4IHNuYXBzaG90X3NlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IGNvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChsZW4gXHUwMDI2XHUwMDI2IGJ1ZltsZW4gLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuJiM0MztcdFx0bGVuLS07XG4mIzQzO1x0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuJiM0MztcdGlmIChzbmFwc2hvdF9zZWVkX3ZhbGlkKSB7XG4mIzQzO1x0XHRyZXQgPSBjcnlwdG9fbWVtbmVxKHNuYXBzaG90X3NlZWQsIHNlZWQsIHNpemVvZihzZWVkKSkgPyAtRVBFUk0gOiAwO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcbiYjNDM7XHRzbmFwc2hvdF9zZWVkX3ZhbGlkID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1BNOiBoaWJlcm5hdGU6IHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBsb2NrZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfY29weV9lbmNyeXB0aW9uX3NlZWQodTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdKVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCB2YWxpZDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7XHR2YWxpZCA9IHNuYXBzaG90X3NlZWRfdmFsaWQ7XG4mIzQzO1x0aWYgKHZhbGlkKVxuJiM0MztcdFx0bWVtY3B5KHNlZWQsIHNuYXBzaG90X3NlZWQsIFNOQVBTSE9UX1NFRURfU0laRSk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdmFsaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gXCYjMzQ7TGludXggaGliZXJuYXRlIHNuYXBzaG90IGtleSB3cmFwIHYxXCYjMzQ7O1xuJiM0MztcdHU4IGRpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdO1xuJiM0MztcdHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuJiM0MztcbiYjNDM7XHRpZiAoIXNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHNlZWQpKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9LRVk7XG4mIzQzO1xuJiM0MztcdHNoYTI1Nl9pbml0KFx1MDAyNnNoYTI1Nl9jdHgpO1xuJiM0MztcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xuJiM0MztcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcbiYjNDM7XHRzaGEyNTZfZmluYWwoXHUwMDI2c2hhMjU2X2N0eCwgZGlnZXN0KTtcbiYjNDM7XG4mIzQzO1x0bWVtY3B5KGtleSwgZGlnZXN0LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgKndyYXBwZWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxuJiM0MztcdFx0XHRcdCAgICAgIGJvb2wgZW5jcnlwdClcbiYjNDM7e1xuJiM0MztcdHU4IHdyYXBfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtO1xuJiM0MztcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcTtcbiYjNDM7XHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7XG4mIzQzO1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdHJjID0gc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh3cmFwX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0cmV0dXJuIHJjO1xuJiM0MztcbiYjNDM7XHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcJiMzNDtnY20oYWVzKVwmIzM0OywgMCwgMCk7XG4mIzQzO1x0aWYgKElTX0VSUih0Zm0pKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIodGZtKTtcbiYjNDM7XHRcdGdvdG8gb3V0X2tleTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZSh0Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XG4mIzQzO1x0cmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFyZXEpIHtcbiYjNDM7XHRcdHJjID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChlbmNyeXB0KSB7XG4mIzQzO1x0XHRnZXRfcmFuZG9tX2J5dGVzKHdyYXBwZWQtXHUwMDNld3JhcF9ub25jZSwgc2l6ZW9mKHdyYXBwZWQtXHUwMDNld3JhcF9ub25jZSkpO1xuJiM0MztcdFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bWVtY3B5KGJ1Ziwgd3JhcHBlZC1cdTAwM2VlbmNyeXB0ZWRfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHRcdG1lbWNweShidWYgJiM0MzsgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSwgd3JhcHBlZC1cdTAwM2V0YWcsXG4mIzQzO1x0XHQgICAgICAgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRzZ19pbml0X29uZShcdTAwMjZzZywgYnVmLCBzaXplb2YoYnVmKSk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9hZChyZXEsIDApO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBcdTAwMjZzZywgXHUwMDI2c2csXG4mIzQzO1x0XHRcdCAgICAgICBlbmNyeXB0ID8gU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSA6XG4mIzQzO1x0XHRcdFx0XHQgc2l6ZW9mKGJ1ZiksXG4mIzQzO1x0XHRcdCAgICAgICB3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UpO1xuJiM0MztcbiYjNDM7XHRyYyA9IGNyeXB0b193YWl0X3JlcShlbmNyeXB0ID8gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpIDpcbiYjNDM7XHRcdFx0XHQgICAgICAgY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNndhaXQpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3JlcTtcbiYjNDM7XG4mIzQzO1x0aWYgKGVuY3J5cHQpIHtcbiYjNDM7XHRcdG1lbWNweSh3cmFwcGVkLVx1MDAzZWVuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2V0YWcsIGJ1ZiAmIzQzOyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLFxuJiM0MztcdFx0ICAgICAgIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtZW1jcHkoaW1hZ2Vfa2V5LCBidWYsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dF9yZXE6XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X2ZyZWUocmVxKTtcbiYjNDM7b3V0X3RmbTpcbiYjNDM7XHRjcnlwdG9fZnJlZV9hZWFkKHRmbSk7XG4mIzQzO291dF9rZXk6XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChidWYsIHNpemVvZihidWYpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3Rfd3JhcF9pbWFnZV9rZXkoY29uc3QgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZClcbiYjNDM7e1xuJiM0MztcdHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdG1lbXNldCh3cmFwcGVkLCAwLCBzaXplb2YoKndyYXBwZWQpKTtcbiYjNDM7XHRtZW1jcHkod3JhcHBlZC1cdTAwM2VtYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsIHNpemVvZih3cmFwcGVkLVx1MDAzZW1hZ2ljKSk7XG4mIzQzO1x0d3JhcHBlZC1cdTAwM2V2ZXJzaW9uID0gY3B1X3RvX2xlMzIoU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTik7XG4mIzQzO1xuJiM0MztcdG1lbWNweShrZXksIGltYWdlX2tleSwgc2l6ZW9mKGtleSkpO1xuJiM0MztcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGtleSwgc2l6ZW9mKGtleSkpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KGNvbnN0IHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbiYjNDM7XHRcdFx0XHQgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7XG4mIzQzO1x0aW50IHJjO1xuJiM0MztcbiYjNDM7XHRpZiAobWVtY21wKHdyYXBwZWQtXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLFxuJiM0MztcdFx0ICAgc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cdTAwM2V2ZXJzaW9uKSAhPSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHRtcCA9ICp3cmFwcGVkO1xuJiM0MztcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkoXHUwMDI2dG1wLCBpbWFnZV9rZXksIGZhbHNlKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnRtcCwgc2l6ZW9mKHRtcCkpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHQgICAgICBjb25zdCB1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdG1lbWNweShkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LCBpbWFnZV9rZXksIHNpemVvZihkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbiYjNDM7XHRcdFx0XHRzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbiYjNDM7XHRcdFx0XHQgc2l6ZW9mKGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEZXJpdmUgYSBrZXkgZnJvbSB0aGUga2VybmVsIGFuZCB1c2VyIGtleXMgZm9yIGRhdGEgZW5jcnlwdGlvbi4gKi9cbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF91c2VfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBIYXNoIHRoZSBrZXJuZWwga2V5IGFuZCB0aGUgdXNlciBrZXkgdG9nZXRoZXIuIFRoaXMgZm9sZHMgaW4gdGhlIHVzZXJcbiYjNDM7XHQgKiBrZXksIGJ1dCBub3QgaW4gYSB3YXkgdGhhdCBnaXZlcyB0aGUgdXNlciBtb2RlIHByZWRpY3RhYmxlIGNvbnRyb2xcbiYjNDM7XHQgKiBvdmVyIHRoZSBrZXkgYml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbiYjNDM7XG4mIzQzO1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LFxuJiM0MztcdFx0ICAgICAgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBkYXRhLVx1MDAzZXVzZXJfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkpO1xuJiM0MztcdHNoYTI1Nl9maW5hbChcdTAwMjZzaGEyNTZfY3R4LCBkaWdlc3QpO1xuJiM0MztcbiYjNDM7XHRCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBcdTAwM2UgU0hBMjU2X0RJR0VTVF9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSxcbiYjNDM7XHRcdFx0XHRkaWdlc3QsXG4mIzQzO1x0XHRcdFx0U05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDaGVjayB0byBzZWUgaWYgaXQmIzM5O3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID09IGRhdGEtXHUwMDNlbWV0YV9zaXplKSB7XG4mIzQzO1x0XHRyZXR1cm4gc25hcHNob3RfdXNlX3VzZXJfa2V5KGRhdGEpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3Rfc2V0X21ldGFfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgdTY0IG1ldGFfc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlbWV0YV9zaXplID0gbWV0YV9zaXplO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobWV0YV9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVjb3JkX2VuY3J5cHRlZF9yZWFkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0ICAgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkICYjNDM7PSBjb3VudDtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBFbmNyeXB0IG1vcmUgZGF0YSBmcm9tIHRoZSBzbmFwc2hvdCBpbnRvIHRoZSBzdGFnaW5nIGFyZWEuICovXG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLVx1MDAzZWFlYWRfcmVxO1xuJiM0MztcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XG4mIzQzO1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbiYjNDM7XHRzaXplX3QgdG90YWwgPSAwO1xuJiM0MztcdGludCBwZ19pZHg7XG4mIzQzO1x0aW50IHJlcztcbiYjNDM7XG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xuJiM0MztcdFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxuJiM0MztcdFx0XHRcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4mIzQzO1x0XHRpZiAocmVzKVxuJiM0MztcdFx0XHRyZXR1cm4gcmVzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnRcbiYjNDM7XHQgKiBhdHRhY2tzIHRoYXQgcmVhcnJhbmdlIGNodW5rcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZ19zZXRfYnVmKFx1MDAyNmRhdGEtXHUwMDNlc2dbMF0sIFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfdG90YWwsIHNpemVvZihkYXRhLVx1MDAzZWNyeXB0X3RvdGFsKSk7XG4mIzQzO1xuJiM0MztcdC8qIExvYWQgdGhlIGNyeXB0IGJ1ZmZlciB3aXRoIHNuYXBzaG90IHBhZ2VzLiAqL1xuJiM0MztcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR2b2lkICpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF07XG4mIzQzO1xuJiM0MztcdFx0LyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi9cbiYjNDM7XHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkIFx1MDAyNlx1MDAyNiB0b3RhbCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAoKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgJiM0MzsgdG90YWwpID09IGRhdGEtXHUwMDNlbWV0YV9zaXplKSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiYjNDM7XHRcdGlmIChyZXMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXM7XG4mIzQzO1x0XHRpZiAocmVzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIENvcHkgdGhlIHBhZ2UgaW50byB0aGUgc3RhZ2luZyBhcmVhLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb25cbiYjNDM7XHRcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdG1lbWNweShidWYsIGRhdGFfb2YoZGF0YS1cdTAwM2VoYW5kbGUpLCBQQUdFX1NJWkUpO1xuJiM0MztcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgYnVmLCBQQUdFX1NJWkUpO1xuJiM0MztcdFx0dG90YWwgJiM0Mzs9IFBBR0VfU0laRTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghdG90YWwpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgXHUwMDI2ZGF0YS1cdTAwM2VhdXRoX3RhZywgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVc2UgaW5jcmVtZW50aW5nIG5vbmNlcyBmb3IgZWFjaCBjaHVuaywgc2luY2UgYSA2NCBiaXQgdmFsdWUgd29uJiMzOTt0XG4mIzQzO1x0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtZW1jcHkoXHUwMDI2bm9uY2VbMF0sIFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbiYjNDM7XHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4mIzQzO1x0ICAgICAgIFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCxcbiYjNDM7XHQgICAgICAgc2l6ZW9mKG5vbmNlKSAtIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuJiM0MztcbiYjNDM7XHRkYXRhLVx1MDAzZW5vbmNlX2xvdyAmIzQzOz0gMTtcbiYjNDM7XHQvKiBUb3RhbCBkb2VzIG5vdCBpbmNsdWRlIEFBRCBvciB0aGUgYXV0aCB0YWcuICovXG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIGRhdGEtXHUwMDNlc2csIGRhdGEtXHUwMDNlc2csIHRvdGFsLCBub25jZSk7XG4mIzQzO1x0cmVzID0gY3J5cHRvX3dhaXRfcmVxKGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0aWYgKHJlcylcbiYjNDM7XHRcdHJldHVybiByZXM7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IHRvdGFsO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgJiM0Mzs9IHRvdGFsO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi9cbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cdTAwM2VhZWFkX3JlcTtcbiYjNDM7XHR1OCBub25jZVtHQ01fQUVTX0lWX1NJWkVdO1xuJiM0MztcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XG4mIzQzO1x0aW50IHBhZ2VfY291bnQ7XG4mIzQzO1x0c2l6ZV90IHRvdGFsO1xuJiM0MztcdGludCBwZ19pZHg7XG4mIzQzO1x0aW50IHJlcztcbiYjNDM7XG4mIzQzO1x0LyogU2V0IHVwIHRoZSBhc3NvY2lhdGVkIGRhdGEuICovXG4mIzQzO1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzBdLCBcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXG4mIzQzO1x0ICogc2hvdWxkIGFsc28gYmUgYSB0YWcgYXQgdGhlIGVuZCwgc28gdGhlIG9mZnNldCB3b24mIzM5O3QgYmUgYW4gZXZlbiBwYWdlLlxuJiM0MztcdCAqL1xuJiM0MztcdHBhZ2VfY291bnQgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR0b3RhbCA9IHBhZ2VfY291bnQgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBMb2FkIHRoZSBzZyBsaXN0IHdpdGggdGhlIGNyeXB0IGJ1ZmZlci4gSW5saW5lIGRlY3J5cHQgYmFjayBpbnRvIHRoZVxuJiM0MztcdCAqIHN0YWdpbmcgYnVmZmVyLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgZGVjcnlwdCBkaXJlY3RseSBpbnRvXG4mIzQzO1x0ICogbG93bWVtIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBwYWdlX2NvdW50OyBwZ19pZHgmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEl0JiMzOTtzIHBvc3NpYmxlIHRoaXMgaXMgdGhlIGZpbmFsIGRlY3J5cHQsIG9yIHRoZSBmaW5hbCBkZWNyeXB0IG9mIHRoZVxuJiM0MztcdCAqIG1ldGEgcmVnaW9uLCBhbmQgdGhlcmUgYXJlIGZld2VyIHRoYW4gQ0hVTktfU0laRSBwYWdlcy4gSWYgdGhpcyBpc1xuJiM0MztcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcbiYjNDM7XHQgKiBieXRlcyBvZiBhIG5ldyBwYWdlLiBDb3B5IHRvIHRoZSB0YWcgaWYgc28uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VfY291bnQgXHUwMDNjIENIVU5LX1NJWkUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAtIHRvdGFsKSA9PSBzaXplb2YoZGF0YS1cdTAwM2VhdXRoX3RhZykpIHtcbiYjNDM7XHRcdG1lbWNweShkYXRhLVx1MDAzZWF1dGhfdGFnLCBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0sXG4mIzQzO1x0XHQgICAgICAgc2l6ZW9mKGRhdGEtXHUwMDNlYXV0aF90YWcpKTtcbiYjNDM7XHR9IGVsc2UgaWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICE9XG4mIzQzO1x0XHQgICAoKENIVU5LX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNnX3NldF9idWYoXHUwMDI2ZGF0YS1cdTAwM2VzZ1sxICYjNDM7IHBnX2lkeF0sIFx1MDAyNmRhdGEtXHUwMDNlYXV0aF90YWcsIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuJiM0MztcdG1lbWNweShcdTAwMjZub25jZVswXSwgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9sb3csIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuJiM0MztcdG1lbWNweShcdTAwMjZub25jZVtzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpXSxcbiYjNDM7XHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuJiM0MztcdCAgICAgICBzaXplb2Yobm9uY2UpIC0gc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICYjNDM7PSAxO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBkYXRhLVx1MDAzZXNnLCBkYXRhLVx1MDAzZXNnLCB0b3RhbCAmIzQzOyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFLCBub25jZSk7XG4mIzQzO1x0cmVzID0gY3J5cHRvX3dhaXRfcmVxKGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0aWYgKHJlcylcbiYjNDM7XHRcdHJldHVybiByZXM7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xuJiM0MztcbiYjNDM7XHQvKiBQdXNoIHRoZSBkZWNyeXB0ZWQgcGFnZXMgZnVydGhlciBkb3duIHRoZSBzdGFjay4gKi9cbiYjNDM7XHR0b3RhbCA9IDA7XG4mIzQzO1x0Zm9yIChwZ19pZHggPSAwOyBwZ19pZHggXHUwMDNjIHBhZ2VfY291bnQ7IHBnX2lkeCYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHZvaWQgKmJ1ZiA9IGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XTtcbiYjNDM7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiYjNDM7XHRcdGlmIChyZXMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXM7XG4mIzQzO1x0XHRpZiAocmVzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdGlmICghZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0LyogQ29weSB0aGUgZGVjcnlwdGVkIHBhZ2UgaW50byB0aGUgc25hcHNob3QgaW1hZ2UuICovXG4mIzQzO1x0XHRtZW1jcHkoZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSksIGJ1ZiwgUEFHRV9TSVpFKTtcbiYjNDM7XHRcdHRvdGFsICYjNDM7PSBQQUdFX1NJWkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCA9PSAwKSB7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkKVxuJiM0MztcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9XG4mIzQzO1x0XHRcdFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cdTAwM2VtZXRhX3NpemUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7XG4mIzQzO1x0cmVzID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xuJiM0MztcdGlmIChyZXMpXG4mIzQzO1x0XHRyZXR1cm4gcmVzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICB2b2lkICoqYnVmKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHRhZ19vZmY7XG4mIzQzO1xuJiM0MztcdC8qIFJlZmlsbCB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCYjMzk7cyBlbXB0eS4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9zaXplID09IDAgfHxcbiYjNDM7XHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZT1cbiYjNDM7XHQgICAgIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkpKSB7XG4mIzQzO1x0XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VjcnlwdF9zaXplID0gMDtcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbiYjNDM7XHRcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9zaXplKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFJldHVybiBkYXRhIHBhZ2VzIGlmIHRoZSBvZmZzZXQgaXMgaW4gdGhhdCByZWdpb24uICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzYyBkYXRhLVx1MDAzZWNyeXB0X3NpemUpIHtcbiYjNDM7XHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHRcdHNpemVfdCBwZ19vZmYgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdFx0KmJ1ZiA9IGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XSAmIzQzOyBwZ19vZmY7XG4mIzQzO1x0XHRyZXR1cm4gUEFHRV9TSVpFIC0gcGdfb2ZmO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovXG4mIzQzO1x0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gZGF0YS1cdTAwM2VjcnlwdF9zaXplO1xuJiM0MztcdGlmICh0YWdfb2ZmIFx1MDAzZSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxuJiM0MztcdFx0dGFnX29mZiA9IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkU7XG4mIzQzO1xuJiM0MztcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICYjNDM7IHRhZ19vZmY7XG4mIzQzO1x0cmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgdm9pZCAqKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHNpemVfdCBzaXplX2F2YWlsO1xuJiM0MztcdHNpemVfdCB0YWdfb2ZmO1xuJiM0MztcbiYjNDM7XHQvKiBSZXR1cm4gZGF0YSBwYWdlcyBpZiB0aGUgb2Zmc2V0IGlzIGluIHRoYXQgcmVnaW9uLiAqL1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpKSB7XG4mIzQzO1x0XHRzaXplX3QgcGdfaWR4ID0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbiYjNDM7XG4mIzQzO1x0XHQqYnVmID0gZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdICYjNDM7IHBnX29mZjtcbiYjNDM7XHRcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFVzZSBvZmZzZXRzIGp1c3QgYmV5b25kIHRoZSBzaXplIHRvIHJldHVybiB0aGUgdGFnLiAqL1xuJiM0MztcdFx0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xuJiM0MztcdFx0aWYgKHRhZ19vZmYgXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXG4mIzQzO1x0XHRcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xuJiM0MztcbiYjNDM7XHRcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICYjNDM7IHRhZ19vZmY7XG4mIzQzO1x0XHRzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsIFx1MDAzYyBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSkge1xuJiM0MztcdFx0dTY0IG1ldGFfYXZhaWwgPSBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSAtIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsO1xuJiM0MztcbiYjNDM7XHRcdHNpemVfYXZhaWwgPSBtaW5fdCh1NjQsIHNpemVfYXZhaWwsIG1ldGFfYXZhaWwpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNpemVfYXZhaWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0Y2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgY29weV9zaXplO1xuJiM0MztcdHNpemVfdCBub3RfZG9uZTtcbiYjNDM7XHRzaXplX3QgcGdfb2ZmO1xuJiM0MztcdHZvaWQgKnNyYztcbiYjNDM7XHRzc2l6ZV90IHNyY19zaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvdW50KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHBnX29mZiA9ICpvZmZwIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4mIzQzO1x0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xuJiM0MztcbiYjNDM7XHRzcmNfc2l6ZSA9IHNuYXBzaG90X3JlYWRfbmV4dF9lbmNyeXB0ZWQoZGF0YSwgXHUwMDI2c3JjKTtcbiYjNDM7XHRpZiAoc3JjX3NpemUgXHUwMDNjPSAwKVxuJiM0MztcdFx0cmV0dXJuIHNyY19zaXplO1xuJiM0MztcbiYjNDM7XHRjb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIGNvdW50LCBzcmNfc2l6ZSk7XG4mIzQzO1x0bm90X2RvbmUgPSBjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGNvcHlfc2l6ZSk7XG4mIzQzO1x0Y29weV9zaXplIC09IG5vdF9kb25lO1xuJiM0MztcdGlmICghY29weV9zaXplKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0Km9mZnAgJiM0Mzs9IGNvcHlfc2l6ZTtcbiYjNDM7XHRzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTtcbiYjNDM7XHRyZXR1cm4gY29weV9zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHQgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuJiM0MztcdFx0XHRcdCBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgY29weV9zaXplO1xuJiM0MztcdHNpemVfdCBub3RfZG9uZTtcbiYjNDM7XHRzaXplX3QgcGdfb2ZmO1xuJiM0MztcdHZvaWQgKmRzdDtcbiYjNDM7XHRzc2l6ZV90IGRzdF9zaXplO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3VudClcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRwZ19vZmYgPSAqb2ZmcCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdGNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFIC0gcGdfb2ZmKTtcbiYjNDM7XG4mIzQzO1x0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZkc3QpO1xuJiM0MztcdGlmIChkc3Rfc2l6ZSBcdTAwM2M9IDApXG4mIzQzO1x0XHRyZXR1cm4gZHN0X3NpemU7XG4mIzQzO1xuJiM0MztcdGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTtcbiYjNDM7XHRub3RfZG9uZSA9IGNvcHlfZnJvbV91c2VyKGRzdCwgYnVmLCBjb3B5X3NpemUpO1xuJiM0MztcdGNvcHlfc2l6ZSAtPSBub3RfZG9uZTtcbiYjNDM7XHRpZiAoIWNvcHlfc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAmIzQzOz0gY29weV9zaXplO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCYjMzk7cyBmdWxsLCBvciBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGVcbiYjNDM7XHQgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZT1cbiYjNDM7XHQgICAgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgfHxcbiYjNDM7XHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUpKSB7XG4mIzQzO1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdCpvZmZwICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0cmV0dXJuIGNvcHlfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW5vbmNlX2xvdyA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vub25jZV9oaWdoID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgPSBmYWxzZTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0bWVtc2V0KGRhdGEtXHUwMDNlYXV0aF90YWcsIDAsIHNpemVvZihkYXRhLVx1MDAzZWF1dGhfdGFnKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VhZWFkX3JlcSkge1xuJiM0MztcdFx0YWVhZF9yZXF1ZXN0X2ZyZWUoZGF0YS1cdTAwM2VhZWFkX3JlcSk7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWFlYWRfcmVxID0gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWFlYWRfdGZtKSB7XG4mIzQzO1x0XHRjcnlwdG9fZnJlZV9hZWFkKGRhdGEtXHUwMDNlYWVhZF90Zm0pO1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBDSFVOS19TSVpFOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pIHtcbiYjNDM7XHRcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pO1xuJiM0MztcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSwgc2l6ZW9mKGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4mIzQzO1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCBpLCByYztcbiYjNDM7XG4mIzQzO1x0LyogVGhpcyBvbmx5IHdvcmtzIG9uY2UgcGVyIGhpYmVybmF0ZS4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VhZWFkX3RmbSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKGRhdGEpO1xuJiM0MztcdG1lbXNldChkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF9wYWdlcykpO1xuJiM0MztcbiYjNDM7XHQvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovXG4mIzQzO1x0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IGNyeXB0b19hbGxvY19hZWFkKFwmIzM0O2djbShhZXMpXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGRhdGEtXHUwMDNlYWVhZF90Zm0pKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIoZGF0YS1cdTAwM2VhZWFkX3RmbSk7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWFlYWRfdGZtID0gTlVMTDtcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJjID0gLUVOT01FTTtcbiYjNDM7XHRkYXRhLVx1MDAzZWFlYWRfcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKGRhdGEtXHUwMDNlYWVhZF90Zm0sIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghZGF0YS1cdTAwM2VhZWFkX3JlcSlcbiYjNDM7XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogQWxsb2NhdGUgdGhlIHN0YWdpbmcgYXJlYSAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRpZiAoIWRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pXG4mIzQzO1x0XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNnX2luaXRfdGFibGUoZGF0YS1cdTAwM2VzZywgQ0hVTktfU0laRSAmIzQzOyAyKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgYXNzb2NpYXRlZCBkYXRhIHdpbGwgYmUgdGhlIG9mZnNldCBzbyB0aGF0IGJsb2NrcyBjYW4mIzM5O3QgYmVcbiYjNDM7XHQgKiByZWFycmFuZ2VkLlxuJiM0MztcdCAqL1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfYWQoZGF0YS1cdTAwM2VhZWFkX3JlcSwgc2l6ZW9mKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwpKTtcbiYjNDM7XHRyYyA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGRhdGEtXHUwMDNlYWVhZF90Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztzZXR1cF9mYWlsOlxuJiM0MztcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcbiYjNDM7XHR1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmcgPSB7fTtcbiYjNDM7XHR1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdC8qIERvbiYjMzk7dCBwdWxsIGEgcmFuZG9tIGtleSBmcm9tIGEgd29ybGQgdGhhdCBjYW4gYmUgcmVzZXQuICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlcmVhZHkpXG4mIzQzO1x0XHRyZXR1cm4gLUVQSVBFO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XG4mIzQzO1x0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXG4mIzQzO1x0Z2V0X3JhbmRvbV9ieXRlcyhub25jZSwgc2l6ZW9mKG5vbmNlKSk7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBcdTAwMjZub25jZVswXSwgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCwgXHUwMDI2bm9uY2VbOF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2hpZ2gpKTtcbiYjNDM7XG4mIzQzO1x0LyogQnVpbGQgYW5kIGluc3RhbGwgYSByYW5kb20gaW1hZ2UgZW5jcnlwdGlvbiBrZXkuICovXG4mIzQzO1x0Z2V0X3JhbmRvbV9ieXRlcyhpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGltYWdlX2tleSwgXHUwMDI2d3JhcHBlZCk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBIYW5kIHRoZSB3cmFwcGVkIGtleSBhbmQgY2xlYXIgbm9uY2UgYmFjayB0byB1c2VyIG1vZGUuICovXG4mIzQzO1x0cmMgPSBwdXRfdXNlcihzaXplb2Yod3JhcHBlZCksIFx1MDAyNmtleS1cdTAwM2VibG9iX2xlbik7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHRCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpIFx1MDAzZVxuJiM0MztcdFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVx1MDAzZWJsb2IpKTtcbiYjNDM7XHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2VibG9iLCBcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpKSB7XG4mIzQzO1x0XHRyYyA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2Vub25jZSwgXHUwMDI2bm9uY2UsIHNpemVvZihub25jZSkpKSB7XG4mIzQzO1x0XHRyYyA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2ZhaWw6XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4mIzQzO1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjtcbiYjNDM7XHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgd3JhcHBlZCA9IHt9O1xuJiM0MztcdHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9O1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0LyogSXQmIzM5O3MgdG9vIGxhdGUgaWYgZGF0YSYjMzk7cyBiZWVuIHB1c2hlZCBpbi4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VoYW5kbGUuY3VyKVxuJiM0MztcdFx0cmV0dXJuIC1FUElQRTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRyZXR1cm4gcmM7XG4mIzQzO1xuJiM0MztcdC8qIExvYWQgdGhlIGtleSBmcm9tIHVzZXIgbW9kZS4gKi9cbiYjNDM7XHRibG9iID0gbWVtZHVwX3VzZXIoa2V5LCBzaXplb2YoKmJsb2IpKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGJsb2IpKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIoYmxvYik7XG4mIzQzO1x0XHRnb3RvIGNyeXB0b19zZXR1cF9mYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGJsb2ItXHUwMDNlYmxvYl9sZW4gIT0gc2l6ZW9mKHdyYXBwZWQpKSB7XG4mIzQzO1x0XHRyYyA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIG91dF9ibG9iO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNndyYXBwZWQsIGJsb2ItXHUwMDNlYmxvYiwgc2l6ZW9mKHdyYXBwZWQpKTtcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoXHUwMDI2d3JhcHBlZCwgaW1hZ2Vfa2V5KTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRnb3RvIG91dF9ibG9iO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXRfYmxvYjtcbiYjNDM7XG4mIzQzO1x0LyogTG9hZCB0aGUgc3RhcnRpbmcgbm9uY2UuICovXG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzBdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbiYjNDM7XHRtZW1jcHkoXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzhdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9oaWdoKSk7XG4mIzQzO1xuJiM0MztvdXRfYmxvYjpcbiYjNDM7XHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjcnlwdG9fc2V0dXBfZmFpbDpcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGxvZmZfdCBwYWdlcyA9IHBsYWluX3NpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0bG9mZl90IGNodW5rcyA9IChwYWdlcyAmIzQzOyAoQ0hVTktfU0laRSAtIDEpKSAvIENIVU5LX1NJWkU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW5cbiYjNDM7XHQgKiBhdXRoZW50aWNhdGlvbiB0YWcgZm9yIGV2ZXJ5IGNodW5rIG9mIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiBwbGFpbl9zaXplICYjNDM7IChjaHVua3MgKiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChsb2ZmX3QgcmF3X3NpemUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgbG9mZl90IG1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGlmIChyYXdfc2l6ZSBcdTAwM2M9IG1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7XHRcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICYjNDM7XG4mIzQzO1x0XHRzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdCAgc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB1c2VyX2tleSA9IHt9O1xuJiM0MztcdHVuc2lnbmVkIGludCBrZXlfbGVuO1xuJiM0MztcdHU2NCBzaXplO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnVzZXJfa2V5LCBrZXksIHNpemVvZihzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSkpKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkgXHUwMDNjIHNpemVvZih1c2VyX2tleS5rZXkpKTtcbiYjNDM7XHRyYyA9IC1FSU5WQUw7XG4mIzQzO1x0aWYgKHVzZXJfa2V5LnJlc2VydmVkKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKHVzZXJfa2V5LmtleV9sZW4gXHUwMDNlIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICh1c2VyX2tleS5rZXlfbGVuIFx1MDAzYyA4KVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXHUwMDI2XHUwMDI2ICFkYXRhLVx1MDAzZXJlYWR5KSB7XG4mIzQzO1x0XHRyYyA9IC1FTk9EQVRBO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJldHVybiB0aGUgbWV0YWRhdGEgc2l6ZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBmZWQgaW4gYmVmb3JlXG4mIzQzO1x0ICogdGhlIHVzZXIgZGF0YSBrZXkgaXMgbmVlZGVkIGF0IHJlc3VtZSB0aW1lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19XUk9OTFkgXHUwMDI2XHUwMDI2ICFkYXRhLVx1MDAzZW1ldGFfc2l6ZSkge1xuJiM0MztcdFx0aWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSBcdTAwM2MgUEFHRV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gdXNlcl9rZXkubWV0YV9zaXplO1xuJiM0MztcdFx0c2l6ZSA9IGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbmFwc2hvdF9zZXRfbWV0YV9zaXplKGRhdGEsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCk7XG4mIzQzO1x0XHRzaXplID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyYyA9IHB1dF91c2VyKHNpemUsIFx1MDAyNmtleS1cdTAwM2VtZXRhX3NpemUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRrZXlfbGVuID0gdXNlcl9rZXkua2V5X2xlbjtcbiYjNDM7XG4mIzQzO1x0LyogRG9uJiMzOTt0IGFsbG93IGl0IGlmIGl0JiMzOTtzIHRvbyBsYXRlLiAqL1xuJiM0MztcdGlmICgoZGF0YS1cdTAwM2VtZXRhX3NpemUgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlbWV0YV9zaXplKSB8fFxuJiM0MztcdCAgICAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICBkYXRhLVx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbCBcdTAwM2UgZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUpKSB7XG4mIzQzO1x0XHRyYyA9IC1FQlVTWTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGRhdGEtXHUwMDNldXNlcl9rZXksIDAsIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4mIzQzO1x0bWVtY3B5KGRhdGEtXHUwMDNldXNlcl9rZXksIHVzZXJfa2V5LmtleSwga2V5X2xlbik7XG4mIzQzO1x0ZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZCA9IHRydWU7XG4mIzQzO1x0LyogSW5zdGFsbCB0aGUga2V5IGlmIHRoZSB1c2VyIGlzIGp1c3QgdW5kZXIgdGhlIHdpcmUuICovXG4mIzQzO1x0cmMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJjID0gMDtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnVzZXJfa2V5LCBzaXplb2YodXNlcl9rZXkpKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgbG9mZl90IHJhd19zaXplKVxuJiM0Mzt7XG4mIzQzO1x0bG9mZl90IG1ldGFfcGxhaW5fc2l6ZSA9IGRhdGEtXHUwMDNlbWV0YV9zaXplO1xuJiM0MztcdGxvZmZfdCBzcGxpdF9zaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7XHRcdG1ldGFfcGxhaW5fc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0c3BsaXRfc2l6ZSA9IHNuYXBzaG90X2VuY3J5cHRlZF9zcGxpdF9ieXRlX2NvdW50KHJhd19zaXplLFxuJiM0MztcdFx0XHRcdFx0XHRcdCBtZXRhX3BsYWluX3NpemUpO1xuJiM0MztcdGlmICghZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZClcbiYjNDM7XHRcdHJldHVybiBtYXgoc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpLCBzcGxpdF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNwbGl0X3NpemU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAhPSAwKSB7XG4mIzQzO1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMpXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuaW5kZXggZDkzM2I1YjJjMDVkNC4uMDI0MDBhYzEyNWM1OCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuQEAgLTIxNzcsNiAmIzQzOzIxNzcsMTEgQEAgdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIG5yX2NvcHlfcGFnZXMgJiM0MzsgbnJfbWV0YV9wYWdlcyAmIzQzOyAxO1xuIH1cbiBcbiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbnJfbWV0YV9wYWdlcyAmIzQzOyAxO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgaW5pdF9oZWFkZXIoc3RydWN0IHN3c3VzcF9pbmZvICppbmZvKVxuIHtcbiBcdG1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHN3c3VzcF9pbmZvKSk7XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3YXAuYyBiL2tlcm5lbC9wb3dlci9zd2FwLmNcbmluZGV4IGM2MjZlOWRjM2MxYzEuLjNiZGQ1OGQ1YjYyY2IgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvc3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXG5AQCAtMTY2LDYgJiM0MzsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIHN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBzd2FwX29mZnNldCxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJiX25vZGUgKm5vZGUgPSBzd3N1c3BfZXh0ZW50cy5yYl9ub2RlO1xuJiM0MztcdHN0cnVjdCBzd3N1c3BfZXh0ZW50ICpleHQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmQ7XG4mIzQzO1xuJiM0MztcdGlmICghbnJfcGFnZXMpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGVuZCA9IHN3YXBfb2Zmc2V0ICYjNDM7IG5yX3BhZ2VzIC0gMTtcbiYjNDM7XHRpZiAoZW5kIFx1MDAzYyBzd2FwX29mZnNldClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKG5vZGUpIHtcbiYjNDM7XHRcdGV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTtcbiYjNDM7XHRcdGlmIChzd2FwX29mZnNldCBcdTAwM2MgZXh0LVx1MDAzZXN0YXJ0KVxuJiM0MztcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuJiM0MztcdFx0ZWxzZSBpZiAoc3dhcF9vZmZzZXQgXHUwMDNlIGV4dC1cdTAwM2VlbmQpXG4mIzQzO1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRnb3RvIGZvdW5kO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7Zm91bmQ6XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHN3YXBfb2Zmc2V0IFx1MDAzYyBleHQtXHUwMDNlc3RhcnQpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmIChlbmQgXHUwMDNjPSBleHQtXHUwMDNlZW5kKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdGlmIChleHQtXHUwMDNlZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0c3dhcF9vZmZzZXQgPSBleHQtXHUwMDNlZW5kICYjNDM7IDE7XG4mIzQzO1x0XHRub2RlID0gcmJfbmV4dChcdTAwMjZleHQtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRpZiAoIW5vZGUpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0XHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChpbnQgc3dhcCwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGJsb2NrO1xuJiM0MztcdHU2NCBlbmQ7XG4mIzQzO1x0dTY0IGVuZF9ibG9jaztcbiYjNDM7XG4mIzQzO1x0aWYgKHN3YXAgXHUwMDNjIDAgfHwgcG9zIFx1MDAzYyAwIHx8ICFjb3VudClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZW5kID0gKHU2NClwb3MgJiM0MzsgY291bnQgLSAxO1xuJiM0MztcdGlmIChlbmQgXHUwMDNjICh1NjQpcG9zKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRibG9jayA9ICh1NjQpcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdGVuZF9ibG9jayA9IGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0dTY0IHJlbWFpbmluZ19wYWdlcyA9IGVuZF9ibG9jayAtIGJsb2NrICYjNDM7IDE7XG4mIzQzO1x0XHRwZ29mZl90IHN3YXBfb2Zmc2V0O1xuJiM0MztcdFx0cGdvZmZfdCBtYXBwZWRfcGFnZXM7XG4mIzQzO1x0XHRzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7XG4mIzQzO1x0XHR1NjQgcGFnZXM7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFyZW1haW5pbmdfcGFnZXMpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmICgodTY0KXBhZ2VfYmxvY2sgIT0gYmxvY2spXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCBcdTAwMjZzd2FwX29mZnNldCxcbiYjNDM7XHRcdFx0XHRcdCAgICBcdTAwMjZtYXBwZWRfcGFnZXMpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRpZiAoIW1hcHBlZF9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cGFnZXMgPSBtaW5fdCh1NjQsIG1hcHBlZF9wYWdlcywgcmVtYWluaW5nX3BhZ2VzKTtcbiYjNDM7XHRcdGlmICgodTY0KSh1bnNpZ25lZCBsb25nKXBhZ2VzICE9IHBhZ2VzKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0aWYgKHBhZ2VzID09IHJlbWFpbmluZ19wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRibG9jayAmIzQzOz0gcGFnZXM7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcylcbiYjNDM7e1xuJiM0MztcdHU2NCBpbWFnZV9wYWdlcyA9IERJVl9ST1VORF9VUF9VTEwoaW1hZ2VfYnl0ZXMsIFBBR0VfU0laRSk7XG4mIzQzO1x0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyAmIzQzOyAxO1xuJiM0MztcbiYjNDM7XHRpZiAobWFwX3BhZ2VzIFx1MDAzZSBVNjRfTUFYIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKVxuJiM0MztcdFx0cmV0dXJuIFU2NF9NQVg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtYXBfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO31cbiYjNDM7XG4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuY1xuaW5kZXggZDBmY2ZiYTdhYzIzNS4uNTdiOGNlODNhNjI2ZiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci91c2VyLmNcbkBAIC0yMSw1NCAmIzQzOzIxLDE4NSBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnNvbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BpZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtwb3dlci5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3VzZXIuaFwmIzM0O1xuIFxuIHN0YXRpYyBib29sIG5lZWRfd2FpdDtcbi1cbi1zdGF0aWMgc3RydWN0IHNuYXBzaG90X2RhdGEge1xuLVx0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4tXHRpbnQgc3dhcDtcbi1cdGludCBtb2RlO1xuLVx0Ym9vbCBmcm96ZW47XG4tXHRib29sIHJlYWR5O1xuLVx0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xuLVx0Ym9vbCBmcmVlX2JpdG1hcHM7XG4tXHRkZXZfdCBkZXY7XG4tfSBzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7c3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XG4gXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldilcbiB7XG4gXHRyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgXHUwMDI2XHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XG4gfVxuIFxuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgZGV2X3QgZGV2KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCBcdTAwMjZcdTAwMjYgZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ZGF0YS1cdTAwM2VyZWFkeSBcdTAwMjZcdTAwMjYgZGF0YS1cdTAwM2VkZXYgPT0gZGV2IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0bG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0bG9mZl90IGhlYWRlcl9vZmZzZXQgPSBkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldDtcbiYjNDM7XHRsb2ZmX3Qgb2Zmc2V0O1xuJiM0MztcbiYjNDM7XHRpZiAocG9zIFx1MDAzYyBoZWFkZXJfb2Zmc2V0KVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRvZmZzZXQgPSBwb3MgLSBoZWFkZXJfb2Zmc2V0O1xuJiM0MztcdHJldHVybiBvZmZzZXQgXHUwMDNjIFBBR0VfU0laRSBcdTAwMjZcdTAwMjYgY291bnQgXHUwMDNjPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgc25hcHNob3Rfc3dhcF93cml0ZV9idWRnZXQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaW1hZ2VfYnl0ZXMgPSByb3VuZF91cChkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQsIFBBR0VfU0laRSk7XG4mIzQzO1x0dTY0IG1hcF9ieXRlcyA9IHN3c3VzcF9zd2FwX21hcF9ieXRlcyhkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQpO1xuJiM0MztcdHU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyAmIzQzOyBtYXBfYnl0ZXM7XG4mIzQzO1xuJiM0MztcdGlmIChpbWFnZV9ieXRlcyBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkIHx8IGJ1ZGdldCBcdTAwM2MgaW1hZ2VfYnl0ZXMpXG4mIzQzO1x0XHRyZXR1cm4gVTY0X01BWDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGJ1ZGdldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlXG4mIzQzO2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbiYjNDM7e1xuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4mIzQzO1x0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0MztcdGJvb2wgaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkO1xuJiM0MztcdHU2NCBzd2FwX2J1ZGdldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3VudCB8fCAhc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcbiYjNDM7XHRcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZzeXN0ZW1fdHJhbnNpdGlvbl9tdXRleCk7XG4mIzQzO1xuJiM0MztcdGlmICghc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcbiYjNDM7XHRpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgPSBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoZGF0YS1cdTAwM2Vzd2FwLCBwb3MsIGNvdW50KTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0c3dhcF9idWRnZXQgPSBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChkYXRhKTtcbiYjNDM7XHRpZiAoc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKGRhdGEsIHBvcywgY291bnQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2M9IFBBR0VfU0laRSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgUEFHRV9TSVpFIC0gZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXHUwMDNlPSBjb3VudCkge1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgJiM0Mzs9IGNvdW50O1xuJiM0MztcdFx0dHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVI7XG4mIzQzO1x0fSBlbHNlIGlmIChpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICBzd2FwX2J1ZGdldCBcdTAwM2U9IGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgIHN3YXBfYnVkZ2V0IC0gZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkIFx1MDAzZT0gY291bnQpIHtcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCAmIzQzOz0gY291bnQ7XG4mIzQzO1x0XHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFO1xuJiM0MztcdH1cbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHlwZTtcbiYjNDM7XG4mIzQzO3VubG9jazpcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuJiM0MztcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbiYjNDM7I2Vsc2VcbiYjNDM7XHRyZXR1cm4gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbiYjNDM7XHRcdFx0XHQgIHNpemVfdCByZXNlcnZlZCwgc3NpemVfdCB3cml0dGVuKVxuJiM0Mzt7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcdTAwMjZzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7XHR1NjQgKnJlc2VydmVkX3RvdGFsO1xuJiM0MztcdHNpemVfdCB1bnVzZWQ7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghcmVzZXJ2ZWQpXG4mIzQzO1x0XHRnb3RvIHVubG9jaztcbiYjNDM7XG4mIzQzO1x0aWYgKHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUilcbiYjNDM7XHRcdHVudXNlZCA9IHJlc2VydmVkO1xuJiM0MztcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjPSAwKVxuJiM0MztcdFx0dW51c2VkID0gcmVzZXJ2ZWQ7XG4mIzQzO1x0ZWxzZSBpZiAod3JpdHRlbiBcdTAwM2MgcmVzZXJ2ZWQpXG4mIzQzO1x0XHR1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1xuJiM0MztcdHJlc2VydmVkX3RvdGFsID0gdHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSID9cbiYjNDM7XHRcdFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkIDogXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkO1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHQqcmVzZXJ2ZWRfdG90YWwgLT0gbWluX3QodTY0LCAqcmVzZXJ2ZWRfdG90YWwsIHVudXNlZCk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XG4mIzQzO3VubG9jazpcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuJiM0MzsjZW5kaWZcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNlY3VyaXR5X2xvY2tlZF9kb3duKExPQ0tET1dOX0hJQkVSTkFUSU9OKTtcbiYjNDM7XHRyZXR1cm4gZGF0YS1cdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiB7XG4gXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTtcbiBcdHVuc2lnbmVkIGludCBzbGVlcF9mbGFncztcbiBcdGludCBlcnJvcjtcbiBcbi1cdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXG4mIzQzO1x0aWYgKCFoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKCkpXG4gXHRcdHJldHVybiAtRVBFUk07XG4gXG4gXHRzbGVlcF9mbGFncyA9IGxvY2tfc3lzdGVtX3NsZWVwKCk7XG4gXG4gXHRpZiAoIWhpYmVybmF0ZV9hY3F1aXJlKCkpIHtcbiBcdFx0ZXJyb3IgPSAtRUJVU1k7XG4tXHRcdGdvdG8gVW5sb2NrO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4gXHR9XG4gXG4gXHRpZiAoKGZpbHAtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JEV1IpIHtcbiBcdFx0aGliZXJuYXRlX3JlbGVhc2UoKTtcbiBcdFx0ZXJyb3IgPSAtRU5PU1lTO1xuLVx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFx0bm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7XG4gXHRkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4gXHRmaWxwLVx1MDAzZXByaXZhdGVfZGF0YSA9IGRhdGE7XG4gXHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3Bpbl9sb2NrX2luaXQoXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW93bmVyX3RnaWQgPSBOVUxMO1xuJiM0MzsjZW5kaWZcbiBcdGlmICgoZmlscC1cdTAwM2VmX2ZsYWdzIFx1MDAyNiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSB7XG4gXHRcdC8qIEhpYmVybmF0aW5nLiAgVGhlIGltYWdlIGRldmljZSBzaG91bGQgYmUgYWNjZXNzaWJsZS4gKi9cbiBcdFx0ZGF0YS1cdTAwM2Vzd2FwID0gcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShzd3N1c3BfcmVzdW1lX2RldmljZSwgMCk7XG5AQCAtOTksOCAmIzQzOzIzMCwxMyBAQCBzdGF0aWMgaW50IHNuYXBzaG90X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4gXHRkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQgPSBmYWxzZTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQgPSBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpO1xuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztcdGlmICghZXJyb3IpXG4mIzQzO1x0XHRkYXRhLVx1MDAzZW93bmVyX3RnaWQgPSBnZXRfdGFza19waWQoY3VycmVudCwgUElEVFlQRV9UR0lEKTtcbiYjNDM7I2VuZGlmXG4gXG4tIFVubG9jazpcbiYjNDM7IHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIGVycm9yO1xuQEAgLTExNiw2ICYjNDM7MjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdHN3c3VzcF9mcmVlKCk7XG4gXHRkYXRhID0gZmlscC1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXHRkYXRhLVx1MDAzZWRldiA9IDA7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0cHV0X3BpZChkYXRhLVx1MDAzZW93bmVyX3RnaWQpO1xuJiM0MztcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XG4mIzQzOyNlbmRpZlxuIFx0ZnJlZV9hbGxfc3dhcF9wYWdlcyhkYXRhLVx1MDAzZXN3YXApO1xuIFx0dW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRhdGEtXHUwMDNlc3dhcCk7XG4gXHRpZiAoZGF0YS1cdTAwM2Vmcm96ZW4pIHtcbkBAIC0xMjUsNiAmIzQzOzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VmcmVlX2JpdG1hcHMpIHtcbiBcdFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xuIFx0fVxuJiM0MztcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRwbV9ub3RpZmllcl9jYWxsX2NoYWluKGRhdGEtXHUwMDNlbW9kZSA9PSBPX1JET05MWSA/XG4gXHRcdFx0UE1fUE9TVF9ISUJFUk5BVElPTiA6IFBNX1BPU1RfUkVTVE9SRSk7XG4gXHRoaWJlcm5hdGVfcmVsZWFzZSgpO1xuQEAgLTE0NywxMiAmIzQzOzI4OCwyMyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxuIFx0ZGF0YSA9IGZpbHAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0aWYgKCFkYXRhLVx1MDAzZXJlYWR5KSB7XG4gXHRcdHJlcyA9IC1FTk9EQVRBO1xuLVx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0cmVzID0gLUVQRVJNO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuJiM0MztcbiBcdGlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqL1xuIFx0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbi1cdFx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdFx0Z290byB1bmxvY2s7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xuIFx0fVxuQEAgLTE2Miw3ICYjNDM7MzE0LDcgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZixcbiBcdGlmIChyZXMgXHUwMDNlIDApXG4gXHRcdCpvZmZwICYjNDM7PSByZXM7XG4gXG4tIFVubG9jazpcbiYjNDM7IHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIHJlcztcbkBAIC0xODUsNiAmIzQzOzMzNywxNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbiBcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0cmVzID0gLUVQRVJNO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7XG4mIzQzO1x0XHRnb3RvIHVubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKCFwZ19vZmZwKSB7XG4gXHRcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbkBAIC0yNTIsNiAmIzQzOzQxNSw5IEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfc2V0X3N3YXBfYXJlYShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiBcdGlmIChkYXRhLVx1MDAzZXN3YXAgXHUwMDNjIDApXG4gXHRcdHJldHVybiBzd2RldiA/IC1FTk9ERVYgOiAtRUlOVkFMO1xuIFx0ZGF0YS1cdTAwM2VkZXYgPSBzd2RldjtcbiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbiYjNDM7XHRkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuJiM0MzsjZW5kaWZcbiBcdHJldHVybiAwO1xuIH1cbiBcbkBAIC0zMTgsNiAmIzQzOzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4gXHRcdHBtX3Jlc3RvcmVfZ2ZwX21hc2soKTtcbiBcdFx0ZXJyb3IgPSBoaWJlcm5hdGlvbl9zbmFwc2hvdChkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpO1xuIFx0XHRpZiAoIWVycm9yKSB7XG5AQCAtMzI4LDYgJiM0Mzs0OTksMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGJyZWFrO1xuIFxuIFx0Y2FzZSBTTkFQU0hPVF9BVE9NSUNfUkVTVE9SRTpcbiYjNDM7XHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbiYjNDM7XHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcbiYjNDM7XHRcdFx0aWYgKGVycm9yKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcbiBcdFx0ZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShcdTAwMjZkYXRhLVx1MDAzZWhhbmRsZSk7XG4gXHRcdGlmIChlcnJvcilcbiBcdFx0XHRicmVhaztcbkBAIC0zNDYsNiAmIzQzOzUyOCw3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRzd3N1c3BfZnJlZSgpO1xuIFx0XHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4gXHRcdGRhdGEtXHUwMDNlcmVhZHkgPSBmYWxzZTtcbiYjNDM7XHRcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRcdC8qXG4gXHRcdCAqIEl0IGlzIG5lY2Vzc2FyeSB0byB0aGF3IGtlcm5lbCB0aHJlYWRzIGhlcmUsIGJlY2F1c2VcbiBcdFx0ICogU05BUFNIT1RfQ1JFQVRFX0lNQUdFIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5IGFmdGVyXG5AQCAtMzY4LDYgJiM0Mzs1NTEsOCBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0fVxuIFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2ltYWdlX3NpemUoKTtcbiBcdFx0c2l6ZSBcdTAwM2NcdTAwM2M9IFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxuJiM0MztcdFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xuIFx0XHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcbiBcdFx0YnJlYWs7XG4gXG5AQCAtMzk3LDYgJiM0Mzs1ODIsOSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0XHRmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtXHUwMDNlc3dhcCk7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0XHRzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKGRhdGEpO1xuJiM0MzsjZW5kaWZcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIFNOQVBTSE9UX1MyUkFNOlxuQEAgLTQwNCw2ICYjNDM7NTkyLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRcdGVycm9yID0gLUVQRVJNO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRcdGVycm9yID0gLUVQRVJNO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiBcdFx0LypcbiBcdFx0ICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGhcbiBcdFx0ICogUE1fSElCRVJOQVRJT05fUFJFUEFSRVxuQEAgLTQxNyw2ICYjNDM7NjEwLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfUE9XRVJfT0ZGOlxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4gXHRcdGlmIChkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpXG4gXHRcdFx0ZXJyb3IgPSBoaWJlcm5hdGlvbl9wbGF0Zm9ybV9lbnRlcigpO1xuIFx0XHRicmVhaztcbkBAIC00MjUsNiAmIzQzOzYyMywxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0ZXJyb3IgPSBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4gXHRcdGJyZWFrO1xuIFxuJiM0MztcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4mIzQzO1x0XHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZKVxuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdGNhc2UgU05BUFNIT1RfU0VUX1VTRVJfS0VZOlxuJiM0MztcdFx0ZXJyb3IgPSBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoZGF0YSwgKHZvaWQgX191c2VyICopYXJnKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiBcdGRlZmF1bHQ6XG4gXHRcdGVycm9yID0gLUVOT1RUWTtcbiBcbkBAIC00NDgsNiAmIzQzOzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRjYXNlIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRTpcbiBcdGNhc2UgU05BUFNIT1RfQ1JFQVRFX0lNQUdFOlxuIFx0Y2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOlxuJiM0MztcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4mIzQzO1x0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XG4gXHRcdHJldHVybiBzbmFwc2hvdF9pb2N0bChmaWxlLCBjbWQsXG4gXHRcdFx0XHQgICAgICAodW5zaWduZWQgbG9uZykgY29tcGF0X3B0cihhcmcpKTtcbiBcdGRlZmF1bHQ6XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuaCBiL2tlcm5lbC9wb3dlci91c2VyLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40ZGYyZjlhZTlhZGE0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvdXNlci5oXG5AQCAtMCwwICYjNDM7MSwxNTEgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyeXB0by5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjYXR0ZXJsaXN0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3BpbmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdXNwZW5kX2lvY3Rscy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL2Flcy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcGlkO1xuJiM0MztcbiYjNDM7I2RlZmluZSBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIEFFU19LRVlTSVpFXzEyOFxuJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTZcbiYjNDM7XG4mIzQzOy8qIERlZmluZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIGEgc2luZ2xlIEFFQUQgZW5jcnlwdGlvbiBjaHVuay4gKi9cbiYjNDM7I2RlZmluZSBDSFVOS19TSVpFIDE2XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgc25hcHNob3RfZGF0YSB7XG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4mIzQzO1x0aW50IHN3YXA7XG4mIzQzO1x0aW50IG1vZGU7XG4mIzQzO1x0Ym9vbCBmcm96ZW47XG4mIzQzO1x0Ym9vbCByZWFkeTtcbiYjNDM7XHRib29sIHBsYXRmb3JtX3N1cHBvcnQ7XG4mIzQzO1x0Ym9vbCBmcmVlX2JpdG1hcHM7XG4mIzQzO1x0Ym9vbCBlbmNyeXB0aW9uX3JlcXVpcmVkO1xuJiM0MztcdGRldl90IGRldjtcbiYjNDM7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTtcbiYjNDM7XHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcTtcbiYjNDM7XHR2b2lkICpjcnlwdF9wYWdlc1tDSFVOS19TSVpFXTtcbiYjNDM7XHR1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTtcbiYjNDM7XHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQ0hVTktfU0laRSAmIzQzOyAyXTsgLyogQWRkIHJvb20gZm9yIEFEIGFuZCBhdXRoIHRhZy4gKi9cbiYjNDM7XHRzaXplX3QgY3J5cHRfb2Zmc2V0O1xuJiM0MztcdHNpemVfdCBjcnlwdF9zaXplO1xuJiM0MztcdHU2NCBjcnlwdF90b3RhbDtcbiYjNDM7XHR1NjQgY3J5cHRfc3RyZWFtX3RvdGFsO1xuJiM0MztcdHU2NCBub25jZV9sb3c7XG4mIzQzO1x0dTY0IG5vbmNlX2hpZ2g7XG4mIzQzO1x0dTggZW5jcnlwdGlvbl9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0dTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRib29sIHVzZXJfa2V5X3ZhbGlkO1xuJiM0MztcdHU2NCBtZXRhX3NpemU7XG4mIzQzO1x0dTY0IGNyeXB0X21ldGFfc2l6ZTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByb3RlY3RzIGNyeXB0X2J5dGVzX3JlYWQgYW5kIHRoZSByZXNlcnZhdGlvbiBjb3VudGVycyBiZWxvdy5cbiYjNDM7XHQgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZVxuJiM0MztcdCAqIGdlbmVyYXRlZCBzd2FwLW1hcCBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzcGlubG9ja190IGNyeXB0X2xvY2s7XG4mIzQzO1x0dTY0IGNyeXB0X2J5dGVzX3JlYWQ7XG4mIzQzO1x0dTY0IGNyeXB0X3N3YXBfcmVzZXJ2ZWQ7XG4mIzQzO1x0dTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDtcbiYjNDM7XHRsb2ZmX3Qgc3dhcF9oZWFkZXJfb2Zmc2V0O1xuJiM0MztcdHN0cnVjdCBwaWQgKm93bmVyX3RnaWQ7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2V4dGVybiBzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7XG4mIzQzOy8qIGtlcm5lbC9wb3dlci9zbmFwZW5jLmMgcm91dGluZXMgKi9cbiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbiYjNDM7XG4mIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0Y2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApO1xuJiM0MztcbiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcbiYjNDM7XHRcdFx0XHQgbG9mZl90ICpvZmZwKTtcbiYjNDM7XG4mIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7XG4mIzQzO2ludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpO1xuJiM0MztcbiYjNDM7aW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XG4mIzQzO1xuJiM0MztpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpO1xuJiM0MztcbiYjNDM7bG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCBsb2ZmX3QgcmF3X3NpemUpO1xuJiM0MztcbiYjNDM7aW50IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRhdGEtXHUwMDNlYWVhZF90Zm07XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbHNlXG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHNzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FTk9UVFk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKSB7fVxuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICAgbG9mZl90IHJhd19zaXplKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJhd19zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcbmluZGV4IDc4YjQ5YjA2NThhZGQuLjExZGYwYzU1NmY0ZTkgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwZmlsZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwZmlsZS5jXG5AQCAtMjM2Niw2ICYjNDM7MjM2NiwzOCBAQCBzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCB0eXBlLCBwZ29mZl90IG9mZnNldClcbiBcdHJldHVybiBzZS1cdTAwM2VzdGFydF9ibG9jayAmIzQzOyAob2Zmc2V0IC0gc2UtXHUwMDNlc3RhcnRfcGFnZSk7XG4gfVxuIFxuJiM0MztpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQsXG4mIzQzO1x0XHRcdCAgICBwZ29mZl90ICpucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2V4dGVudCAqc2U7XG4mIzQzO1x0c3RydWN0IHJiX25vZGUgKnJiO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNpIHx8ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiYjNDM7XHRcdHJldHVybiAtRU5PREVWO1xuJiM0MztcbiYjNDM7XHRmb3IgKHJiID0gcmJfZmlyc3QoXHUwMDI2c2ktXHUwMDNlc3dhcF9leHRlbnRfcm9vdCk7IHJiOyByYiA9IHJiX25leHQocmIpKSB7XG4mIzQzO1x0XHRzZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIHJiX25vZGUpO1xuJiM0MztcdFx0aWYgKGJsb2NrIFx1MDAzZT0gc2UtXHUwMDNlc3RhcnRfYmxvY2sgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jayBcdTAwM2Mgc2UtXHUwMDNlbnJfcGFnZXMpIHtcbiYjNDM7XHRcdFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jaztcbiYjNDM7XG4mIzQzO1x0XHRcdCpvZmZzZXQgPSBzZS1cdTAwM2VzdGFydF9wYWdlICYjNDM7IHBhZ2U7XG4mIzQzO1x0XHRcdCpucl9wYWdlcyA9IHNlLVx1MDAzZW5yX3BhZ2VzIC0gcGFnZTtcbiYjNDM7XHRcdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxuJiM0Mzt7XG4mIzQzO1x0cGdvZmZfdCBucl9wYWdlcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KHR5cGUsIGJsb2NrLCBvZmZzZXQsIFx1MDAyNm5yX3BhZ2VzKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIFJldHVybiBlaXRoZXIgdGhlIHRvdGFsIG51bWJlciBvZiBzd2FwIHBhZ2VzIG9mIGdpdmVuIHR5cGUsIG9yIHRoZSBudW1iZXJcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFTkNSWVBURURfSElCRVJOQVRJT04mIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT05fU05BUFNIT1RfREVWJiMzNDssCiAgICAmIzM0O0hJQkVSTkFUSU9OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfc2V0X3VzZXJfa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3JlYWRfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3dyaXRlX2VuY3J5cHRlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2UmIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luJiMzNDssCiAgICAmIzM0O2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQmIzM0OywKICAgICYjMzQ7c3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkJiMzNDssCiAgICAmIzM0O3N3YXBkZXZfYmxvY2tfdG9fZXh0ZW50JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGEwM2MwMjBlN2EyYzJmZmYyZWEyYjRkMzgwODdjMDg0ZDY2NDU3YWEKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyA0IDEyOjEyOjU0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKaW5kZXggZDM4ZGEwNzc5MDVhOS4uNTdmNjA2M2VmODhjOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCkBAIC00NzAsMyAmIzQzOzQ3MCwxNyBAQCBEZXNjcmlwdGlvbjoKIAogICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDEKICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAzCiYjNDM7CiYjNDM7V2hhdDoJCS9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZAomIzQzO0RhdGU6CQlKdWx5IDIwMjYKJiM0MztDb250YWN0OglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKJiM0MztEZXNjcmlwdGlvbjoKJiM0MzsJCVdyaXRlLW9ubHkgZmlsZSBwcmVzZW50IHdoZW4gQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTj15LgomIzQzOwomIzQzOwkJVHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2Ugd3JpdGVzIGEgMzItYnl0ZSBzZWVkLCBlbmNvZGVkIGFzCiYjNDM7CQk2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlCiYjNDM7CQllbmFibGluZyBlbmNyeXB0ZWQgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4KJiM0MzsKJiM0MzsJCVRoZSBmaXJzdCBzdWNjZXNzZnVsIHdyaXRlIGxvY2tzIHRoZSBzZWVkIHVudGlsIHRoZSBuZXh0IGJvb3QuCiYjNDM7CQlXcml0aW5nIHRoZSBzYW1lIHNlZWQgYWdhaW4gc3VjY2VlZHMuIFdyaXRpbmcgYSBkaWZmZXJlbnQgc2VlZAomIzQzOwkJZmFpbHMgd2l0aCBFUEVSTS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdAppbmRleCAxY2Y2MmQ4MGE5Y2ExLi5kZjhlY2E5ZTZlMzYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0CkBAIC0xMTUsNiAmIzQzOzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTQogCXRvIHJlc3VtZSB0aGUgc3lzdGVtIGZyb20gUkFNIGlmIHRoZXJlJiMzOTtzIGVub3VnaCBiYXR0ZXJ5IHBvd2VyIG9yIHJlc3RvcmUKIAlpdHMgc3RhdGUgb24gdGhlIGJhc2lzIG9mIHRoZSBzYXZlZCBzdXNwZW5kIGltYWdlIG90aGVyd2lzZSkKIAomIzQzO1NOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OCiYjNDM7CUVuYWJsZXMgZW5jcnlwdGlvbiBvZiB0aGUgaGliZXJuYXRlIGltYWdlIHdpdGhpbiB0aGUga2VybmVsLiBUcnVzdGVkCiYjNDM7CWVhcmx5IHVzZXJzcGFjZSBtdXN0IHdyaXRlIHRoZSAzMi1ieXRlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCB0bwomIzQzOwkvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBpb2N0bC4gVXBvbiBzdXNwZW5kCiYjNDM7CShpZSB3aGVuIHRoZSBzbmFwc2hvdCBkZXZpY2Ugd2FzIG9wZW5lZCBmb3IgcmVhZGluZyksIHRoaXMgaW9jdGwgcmV0dXJucwomIzQzOwlhbiBvcGFxdWUgd3JhcHBlZCBrZXkgYmxvYiBhbmQgdGhlIHN0YXJ0aW5nIG5vbmNlLiBVcG9uIHJlc3VtZSAoaWUgd2hlbgomIzQzOwl0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcpLCB0aGlzIGlvY3RsIHJlY2VpdmVzIHRoZQomIzQzOwlzYW1lIGJsb2IgYW5kIG5vbmNlIGZyb20gdXNlcm1vZGUgYWZ0ZXIgdGhlIHNhbWUgc2VlZCBoYXMgYmVlbiB3cml0dGVuCiYjNDM7CXRvIC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZC4gVGhlIHBsYWludGV4dCBpbWFnZSBrZXkgaXMgZ2VuZXJhdGVkIGFuZAomIzQzOwl1bndyYXBwZWQgaW5zaWRlIHRoZSBrZXJuZWwuCiYjNDM7CiYjNDM7U05BUFNIT1RfU0VUX1VTRVJfS0VZCiYjNDM7CU1peGVzIGFkZGl0aW9uYWwgdXNlciBrZXkgbWF0ZXJpYWwgaW50byB0aGUgZGF0YSBwb3J0aW9uIG9mIGFuIGVuY3J5cHRlZAomIzQzOwloaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuCiYjNDM7CWtleV9sZW4gbXVzdCBiZSBiZXR3ZWVuIDggYW5kIFVTV1NVU1BfVVNFUl9LRVlfU0laRSBieXRlcywgYW5kIHJlc2VydmVkCiYjNDM7CW11c3QgYmUgemVyby4gRHVyaW5nIGhpYmVybmF0aW9uIHRoZSBrZXJuZWwgd3JpdGVzIG1ldGFfc2l6ZSB3aXRoIHRoZQomIzQzOwllbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWQKJiM0MzsJbWV0YV9zaXplIGJhY2sgc28gdGhlIGtlcm5lbCBjYW4gc3dpdGNoIGtleXMgYXQgdGhlIG1ldGFkYXRhIGJvdW5kYXJ5CiYjNDM7CWJlZm9yZSB0aGUgc25hcHNob3QgaGVhZGVyIGhhcyBiZWVuIGRlY3J5cHRlZC4KJiM0MzsKIFRoZSBkZXZpY2UmIzM5O3MgcmVhZCgpIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbQogdGhlIGtlcm5lbC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgogCmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5kZXggMTU3ODNhNjE4MGRlYy4uZWZlYjQ4NWU5MWU2YyAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNzIzLDQzICYjNDM7NzIzLDY1IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0mZ3Q7a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldl9maWxlX2lub2RlKGZpbGUpOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpOwomIzQzOwlkZXZfdCBkZXYgPSBiZF9pbm9kZS0mZ3Q7aV9yZGV2OwogCWJvb2wgYXRvbWljID0gaW9jYi0mZ3Q7a2lfZmxhZ3MgJmFtcDsgSU9DQl9BVE9NSUM7CiAJbG9mZl90IHNpemUgPSBiZGV2X25yX2J5dGVzKGJkZXYpOwomIzQzOwllbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSBoaWJlcm5hdGVfd3JpdGU7CiYjNDM7CXNpemVfdCBoaWJlcm5hdGVfbGVuID0gMDsKIAlzaXplX3Qgc2hvcnRlZCA9IDA7CiYjNDM7CXNzaXplX3QgaGliZXJuYXRlX3dyaXR0ZW4gPSAwOwogCXNzaXplX3QgcmV0OwogCiAJaWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSAmYW1wOyZhbXA7ICFpc19oaWJlcm5hdGVfcmVzdW1lX2RldihiZF9pbm9kZS0mZ3Q7aV9yZGV2KSkKLQkJcmV0dXJuIC1FVFhUQlNZOwomIzQzOwlpZiAoSVNfU1dBUEZJTEUoYmRfaW5vZGUpICZhbXA7JmFtcDsgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldikpIHsKJiM0MzsJCWlmICghaXNfc3luY19raW9jYihpb2NiKSB8fCAhaW9jYl9pc19kc3luYyhpb2NiKSB8fAomIzQzOwkJICAgIChpb2NiLSZndDtraV9mbGFncyAmYW1wOyBJT0NCX0RJUkVDVCkpCiYjNDM7CQkJcmV0dXJuIC1FVFhUQlNZOwogCi0JaWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkKLQkJcmV0dXJuIDA7CiYjNDM7CQloaWJlcm5hdGVfbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiYjNDM7CQloaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLSZndDtraV9wb3MsIGhpYmVybmF0ZV9sZW4pOwomIzQzOwkJaWYgKGhpYmVybmF0ZV93cml0ZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSkKJiM0MzsJCQlyZXR1cm4gLUVUWFRCU1k7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQloaWJlcm5hdGVfd3JpdGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTsKJiM0MzsJfQogCi0JaWYgKGlvY2ItJmd0O2tpX3BvcyAmZ3Q7PSBzaXplKQotCQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsJaWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkgewomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKJiM0MzsJfQogCi0JaWYgKChpb2NiLSZndDtraV9mbGFncyAmYW1wOyAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CWlmIChpb2NiLSZndDtraV9wb3MgJmd0Oz0gc2l6ZSkgewomIzQzOwkJcmV0ID0gLUVOT1NQQzsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoKGlvY2ItJmd0O2tpX2ZsYWdzICZhbXA7IChJT0NCX05PV0FJVCB8IElPQ0JfRElSRUNUKSkgPT0gSU9DQl9OT1dBSVQpIHsKJiM0MzsJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJZ290byBvdXRfaGliZXJuYXRlOwomIzQzOwl9CiAKIAlpZiAoYXRvbWljKSB7CiAJCXJldCA9IGdlbmVyaWNfYXRvbWljX3dyaXRlX3ZhbGlkKGlvY2IsIGZyb20pOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKJiM0MzsJCQlnb3RvIG91dF9oaWJlcm5hdGU7CiAJfQogCiAJc2l6ZSAtPSBpb2NiLSZndDtraV9wb3M7CiAJaWYgKGlvdl9pdGVyX2NvdW50KGZyb20pICZndDsgc2l6ZSkgewotCQlpZiAoYXRvbWljKQotCQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoYXRvbWljKSB7CiYjNDM7CQkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dF9oaWJlcm5hdGU7CiYjNDM7CQl9CiAJCXNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7CiAJCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpOwogCX0KIAogCXJldCA9IGZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKIAogCWlmIChpb2NiLSZndDtraV9mbGFncyAmYW1wOyBJT0NCX0RJUkVDVCkgewogCQlyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pOwpAQCAtNzc3LDkgJiM0Mzs3OTksMTYgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiAJCWlub2RlX3VubG9ja19zaGFyZWQoYmRfaW5vZGUpOwogCX0KIAotCWlmIChyZXQgJmd0OyAwKQomIzQzOwlpZiAocmV0ICZndDsgMCkgewomIzQzOwkJaGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7CiAJCXJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpOwomIzQzOwl9CiAJaW92X2l0ZXJfcmVleHBhbmQoZnJvbSwgaW92X2l0ZXJfY291bnQoZnJvbSkgJiM0Mzsgc2hvcnRlZCk7CiYjNDM7CiYjNDM7b3V0X2hpYmVybmF0ZToKJiM0MzsJaWYgKGhpYmVybmF0ZV9sZW4pCiYjNDM7CQloaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGhpYmVybmF0ZV93cml0ZSwgaGliZXJuYXRlX2xlbiwKJiM0MzsJCQkJCSAgICAgaGliZXJuYXRlX3dyaXR0ZW4pOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKaW5kZXggYjAyODc2ZjFhZTM4YS4uODMwOGE2NTgzNzU2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKQEAgLTQyNiwxMCAmIzQzOzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAKIGludCBhcmNoX3Jlc3VtZV9ub3NtdCh2b2lkKTsKIAomIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHsKJiM0MzsJSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUsCiYjNDM7CUhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9JTUFHRSwKJiM0MzsJSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUiwKJiM0Mzt9OwomIzQzOwogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYKIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpOwomIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlCiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTsKJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KSB7IHJldHVybiAwOyB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZQomIzQzO2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJCQlzaXplX3QgcmVzZXJ2ZWQsCiYjNDM7CQkJCQkJc3NpemVfdCB3cml0dGVuKQomIzQzO3sKJiM0Mzt9CiAjZW5kaWYKIAogLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDhmMGY2OGUyNDViYWEuLmIzNjY4NWQxZjMxNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC00MzksNiAmIzQzOzQzOSw5IEBAIGV4dGVybiBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpOwogaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQsIGludCk7CiBleHRlcm4gc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQsIHBnb2ZmX3QpOwomIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCk7CiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LAomIzQzOwkJCSAgICBwZ29mZl90ICpucl9wYWdlcyk7CiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7CiBleHRlcm4gYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSk7CiBleHRlcm4gaW50IHN3cF9zd2FwY291bnQoc3dwX2VudHJ5X3QgZW50cnkpOwpAQCAtNTM1LDYgJiM0Mzs1MzgsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgYWRkX3N3YXBfZXh0ZW50KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLAomIzQzOwkJCQkJICBwZ29mZl90ICpvZmZzZXQpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLAomIzQzOwkJCQkJICBwZ29mZl90ICpvZmZzZXQsCiYjNDM7CQkJCQkgIHBnb2ZmX3QgKm5yX3BhZ2VzKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FSU5WQUw7CiYjNDM7fQogI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAjaWZkZWYgQ09ORklHX01FTUNHCiBzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaAppbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaApAQCAtMTMsNiAmIzQzOzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHsKIAlfX3UzMiBkZXY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiYjNDM7I2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2CiYjNDM7I2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzIKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlCiYjNDM7ICogZW5jcnlwdGlvbiBrZXkgYW5kIHN0YXJ0aW5nIG5vbmNlIGluIGVpdGhlciBkaXJlY3Rpb24uCiYjNDM7ICovCiYjNDM7c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgewomIzQzOwlfX3UzMiBibG9iX2xlbjsKJiM0MzsJX191OCBibG9iWzUxMl07CiYjNDM7CV9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nOwomIzQzO30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBbGxvdyB1c2VyIG1vZGUgdG8gZm9sZCBpbiBrZXkgbWF0ZXJpYWwgZm9yIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGhpYmVybmF0ZQomIzQzOyAqIGltYWdlLgomIzQzOyAqLwomIzQzO3N0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHsKJiM0MzsJLyogS2VybmVsIHJldHVybnMgdGhlIG1ldGFkYXRhIHNpemU7IHJlc3VtZSBwYXNzZXMgdGhlIHNhdmVkIHZhbHVlIGluLiAqLwomIzQzOwlfX3U2NCBtZXRhX3NpemU7CiYjNDM7CV9fdTMyIGtleV9sZW47CiYjNDM7CV9fdTMyIHJlc2VydmVkOwomIzQzOwlfX3U4IGtleVtVU1dTVVNQX1VTRVJfS0VZX1NJWkVdIF9fa2VybmVsX25vbnN0cmluZzsKJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwomIzQzOwogI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUMJJiMzOTszJiMzOTsKICNkZWZpbmUgU05BUFNIT1RfRlJFRVpFCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSkKICNkZWZpbmUgU05BUFNIT1RfVU5GUkVFWkUJCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDIpCkBAIC0yOSw2ICYjNDM7NTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEgewogI2RlZmluZSBTTkFQU0hPVF9QUkVGX0lNQUdFX1NJWkUJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMTgpCiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRQlfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMTksIF9fa2VybmVsX2xvZmZfdCkKICNkZWZpbmUgU05BUFNIT1RfQUxMT0NfU1dBUF9QQUdFCV9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KQotI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlIJMjAKJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OCV9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFwKJiM0MzsJCQkJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IpCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVkJCV9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFwKJiM0MzsJCQkJCQkJc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlIJMjIKIAogI2VuZGlmIC8qIF9MSU5VWF9TVVNQRU5EX0lPQ1RMU19IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDUzMGM4OTczMTFkNDQuLmE5YmVlNzE1NzFjZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xMTUsNiAmIzQzOzExNSwyMSBAQCBjb25maWcgSElCRVJOQVRJT05fREVGX0NPTVAKIAloZWxwCiAJICBEZWZhdWx0IGNvbXByZXNzb3IgdG8gYmUgdXNlZCBmb3IgaGliZXJuYXRpb24uCiAKJiM0Mztjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OCiYjNDM7CWJvb2wgJiMzNDtFbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBzbmFwc2hvdHMmIzM0OwomIzQzOwlkZXBlbmRzIG9uIEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVgomIzQzOwlzZWxlY3QgQ1JZUFRPX0FFUwomIzQzOwlzZWxlY3QgQ1JZUFRPX0dDTQomIzQzOwlzZWxlY3QgQ1JZUFRPX0xJQl9TSEEyNTYKJiM0MzsJaGVscAomIzQzOwkgIEVuYWJsZSBzdXBwb3J0IGZvciBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBvZiBoaWJlcm5hdGlvbiBzbmFwc2hvdHMKJiM0MzsJICBjcmVhdGVkIGJ5IHVzd3N1c3AgdG9vbHMuIEEgdHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2UgY29tcG9uZW50IG11c3QKJiM0MzsJICBwcm92aWRlIHRoZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgYmVmb3JlIGVuYWJsaW5nIGVuY3J5cHRpb24uCiYjNDM7CiYjNDM7CSAgU2F5IE4gaWYgdXNlcnNwYWNlIGhhbmRsZXMgdGhlIGltYWdlIGVuY3J5cHRpb24uCiYjNDM7CiYjNDM7CSAgSWYgaW4gZG91YnQsIHNheSBOLgomIzQzOwogY29uZmlnIFBNX1NURF9QQVJUSVRJT04KIAlzdHJpbmcgJiMzNDtEZWZhdWx0IHJlc3VtZSBwYXJ0aXRpb24mIzM0OwogCWRlcGVuZHMgb24gSElCRVJOQVRJT04KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZSBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQppbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORCkJCSYjNDM7PSBzdXNwZW5kLm8KIG9iai0kKENPTkZJR19QTV9URVNUX1NVU1BFTkQpCSYjNDM7PSBzdXNwZW5kX3Rlc3Qubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkmIzQzOz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm8KIG9iai0kKENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYpICYjNDM7PSB1c2VyLm8KJiM0MztvYmotJChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKSAmIzQzOz0gc25hcGVuYy5vCiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKQkmIzQzOz0gYXV0b3NsZWVwLm8KIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpCSYjNDM7PSB3YWtlbG9jay5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0zNiw2ICYjNDM7MzYsNyBAQAogI2luY2x1ZGUgJmx0O3RyYWNlL2V2ZW50cy9wb3dlci5oJmd0OwogCiAjaW5jbHVkZSAmIzM0O3Bvd2VyLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dXNlci5oJiMzNDsKIAogCiBzdGF0aWMgaW50IG5vY29tcHJlc3M7CkBAIC0xMTMsNiAmIzQzOzExNCwxNCBAQCBib29sIGhpYmVybmF0aW9uX2F2YWlsYWJsZSh2b2lkKQogCQkhc2VjcmV0bWVtX2FjdGl2ZSgpICZhbXA7JmFtcDsgIWN4bF9tZW1fYWN0aXZlKCk7CiB9CiAKJiM0Mztib29sIGhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBub2hpYmVybmF0ZSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJCSghc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pIHx8CiYjNDM7CQkgSVNfRU5BQkxFRChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKSkgJmFtcDsmYW1wOwomIzQzOwkJIXNlY3JldG1lbV9hY3RpdmUoKSAmYW1wOyZhbXA7ICFjeGxfbWVtX2FjdGl2ZSgpOwomIzQzO30KJiM0MzsKIC8qKgogICogaGliZXJuYXRpb25fc2V0X29wcyAtIFNldCB0aGUgZ2xvYmFsIGhpYmVybmF0ZSBvcGVyYXRpb25zLgogICogQG9wczogSGliZXJuYXRpb24gb3BlcmF0aW9ucyB0byB1c2UgaW4gc3Vic2VxdWVudCBoaWJlcm5hdGlvbiB0cmFuc2l0aW9ucy4KQEAgLTEzNzYsMTIgJiM0MzsxMzg1LDM1IEBAIHN0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiAKIHBvd2VyX2F0dHIocmVzZXJ2ZWRfc2l6ZSk7CiAKJiM0MzsjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTgomIzQzO3N0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3NlZWRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiYjNDM7CQkJCSAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKJiM0MzsJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pOwomIzQzOwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzbmFwc2hvdF9zZWVkX2F0dHIgPSB7CiYjNDM7CS5hdHRyCT0gewomIzQzOwkJLm5hbWUgPSAmIzM0O3NuYXBzaG90X3NlZWQmIzM0OywKJiM0MzsJCS5tb2RlID0gMDIwMCwKJiM0MzsJfSwKJiM0MzsJLnN0b3JlCT0gc25hcHNob3Rfc2VlZF9zdG9yZSwKJiM0Mzt9OwomIzQzOyNlbmRpZgomIzQzOwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmdbXSA9IHsKIAkmYW1wO2Rpc2tfYXR0ci5hdHRyLAogCSZhbXA7cmVzdW1lX29mZnNldF9hdHRyLmF0dHIsCiAJJmFtcDtyZXN1bWVfYXR0ci5hdHRyLAogCSZhbXA7aW1hZ2Vfc2l6ZV9hdHRyLmF0dHIsCiAJJmFtcDtyZXNlcnZlZF9zaXplX2F0dHIuYXR0ciwKJiM0MzsjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTgomIzQzOwkmYW1wO3NuYXBzaG90X3NlZWRfYXR0ci5hdHRyLAomIzQzOyNlbmRpZgogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcG93ZXIuaCBiL2tlcm5lbC9wb3dlci9wb3dlci5oCmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wb3dlci5oCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9wb3dlci5oCkBAIC0xNjAsNiAmIzQzOzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgewogCiBleHRlcm4gdW5zaWduZWQgaW50IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7CiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpOwogZXh0ZXJuIGludCBzbmFwc2hvdF9yZWFkX25leHQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTsKIGV4dGVybiBpbnQgc25hcHNob3Rfd3JpdGVfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpOwogaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7CkBAIC0xNjcsOCAmIzQzOzE2OCwxMSBAQCBleHRlcm4gaW50IHNuYXBzaG90X2ltYWdlX2xvYWRlZChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpOwogCiBleHRlcm4gYm9vbCBoaWJlcm5hdGVfYWNxdWlyZSh2b2lkKTsKIGV4dGVybiB2b2lkIGhpYmVybmF0ZV9yZWxlYXNlKHZvaWQpOwomIzQzO2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTsKIAogZXh0ZXJuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApOwomIzQzO2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpOwomIzQzO3U2NCBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXModTY0IGltYWdlX2J5dGVzKTsKIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXApOwogZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwZW5jLmMgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmNkMjk4MDNlYzZjNWEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jCkBAIC0wLDAgJiM0MzsxLDk0MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcnlwdG8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3J5cHRvL2FlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3J5cHRvL2djbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjcnlwdG8vc2hhMi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjcnlwdG8vdXRpbHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JhbmRvbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtwb3dlci5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3VzZXIuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBTTkFQU0hPVF9TRUVEX1NJWkUgU0hBMjU2X0RJR0VTVF9TSVpFCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OIDEKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgdTggc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWNbOF0gPSB7CiYjNDM7CSYjMzk7UyYjMzk7LCAmIzM5O1cmIzM5OywgJiMzOTtTJiMzOTssICYjMzk7VSYjMzk7LCAmIzM5O1MmIzM5OywgJiMzOTtQJiMzOTssICYjMzk7SyYjMzk7LCAmIzM5OzEmIzM5OywKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB7CiYjNDM7CXU4IG1hZ2ljW3NpemVvZihzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYyldOwomIzQzOwlfX2xlMzIgdmVyc2lvbjsKJiM0MzsJdTggd3JhcF9ub25jZVtHQ01fQUVTX0lWX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwl1OCBlbmNyeXB0ZWRfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwl1OCB0YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7fSBfX3BhY2tlZDsKJiM0MzsKJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKHNuYXBzaG90X3NlZWRfbXV0ZXgpOwomIzQzO3N0YXRpYyB1OCBzbmFwc2hvdF9zZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDsKJiM0MzsKJiM0MztpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJdTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlzaXplX3QgbGVuID0gY291bnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWlmIChsZW4gJmFtcDsmYW1wOyBidWZbbGVuIC0gMV0gPT0gJiMzOTtcbiYjMzk7KQomIzQzOwkJbGVuLS07CiYjNDM7CWlmIChsZW4gIT0gU05BUFNIT1RfU0VFRF9TSVpFICogMikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlyZXQgPSBoZXgyYmluKHNlZWQsIGJ1Ziwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtzbmFwc2hvdF9zZWVkX211dGV4KTsKJiM0MzsJaWYgKHNuYXBzaG90X3NlZWRfdmFsaWQpIHsKJiM0MzsJCXJldCA9IGNyeXB0b19tZW1uZXEoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKSA/IC1FUEVSTSA6IDA7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJc25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtQTTogaGliZXJuYXRlOiBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgbG9ja2VkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwltdXRleF91bmxvY2soJmFtcDtzbmFwc2hvdF9zZWVkX211dGV4KTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZCh1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0pCiYjNDM7ewomIzQzOwlib29sIHZhbGlkOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7c25hcHNob3Rfc2VlZF9tdXRleCk7CiYjNDM7CXZhbGlkID0gc25hcHNob3Rfc2VlZF92YWxpZDsKJiM0MzsJaWYgKHZhbGlkKQomIzQzOwkJbWVtY3B5KHNlZWQsIHNuYXBzaG90X3NlZWQsIFNOQVBTSE9UX1NFRURfU0laRSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3NuYXBzaG90X3NlZWRfbXV0ZXgpOwomIzQzOwomIzQzOwlyZXR1cm4gdmFsaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gJiMzNDtMaW51eCBoaWJlcm5hdGUgc25hcHNob3Qga2V5IHdyYXAgdjEmIzM0OzsKJiM0MzsJdTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07CiYjNDM7CXU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJc3RydWN0IHNoYTI1Nl9jdHggc2hhMjU2X2N0eDsKJiM0MzsKJiM0MzsJaWYgKCFzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZChzZWVkKSkKJiM0MzsJCXJldHVybiAtRU5PS0VZOwomIzQzOwomIzQzOwlzaGEyNTZfaW5pdCgmYW1wO3NoYTI1Nl9jdHgpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJc2hhMjU2X2ZpbmFsKCZhbXA7c2hhMjU2X2N0eCwgZGlnZXN0KTsKJiM0MzsKJiM0MzsJbWVtY3B5KGtleSwgZGlnZXN0LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgKndyYXBwZWQsCiYjNDM7CQkJCSAgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSwKJiM0MzsJCQkJICAgICAgYm9vbCBlbmNyeXB0KQomIzQzO3sKJiM0MzsJdTggd3JhcF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7CXU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbTsKJiM0MzsJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxOwomIzQzOwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiYjNDM7CURFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJcmMgPSBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHdyYXBfa2V5KTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJcmV0dXJuIHJjOwomIzQzOwomIzQzOwl0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZCgmIzM0O2djbShhZXMpJiMzNDssIDAsIDApOwomIzQzOwlpZiAoSVNfRVJSKHRmbSkpIHsKJiM0MzsJCXJjID0gUFRSX0VSUih0Zm0pOwomIzQzOwkJZ290byBvdXRfa2V5OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlnb3RvIG91dF90Zm07CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfdGZtOwomIzQzOwomIzQzOwlyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFyZXEpIHsKJiM0MzsJCXJjID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gb3V0X3RmbTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZW5jcnlwdCkgewomIzQzOwkJZ2V0X3JhbmRvbV9ieXRlcyh3cmFwcGVkLSZndDt3cmFwX25vbmNlLCBzaXplb2Yod3JhcHBlZC0mZ3Q7d3JhcF9ub25jZSkpOwomIzQzOwkJbWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW1lbWNweShidWYsIHdyYXBwZWQtJmd0O2VuY3J5cHRlZF9rZXksIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLSZndDt0YWcsCiYjNDM7CQkgICAgICAgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2dfaW5pdF9vbmUoJmFtcDtzZywgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CWFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsICZhbXA7d2FpdCk7CiYjNDM7CWFlYWRfcmVxdWVzdF9zZXRfYWQocmVxLCAwKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsICZhbXA7c2csICZhbXA7c2csCiYjNDM7CQkJICAgICAgIGVuY3J5cHQgPyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIDoKJiM0MzsJCQkJCSBzaXplb2YoYnVmKSwKJiM0MzsJCQkgICAgICAgd3JhcHBlZC0mZ3Q7d3JhcF9ub25jZSk7CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX3dhaXRfcmVxKGVuY3J5cHQgPyBjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOgomIzQzOwkJCQkgICAgICAgY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLAomIzQzOwkJCSAgICAgJmFtcDt3YWl0KTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfcmVxOwomIzQzOwomIzQzOwlpZiAoZW5jcnlwdCkgewomIzQzOwkJbWVtY3B5KHdyYXBwZWQtJmd0O2VuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7CiYjNDM7CQltZW1jcHkod3JhcHBlZC0mZ3Q7dGFnLCBidWYgJiM0MzsgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSwKJiM0MzsJCSAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW1lbWNweShpbWFnZV9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7CiYjNDM7CX0KJiM0MzsKJiM0MztvdXRfcmVxOgomIzQzOwlhZWFkX3JlcXVlc3RfZnJlZShyZXEpOwomIzQzO291dF90Zm06CiYjNDM7CWNyeXB0b19mcmVlX2FlYWQodGZtKTsKJiM0MztvdXRfa2V5OgomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGJ1Ziwgc2l6ZW9mKGJ1ZikpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSwKJiM0MzsJCQkJICAgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkKQomIzQzO3sKJiM0MzsJdTgga2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CW1lbXNldCh3cmFwcGVkLCAwLCBzaXplb2YoKndyYXBwZWQpKTsKJiM0MzsJbWVtY3B5KHdyYXBwZWQtJmd0O21hZ2ljLCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYywgc2l6ZW9mKHdyYXBwZWQtJmd0O21hZ2ljKSk7CiYjNDM7CXdyYXBwZWQtJmd0O3ZlcnNpb24gPSBjcHVfdG9fbGUzMihTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKTsKJiM0MzsKJiM0MzsJbWVtY3B5KGtleSwgaW1hZ2Vfa2V5LCBzaXplb2Yoa2V5KSk7CiYjNDM7CXJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoY29uc3Qgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkLAomIzQzOwkJCQkgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJaWYgKG1lbWNtcCh3cmFwcGVkLSZndDttYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsCiYjNDM7CQkgICBzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAobGUzMl90b19jcHUod3JhcHBlZC0mZ3Q7dmVyc2lvbikgIT0gU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwl0bXAgPSAqd3JhcHBlZDsKJiM0MzsJcmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleSgmYW1wO3RtcCwgaW1hZ2Vfa2V5LCBmYWxzZSk7CiYjNDM7CW1lbXplcm9fZXhwbGljaXQoJmFtcDt0bXAsIHNpemVvZih0bXApKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkgICAgICBjb25zdCB1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pCiYjNDM7ewomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CW1lbWNweShkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJcmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS0mZ3Q7YWVhZF90Zm0sIGRhdGEtJmd0O2VuY3J5cHRpb25fa2V5LAomIzQzOwkJCQlzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJbWVtemVyb19leHBsaWNpdChkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwKJiM0MzsJCQkJIHNpemVvZihkYXRhLSZndDtlbmNyeXB0aW9uX2tleSkpOwomIzQzOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qIERlcml2ZSBhIGtleSBmcm9tIHRoZSBrZXJuZWwgYW5kIHVzZXIga2V5cyBmb3IgZGF0YSBlbmNyeXB0aW9uLiAqLwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfdXNlX3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJdTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07CiYjNDM7CXN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyCiYjNDM7CSAqIGtleSwgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGdpdmVzIHRoZSB1c2VyIG1vZGUgcHJlZGljdGFibGUgY29udHJvbAomIzQzOwkgKiBvdmVyIHRoZSBrZXkgYml0cy4KJiM0MzsJICovCiYjNDM7CXNoYTI1Nl9pbml0KCZhbXA7c2hhMjU2X2N0eCk7CiYjNDM7CiYjNDM7CXNoYTI1Nl91cGRhdGUoJmFtcDtzaGEyNTZfY3R4LCBkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwKJiM0MzsJCSAgICAgIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgZGF0YS0mZ3Q7dXNlcl9rZXksIHNpemVvZihkYXRhLSZndDt1c2VyX2tleSkpOwomIzQzOwlzaGEyNTZfZmluYWwoJmFtcDtzaGEyNTZfY3R4LCBkaWdlc3QpOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSAmZ3Q7IFNIQTI1Nl9ESUdFU1RfU0laRSk7CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KGRhdGEtJmd0O2FlYWRfdGZtLAomIzQzOwkJCQlkaWdlc3QsCiYjNDM7CQkJCVNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwomIzQzOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qIENoZWNrIHRvIHNlZSBpZiBpdCYjMzk7cyB0aW1lIHRvIHN3aXRjaCB0byB0aGUgdXNlciBrZXksIGFuZCBkbyBpdCBpZiBzby4gKi8KJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CWlmIChkYXRhLSZndDt1c2VyX2tleV92YWxpZCAmYW1wOyZhbXA7IGRhdGEtJmd0O21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF90b3RhbCA9PSBkYXRhLSZndDttZXRhX3NpemUpIHsKJiM0MzsJCXJldHVybiBzbmFwc2hvdF91c2VfdXNlcl9rZXkoZGF0YSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3NldF9tZXRhX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsIHU2NCBtZXRhX3NpemUpCiYjNDM7ewomIzQzOwlkYXRhLSZndDttZXRhX3NpemUgPSBtZXRhX3NpemU7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSA9IHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KG1ldGFfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3JlY29yZF9lbmNyeXB0ZWRfcmVhZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2RhdGEtJmd0O2NyeXB0X2xvY2spOwomIzQzOwlkYXRhLSZndDtjcnlwdF9ieXRlc19yZWFkICYjNDM7PSBjb3VudDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRW5jcnlwdCBtb3JlIGRhdGEgZnJvbSB0aGUgc25hcHNob3QgaW50byB0aGUgc3RhZ2luZyBhcmVhLiAqLwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLSZndDthZWFkX3JlcTsKJiM0MzsJdTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTsKJiM0MzsJREVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTsKJiM0MzsJc2l6ZV90IHRvdGFsID0gMDsKJiM0MzsJaW50IHBnX2lkeDsKJiM0MzsJaW50IHJlczsKJiM0MzsKJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X3RvdGFsID09IDApIHsKJiM0MzsJCXNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSwKJiM0MzsJCQkJICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTsKJiM0MzsJCWlmIChyZXMpCiYjNDM7CQkJcmV0dXJuIHJlczsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnQKJiM0MzsJICogYXR0YWNrcyB0aGF0IHJlYXJyYW5nZSBjaHVua3MuCiYjNDM7CSAqLwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMF0sICZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfdG90YWwsIHNpemVvZihkYXRhLSZndDtjcnlwdF90b3RhbCkpOwomIzQzOwomIzQzOwkvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi8KJiM0MzsJZm9yIChwZ19pZHggPSAwOyBwZ19pZHggJmx0OyBDSFVOS19TSVpFOyBwZ19pZHgmIzQzOyYjNDM7KSB7CiYjNDM7CQl2b2lkICpidWYgPSBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdOwomIzQzOwomIzQzOwkJLyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi8KJiM0MzsJCWlmIChkYXRhLSZndDt1c2VyX2tleV92YWxpZCAmYW1wOyZhbXA7IHRvdGFsICZhbXA7JmFtcDsKJiM0MzsJCSAgICAoKGRhdGEtJmd0O2NyeXB0X3RvdGFsICYjNDM7IHRvdGFsKSA9PSBkYXRhLSZndDttZXRhX3NpemUpKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwkJcmVzID0gc25hcHNob3RfcmVhZF9uZXh0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlKTsKJiM0MzsJCWlmIChyZXMgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXM7CiYjNDM7CQlpZiAocmVzID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiYjNDM7CQlXQVJOX09OKHJlcyAhPSBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIENvcHkgdGhlIHBhZ2UgaW50byB0aGUgc3RhZ2luZyBhcmVhLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24KJiM0MzsJCSAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuCiYjNDM7CQkgKi8KJiM0MzsJCW1lbWNweShidWYsIGRhdGFfb2YoZGF0YS0mZ3Q7aGFuZGxlKSwgUEFHRV9TSVpFKTsKJiM0MzsJCXNnX3NldF9idWYoJmFtcDtkYXRhLSZndDtzZ1sxICYjNDM7IHBnX2lkeF0sIGJ1ZiwgUEFHRV9TSVpFKTsKJiM0MzsJCXRvdGFsICYjNDM7PSBQQUdFX1NJWkU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCF0b3RhbCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCAmYW1wO2RhdGEtJmd0O2F1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgJmFtcDt3YWl0KTsKJiM0MzsJLyoKJiM0MzsJICogVXNlIGluY3JlbWVudGluZyBub25jZXMgZm9yIGVhY2ggY2h1bmssIHNpbmNlIGEgNjQgYml0IHZhbHVlIHdvbiYjMzk7dAomIzQzOwkgKiByb2xsIGludG8gcmUtdXNlIGZvciBhbnkgZ2l2ZW4gaGliZXJuYXRlIGltYWdlLgomIzQzOwkgKi8KJiM0MzsJbWVtY3B5KCZhbXA7bm9uY2VbMF0sICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO25vbmNlW3NpemVvZihkYXRhLSZndDtub25jZV9sb3cpXSwKJiM0MzsJICAgICAgICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwKJiM0MzsJICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O25vbmNlX2xvdyAmIzQzOz0gMTsKJiM0MzsJLyogVG90YWwgZG9lcyBub3QgaW5jbHVkZSBBQUQgb3IgdGhlIGF1dGggdGFnLiAqLwomIzQzOwlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS0mZ3Q7c2csIGRhdGEtJmd0O3NnLCB0b3RhbCwgbm9uY2UpOwomIzQzOwlyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpLCAmYW1wO3dhaXQpOwomIzQzOwlpZiAocmVzKQomIzQzOwkJcmV0dXJuIHJlczsKJiM0MzsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9IHRvdGFsOwomIzQzOwlkYXRhLSZndDtjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi8KJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLSZndDthZWFkX3JlcTsKJiM0MzsJdTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTsKJiM0MzsJREVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTsKJiM0MzsJaW50IHBhZ2VfY291bnQ7CiYjNDM7CXNpemVfdCB0b3RhbDsKJiM0MzsJaW50IHBnX2lkeDsKJiM0MzsJaW50IHJlczsKJiM0MzsKJiM0MzsJLyogU2V0IHVwIHRoZSBhc3NvY2lhdGVkIGRhdGEuICovCiYjNDM7CXNnX3NldF9idWYoJmFtcDtkYXRhLSZndDtzZ1swXSwgJmFtcDtkYXRhLSZndDtjcnlwdF90b3RhbCwgc2l6ZW9mKGRhdGEtJmd0O2NyeXB0X3RvdGFsKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlCiYjNDM7CSAqIHNob3VsZCBhbHNvIGJlIGEgdGFnIGF0IHRoZSBlbmQsIHNvIHRoZSBvZmZzZXQgd29uJiMzOTt0IGJlIGFuIGV2ZW4gcGFnZS4KJiM0MzsJICovCiYjNDM7CXBhZ2VfY291bnQgPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJdG90YWwgPSBwYWdlX2NvdW50ICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CWlmICh0b3RhbCA9PSAwIHx8IHRvdGFsID09IGRhdGEtJmd0O2NyeXB0X29mZnNldCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBMb2FkIHRoZSBzZyBsaXN0IHdpdGggdGhlIGNyeXB0IGJ1ZmZlci4gSW5saW5lIGRlY3J5cHQgYmFjayBpbnRvIHRoZQomIzQzOwkgKiBzdGFnaW5nIGJ1ZmZlci4gQSBmdXR1cmUgb3B0aW1pemF0aW9uIGNvdWxkIGRlY3J5cHQgZGlyZWN0bHkgaW50bwomIzQzOwkgKiBsb3dtZW0gcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCAmbHQ7IHBhZ2VfY291bnQ7IHBnX2lkeCYjNDM7JiM0MzspCiYjNDM7CQlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJdCYjMzk7cyBwb3NzaWJsZSB0aGlzIGlzIHRoZSBmaW5hbCBkZWNyeXB0LCBvciB0aGUgZmluYWwgZGVjcnlwdCBvZiB0aGUKJiM0MzsJICogbWV0YSByZWdpb24sIGFuZCB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBDSFVOS19TSVpFIHBhZ2VzLiBJZiB0aGlzIGlzCiYjNDM7CSAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXcKJiM0MzsJICogYnl0ZXMgb2YgYSBuZXcgcGFnZS4gQ29weSB0byB0aGUgdGFnIGlmIHNvLgomIzQzOwkgKi8KJiM0MzsJaWYgKHBhZ2VfY291bnQgJmx0OyBDSFVOS19TSVpFICZhbXA7JmFtcDsKJiM0MzsJICAgIChkYXRhLSZndDtjcnlwdF9vZmZzZXQgLSB0b3RhbCkgPT0gc2l6ZW9mKGRhdGEtJmd0O2F1dGhfdGFnKSkgewomIzQzOwkJbWVtY3B5KGRhdGEtJmd0O2F1dGhfdGFnLCBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdLAomIzQzOwkJICAgICAgIHNpemVvZihkYXRhLSZndDthdXRoX3RhZykpOwomIzQzOwl9IGVsc2UgaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAhPQomIzQzOwkJICAgKChDSFVOS19TSVpFICZsdDsmbHQ7IFBBR0VfU0hJRlQpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCAmYW1wO2RhdGEtJmd0O2F1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgJmFtcDt3YWl0KTsKJiM0MzsJbWVtY3B5KCZhbXA7bm9uY2VbMF0sICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO25vbmNlW3NpemVvZihkYXRhLSZndDtub25jZV9sb3cpXSwKJiM0MzsJICAgICAgICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwKJiM0MzsJICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O25vbmNlX2xvdyAmIzQzOz0gMTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIGRhdGEtJmd0O3NnLCBkYXRhLSZndDtzZywgdG90YWwgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSwgbm9uY2UpOwomIzQzOwlyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCAmYW1wO3dhaXQpOwomIzQzOwlpZiAocmVzKQomIzQzOwkJcmV0dXJuIHJlczsKJiM0MzsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9IDA7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X29mZnNldCA9IDA7CiYjNDM7CiYjNDM7CS8qIFB1c2ggdGhlIGRlY3J5cHRlZCBwYWdlcyBmdXJ0aGVyIGRvd24gdGhlIHN0YWNrLiAqLwomIzQzOwl0b3RhbCA9IDA7CiYjNDM7CWZvciAocGdfaWR4ID0gMDsgcGdfaWR4ICZsdDsgcGFnZV9jb3VudDsgcGdfaWR4JiM0MzsmIzQzOykgewomIzQzOwkJdm9pZCAqYnVmID0gZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbcGdfaWR4XTsKJiM0MzsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoJmFtcDtkYXRhLSZndDtoYW5kbGUpOwomIzQzOwkJaWYgKHJlcyAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJlczsKJiM0MzsJCWlmIChyZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsKJiM0MzsJCWlmICghZGF0YV9vZihkYXRhLSZndDtoYW5kbGUpKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkJV0FSTl9PTihyZXMgIT0gUEFHRV9TSVpFKTsKJiM0MzsKJiM0MzsJCS8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqLwomIzQzOwkJbWVtY3B5KGRhdGFfb2YoZGF0YS0mZ3Q7aGFuZGxlKSwgYnVmLCBQQUdFX1NJWkUpOwomIzQzOwkJdG90YWwgJiM0Mzs9IFBBR0VfU0laRTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgPT0gMCkgewomIzQzOwkJZGF0YS0mZ3Q7bWV0YV9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQpCiYjNDM7CQkJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0KJiM0MzsJCQkJc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS0mZ3Q7bWV0YV9zaXplKTsKJiM0MzsJfQomIzQzOwomIzQzOwlkYXRhLSZndDtjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7CiYjNDM7CXJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTsKJiM0MzsJaWYgKHJlcykKJiM0MzsJCXJldHVybiByZXM7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgIHZvaWQgKipidWYpCiYjNDM7ewomIzQzOwlzaXplX3QgdGFnX29mZjsKJiM0MzsKJiM0MzsJLyogUmVmaWxsIHRoZSBlbmNyeXB0ZWQgYnVmZmVyIGlmIGl0JiMzOTtzIGVtcHR5LiAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9PSAwIHx8CiYjNDM7CSAgICAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICZndDs9CiYjNDM7CSAgICAgKGRhdGEtJmd0O2NyeXB0X3NpemUgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkpKSB7CiYjNDM7CQlpbnQgcmM7CiYjNDM7CiYjNDM7CQlkYXRhLSZndDtjcnlwdF9zaXplID0gMDsKJiM0MzsJCWRhdGEtJmd0O2NyeXB0X29mZnNldCA9IDA7CiYjNDM7CQlyYyA9IHNuYXBzaG90X2VuY3J5cHRfcmVmaWxsKGRhdGEpOwomIzQzOwkJaWYgKHJjICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CQlpZiAoIWRhdGEtJmd0O2NyeXB0X3NpemUpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAmbHQ7IGRhdGEtJmd0O2NyeXB0X3NpemUpIHsKJiM0MzsJCXNpemVfdCBwZ19pZHggPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJCXNpemVfdCBwZ19vZmYgPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwkJKmJ1ZiA9IGRhdGEtJmd0O2NyeXB0X3BhZ2VzW3BnX2lkeF0gJiM0MzsgcGdfb2ZmOwomIzQzOwkJcmV0dXJuIFBBR0VfU0laRSAtIHBnX29mZjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi8KJiM0MzsJdGFnX29mZiA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAtIGRhdGEtJmd0O2NyeXB0X3NpemU7CiYjNDM7CWlmICh0YWdfb2ZmICZndDsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkKJiM0MzsJCXRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFOwomIzQzOwomIzQzOwkqYnVmID0gZGF0YS0mZ3Q7YXV0aF90YWcgJiM0MzsgdGFnX29mZjsKJiM0MzsJcmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgICAgdm9pZCAqKmJ1ZikKJiM0Mzt7CiYjNDM7CXNpemVfdCBzaXplX2F2YWlsOwomIzQzOwlzaXplX3QgdGFnX29mZjsKJiM0MzsKJiM0MzsJLyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAmbHQ7IChQQUdFX1NJWkUgKiBDSFVOS19TSVpFKSkgewomIzQzOwkJc2l6ZV90IHBnX2lkeCA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJc2l6ZV90IHBnX29mZiA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAmYW1wOyAoUEFHRV9TSVpFIC0gMSk7CiYjNDM7CiYjNDM7CQkqYnVmID0gZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbcGdfaWR4XSAmIzQzOyBwZ19vZmY7CiYjNDM7CQlzaXplX2F2YWlsID0gUEFHRV9TSVpFIC0gcGdfb2ZmOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovCiYjNDM7CQl0YWdfb2ZmID0gZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpOwomIzQzOwkJaWYgKHRhZ19vZmYgJmd0OyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKQomIzQzOwkJCXRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFOwomIzQzOwomIzQzOwkJKmJ1ZiA9IGRhdGEtJmd0O2F1dGhfdGFnICYjNDM7IHRhZ19vZmY7CiYjNDM7CQlzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgJmx0OyBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemUpIHsKJiM0MzsJCXU2NCBtZXRhX2F2YWlsID0gZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplIC0gZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsOwomIzQzOwomIzQzOwkJc2l6ZV9hdmFpbCA9IG1pbl90KHU2NCwgc2l6ZV9hdmFpbCwgbWV0YV9hdmFpbCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHNpemVfYXZhaWw7CiYjNDM7fQomIzQzOwomIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKQomIzQzO3sKJiM0MzsJc2l6ZV90IGNvcHlfc2l6ZTsKJiM0MzsJc2l6ZV90IG5vdF9kb25lOwomIzQzOwlzaXplX3QgcGdfb2ZmOwomIzQzOwl2b2lkICpzcmM7CiYjNDM7CXNzaXplX3Qgc3JjX3NpemU7CiYjNDM7CiYjNDM7CWlmICghY291bnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcGdfb2ZmID0gKm9mZnAgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSAtIHBnX29mZik7CiYjNDM7CiYjNDM7CXNyY19zaXplID0gc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChkYXRhLCAmYW1wO3NyYyk7CiYjNDM7CWlmIChzcmNfc2l6ZSAmbHQ7PSAwKQomIzQzOwkJcmV0dXJuIHNyY19zaXplOwomIzQzOwomIzQzOwljb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIGNvdW50LCBzcmNfc2l6ZSk7CiYjNDM7CW5vdF9kb25lID0gY29weV90b191c2VyKGJ1Ziwgc3JjLCBjb3B5X3NpemUpOwomIzQzOwljb3B5X3NpemUgLT0gbm90X2RvbmU7CiYjNDM7CWlmICghY29weV9zaXplKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X29mZnNldCAmIzQzOz0gY29weV9zaXplOwomIzQzOwkqb2ZmcCAmIzQzOz0gY29weV9zaXplOwomIzQzOwlzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTsKJiM0MzsJcmV0dXJuIGNvcHlfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiYjNDM7CQkJCSBsb2ZmX3QgKm9mZnApCiYjNDM7ewomIzQzOwlzaXplX3QgY29weV9zaXplOwomIzQzOwlzaXplX3Qgbm90X2RvbmU7CiYjNDM7CXNpemVfdCBwZ19vZmY7CiYjNDM7CXZvaWQgKmRzdDsKJiM0MzsJc3NpemVfdCBkc3Rfc2l6ZTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoIWNvdW50KQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXBnX29mZiA9ICpvZmZwICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKJiM0MzsJY291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpOwomIzQzOwomIzQzOwlkc3Rfc2l6ZSA9IHNuYXBzaG90X3dyaXRlX25leHRfZW5jcnlwdGVkKGRhdGEsICZhbXA7ZHN0KTsKJiM0MzsJaWYgKGRzdF9zaXplICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gZHN0X3NpemU7CiYjNDM7CiYjNDM7CWNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTsKJiM0MzsJbm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTsKJiM0MzsJY29weV9zaXplIC09IG5vdF9kb25lOwomIzQzOwlpZiAoIWNvcHlfc2l6ZSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlkYXRhLSZndDtjcnlwdF9vZmZzZXQgJiM0Mzs9IGNvcHlfc2l6ZTsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsICYjNDM7PSBjb3B5X3NpemU7CiYjNDM7CS8qCiYjNDM7CSAqIERyYWluIHRoZSBlbmNyeXB0ZWQgYnVmZmVyIGlmIGl0JiMzOTtzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZQomIzQzOwkgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICZndDs9CiYjNDM7CSAgICAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSB8fAomIzQzOwkgICAgKGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSkpIHsKJiM0MzsJCXJjID0gc25hcHNob3RfZGVjcnlwdF9kcmFpbihkYXRhKTsKJiM0MzsJCWlmIChyYyAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJjOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpvZmZwICYjNDM7PSBjb3B5X3NpemU7CiYjNDM7CXJldHVybiBjb3B5X3NpemU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlkYXRhLSZndDtjcnlwdF9vZmZzZXQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgPSAwOwomIzQzOwlkYXRhLSZndDtub25jZV9sb3cgPSAwOwomIzQzOwlkYXRhLSZndDtub25jZV9oaWdoID0gMDsKJiM0MzsJZGF0YS0mZ3Q7bWV0YV9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQgPSBmYWxzZTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfaGVhZGVyX3Jlc2VydmVkID0gMDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJbWVtc2V0KGRhdGEtJmd0O2F1dGhfdGFnLCAwLCBzaXplb2YoZGF0YS0mZ3Q7YXV0aF90YWcpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3JlcSkgewomIzQzOwkJYWVhZF9yZXF1ZXN0X2ZyZWUoZGF0YS0mZ3Q7YWVhZF9yZXEpOwomIzQzOwkJZGF0YS0mZ3Q7YWVhZF9yZXEgPSBOVUxMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3RmbSkgewomIzQzOwkJY3J5cHRvX2ZyZWVfYWVhZChkYXRhLSZndDthZWFkX3RmbSk7CiYjNDM7CQlkYXRhLSZndDthZWFkX3RmbSA9IE5VTEw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbaV0pIHsKJiM0MzsJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbaV0pOwomIzQzOwkJCWRhdGEtJmd0O2NyeXB0X3BhZ2VzW2ldID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRhdGEtJmd0O2VuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChkYXRhLSZndDt1c2VyX2tleSwgc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSk7CiYjNDM7CXNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlpbnQgaSwgcmM7CiYjNDM7CiYjNDM7CS8qIFRoaXMgb25seSB3b3JrcyBvbmNlIHBlciBoaWJlcm5hdGUuICovCiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3RmbSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKGRhdGEpOwomIzQzOwltZW1zZXQoZGF0YS0mZ3Q7Y3J5cHRfcGFnZXMsIDAsIHNpemVvZihkYXRhLSZndDtjcnlwdF9wYWdlcykpOwomIzQzOwomIzQzOwkvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovCiYjNDM7CWRhdGEtJmd0O2FlYWRfdGZtID0gY3J5cHRvX2FsbG9jX2FlYWQoJiMzNDtnY20oYWVzKSYjMzQ7LCAwLCAwKTsKJiM0MzsJaWYgKElTX0VSUihkYXRhLSZndDthZWFkX3RmbSkpIHsKJiM0MzsJCXJjID0gUFRSX0VSUihkYXRhLSZndDthZWFkX3RmbSk7CiYjNDM7CQlkYXRhLSZndDthZWFkX3RmbSA9IE5VTEw7CiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmMgPSAtRU5PTUVNOwomIzQzOwlkYXRhLSZndDthZWFkX3JlcSA9IGFlYWRfcmVxdWVzdF9hbGxvYyhkYXRhLSZndDthZWFkX3RmbSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghZGF0YS0mZ3Q7YWVhZF9yZXEpCiYjNDM7CQlnb3RvIHNldHVwX2ZhaWw7CiYjNDM7CiYjNDM7CS8qIEFsbG9jYXRlIHRoZSBzdGFnaW5nIGFyZWEgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlkYXRhLSZndDtjcnlwdF9wYWdlc1tpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwomIzQzOwkJaWYgKCFkYXRhLSZndDtjcnlwdF9wYWdlc1tpXSkKJiM0MzsJCQlnb3RvIHNldHVwX2ZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2dfaW5pdF90YWJsZShkYXRhLSZndDtzZywgQ0hVTktfU0laRSAmIzQzOyAyKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsIGJlIHRoZSBvZmZzZXQgc28gdGhhdCBibG9ja3MgY2FuJiMzOTt0IGJlCiYjNDM7CSAqIHJlYXJyYW5nZWQuCiYjNDM7CSAqLwomIzQzOwlhZWFkX3JlcXVlc3Rfc2V0X2FkKGRhdGEtJmd0O2FlYWRfcmVxLCBzaXplb2YoZGF0YS0mZ3Q7Y3J5cHRfdG90YWwpKTsKJiM0MzsJcmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShkYXRhLSZndDthZWFkX3RmbSwgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gc2V0dXBfZmFpbDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7c2V0dXBfZmFpbDoKJiM0MzsJc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQlzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB3cmFwcGVkID0ge307CiYjNDM7CXU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9OwomIzQzOwl1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3QgcHVsbCBhIHJhbmRvbSBrZXkgZnJvbSBhIHdvcmxkIHRoYXQgY2FuIGJlIHJlc2V0LiAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7cmVhZHkpCiYjNDM7CQlyZXR1cm4gLUVQSVBFOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CiYjNDM7CS8qIEJ1aWxkIGEgcmFuZG9tIHN0YXJ0aW5nIG5vbmNlLiAqLwomIzQzOwlnZXRfcmFuZG9tX2J5dGVzKG5vbmNlLCBzaXplb2Yobm9uY2UpKTsKJiM0MzsJbWVtY3B5KCZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCAmYW1wO25vbmNlWzBdLCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO2RhdGEtJmd0O25vbmNlX2hpZ2gsICZhbXA7bm9uY2VbOF0sIHNpemVvZihkYXRhLSZndDtub25jZV9oaWdoKSk7CiYjNDM7CiYjNDM7CS8qIEJ1aWxkIGFuZCBpbnN0YWxsIGEgcmFuZG9tIGltYWdlIGVuY3J5cHRpb24ga2V5LiAqLwomIzQzOwlnZXRfcmFuZG9tX2J5dGVzKGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwlyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJcmMgPSBzbmFwc2hvdF93cmFwX2ltYWdlX2tleShpbWFnZV9rZXksICZhbXA7d3JhcHBlZCk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogSGFuZCB0aGUgd3JhcHBlZCBrZXkgYW5kIGNsZWFyIG5vbmNlIGJhY2sgdG8gdXNlciBtb2RlLiAqLwomIzQzOwlyYyA9IHB1dF91c2VyKHNpemVvZih3cmFwcGVkKSwgJmFtcDtrZXktJmd0O2Jsb2JfbGVuKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpICZndDsKJiM0MzsJCSAgICAgc2l6ZW9mKCgoc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgKikwKS0mZ3Q7YmxvYikpOwomIzQzOwlpZiAoY29weV90b191c2VyKCZhbXA7a2V5LSZndDtibG9iLCAmYW1wO3dyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHsKJiM0MzsJCXJjID0gLUVGQVVMVDsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY29weV90b191c2VyKCZhbXA7a2V5LSZndDtub25jZSwgJmFtcDtub25jZSwgc2l6ZW9mKG5vbmNlKSkpIHsKJiM0MzsJCXJjID0gLUVGQVVMVDsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZmFpbDoKJiM0MzsJbWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdCgmYW1wO3dyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7CiYjNDM7CXNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjsKJiM0MzsJc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTsKJiM0MzsJdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJLyogSXQmIzM5O3MgdG9vIGxhdGUgaWYgZGF0YSYjMzk7cyBiZWVuIHB1c2hlZCBpbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2hhbmRsZS5jdXIpCiYjNDM7CQlyZXR1cm4gLUVQSVBFOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CiYjNDM7CS8qIExvYWQgdGhlIGtleSBmcm9tIHVzZXIgbW9kZS4gKi8KJiM0MzsJYmxvYiA9IG1lbWR1cF91c2VyKGtleSwgc2l6ZW9mKCpibG9iKSk7CiYjNDM7CWlmIChJU19FUlIoYmxvYikpIHsKJiM0MzsJCXJjID0gUFRSX0VSUihibG9iKTsKJiM0MzsJCWdvdG8gY3J5cHRvX3NldHVwX2ZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGJsb2ItJmd0O2Jsb2JfbGVuICE9IHNpemVvZih3cmFwcGVkKSkgewomIzQzOwkJcmMgPSAtRUlOVkFMOwomIzQzOwkJZ290byBvdXRfYmxvYjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDt3cmFwcGVkLCBibG9iLSZndDtibG9iLCBzaXplb2Yod3JhcHBlZCkpOwomIzQzOwlyYyA9IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoJmFtcDt3cmFwcGVkLCBpbWFnZV9rZXkpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlnb3RvIG91dF9ibG9iOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0X2Jsb2I7CiYjNDM7CiYjNDM7CS8qIExvYWQgdGhlIHN0YXJ0aW5nIG5vbmNlLiAqLwomIzQzOwltZW1jcHkoJmFtcDtkYXRhLSZndDtub25jZV9sb3csICZhbXA7YmxvYi0mZ3Q7bm9uY2VbMF0sIHNpemVvZihkYXRhLSZndDtub25jZV9sb3cpKTsKJiM0MzsJbWVtY3B5KCZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwgJmFtcDtibG9iLSZndDtub25jZVs4XSwgc2l6ZW9mKGRhdGEtJmd0O25vbmNlX2hpZ2gpKTsKJiM0MzsKJiM0MztvdXRfYmxvYjoKJiM0MzsJa2ZyZWVfc2Vuc2l0aXZlKGJsb2IpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBjcnlwdG9fc2V0dXBfZmFpbDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y3J5cHRvX3NldHVwX2ZhaWw6CiYjNDM7CW1lbXplcm9fZXhwbGljaXQoJmFtcDt3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwlzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpCiYjNDM7ewomIzQzOwlsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CWxvZmZfdCBjaHVua3MgPSAocGFnZXMgJiM0MzsgKENIVU5LX1NJWkUgLSAxKSkgLyBDSFVOS19TSVpFOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW4KJiM0MzsJICogYXV0aGVudGljYXRpb24gdGFnIGZvciBldmVyeSBjaHVuayBvZiBwYWdlcy4KJiM0MzsJICovCiYjNDM7CXJldHVybiBwbGFpbl9zaXplICYjNDM7IChjaHVua3MgKiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChsb2ZmX3QgcmF3X3NpemUsCiYjNDM7CQkJCQkJICBsb2ZmX3QgbWV0YV9wbGFpbl9zaXplKQomIzQzO3sKJiM0MzsJaWYgKHJhd19zaXplICZsdDs9IG1ldGFfcGxhaW5fc2l6ZSkKJiM0MzsJCXJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICYjNDM7CiYjNDM7CQlzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJICBzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHVzZXJfa2V5ID0ge307CiYjNDM7CXVuc2lnbmVkIGludCBrZXlfbGVuOwomIzQzOwl1NjQgc2l6ZTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDt1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSAmbHQ7IHNpemVvZih1c2VyX2tleS5rZXkpKTsKJiM0MzsJcmMgPSAtRUlOVkFMOwomIzQzOwlpZiAodXNlcl9rZXkucmVzZXJ2ZWQpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKHVzZXJfa2V5LmtleV9sZW4gJmd0OyBzaXplb2YoZGF0YS0mZ3Q7dXNlcl9rZXkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICh1c2VyX2tleS5rZXlfbGVuICZsdDsgOCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSAmYW1wOyZhbXA7ICFkYXRhLSZndDtyZWFkeSkgewomIzQzOwkJcmMgPSAtRU5PREFUQTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFJldHVybiB0aGUgbWV0YWRhdGEgc2l6ZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBmZWQgaW4gYmVmb3JlCiYjNDM7CSAqIHRoZSB1c2VyIGRhdGEga2V5IGlzIG5lZWRlZCBhdCByZXN1bWUgdGltZS4KJiM0MzsJICovCiYjNDM7CWlmIChkYXRhLSZndDttb2RlID09IE9fV1JPTkxZICZhbXA7JmFtcDsgIWRhdGEtJmd0O21ldGFfc2l6ZSkgewomIzQzOwkJaWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSAmbHQ7IFBBR0VfU0laRSAmIzQzOyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0gdXNlcl9rZXkubWV0YV9zaXplOwomIzQzOwkJc2l6ZSA9IGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSwKJiM0MzsJCQkJICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKJiM0MzsJCXNpemUgPSBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmMgPSBwdXRfdXNlcihzaXplLCAmYW1wO2tleS0mZ3Q7bWV0YV9zaXplKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWtleV9sZW4gPSB1c2VyX2tleS5rZXlfbGVuOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3QgYWxsb3cgaXQgaWYgaXQmIzM5O3MgdG9vIGxhdGUuICovCiYjNDM7CWlmICgoZGF0YS0mZ3Q7bWV0YV9zaXplICZhbXA7JmFtcDsgZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgJmd0OyBkYXRhLSZndDttZXRhX3NpemUpIHx8CiYjNDM7CSAgICAoZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplICZhbXA7JmFtcDsKJiM0MzsJICAgICBkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgJmd0OyBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemUpKSB7CiYjNDM7CQlyYyA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldChkYXRhLSZndDt1c2VyX2tleSwgMCwgc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSk7CiYjNDM7CW1lbWNweShkYXRhLSZndDt1c2VyX2tleSwgdXNlcl9rZXkua2V5LCBrZXlfbGVuKTsKJiM0MzsJZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQgPSB0cnVlOwomIzQzOwkvKiBJbnN0YWxsIHRoZSBrZXkgaWYgdGhlIHVzZXIgaXMganVzdCB1bmRlciB0aGUgd2lyZS4gKi8KJiM0MzsJcmMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyYyA9IDA7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7dXNlcl9rZXksIHNpemVvZih1c2VyX2tleSkpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCQkgbG9mZl90IHJhd19zaXplKQomIzQzO3sKJiM0MzsJbG9mZl90IG1ldGFfcGxhaW5fc2l6ZSA9IGRhdGEtJmd0O21ldGFfc2l6ZTsKJiM0MzsJbG9mZl90IHNwbGl0X3NpemU7CiYjNDM7CiYjNDM7CWlmICghbWV0YV9wbGFpbl9zaXplKQomIzQzOwkJbWV0YV9wbGFpbl9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CXNwbGl0X3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChyYXdfc2l6ZSwKJiM0MzsJCQkJCQkJIG1ldGFfcGxhaW5fc2l6ZSk7CiYjNDM7CWlmICghZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQpCiYjNDM7CQlyZXR1cm4gbWF4KHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KHJhd19zaXplKSwgc3BsaXRfc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBzcGxpdF9zaXplOwomIzQzO30KJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICE9IDApIHsKJiM0MzsJCXJjID0gc25hcHNob3RfZGVjcnlwdF9kcmFpbihkYXRhKTsKJiM0MzsJCWlmIChyYykKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBkOTMzYjViMmMwNWQ0Li4wMjQwMGFjMTI1YzU4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMjE3Nyw2ICYjNDM7MjE3NywxMSBAQCB1bnNpZ25lZCBsb25nIHNuYXBzaG90X2dldF9pbWFnZV9zaXplKHZvaWQpCiAJcmV0dXJuIG5yX2NvcHlfcGFnZXMgJiM0MzsgbnJfbWV0YV9wYWdlcyAmIzQzOyAxOwogfQogCiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbnJfbWV0YV9wYWdlcyAmIzQzOyAxOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgaW5pdF9oZWFkZXIoc3RydWN0IHN3c3VzcF9pbmZvICppbmZvKQogewogCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHN3c3VzcF9pbmZvKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dhcC5jIGIva2VybmVsL3Bvd2VyL3N3YXAuYwppbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9zd2FwLmMKQEAgLTE2Niw2ICYjNDM7MTY2LDEwNCBAQCBzdGF0aWMgaW50IHN3c3VzcF9leHRlbnRzX2luc2VydCh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0KQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIGJvb2wgc3dzdXNwX2V4dGVudHNfY29udGFpbl9yYW5nZSh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0LAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHN3c3VzcF9leHRlbnRzLnJiX25vZGU7CiYjNDM7CXN0cnVjdCBzd3N1c3BfZXh0ZW50ICpleHQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwllbmQgPSBzd2FwX29mZnNldCAmIzQzOyBucl9wYWdlcyAtIDE7CiYjNDM7CWlmIChlbmQgJmx0OyBzd2FwX29mZnNldCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTsKJiM0MzsJCWlmIChzd2FwX29mZnNldCAmbHQ7IGV4dC0mZ3Q7c3RhcnQpCiYjNDM7CQkJbm9kZSA9IG5vZGUtJmd0O3JiX2xlZnQ7CiYjNDM7CQllbHNlIGlmIChzd2FwX29mZnNldCAmZ3Q7IGV4dC0mZ3Q7ZW5kKQomIzQzOwkJCW5vZGUgPSBub2RlLSZndDtyYl9yaWdodDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlnb3RvIGZvdW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0MzsKJiM0Mztmb3VuZDoKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHN3YXBfb2Zmc2V0ICZsdDsgZXh0LSZndDtzdGFydCkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoZW5kICZsdDs9IGV4dC0mZ3Q7ZW5kKQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJaWYgKGV4dC0mZ3Q7ZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJCXN3YXBfb2Zmc2V0ID0gZXh0LSZndDtlbmQgJiM0MzsgMTsKJiM0MzsJCW5vZGUgPSByYl9uZXh0KCZhbXA7ZXh0LSZndDtub2RlKTsKJiM0MzsJCWlmICghbm9kZSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXU2NCBibG9jazsKJiM0MzsJdTY0IGVuZDsKJiM0MzsJdTY0IGVuZF9ibG9jazsKJiM0MzsKJiM0MzsJaWYgKHN3YXAgJmx0OyAwIHx8IHBvcyAmbHQ7IDAgfHwgIWNvdW50KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwllbmQgPSAodTY0KXBvcyAmIzQzOyBjb3VudCAtIDE7CiYjNDM7CWlmIChlbmQgJmx0OyAodTY0KXBvcykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJYmxvY2sgPSAodTY0KXBvcyAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwllbmRfYmxvY2sgPSBlbmQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJdTY0IHJlbWFpbmluZ19wYWdlcyA9IGVuZF9ibG9jayAtIGJsb2NrICYjNDM7IDE7CiYjNDM7CQlwZ29mZl90IHN3YXBfb2Zmc2V0OwomIzQzOwkJcGdvZmZfdCBtYXBwZWRfcGFnZXM7CiYjNDM7CQlzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7CiYjNDM7CQl1NjQgcGFnZXM7CiYjNDM7CiYjNDM7CQlpZiAoIXJlbWFpbmluZ19wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCWlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCAmYW1wO3N3YXBfb2Zmc2V0LAomIzQzOwkJCQkJICAgICZhbXA7bWFwcGVkX3BhZ2VzKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoIW1hcHBlZF9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlwYWdlcyA9IG1pbl90KHU2NCwgbWFwcGVkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpOwomIzQzOwkJaWYgKCh1NjQpKHVuc2lnbmVkIGxvbmcpcGFnZXMgIT0gcGFnZXMpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJaWYgKCFzd3N1c3BfZXh0ZW50c19jb250YWluX3JhbmdlKHN3YXBfb2Zmc2V0LCBwYWdlcykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJaWYgKHBhZ2VzID09IHJlbWFpbmluZ19wYWdlcykKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCWJsb2NrICYjNDM7PSBwYWdlczsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcykKJiM0Mzt7CiYjNDM7CXU2NCBpbWFnZV9wYWdlcyA9IERJVl9ST1VORF9VUF9VTEwoaW1hZ2VfYnl0ZXMsIFBBR0VfU0laRSk7CiYjNDM7CXU2NCBtYXBfcGFnZXMgPSBpbWFnZV9wYWdlcyAvIE1BUF9QQUdFX0VOVFJJRVMgJiM0MzsgMTsKJiM0MzsKJiM0MzsJaWYgKG1hcF9wYWdlcyAmZ3Q7IFU2NF9NQVggJmd0OyZndDsgUEFHRV9TSElGVCkKJiM0MzsJCXJldHVybiBVNjRfTUFYOwomIzQzOwomIzQzOwlyZXR1cm4gbWFwX3BhZ2VzICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7fQomIzQzOwogc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmMgYi9rZXJuZWwvcG93ZXIvdXNlci5jCmluZGV4IGQwZmNmYmE3YWMyMzUuLjU3YjhjZTgzYTYyNmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL3VzZXIuYwpAQCAtMjEsNTQgJiM0MzsyMSwxODUgQEAKICNpbmNsdWRlICZsdDtsaW51eC9jb25zb2xlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9waWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvc2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7cG93ZXIuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt1c2VyLmgmIzM0OwogCiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25hcHNob3RfZGF0YSB7Ci0Jc3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7Ci0JaW50IHN3YXA7Ci0JaW50IG1vZGU7Ci0JYm9vbCBmcm96ZW47Ci0JYm9vbCByZWFkeTsKLQlib29sIHBsYXRmb3JtX3N1cHBvcnQ7Ci0JYm9vbCBmcmVlX2JpdG1hcHM7Ci0JZGV2X3QgZGV2OwotfSBzbmFwc2hvdF9zdGF0ZTsKJiM0MztzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTsKIAogaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldikKIHsKIAlyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgJmFtcDsmYW1wOyBzbmFwc2hvdF9zdGF0ZS5kZXYgPT0gZGV2OwogfQogCiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgZGV2X3QgZGV2KQomIzQzO3sKJiM0MzsJcmV0dXJuIGRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgJmFtcDsmYW1wOyBkYXRhLSZndDttb2RlID09IE9fUkRPTkxZICZhbXA7JmFtcDsKJiM0MzsJCWRhdGEtJmd0O3JlYWR5ICZhbXA7JmFtcDsgZGF0YS0mZ3Q7ZGV2ID09IGRldiAmYW1wOyZhbXA7CiYjNDM7CQlkYXRhLSZndDtvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSAmYW1wOyZhbXA7CiYjNDM7CQlzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCWxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CWxvZmZfdCBoZWFkZXJfb2Zmc2V0ID0gZGF0YS0mZ3Q7c3dhcF9oZWFkZXJfb2Zmc2V0OwomIzQzOwlsb2ZmX3Qgb2Zmc2V0OwomIzQzOwomIzQzOwlpZiAocG9zICZsdDsgaGVhZGVyX29mZnNldCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJb2Zmc2V0ID0gcG9zIC0gaGVhZGVyX29mZnNldDsKJiM0MzsJcmV0dXJuIG9mZnNldCAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IGNvdW50ICZsdDs9IFBBR0VfU0laRSAtIG9mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXU2NCBpbWFnZV9ieXRlcyA9IHJvdW5kX3VwKGRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQsIFBBR0VfU0laRSk7CiYjNDM7CXU2NCBtYXBfYnl0ZXMgPSBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXMoZGF0YS0mZ3Q7Y3J5cHRfYnl0ZXNfcmVhZCk7CiYjNDM7CXU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyAmIzQzOyBtYXBfYnl0ZXM7CiYjNDM7CiYjNDM7CWlmIChpbWFnZV9ieXRlcyAmbHQ7IGRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQgfHwgYnVkZ2V0ICZsdDsgaW1hZ2VfYnl0ZXMpCiYjNDM7CQlyZXR1cm4gVTY0X01BWDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJ1ZGdldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2RhdGEtJmd0O2NyeXB0X2xvY2spOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0Mzt9CiYjNDM7I2VuZGlmCiYjNDM7CiYjNDM7ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUKJiM0MztoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pCiYjNDM7CXN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gJmFtcDtzbmFwc2hvdF9zdGF0ZTsKJiM0MzsJZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOwlib29sIGltYWdlX3JhbmdlX2FsbG9jYXRlZDsKJiM0MzsJdTY0IHN3YXBfYnVkZ2V0OwomIzQzOwomIzQzOwlpZiAoIWNvdW50IHx8ICFzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShkYXRhLCBkZXYpKQomIzQzOwkJcmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpOwomIzQzOwomIzQzOwlpZiAoIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpCiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsKJiM0MzsJaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkID0gc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGRhdGEtJmd0O3N3YXAsIHBvcywgY291bnQpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJc3dhcF9idWRnZXQgPSBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChkYXRhKTsKJiM0MzsJaWYgKHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShkYXRhLCBwb3MsIGNvdW50KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgJmx0Oz0gUEFHRV9TSVpFICZhbXA7JmFtcDsKJiM0MzsJICAgIFBBR0VfU0laRSAtIGRhdGEtJmd0O2NyeXB0X2hlYWRlcl9yZXNlcnZlZCAmZ3Q7PSBjb3VudCkgewomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfaGVhZGVyX3Jlc2VydmVkICYjNDM7PSBjb3VudDsKJiM0MzsJCXR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSOwomIzQzOwl9IGVsc2UgaWYgKGltYWdlX3JhbmdlX2FsbG9jYXRlZCAmYW1wOyZhbXA7CiYjNDM7CQkgICBzd2FwX2J1ZGdldCAmZ3Q7PSBkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkICZhbXA7JmFtcDsKJiM0MzsJCSAgIHN3YXBfYnVkZ2V0IC0gZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZCAmZ3Q7PSBjb3VudCkgewomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZCAmIzQzOz0gY291bnQ7CiYjNDM7CQl0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CiYjNDM7CWlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKQomIzQzOwkJZ290byB1bmxvY2s7CiYjNDM7CiYjNDM7CXJldHVybiB0eXBlOwomIzQzOwomIzQzO3VubG9jazoKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpOwomIzQzOwlyZXR1cm4gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7CiYjNDM7I2Vsc2UKJiM0MzsJcmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbikKJiM0Mzt7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSAmYW1wO3NuYXBzaG90X3N0YXRlOwomIzQzOwl1NjQgKnJlc2VydmVkX3RvdGFsOwomIzQzOwlzaXplX3QgdW51c2VkOwomIzQzOwomIzQzOwlpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKCFyZXNlcnZlZCkKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwomIzQzOwlpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSKQomIzQzOwkJdW51c2VkID0gcmVzZXJ2ZWQ7CiYjNDM7CWVsc2UgaWYgKHdyaXR0ZW4gJmx0Oz0gMCkKJiM0MzsJCXVudXNlZCA9IHJlc2VydmVkOwomIzQzOwllbHNlIGlmICh3cml0dGVuICZsdDsgcmVzZXJ2ZWQpCiYjNDM7CQl1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47CiYjNDM7CWVsc2UKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwomIzQzOwlyZXNlcnZlZF90b3RhbCA9IHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUiA/CiYjNDM7CQkmYW1wO2RhdGEtJmd0O2NyeXB0X2hlYWRlcl9yZXNlcnZlZCA6ICZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZDsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CSpyZXNlcnZlZF90b3RhbCAtPSBtaW5fdCh1NjQsICpyZXNlcnZlZF90b3RhbCwgdW51c2VkKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsKJiM0Mzt1bmxvY2s6CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3N5c3RlbV90cmFuc2l0aW9uX211dGV4KTsKJiM0MzsjZW5kaWYKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CWRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgPSBzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTik7CiYjNDM7CXJldHVybiBkYXRhLSZndDtlbmNyeXB0aW9uX3JlcXVpcmVkOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTsKIAl1bnNpZ25lZCBpbnQgc2xlZXBfZmxhZ3M7CiAJaW50IGVycm9yOwogCi0JaWYgKCFoaWJlcm5hdGlvbl9hdmFpbGFibGUoKSkKJiM0MzsJaWYgKCFoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKCkpCiAJCXJldHVybiAtRVBFUk07CiAKIAlzbGVlcF9mbGFncyA9IGxvY2tfc3lzdGVtX3NsZWVwKCk7CiAKIAlpZiAoIWhpYmVybmF0ZV9hY3F1aXJlKCkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7Ci0JCWdvdG8gVW5sb2NrOwomIzQzOwkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKChmaWxwLSZndDtmX2ZsYWdzICZhbXA7IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CiAJCWhpYmVybmF0ZV9yZWxlYXNlKCk7CiAJCWVycm9yID0gLUVOT1NZUzsKLQkJZ290byBVbmxvY2s7CiYjNDM7CQlnb3RvIHVubG9jazsKIAl9CiAJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CiAJZGF0YSA9ICZhbXA7c25hcHNob3Rfc3RhdGU7CiAJZmlscC0mZ3Q7cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAltZW1zZXQoJmFtcDtkYXRhLSZndDtoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3Bpbl9sb2NrX2luaXQoJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfYnl0ZXNfcmVhZCA9IDA7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwOwomIzQzOwlkYXRhLSZndDtzd2FwX2hlYWRlcl9vZmZzZXQgPSAwOwomIzQzOwlkYXRhLSZndDtvd25lcl90Z2lkID0gTlVMTDsKJiM0MzsjZW5kaWYKIAlpZiAoKGZpbHAtJmd0O2ZfZmxhZ3MgJmFtcDsgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkgewogCQkvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovCiAJCWRhdGEtJmd0O3N3YXAgPSBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKHN3c3VzcF9yZXN1bWVfZGV2aWNlLCAwKTsKQEAgLTk5LDggJiM0MzsyMzAsMTMgQEAgc3RhdGljIGludCBzbmFwc2hvdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogCWRhdGEtJmd0O3JlYWR5ID0gZmFsc2U7CiAJZGF0YS0mZ3Q7cGxhdGZvcm1fc3VwcG9ydCA9IGZhbHNlOwogCWRhdGEtJmd0O2RldiA9IDA7CiYjNDM7CWRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgPSBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpOwomIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pCiYjNDM7CWlmICghZXJyb3IpCiYjNDM7CQlkYXRhLSZndDtvd25lcl90Z2lkID0gZ2V0X3Rhc2tfcGlkKGN1cnJlbnQsIFBJRFRZUEVfVEdJRCk7CiYjNDM7I2VuZGlmCiAKLSBVbmxvY2s6CiYjNDM7IHVubG9jazoKIAl1bmxvY2tfc3lzdGVtX3NsZWVwKHNsZWVwX2ZsYWdzKTsKIAogCXJldHVybiBlcnJvcjsKQEAgLTExNiw2ICYjNDM7MjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIAlzd3N1c3BfZnJlZSgpOwogCWRhdGEgPSBmaWxwLSZndDtwcml2YXRlX2RhdGE7CiAJZGF0YS0mZ3Q7ZGV2ID0gMDsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKQomIzQzOwlwdXRfcGlkKGRhdGEtJmd0O293bmVyX3RnaWQpOwomIzQzOwlkYXRhLSZndDtvd25lcl90Z2lkID0gTlVMTDsKJiM0MzsjZW5kaWYKIAlmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtJmd0O3N3YXApOwogCXVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkYXRhLSZndDtzd2FwKTsKIAlpZiAoZGF0YS0mZ3Q7ZnJvemVuKSB7CkBAIC0xMjUsNiAmIzQzOzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIAl9IGVsc2UgaWYgKGRhdGEtJmd0O2ZyZWVfYml0bWFwcykgewogCQlmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CiAJfQomIzQzOwlzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpOwogCXBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSA/CiAJCQlQTV9QT1NUX0hJQkVSTkFUSU9OIDogUE1fUE9TVF9SRVNUT1JFKTsKIAloaWJlcm5hdGVfcmVsZWFzZSgpOwpAQCAtMTQ3LDEyICYjNDM7Mjg4LDIzIEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCiAJZGF0YSA9IGZpbHAtJmd0O3ByaXZhdGVfZGF0YTsKIAlpZiAoIWRhdGEtJmd0O3JlYWR5KSB7CiAJCXJlcyA9IC1FTk9EQVRBOwotCQlnb3RvIFVubG9jazsKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwl9CiYjNDM7CWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCXJlcyA9IC1FUEVSTTsKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKGRhdGEsIGJ1ZiwgY291bnQsIG9mZnApOwomIzQzOwkJZ290byB1bmxvY2s7CiAJfQomIzQzOwogCWlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqLwogCQlyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoJmFtcDtkYXRhLSZndDtoYW5kbGUpOwogCQlpZiAocmVzICZsdDs9IDApCi0JCQlnb3RvIFVubG9jazsKJiM0MzsJCQlnb3RvIHVubG9jazsKIAl9IGVsc2UgewogCQlyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwOwogCX0KQEAgLTE2Miw3ICYjNDM7MzE0LDcgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKIAlpZiAocmVzICZndDsgMCkKIAkJKm9mZnAgJiM0Mzs9IHJlczsKIAotIFVubG9jazoKJiM0MzsgdW5sb2NrOgogCXVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpOwogCiAJcmV0dXJuIHJlczsKQEAgLTE4NSw2ICYjNDM7MzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCiAJZGF0YSA9IGZpbHAtJmd0O3ByaXZhdGVfZGF0YTsKIAomIzQzOwlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQlyZXMgPSAtRVBFUk07CiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQlyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7CiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsJfQomIzQzOwogCWlmICghcGdfb2ZmcCkgewogCQlyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlKTsKIAkJaWYgKHJlcyAmbHQ7PSAwKQpAQCAtMjUyLDYgJiM0Mzs0MTUsOSBAQCBzdGF0aWMgaW50IHNuYXBzaG90X3NldF9zd2FwX2FyZWEoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiAJaWYgKGRhdGEtJmd0O3N3YXAgJmx0OyAwKQogCQlyZXR1cm4gc3dkZXYgPyAtRU5PREVWIDogLUVJTlZBTDsKIAlkYXRhLSZndDtkZXYgPSBzd2RldjsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKQomIzQzOwlkYXRhLSZndDtzd2FwX2hlYWRlcl9vZmZzZXQgPSAobG9mZl90KW9mZnNldCAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0zMTgsNiAmIzQzOzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCWVycm9yID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KJiM0MzsJCWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSAtRVBFUk07CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiAJCXBtX3Jlc3RvcmVfZ2ZwX21hc2soKTsKIAkJZXJyb3IgPSBoaWJlcm5hdGlvbl9zbmFwc2hvdChkYXRhLSZndDtwbGF0Zm9ybV9zdXBwb3J0KTsKIAkJaWYgKCFlcnJvcikgewpAQCAtMzI4LDYgJiM0Mzs0OTksMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9BVE9NSUNfUkVTVE9SRToKJiM0MzsJCWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSAtRVBFUk07CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2UoZGF0YSk7CiYjNDM7CQkJaWYgKGVycm9yKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKIAkJZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZSgmYW1wO2RhdGEtJmd0O2hhbmRsZSk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtMzQ2LDYgJiM0Mzs1MjgsNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJc3dzdXNwX2ZyZWUoKTsKIAkJbWVtc2V0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IHNuYXBzaG90X2hhbmRsZSkpOwogCQlkYXRhLSZndDtyZWFkeSA9IGZhbHNlOwomIzQzOwkJc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTsKIAkJLyoKIAkJICogSXQgaXMgbmVjZXNzYXJ5IHRvIHRoYXcga2VybmVsIHRocmVhZHMgaGVyZSwgYmVjYXVzZQogCQkgKiBTTkFQU0hPVF9DUkVBVEVfSU1BR0UgbWF5IGJlIGludm9rZWQgZGlyZWN0bHkgYWZ0ZXIKQEAgLTM2OCw2ICYjNDM7NTUxLDggQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCX0KIAkJc2l6ZSA9IHNuYXBzaG90X2dldF9pbWFnZV9zaXplKCk7CiAJCXNpemUgJmx0OyZsdDs9IFBBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKQomIzQzOwkJCXNpemUgPSBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoZGF0YSwgc2l6ZSk7CiAJCWVycm9yID0gcHV0X3VzZXIoc2l6ZSwgKGxvZmZfdCBfX3VzZXIgKilhcmcpOwogCQlicmVhazsKIApAQCAtMzk3LDYgJiM0Mzs1ODIsOSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCWJyZWFrOwogCQl9CiAJCWZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS0mZ3Q7c3dhcCk7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJCXNuYXBzaG90X3Jlc2V0X3N3YXBfd3JpdGVfcmVzZXJ2YXRpb24oZGF0YSk7CiYjNDM7I2VuZGlmCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9TMlJBTToKQEAgLTQwNCw2ICYjNDM7NTkyLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJZXJyb3IgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQomIzQzOwkJaWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgJmFtcDsmYW1wOwomIzQzOwkJICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCQllcnJvciA9IC1FUEVSTTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KIAkJLyoKIAkJICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGgKIAkJICogUE1fSElCRVJOQVRJT05fUFJFUEFSRQpAQCAtNDE3LDYgJiM0Mzs2MTAsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9QT1dFUl9PRkY6CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkgewomIzQzOwkJCWVycm9yID0gLUVQRVJNOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQogCQlpZiAoZGF0YS0mZ3Q7cGxhdGZvcm1fc3VwcG9ydCkKIAkJCWVycm9yID0gaGliZXJuYXRpb25fcGxhdGZvcm1fZW50ZXIoKTsKIAkJYnJlYWs7CkBAIC00MjUsNiAmIzQzOzYyMywxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJZXJyb3IgPSBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOwogCiYjNDM7CWNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSkKJiM0MzsJCQllcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpOwomIzQzOwkJZWxzZQomIzQzOwkJCWVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7CiYjNDM7CQlicmVhazsKJiM0MzsKJiM0MzsJY2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6CiYjNDM7CQllcnJvciA9IHNuYXBzaG90X3NldF91c2VyX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiAJZGVmYXVsdDoKIAkJZXJyb3IgPSAtRU5PVFRZOwogCkBAIC00NDgsNiAmIzQzOzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAJY2FzZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0U6CiAJY2FzZSBTTkFQU0hPVF9DUkVBVEVfSU1BR0U6CiAJY2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOgomIzQzOwljYXNlIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OOgomIzQzOwljYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWToKIAkJcmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZykgY29tcGF0X3B0cihhcmcpKTsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuaCBiL2tlcm5lbC9wb3dlci91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNGRmMmY5YWU5YWRhNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci91c2VyLmgKQEAgLTAsMCAmIzQzOzEsMTUxIEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3J5cHRvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NjYXR0ZXJsaXN0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N1c3BlbmRfaW9jdGxzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2NyeXB0by9hZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2NyeXB0by9hZXMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgcGlkOwomIzQzOwomIzQzOyNkZWZpbmUgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBBRVNfS0VZU0laRV8xMjgKJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTYKJiM0MzsKJiM0MzsvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBwYWdlcyBpbiBhIHNpbmdsZSBBRUFEIGVuY3J5cHRpb24gY2h1bmsuICovCiYjNDM7I2RlZmluZSBDSFVOS19TSVpFIDE2CiYjNDM7CiYjNDM7c3RydWN0IHNuYXBzaG90X2RhdGEgewomIzQzOwlzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlIGhhbmRsZTsKJiM0MzsJaW50IHN3YXA7CiYjNDM7CWludCBtb2RlOwomIzQzOwlib29sIGZyb3plbjsKJiM0MzsJYm9vbCByZWFkeTsKJiM0MzsJYm9vbCBwbGF0Zm9ybV9zdXBwb3J0OwomIzQzOwlib29sIGZyZWVfYml0bWFwczsKJiM0MzsJYm9vbCBlbmNyeXB0aW9uX3JlcXVpcmVkOwomIzQzOwlkZXZfdCBkZXY7CiYjNDM7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTsKJiM0MzsJc3RydWN0IGFlYWRfcmVxdWVzdCAqYWVhZF9yZXE7CiYjNDM7CXZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdOwomIzQzOwl1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTsKJiM0MzsJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW0NIVU5LX1NJWkUgJiM0MzsgMl07IC8qIEFkZCByb29tIGZvciBBRCBhbmQgYXV0aCB0YWcuICovCiYjNDM7CXNpemVfdCBjcnlwdF9vZmZzZXQ7CiYjNDM7CXNpemVfdCBjcnlwdF9zaXplOwomIzQzOwl1NjQgY3J5cHRfdG90YWw7CiYjNDM7CXU2NCBjcnlwdF9zdHJlYW1fdG90YWw7CiYjNDM7CXU2NCBub25jZV9sb3c7CiYjNDM7CXU2NCBub25jZV9oaWdoOwomIzQzOwl1OCBlbmNyeXB0aW9uX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJdTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJYm9vbCB1c2VyX2tleV92YWxpZDsKJiM0MzsJdTY0IG1ldGFfc2l6ZTsKJiM0MzsJdTY0IGNyeXB0X21ldGFfc2l6ZTsKJiM0MzsJLyoKJiM0MzsJICogUHJvdGVjdHMgY3J5cHRfYnl0ZXNfcmVhZCBhbmQgdGhlIHJlc2VydmF0aW9uIGNvdW50ZXJzIGJlbG93LgomIzQzOwkgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZQomIzQzOwkgKiBnZW5lcmF0ZWQgc3dhcC1tYXAgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlzcGlubG9ja190IGNyeXB0X2xvY2s7CiYjNDM7CXU2NCBjcnlwdF9ieXRlc19yZWFkOwomIzQzOwl1NjQgY3J5cHRfc3dhcF9yZXNlcnZlZDsKJiM0MzsJdTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDsKJiM0MzsJbG9mZl90IHN3YXBfaGVhZGVyX29mZnNldDsKJiM0MzsJc3RydWN0IHBpZCAqb3duZXJfdGdpZDsKJiM0MzsjZW5kaWYKJiM0MzsKJiM0Mzt9OwomIzQzOwomIzQzO2V4dGVybiBzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTsKJiM0MzsKJiM0MzsvKiBrZXJuZWwvcG93ZXIvc25hcGVuYy5jIHJvdXRpbmVzICovCiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsKJiM0Mztzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CiYjNDM7CiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiYjNDM7CQkJCSBsb2ZmX3QgKm9mZnApOwomIzQzOwomIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7CiYjNDM7aW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpOwomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCXN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KTsKJiM0MzsKJiM0MztpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCSAgc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpOwomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwomIzQzOwomIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCQkgbG9mZl90IHJhd19zaXplKTsKJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJcmV0dXJuIGRhdGEtJmd0O2FlYWRfdGZtOwomIzQzO30KJiM0MzsKJiM0MzsjZWxzZQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKJiM0MzsJCQkJCSAgICAgIGxvZmZfdCAqb2ZmcCkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU5PVFRZOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHNzaXplX3Qgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiYjNDM7CQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpIHt9CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FTk9UVFk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCQkgICAgICAgbG9mZl90IHJhd19zaXplKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJhd19zaXplOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA3OGI0OWIwNjU4YWRkLi4xMWRmMGM1NTZmNGU5IDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBmaWxlLmMKQEAgLTIzNjYsNiAmIzQzOzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpCiAJcmV0dXJuIHNlLSZndDtzdGFydF9ibG9jayAmIzQzOyAob2Zmc2V0IC0gc2UtJmd0O3N0YXJ0X3BhZ2UpOwogfQogCiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LAomIzQzOwkJCSAgICBwZ29mZl90ICpucl9wYWdlcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlOwomIzQzOwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CiYjNDM7CiYjNDM7CWlmICghc2kgfHwgIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1dSSVRFT0spKQomIzQzOwkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CiYjNDM7CWZvciAocmIgPSByYl9maXJzdCgmYW1wO3NpLSZndDtzd2FwX2V4dGVudF9yb290KTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHsKJiM0MzsJCXNlID0gcmJfZW50cnkocmIsIHN0cnVjdCBzd2FwX2V4dGVudCwgcmJfbm9kZSk7CiYjNDM7CQlpZiAoYmxvY2sgJmd0Oz0gc2UtJmd0O3N0YXJ0X2Jsb2NrICZhbXA7JmFtcDsKJiM0MzsJCSAgICBibG9jayAtIHNlLSZndDtzdGFydF9ibG9jayAmbHQ7IHNlLSZndDtucl9wYWdlcykgewomIzQzOwkJCXBnb2ZmX3QgcGFnZSA9IGJsb2NrIC0gc2UtJmd0O3N0YXJ0X2Jsb2NrOwomIzQzOwomIzQzOwkJCSpvZmZzZXQgPSBzZS0mZ3Q7c3RhcnRfcGFnZSAmIzQzOyBwYWdlOwomIzQzOwkJCSpucl9wYWdlcyA9IHNlLSZndDtucl9wYWdlcyAtIHBhZ2U7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCkKJiM0Mzt7CiYjNDM7CXBnb2ZmX3QgbnJfcGFnZXM7CiYjNDM7CiYjNDM7CXJldHVybiBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudCh0eXBlLCBibG9jaywgb2Zmc2V0LCAmYW1wO25yX3BhZ2VzKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogUmV0dXJuIGVpdGhlciB0aGUgdG90YWwgbnVtYmVyIG9mIHN3YXAgcGFnZXMgb2YgZ2l2ZW4gdHlwZSwgb3IgdGhlIG51bWJlcgogICogb2YgZnJlZSBwYWdlcyBvZiB0aGF0IHR5cGUgKGRlcGVuZGluZyBvbiBAZnJlZSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTI6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ4MTEKCQkJCQkJCW91dHB1dDogMjYzCgkJCQkJCQl0aG91Z2h0czogMTUxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFbmNyeXB0aW9uIGZvciBVc2Vyc3BhY2UgSGliZXJuYXRpb24gU25hcHNob3RzIC0gS2V5IEFyZWFzIGZvciBJbnZlc3RpZ2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0IGludHJvZHVjZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBhIHByZXR0eSBzdWJzdGFudGlhbCBjaGFuZ2UgYW5kIGRlZmluaXRlbHkgd2FycmFudHMgYSBnb29kIGZ1enppbmcgY2FtcGFpZ24uIEl0IHRvdWNoZXMgcXVpdGUgYSBmZXcga2V5IGFyZWFzIG9mIHRoZSBrZXJuZWwuCgpGaXJzdCwgdGhlIGNvcmUgb2YgaXQgaXMgdGhlIGVuY3J5cHRpb24gaXRzZWxmLiBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIGluIHNldmVyYWwgZmlsZXM6IGBibG9jay9mb3BzLmNgLCB2YXJpb3VzIGhlYWRlciBmaWxlcyAoYHN1c3BlbmQuaGAsIGBzd2FwLmhgLCBgc3VzcGVuZF9pb2N0bHMuaGApLCB0aGUga2VybmVsIHBvd2VyIGNvbmZpZyBmaWxlcyAoYEtjb25maWdgLCBgTWFrZWZpbGVgLCBgcG93ZXIuaGApLCBhbmQgY3J1Y2lhbGx5LCBmaWxlcyBsaWtlIGBoaWJlcm5hdGUuY2AsIGBzbmFwZW5jLmNgLCBgc25hcHNob3QuY2AsIGBzd2FwLmNgLCBhbmQgYHVzZXIuY2Agd2l0aGluIHRoZSBga2VybmVsL3Bvd2VyYCBkaXJlY3RvcnksIGFsb25nIHdpdGggYG1tL3N3YXBmaWxlLmNgLgoKVGhlIGdpc3Qgb2YgaXQgaXMgZW5hYmxpbmcga2VybmVsLWJhc2VkIGVuY3J5cHRpb24uIFRoZXkmIzM5O3ZlIGFkZGVkIHNvbWUgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGA6IGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAgYW5kIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgLiBUaGVyZSYjMzk7cyBhbHNvIGEgbmV3IHN5c2ZzIGZpbGUsIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLgoKTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgdGhlIG5ldyBgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTmAgb3B0aW9uIGlzIHRoZSBrZXkgb25lLiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgY29uZmlnIGZvciBgL2Rldi9zbmFwc2hvdGAuIE9mIGNvdXJzZSwgd2UmIzM5O2xsIG5lZWQgYEhJQkVSTkFUSU9OYCBhcyB3ZWxsLgoKTm93LCBsZXQmIzM5O3MgemVybyBpbiBvbiB0aGUgaW50ZXJlc3RpbmcgZnVuY3Rpb25zLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBzbmFwc2hvdF9pb2N0bGAgaXMgZ29pbmcgdG8gaGFuZGxlIHRob3NlIG5ldyBpb2N0bHMuIGBrZXJuZWwvcG93ZXIvc25hcGVuYy5jYCBpcyBnb2luZyB0byBiZSB0aGUgaGVhcnQgb2YgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBiZSBsb29raW5nIGF0OiBgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5YCwgYHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleWAsIGBzbmFwc2hvdF9zZXRfdXNlcl9rZXlgLCBgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWRgLCBgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkYCwgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGAsIGFuZCBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYC4gSW4gYGtlcm5lbC9wb3dlci91c2VyLmNgLCBgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luYCBhbmQgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRgIGFyZSBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHNuYXBzaG90IHdyaXRlIHByb2Nlc3MuIFRoZW4sIG92ZXIgaW4gYG1tL3N3YXBmaWxlLmNgLCB0aGUgYHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50YCBhbmQgYHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0YCBmdW5jdGlvbnMgaGF2ZSBiZWNvbWUgcmVsZXZhbnQgYmVjYXVzZSBvZiB0aGUgc3dhcCBhbGxvY2F0aW9uIHRyYWNraW5nLiBBbmQsIGBrZXJuZWwvcG93ZXIvc3dhcC5jYCBoYXMgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGAgYW5kIGBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXNgLgoKU28sIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGUgcGxhbiBpcyB0byBmb2N1cyBvbiB0aGVzZSBmdW5jdGlvbnM6CgoqICAgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGAKKiAgIGBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlgCiogICBgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5YAoqICAgYHNuYXBzaG90X3NldF91c2VyX2tleWAKKiAgIGBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZGAKKiAgIGBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRgCiogICBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYAoqICAgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbmAKKiAgIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kYAoqICAgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGAKKiAgIGBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudGAKCkFuZCB0aGUga2V5IGNvbmZpZ3MgdG8gZW5hYmxlIGFyZToKCiogICBgRU5DUllQVEVEX0hJQkVSTkFUSU9OYAoqICAgYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAKKiAgIGBISUJFUk5BVElPTmAKClRoaXMgbG9va3MgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgdGhvcm91Z2ggZnV6emluZyBjYW1wYWlnbi4gV2UgYXJlIGFpbWluZyB0byB1bmNvdmVyIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIHJlYWQvd3JpdGUgcGF0aHMsIGtleSBtYW5hZ2VtZW50LCBhbmQgc3dhcCBhbGxvY2F0aW9uIGR1cmluZyB0aGUgaGliZXJuYXRpb24gcHJvY2Vzcy4gR2l2ZW4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIGFuZCB0aGUgY29yZSBzeXN0ZW0gZnVuY3Rpb25hbGl0eSBpbnZvbHZlZCwgSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBpbnRlcmVzdGluZyBmaW5kaW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxMjoxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RU5DUllQVEVEX0hJQkVSTkFUSU9OJiMzNDssCiAgICAmIzM0O0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFViYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF91c2VyX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlJiMzNDssCiAgICAmIzM0O2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbiYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kJiMzNDssCiAgICAmIzM0O3N3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZCYjMzQ7LAogICAgJiMzNDtzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uIGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBJdCBhZGRzIG5ldyBpb2N0bHMgdG8gYC9kZXYvc25hcHNob3RgIChgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05gLCBgU05BUFNIT1RfU0VUX1VTRVJfS0VZYCksIGEgc3lzZnMgaW50ZXJmYWNlIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLCBhbmQgbW9kaWZpZXMgdGhlIHJlYWQvd3JpdGUgcGF0aHMgZm9yIHRoZSBzbmFwc2hvdCBkZXZpY2UgdG8gc3VwcG9ydCBlbmNyeXB0aW9uL2RlY3J5cHRpb24uIEl0IGFsc28gaG9va3MgaW50byBibG9jayBkZXZpY2Ugd3JpdGVzIHRvIHRyYWNrIHN3YXAgYWxsb2NhdGlvbnMuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VOQ1JZUFRFRF9ISUJFUk5BVElPTiYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYmIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfdXNlcl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3RfcmVhZF9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZSYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4mIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZCYjMzQ7LAogICAgJiMzNDtzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQmIzM0OywKICAgICYjMzQ7c3dhcGRldl9ibG9ja190b19leHRlbnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTYuNzc1MzMzODgyWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk3NzEzMjA5ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRU5DUllQVEVEX0hJQkVSTkFUSU9OXCIsXG4gICAgXCJISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcIixcbiAgICBcIkhJQkVSTkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkXCIsXG4gICAgXCJzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X3VzZXJfa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VcIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpblwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZFwiLFxuICAgIFwic3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkXCIsXG4gICAgXCJzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTYuNzc1MzQxOTkyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI2MjM2NzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYTAzYzAyMGU3YTJjMmZmZjJlYTJiNGQzODA4N2MwODRkNjY0NTdhYVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyA0IDEyOjEyOjU0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXFxuaW5kZXggZDM4ZGEwNzc5MDVhOS4uNTdmNjA2M2VmODhjOSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXFxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxcbkBAIC00NzAsMyArNDcwLDE3IEBAIERlc2NyaXB0aW9uOlxcbiBcXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcXG4gICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IDNcXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkXFxuK0RhdGU6XFx0XFx0SnVseSAyMDI2XFxuK0NvbnRhY3Q6XFx0bGludXgtcG1Admdlci5rZXJuZWwub3JnXFxuK0Rlc2NyaXB0aW9uOlxcbitcXHRcXHRXcml0ZS1vbmx5IGZpbGUgcHJlc2VudCB3aGVuIENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT049eS5cXG4rXFxuK1xcdFxcdFRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIHdyaXRlcyBhIDMyLWJ5dGUgc2VlZCwgZW5jb2RlZCBhc1xcbitcXHRcXHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXFxuK1xcdFxcdGVuYWJsaW5nIGVuY3J5cHRlZCB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLlxcbitcXG4rXFx0XFx0VGhlIGZpcnN0IHN1Y2Nlc3NmdWwgd3JpdGUgbG9ja3MgdGhlIHNlZWQgdW50aWwgdGhlIG5leHQgYm9vdC5cXG4rXFx0XFx0V3JpdGluZyB0aGUgc2FtZSBzZWVkIGFnYWluIHN1Y2NlZWRzLiBXcml0aW5nIGEgZGlmZmVyZW50IHNlZWRcXG4rXFx0XFx0ZmFpbHMgd2l0aCBFUEVSTS5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XFxuaW5kZXggMWNmNjJkODBhOWNhMS4uZGY4ZWNhOWU2ZTM2MyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcXG5AQCAtMTE1LDYgKzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxcbiBcXHR0byByZXN1bWUgdGhlIHN5c3RlbSBmcm9tIFJBTSBpZiB0aGVyZSdzIGVub3VnaCBiYXR0ZXJ5IHBvd2VyIG9yIHJlc3RvcmVcXG4gXFx0aXRzIHN0YXRlIG9uIHRoZSBiYXNpcyBvZiB0aGUgc2F2ZWQgc3VzcGVuZCBpbWFnZSBvdGhlcndpc2UpXFxuIFxcbitTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTlxcbitcXHRFbmFibGVzIGVuY3J5cHRpb24gb2YgdGhlIGhpYmVybmF0ZSBpbWFnZSB3aXRoaW4gdGhlIGtlcm5lbC4gVHJ1c3RlZFxcbitcXHRlYXJseSB1c2Vyc3BhY2UgbXVzdCB3cml0ZSB0aGUgMzItYnl0ZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgdG9cXG4rXFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgaW9jdGwuIFVwb24gc3VzcGVuZFxcbitcXHQoaWUgd2hlbiB0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcpLCB0aGlzIGlvY3RsIHJldHVybnNcXG4rXFx0YW4gb3BhcXVlIHdyYXBwZWQga2V5IGJsb2IgYW5kIHRoZSBzdGFydGluZyBub25jZS4gVXBvbiByZXN1bWUgKGllIHdoZW5cXG4rXFx0dGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciB3cml0aW5nKSwgdGhpcyBpb2N0bCByZWNlaXZlcyB0aGVcXG4rXFx0c2FtZSBibG9iIGFuZCBub25jZSBmcm9tIHVzZXJtb2RlIGFmdGVyIHRoZSBzYW1lIHNlZWQgaGFzIGJlZW4gd3JpdHRlblxcbitcXHR0byAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQuIFRoZSBwbGFpbnRleHQgaW1hZ2Uga2V5IGlzIGdlbmVyYXRlZCBhbmRcXG4rXFx0dW53cmFwcGVkIGluc2lkZSB0aGUga2VybmVsLlxcbitcXG4rU05BUFNIT1RfU0VUX1VTRVJfS0VZXFxuK1xcdE1peGVzIGFkZGl0aW9uYWwgdXNlciBrZXkgbWF0ZXJpYWwgaW50byB0aGUgZGF0YSBwb3J0aW9uIG9mIGFuIGVuY3J5cHRlZFxcbitcXHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXFxuK1xcdGtleV9sZW4gbXVzdCBiZSBiZXR3ZWVuIDggYW5kIFVTV1NVU1BfVVNFUl9LRVlfU0laRSBieXRlcywgYW5kIHJlc2VydmVkXFxuK1xcdG11c3QgYmUgemVyby4gRHVyaW5nIGhpYmVybmF0aW9uIHRoZSBrZXJuZWwgd3JpdGVzIG1ldGFfc2l6ZSB3aXRoIHRoZVxcbitcXHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcXG4rXFx0bWV0YV9zaXplIGJhY2sgc28gdGhlIGtlcm5lbCBjYW4gc3dpdGNoIGtleXMgYXQgdGhlIG1ldGFkYXRhIGJvdW5kYXJ5XFxuK1xcdGJlZm9yZSB0aGUgc25hcHNob3QgaGVhZGVyIGhhcyBiZWVuIGRlY3J5cHRlZC5cXG4rXFxuIFRoZSBkZXZpY2UncyByZWFkKCkgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBzbmFwc2hvdCBpbWFnZSBmcm9tXFxuIHRoZSBrZXJuZWwuICBJdCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcXG4gXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2ZvcHMuYyBiL2Jsb2NrL2ZvcHMuY1xcbmluZGV4IDE1NzgzYTYxODBkZWMuLmVmZWI0ODVlOTFlNmMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svZm9wcy5jXFxuKysrIGIvYmxvY2svZm9wcy5jXFxuQEAgLTcyMyw0MyArNzIzLDY1IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbiBcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItXFx1MDAzZWtpX2ZpbHA7XFxuIFxcdHN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBiZGV2X2ZpbGVfaW5vZGUoZmlsZSk7XFxuIFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpO1xcbitcXHRkZXZfdCBkZXYgPSBiZF9pbm9kZS1cXHUwMDNlaV9yZGV2O1xcbiBcXHRib29sIGF0b21pYyA9IGlvY2ItXFx1MDAzZWtpX2ZsYWdzIFxcdTAwMjYgSU9DQl9BVE9NSUM7XFxuIFxcdGxvZmZfdCBzaXplID0gYmRldl9ucl9ieXRlcyhiZGV2KTtcXG4rXFx0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgaGliZXJuYXRlX3dyaXRlO1xcbitcXHRzaXplX3QgaGliZXJuYXRlX2xlbiA9IDA7XFxuIFxcdHNpemVfdCBzaG9ydGVkID0gMDtcXG4rXFx0c3NpemVfdCBoaWJlcm5hdGVfd3JpdHRlbiA9IDA7XFxuIFxcdHNzaXplX3QgcmV0O1xcbiBcXG4gXFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxcbiBcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbiBcXG4tXFx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcXHUwMDI2XFx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoYmRfaW5vZGUtXFx1MDAzZWlfcmRldikpXFxuLVxcdFxcdHJldHVybiAtRVRYVEJTWTtcXG4rXFx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcXHUwMDI2XFx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2KSkge1xcbitcXHRcXHRpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikgfHwgIWlvY2JfaXNfZHN5bmMoaW9jYikgfHxcXG4rXFx0XFx0ICAgIChpb2NiLVxcdTAwM2VraV9mbGFncyBcXHUwMDI2IElPQ0JfRElSRUNUKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FVFhUQlNZO1xcbiBcXG4tXFx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSlcXG4tXFx0XFx0cmV0dXJuIDA7XFxuK1xcdFxcdGhpYmVybmF0ZV9sZW4gPSBpb3ZfaXRlcl9jb3VudChmcm9tKTtcXG4rXFx0XFx0aGliZXJuYXRlX3dyaXRlID0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldiwgaW9jYi1cXHUwMDNla2lfcG9zLCBoaWJlcm5hdGVfbGVuKTtcXG4rXFx0XFx0aWYgKGhpYmVybmF0ZV93cml0ZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FVFhUQlNZO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRoaWJlcm5hdGVfd3JpdGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFx0fVxcbiBcXG4tXFx0aWYgKGlvY2ItXFx1MDAzZWtpX3BvcyBcXHUwMDNlPSBzaXplKVxcbi1cXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4rXFx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkge1xcbitcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4gXFxuLVxcdGlmICgoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxcbi1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcdGlmIChpb2NiLVxcdTAwM2VraV9wb3MgXFx1MDAzZT0gc2l6ZSkge1xcbitcXHRcXHRyZXQgPSAtRU5PU1BDO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKSB7XFxuK1xcdFxcdHJldCA9IC1FT1BOT1RTVVBQO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4gXFxuIFxcdGlmIChhdG9taWMpIHtcXG4gXFx0XFx0cmV0ID0gZ2VuZXJpY19hdG9taWNfd3JpdGVfdmFsaWQoaW9jYiwgZnJvbSk7XFxuIFxcdFxcdGlmIChyZXQpXFxuLVxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdFxcdGdvdG8gb3V0X2hpYmVybmF0ZTtcXG4gXFx0fVxcbiBcXG4gXFx0c2l6ZSAtPSBpb2NiLVxcdTAwM2VraV9wb3M7XFxuIFxcdGlmIChpb3ZfaXRlcl9jb3VudChmcm9tKSBcXHUwMDNlIHNpemUpIHtcXG4tXFx0XFx0aWYgKGF0b21pYylcXG4tXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdGlmIChhdG9taWMpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXRfaGliZXJuYXRlO1xcbitcXHRcXHR9XFxuIFxcdFxcdHNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7XFxuIFxcdFxcdGlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmaWxlX3VwZGF0ZV90aW1lKGZpbGUpO1xcbiBcXHRpZiAocmV0KVxcbi1cXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuIFxcbiBcXHRpZiAoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiBJT0NCX0RJUkVDVCkge1xcbiBcXHRcXHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xcbkBAIC03NzcsOSArNzk5LDE2IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbiBcXHRcXHRpbm9kZV91bmxvY2tfc2hhcmVkKGJkX2lub2RlKTtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKHJldCBcXHUwMDNlIDApXFxuK1xcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGhpYmVybmF0ZV93cml0dGVuID0gcmV0O1xcbiBcXHRcXHRyZXQgPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmV0KTtcXG4rXFx0fVxcbiBcXHRpb3ZfaXRlcl9yZWV4cGFuZChmcm9tLCBpb3ZfaXRlcl9jb3VudChmcm9tKSArIHNob3J0ZWQpO1xcbitcXG4rb3V0X2hpYmVybmF0ZTpcXG4rXFx0aWYgKGhpYmVybmF0ZV9sZW4pXFxuK1xcdFxcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIGhpYmVybmF0ZV93cml0dGVuKTtcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxcbmluZGV4IGIwMjg3NmYxYWUzOGEuLjgzMDhhNjU4Mzc1NmMgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxcbkBAIC00MjYsMTAgKzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9XFxuIFxcbiBpbnQgYXJjaF9yZXN1bWVfbm9zbXQodm9pZCk7XFxuIFxcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB7XFxuK1xcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FLFxcbitcXHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0UsXFxuK1xcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIsXFxuK307XFxuK1xcbiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlxcbiBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KTtcXG4rZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcXG4rdm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pO1xcbiAjZWxzZVxcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxcbit7XFxuK1xcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0c2l6ZV90IHJlc2VydmVkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRzc2l6ZV90IHdyaXR0ZW4pXFxuK3tcXG4rfVxcbiAjZW5kaWZcXG4gXFxuIC8qIEhpYmVybmF0aW9uIGFuZCBzdXNwZW5kIGV2ZW50cyAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuQEAgLTQzOSw2ICs0MzksOSBAQCBleHRlcm4gaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KTtcXG4gaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTtcXG4gZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCwgaW50KTtcXG4gZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTtcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KTtcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LFxcbitcXHRcXHRcXHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpO1xcbiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XFxuIGV4dGVybiBib29sIHN3YXBfZW50cnlfc3dhcHBlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN3cF9lbnRyeV90IGVudHJ5KTtcXG4gZXh0ZXJuIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcXG5AQCAtNTM1LDYgKzUzOCwxOSBAQCBzdGF0aWMgaW5saW5lIGludCBhZGRfc3dhcF9leHRlbnQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyxcXG4ge1xcbiBcXHRyZXR1cm4gLUVJTlZBTDtcXG4gfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHQgIHBnb2ZmX3QgKm9mZnNldClcXG4re1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHQgIHBnb2ZmX3QgKm9mZnNldCxcXG4rXFx0XFx0XFx0XFx0XFx0ICBwZ29mZl90ICpucl9wYWdlcylcXG4re1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rfVxcbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cXG4gI2lmZGVmIENPTkZJR19NRU1DR1xcbiBzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXFxuaW5kZXggYmNjZTA0ZTIxYzBkYy4uNWUyM2JmOTM2Mjc3ZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXFxuQEAgLTEzLDYgKzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHtcXG4gXFx0X191MzIgZGV2O1xcbiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xcbiBcXG4rI2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2XFxuKyNkZWZpbmUgVVNXU1VTUF9VU0VSX0tFWV9TSVpFIDMyXFxuK1xcbisvKlxcbisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgdGhlIG9wYXF1ZSB3cmFwcGVkIGhpYmVybmF0ZSBpbWFnZVxcbisgKiBlbmNyeXB0aW9uIGtleSBhbmQgc3RhcnRpbmcgbm9uY2UgaW4gZWl0aGVyIGRpcmVjdGlvbi5cXG4rICovXFxuK3N0cnVjdCB1c3dzdXNwX2tleV9ibG9iIHtcXG4rXFx0X191MzIgYmxvYl9sZW47XFxuK1xcdF9fdTggYmxvYls1MTJdO1xcbitcXHRfX3U4IG5vbmNlW1VTV1NVU1BfS0VZX05PTkNFX1NJWkVdIF9fa2VybmVsX25vbnN0cmluZztcXG4rfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTtcXG4rXFxuKy8qXFxuKyAqIEFsbG93IHVzZXIgbW9kZSB0byBmb2xkIGluIGtleSBtYXRlcmlhbCBmb3IgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgaGliZXJuYXRlXFxuKyAqIGltYWdlLlxcbisgKi9cXG4rc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkge1xcbitcXHQvKiBLZXJuZWwgcmV0dXJucyB0aGUgbWV0YWRhdGEgc2l6ZTsgcmVzdW1lIHBhc3NlcyB0aGUgc2F2ZWQgdmFsdWUgaW4uICovXFxuK1xcdF9fdTY0IG1ldGFfc2l6ZTtcXG4rXFx0X191MzIga2V5X2xlbjtcXG4rXFx0X191MzIgcmVzZXJ2ZWQ7XFxuK1xcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xcbit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xcbitcXG4gI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUNcXHQnMydcXG4gI2RlZmluZSBTTkFQU0hPVF9GUkVFWkVcXHRcXHRcXHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxKVxcbiAjZGVmaW5lIFNOQVBTSE9UX1VORlJFRVpFXFx0XFx0X0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMilcXG5AQCAtMjksNiArNTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xcbiAjZGVmaW5lIFNOQVBTSE9UX1BSRUZfSU1BR0VfU0laRVxcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE4KVxcbiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRVxcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAxOSwgX19rZXJuZWxfbG9mZl90KVxcbiAjZGVmaW5lIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRVxcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KVxcbi0jZGVmaW5lIFNOQVBTSE9UX0lPQ19NQVhOUlxcdDIwXFxuKyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cXHRfSU9XUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIxLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iKVxcbisjZGVmaW5lIFNOQVBTSE9UX1NFVF9VU0VSX0tFWVxcdFxcdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXFxuKyNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXFx0MjJcXG4gXFxuICNlbmRpZiAvKiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSCAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnXFxuaW5kZXggNTMwYzg5NzMxMWQ0NC4uYTliZWU3MTU3MWNmYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xcbisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnXFxuQEAgLTExNSw2ICsxMTUsMjEgQEAgY29uZmlnIEhJQkVSTkFUSU9OX0RFRl9DT01QXFxuIFxcdGhlbHBcXG4gXFx0ICBEZWZhdWx0IGNvbXByZXNzb3IgdG8gYmUgdXNlZCBmb3IgaGliZXJuYXRpb24uXFxuIFxcbitjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXFxuK1xcdGJvb2wgXFxcIkVuY3J5cHRpb24gc3VwcG9ydCBmb3IgdXNlcnNwYWNlIHNuYXBzaG90c1xcXCJcXG4rXFx0ZGVwZW5kcyBvbiBISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcXG4rXFx0c2VsZWN0IENSWVBUT19BRVNcXG4rXFx0c2VsZWN0IENSWVBUT19HQ01cXG4rXFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2XFxuK1xcdGhlbHBcXG4rXFx0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXFxuK1xcdCAgY3JlYXRlZCBieSB1c3dzdXNwIHRvb2xzLiBBIHRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIGNvbXBvbmVudCBtdXN0XFxuK1xcdCAgcHJvdmlkZSB0aGUgc25hcHNob3QgZW5jcnlwdGlvbiBzZWVkIGJlZm9yZSBlbmFibGluZyBlbmNyeXB0aW9uLlxcbitcXG4rXFx0ICBTYXkgTiBpZiB1c2Vyc3BhY2UgaGFuZGxlcyB0aGUgaW1hZ2UgZW5jcnlwdGlvbi5cXG4rXFxuK1xcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxcbitcXG4gY29uZmlnIFBNX1NURF9QQVJUSVRJT05cXG4gXFx0c3RyaW5nIFxcXCJEZWZhdWx0IHJlc3VtZSBwYXJ0aXRpb25cXFwiXFxuIFxcdGRlcGVuZHMgb24gSElCRVJOQVRJT05cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXFxuaW5kZXggNzczZTI3ODk0MTJiOS4uMmZkMzFiMmEyNTBmNSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcXG4rKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcXG5AQCAtMTYsNiArMTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORClcXHRcXHQrPSBzdXNwZW5kLm9cXG4gb2JqLSQoQ09ORklHX1BNX1RFU1RfU1VTUEVORClcXHQrPSBzdXNwZW5kX3Rlc3Qub1xcbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXFx0Kz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm9cXG4gb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVikgKz0gdXNlci5vXFxuK29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICs9IHNuYXBlbmMub1xcbiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKVxcdCs9IGF1dG9zbGVlcC5vXFxuIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpXFx0Kz0gd2FrZWxvY2sub1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXFxuaW5kZXggZDI0NzljNjlkNzFhNC4uMGI4NjI2YmRmODFhOCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcXG5AQCAtMzYsNiArMzYsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjdHJhY2UvZXZlbnRzL3Bvd2VyLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwicG93ZXIuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInVzZXIuaFxcXCJcXG4gXFxuIFxcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XFxuQEAgLTExMyw2ICsxMTQsMTQgQEAgYm9vbCBoaWJlcm5hdGlvbl9hdmFpbGFibGUodm9pZClcXG4gXFx0XFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcXHUwMDI2XFx1MDAyNiAhY3hsX21lbV9hY3RpdmUoKTtcXG4gfVxcbiBcXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5vaGliZXJuYXRlID09IDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0KCFzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTikgfHxcXG4rXFx0XFx0IElTX0VOQUJMRUQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCFzZWNyZXRtZW1fYWN0aXZlKCkgXFx1MDAyNlxcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBoaWJlcm5hdGlvbl9zZXRfb3BzIC0gU2V0IHRoZSBnbG9iYWwgaGliZXJuYXRlIG9wZXJhdGlvbnMuXFxuICAqIEBvcHM6IEhpYmVybmF0aW9uIG9wZXJhdGlvbnMgdG8gdXNlIGluIHN1YnNlcXVlbnQgaGliZXJuYXRpb24gdHJhbnNpdGlvbnMuXFxuQEAgLTEzNzYsMTIgKzEzODUsMzUgQEAgc3RhdGljIHNzaXplX3QgcmVzZXJ2ZWRfc2l6ZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcXG4gXFxuIHBvd2VyX2F0dHIocmVzZXJ2ZWRfc2l6ZSk7XFxuIFxcbisjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTlxcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9zZWVkX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsXFxuK1xcdFxcdFxcdFxcdCAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xcbitcXHRyZXR1cm4gcmV0ID8gcmV0IDogbjtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzbmFwc2hvdF9zZWVkX2F0dHIgPSB7XFxuK1xcdC5hdHRyXFx0PSB7XFxuK1xcdFxcdC5uYW1lID0gXFxcInNuYXBzaG90X3NlZWRcXFwiLFxcbitcXHRcXHQubW9kZSA9IDAyMDAsXFxuK1xcdH0sXFxuK1xcdC5zdG9yZVxcdD0gc25hcHNob3Rfc2VlZF9zdG9yZSxcXG4rfTtcXG4rI2VuZGlmXFxuK1xcbiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ1tdID0ge1xcbiBcXHRcXHUwMDI2ZGlza19hdHRyLmF0dHIsXFxuIFxcdFxcdTAwMjZyZXN1bWVfb2Zmc2V0X2F0dHIuYXR0cixcXG4gXFx0XFx1MDAyNnJlc3VtZV9hdHRyLmF0dHIsXFxuIFxcdFxcdTAwMjZpbWFnZV9zaXplX2F0dHIuYXR0cixcXG4gXFx0XFx1MDAyNnJlc2VydmVkX3NpemVfYXR0ci5hdHRyLFxcbisjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTlxcbitcXHRcXHUwMDI2c25hcHNob3Rfc2VlZF9hdHRyLmF0dHIsXFxuKyNlbmRpZlxcbiBcXHROVUxMLFxcbiB9O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaFxcbmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmhcXG4rKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaFxcbkBAIC0xNjAsNiArMTYwLDcgQEAgc3RydWN0IHNuYXBzaG90X2hhbmRsZSB7XFxuIFxcbiBleHRlcm4gdW5zaWduZWQgaW50IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpO1xcbiBleHRlcm4gdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKTtcXG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpO1xcbiBleHRlcm4gaW50IHNuYXBzaG90X3JlYWRfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xcbiBleHRlcm4gaW50IHNuYXBzaG90X3dyaXRlX25leHQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTtcXG4gaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XFxuQEAgLTE2Nyw4ICsxNjgsMTEgQEAgZXh0ZXJuIGludCBzbmFwc2hvdF9pbWFnZV9sb2FkZWQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTtcXG4gXFxuIGV4dGVybiBib29sIGhpYmVybmF0ZV9hY3F1aXJlKHZvaWQpO1xcbiBleHRlcm4gdm9pZCBoaWJlcm5hdGVfcmVsZWFzZSh2b2lkKTtcXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpO1xcbiBcXG4gZXh0ZXJuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApO1xcbitib29sIHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChpbnQgc3dhcCwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcXG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpO1xcbiBleHRlcm4gdm9pZCBmcmVlX2FsbF9zd2FwX3BhZ2VzKGludCBzd2FwKTtcXG4gZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7XFxuIFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcGVuYy5jIGIva2VybmVsL3Bvd2VyL3NuYXBlbmMuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uY2QyOTgwM2VjNmM1YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXFxuQEAgLTAsMCArMSw5NDAgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyeXB0by5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3J5cHRvL2FlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9nY20uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9zaGEyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vdXRpbHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hleC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JhbmRvbS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInBvd2VyLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ1c2VyLmhcXFwiXFxuK1xcbisjZGVmaW5lIFNOQVBTSE9UX1NFRURfU0laRSBTSEEyNTZfRElHRVNUX1NJWkVcXG4rI2RlZmluZSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OIDFcXG4rXFxuK3N0YXRpYyBjb25zdCB1OCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpY1s4XSA9IHtcXG4rXFx0J1MnLCAnVycsICdTJywgJ1UnLCAnUycsICdQJywgJ0snLCAnMScsXFxuK307XFxuK1xcbitzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkge1xcbitcXHR1OCBtYWdpY1tzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpXTtcXG4rXFx0X19sZTMyIHZlcnNpb247XFxuK1xcdHU4IHdyYXBfbm9uY2VbR0NNX0FFU19JVl9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0dTggZW5jcnlwdGVkX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0dTggdGFnW1NOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xcbit9IF9fcGFja2VkO1xcbitcXG4rc3RhdGljIERFRklORV9NVVRFWChzbmFwc2hvdF9zZWVkX211dGV4KTtcXG4rc3RhdGljIHU4IHNuYXBzaG90X3NlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcXG4rc3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcXG4rXFxuK2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0dTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHRzaXplX3QgbGVuID0gY291bnQ7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRpZiAobGVuIFxcdTAwMjZcXHUwMDI2IGJ1ZltsZW4gLSAxXSA9PSAnXFxcXG4nKVxcbitcXHRcXHRsZW4tLTtcXG4rXFx0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XFxuK1xcdGlmIChzbmFwc2hvdF9zZWVkX3ZhbGlkKSB7XFxuK1xcdFxcdHJldCA9IGNyeXB0b19tZW1uZXEoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKSA/IC1FUEVSTSA6IDA7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRtZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcXG4rXFx0c25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7XFxuK1xcdHByX2luZm8oXFxcIlBNOiBoaWJlcm5hdGU6IHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBsb2NrZWRcXFxcblxcXCIpO1xcbitcXG4rb3V0OlxcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSlcXG4re1xcbitcXHRib29sIHZhbGlkO1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XFxuK1xcdHZhbGlkID0gc25hcHNob3Rfc2VlZF92YWxpZDtcXG4rXFx0aWYgKHZhbGlkKVxcbitcXHRcXHRtZW1jcHkoc2VlZCwgc25hcHNob3Rfc2VlZCwgU05BUFNIT1RfU0VFRF9TSVpFKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcXG4rXFxuK1xcdHJldHVybiB2YWxpZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gXFxcIkxpbnV4IGhpYmVybmF0ZSBzbmFwc2hvdCBrZXkgd3JhcCB2MVxcXCI7XFxuK1xcdHU4IGRpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdO1xcbitcXHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7XFxuK1xcbitcXHRpZiAoIXNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHNlZWQpKVxcbitcXHRcXHRyZXR1cm4gLUVOT0tFWTtcXG4rXFxuK1xcdHNoYTI1Nl9pbml0KFxcdTAwMjZzaGEyNTZfY3R4KTtcXG4rXFx0c2hhMjU2X3VwZGF0ZShcXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xcbitcXHRzaGEyNTZfdXBkYXRlKFxcdTAwMjZzaGEyNTZfY3R4LCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xcbitcXHRzaGEyNTZfZmluYWwoXFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XFxuK1xcbitcXHRtZW1jcHkoa2V5LCBkaWdlc3QsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X2NyeXB0X3dyYXBwZWRfa2V5KHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxcbitcXHRcXHRcXHRcXHQgICAgICBib29sIGVuY3J5cHQpXFxuK3tcXG4rXFx0dTggd3JhcF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtO1xcbitcXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXE7XFxuK1xcdHN0cnVjdCBzY2F0dGVybGlzdCBzZztcXG4rXFx0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0cmMgPSBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHdyYXBfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRyZXR1cm4gcmM7XFxuK1xcbitcXHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcXFwiZ2NtKGFlcylcXFwiLCAwLCAwKTtcXG4rXFx0aWYgKElTX0VSUih0Zm0pKSB7XFxuK1xcdFxcdHJjID0gUFRSX0VSUih0Zm0pO1xcbitcXHRcXHRnb3RvIG91dF9rZXk7XFxuK1xcdH1cXG4rXFxuK1xcdHJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X3RmbTtcXG4rXFxuK1xcdHJjID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIG91dF90Zm07XFxuK1xcbitcXHRyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFyZXEpIHtcXG4rXFx0XFx0cmMgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dF90Zm07XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChlbmNyeXB0KSB7XFxuK1xcdFxcdGdldF9yYW5kb21fYnl0ZXMod3JhcHBlZC1cXHUwMDNld3JhcF9ub25jZSwgc2l6ZW9mKHdyYXBwZWQtXFx1MDAzZXdyYXBfbm9uY2UpKTtcXG4rXFx0XFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bWVtY3B5KGJ1Ziwgd3JhcHBlZC1cXHUwMDNlZW5jcnlwdGVkX2tleSwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XFxuK1xcdFxcdG1lbWNweShidWYgKyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLVxcdTAwM2V0YWcsXFxuK1xcdFxcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0fVxcbitcXG4rXFx0c2dfaW5pdF9vbmUoXFx1MDAyNnNnLCBidWYsIHNpemVvZihidWYpKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKHJlcSwgMCk7XFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBcXHUwMDI2c2csIFxcdTAwMjZzZyxcXG4rXFx0XFx0XFx0ICAgICAgIGVuY3J5cHQgPyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIDpcXG4rXFx0XFx0XFx0XFx0XFx0IHNpemVvZihidWYpLFxcbitcXHRcXHRcXHQgICAgICAgd3JhcHBlZC1cXHUwMDNld3JhcF9ub25jZSk7XFxuK1xcbitcXHRyYyA9IGNyeXB0b193YWl0X3JlcShlbmNyeXB0ID8gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpIDpcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSxcXG4rXFx0XFx0XFx0ICAgICBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXRfcmVxO1xcbitcXG4rXFx0aWYgKGVuY3J5cHQpIHtcXG4rXFx0XFx0bWVtY3B5KHdyYXBwZWQtXFx1MDAzZWVuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XFxuK1xcdFxcdG1lbWNweSh3cmFwcGVkLVxcdTAwM2V0YWcsIGJ1ZiArIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUsXFxuK1xcdFxcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bWVtY3B5KGltYWdlX2tleSwgYnVmLCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0fVxcbitcXG4rb3V0X3JlcTpcXG4rXFx0YWVhZF9yZXF1ZXN0X2ZyZWUocmVxKTtcXG4rb3V0X3RmbTpcXG4rXFx0Y3J5cHRvX2ZyZWVfYWVhZCh0Zm0pO1xcbitvdXRfa2V5OlxcbitcXHRtZW16ZXJvX2V4cGxpY2l0KGJ1Ziwgc2l6ZW9mKGJ1ZikpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcXG4rXFx0XFx0XFx0XFx0ICAgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkKVxcbit7XFxuK1xcdHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0bWVtc2V0KHdyYXBwZWQsIDAsIHNpemVvZigqd3JhcHBlZCkpO1xcbitcXHRtZW1jcHkod3JhcHBlZC1cXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLCBzaXplb2Yod3JhcHBlZC1cXHUwMDNlbWFnaWMpKTtcXG4rXFx0d3JhcHBlZC1cXHUwMDNldmVyc2lvbiA9IGNwdV90b19sZTMyKFNOQVBTSE9UX0tFWV9CTE9CX1ZFUlNJT04pO1xcbitcXG4rXFx0bWVtY3B5KGtleSwgaW1hZ2Vfa2V5LCBzaXplb2Yoa2V5KSk7XFxuK1xcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoY29uc3Qgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkLFxcbitcXHRcXHRcXHRcXHQgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcXG4re1xcbitcXHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgdG1wO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRpZiAobWVtY21wKHdyYXBwZWQtXFx1MDAzZW1hZ2ljLCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYyxcXG4rXFx0XFx0ICAgc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cXHUwMDNldmVyc2lvbikgIT0gU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTilcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHR0bXAgPSAqd3JhcHBlZDtcXG4rXFx0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShcXHUwMDI2dG1wLCBpbWFnZV9rZXksIGZhbHNlKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChcXHUwMDI2dG1wLCBzaXplb2YodG1wKSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rc3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgY29uc3QgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxcbit7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdG1lbWNweShkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cXHUwMDNlYWVhZF90Zm0sIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHRcXHRcXHRzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHRcXHRcXHQgc2l6ZW9mKGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XFxuK1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuKy8qIERlcml2ZSBhIGtleSBmcm9tIHRoZSBrZXJuZWwgYW5kIHVzZXIga2V5cyBmb3IgZGF0YSBlbmNyeXB0aW9uLiAqL1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3VzZV91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcXG4rXFx0c3RydWN0IHNoYTI1Nl9jdHggc2hhMjU2X2N0eDtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyXFxuK1xcdCAqIGtleSwgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGdpdmVzIHRoZSB1c2VyIG1vZGUgcHJlZGljdGFibGUgY29udHJvbFxcbitcXHQgKiBvdmVyIHRoZSBrZXkgYml0cy5cXG4rXFx0ICovXFxuK1xcdHNoYTI1Nl9pbml0KFxcdTAwMjZzaGEyNTZfY3R4KTtcXG4rXFxuK1xcdHNoYTI1Nl91cGRhdGUoXFx1MDAyNnNoYTI1Nl9jdHgsIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHQgICAgICBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0c2hhMjU2X3VwZGF0ZShcXHUwMDI2c2hhMjU2X2N0eCwgZGF0YS1cXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpO1xcbitcXHRzaGEyNTZfZmluYWwoXFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBcXHUwMDNlIFNIQTI1Nl9ESUdFU1RfU0laRSk7XFxuK1xcbitcXHRyYyA9IGNyeXB0b19hZWFkX3NldGtleShkYXRhLVxcdTAwM2VhZWFkX3RmbSxcXG4rXFx0XFx0XFx0XFx0ZGlnZXN0LFxcbitcXHRcXHRcXHRcXHRTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcXG4rXFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdGlmIChkYXRhLVxcdTAwM2V1c2VyX2tleV92YWxpZCBcXHUwMDI2XFx1MDAyNiBkYXRhLVxcdTAwM2VtZXRhX3NpemUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsID09IGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSkge1xcbitcXHRcXHRyZXR1cm4gc25hcHNob3RfdXNlX3VzZXJfa2V5KGRhdGEpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSk7XFxuK1xcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9zZXRfbWV0YV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCB1NjQgbWV0YV9zaXplKVxcbit7XFxuK1xcdGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSA9IG1ldGFfc2l6ZTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobWV0YV9zaXplKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVjb3JkX2VuY3J5cHRlZF9yZWFkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCArPSBjb3VudDtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbit9XFxuK1xcbisvKiBFbmNyeXB0IG1vcmUgZGF0YSBmcm9tIHRoZSBzbmFwc2hvdCBpbnRvIHRoZSBzdGFnaW5nIGFyZWEuICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cXHUwMDNlYWVhZF9yZXE7XFxuK1xcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XFxuK1xcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XFxuK1xcdHNpemVfdCB0b3RhbCA9IDA7XFxuK1xcdGludCBwZ19pZHg7XFxuK1xcdGludCByZXM7XFxuK1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xcbitcXHRcXHRzbmFwc2hvdF9zZXRfbWV0YV9zaXplKGRhdGEsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcXG4rXFx0XFx0aWYgKHJlcylcXG4rXFx0XFx0XFx0cmV0dXJuIHJlcztcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIGZpcnN0IGJ1ZmZlciBpcyB0aGUgYXNzb2NpYXRlZCBkYXRhLCBzZXQgdG8gdGhlIG9mZnNldCB0byBwcmV2ZW50XFxuK1xcdCAqIGF0dGFja3MgdGhhdCByZWFycmFuZ2UgY2h1bmtzLlxcbitcXHQgKi9cXG4rXFx0c2dfc2V0X2J1ZihcXHUwMDI2ZGF0YS1cXHUwMDNlc2dbMF0sIFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF90b3RhbCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsKSk7XFxuK1xcbitcXHQvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi9cXG4rXFx0Zm9yIChwZ19pZHggPSAwOyBwZ19pZHggXFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgrKykge1xcbitcXHRcXHR2b2lkICpidWYgPSBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdO1xcbitcXG4rXFx0XFx0LyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi9cXG4rXFx0XFx0aWYgKGRhdGEtXFx1MDAzZXVzZXJfa2V5X3ZhbGlkIFxcdTAwMjZcXHUwMDI2IHRvdGFsIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAoKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsICsgdG90YWwpID09IGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSkpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXG4rXFx0XFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFxcdTAwMjZkYXRhLVxcdTAwM2VoYW5kbGUpO1xcbitcXHRcXHRpZiAocmVzIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJlcztcXG4rXFx0XFx0aWYgKHJlcyA9PSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBDb3B5IHRoZSBwYWdlIGludG8gdGhlIHN0YWdpbmcgYXJlYS4gQSBmdXR1cmUgb3B0aW1pemF0aW9uXFxuK1xcdFxcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtZW1jcHkoYnVmLCBkYXRhX29mKGRhdGEtXFx1MDAzZWhhbmRsZSksIFBBR0VfU0laRSk7XFxuK1xcdFxcdHNnX3NldF9idWYoXFx1MDAyNmRhdGEtXFx1MDAzZXNnWzEgKyBwZ19pZHhdLCBidWYsIFBBR0VfU0laRSk7XFxuK1xcdFxcdHRvdGFsICs9IFBBR0VfU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCF0b3RhbClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1sxICsgcGdfaWR4XSwgXFx1MDAyNmRhdGEtXFx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHQvKlxcbitcXHQgKiBVc2UgaW5jcmVtZW50aW5nIG5vbmNlcyBmb3IgZWFjaCBjaHVuaywgc2luY2UgYSA2NCBiaXQgdmFsdWUgd29uJ3RcXG4rXFx0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cXG4rXFx0ICovXFxuK1xcdG1lbWNweShcXHUwMDI2bm9uY2VbMF0sIFxcdTAwMjZkYXRhLVxcdTAwM2Vub25jZV9sb3csIHNpemVvZihkYXRhLVxcdTAwM2Vub25jZV9sb3cpKTtcXG4rXFx0bWVtY3B5KFxcdTAwMjZub25jZVtzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KV0sXFxuK1xcdCAgICAgICBcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCxcXG4rXFx0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9sb3cgKz0gMTtcXG4rXFx0LyogVG90YWwgZG9lcyBub3QgaW5jbHVkZSBBQUQgb3IgdGhlIGF1dGggdGFnLiAqL1xcbitcXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cXHUwMDNlc2csIGRhdGEtXFx1MDAzZXNnLCB0b3RhbCwgbm9uY2UpO1xcbitcXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpLCBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyZXMpXFxuK1xcdFxcdHJldHVybiByZXM7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gdG90YWw7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsICs9IHRvdGFsO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogRGVjcnlwdCBkYXRhIGZyb20gdGhlIHN0YWdpbmcgYXJlYSBhbmQgcHVzaCBpdCB0byB0aGUgc25hcHNob3QuICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfZGVjcnlwdF9kcmFpbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLVxcdTAwM2VhZWFkX3JlcTtcXG4rXFx0dTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTtcXG4rXFx0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcXG4rXFx0aW50IHBhZ2VfY291bnQ7XFxuK1xcdHNpemVfdCB0b3RhbDtcXG4rXFx0aW50IHBnX2lkeDtcXG4rXFx0aW50IHJlcztcXG4rXFxuK1xcdC8qIFNldCB1cCB0aGUgYXNzb2NpYXRlZCBkYXRhLiAqL1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1swXSwgXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwpKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXFxuK1xcdCAqIHNob3VsZCBhbHNvIGJlIGEgdGFnIGF0IHRoZSBlbmQsIHNvIHRoZSBvZmZzZXQgd29uJ3QgYmUgYW4gZXZlbiBwYWdlLlxcbitcXHQgKi9cXG4rXFx0cGFnZV9jb3VudCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHR0b3RhbCA9IHBhZ2VfY291bnQgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFx0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIExvYWQgdGhlIHNnIGxpc3Qgd2l0aCB0aGUgY3J5cHQgYnVmZmVyLiBJbmxpbmUgZGVjcnlwdCBiYWNrIGludG8gdGhlXFxuK1xcdCAqIHN0YWdpbmcgYnVmZmVyLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgZGVjcnlwdCBkaXJlY3RseSBpbnRvXFxuK1xcdCAqIGxvd21lbSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFxcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspXFxuK1xcdFxcdHNnX3NldF9idWYoXFx1MDAyNmRhdGEtXFx1MDAzZXNnWzEgKyBwZ19pZHhdLCBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSXQncyBwb3NzaWJsZSB0aGlzIGlzIHRoZSBmaW5hbCBkZWNyeXB0LCBvciB0aGUgZmluYWwgZGVjcnlwdCBvZiB0aGVcXG4rXFx0ICogbWV0YSByZWdpb24sIGFuZCB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBDSFVOS19TSVpFIHBhZ2VzLiBJZiB0aGlzIGlzXFxuK1xcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcXG4rXFx0ICogYnl0ZXMgb2YgYSBuZXcgcGFnZS4gQ29weSB0byB0aGUgdGFnIGlmIHNvLlxcbitcXHQgKi9cXG4rXFx0aWYgKHBhZ2VfY291bnQgXFx1MDAzYyBDSFVOS19TSVpFIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IC0gdG90YWwpID09IHNpemVvZihkYXRhLVxcdTAwM2VhdXRoX3RhZykpIHtcXG4rXFx0XFx0bWVtY3B5KGRhdGEtXFx1MDAzZWF1dGhfdGFnLCBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLFxcbitcXHRcXHQgICAgICAgc2l6ZW9mKGRhdGEtXFx1MDAzZWF1dGhfdGFnKSk7XFxuK1xcdH0gZWxzZSBpZiAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0ICE9XFxuK1xcdFxcdCAgICgoQ0hVTktfU0laRSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1sxICsgcGdfaWR4XSwgXFx1MDAyNmRhdGEtXFx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHRtZW1jcHkoXFx1MDAyNm5vbmNlWzBdLCBcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfbG93LCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcdG1lbWNweShcXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdyldLFxcbitcXHQgICAgICAgXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gsXFxuK1xcdCAgICAgICBzaXplb2Yobm9uY2UpIC0gc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdykpO1xcbitcXG4rXFx0ZGF0YS1cXHUwMDNlbm9uY2VfbG93ICs9IDE7XFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBkYXRhLVxcdTAwM2VzZywgZGF0YS1cXHUwMDNlc2csIHRvdGFsICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSwgbm9uY2UpO1xcbitcXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyZXMpXFxuK1xcdFxcdHJldHVybiByZXM7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcXG4rXFxuK1xcdC8qIFB1c2ggdGhlIGRlY3J5cHRlZCBwYWdlcyBmdXJ0aGVyIGRvd24gdGhlIHN0YWNrLiAqL1xcbitcXHR0b3RhbCA9IDA7XFxuK1xcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFxcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspIHtcXG4rXFx0XFx0dm9pZCAqYnVmID0gZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XTtcXG4rXFxuK1xcdFxcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuK1xcdFxcdGlmIChyZXMgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmVzO1xcbitcXHRcXHRpZiAocmVzID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXG4rXFx0XFx0aWYgKCFkYXRhX29mKGRhdGEtXFx1MDAzZWhhbmRsZSkpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0V0FSTl9PTihyZXMgIT0gUEFHRV9TSVpFKTtcXG4rXFxuK1xcdFxcdC8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqL1xcbitcXHRcXHRtZW1jcHkoZGF0YV9vZihkYXRhLVxcdTAwM2VoYW5kbGUpLCBidWYsIFBBR0VfU0laRSk7XFxuK1xcdFxcdHRvdGFsICs9IFBBR0VfU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsID09IDApIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlbWV0YV9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGlmIChkYXRhLVxcdTAwM2V1c2VyX2tleV92YWxpZClcXG4rXFx0XFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID1cXG4rXFx0XFx0XFx0XFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cXHUwMDNlbWV0YV9zaXplKTtcXG4rXFx0fVxcbitcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgKz0gdG90YWw7XFxuK1xcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcXG4rXFx0aWYgKHJlcylcXG4rXFx0XFx0cmV0dXJuIHJlcztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgdm9pZCAqKmJ1ZilcXG4re1xcbitcXHRzaXplX3QgdGFnX29mZjtcXG4rXFxuK1xcdC8qIFJlZmlsbCB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGVtcHR5LiAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfc2l6ZSA9PSAwIHx8XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwM2U9XFxuK1xcdCAgICAgKGRhdGEtXFx1MDAzZWNyeXB0X3NpemUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKSkpIHtcXG4rXFx0XFx0aW50IHJjO1xcbitcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCA9IDA7XFxuK1xcdFxcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XFxuK1xcdFxcdGlmIChyYyBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0XFx0aWYgKCFkYXRhLVxcdTAwM2VjcnlwdF9zaXplKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNjIGRhdGEtXFx1MDAzZWNyeXB0X3NpemUpIHtcXG4rXFx0XFx0c2l6ZV90IHBnX2lkeCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRcXHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xcbitcXHRcXHQqYnVmID0gZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XSArIHBnX29mZjtcXG4rXFx0XFx0cmV0dXJuIFBBR0VfU0laRSAtIHBnX29mZjtcXG4rXFx0fVxcbitcXG4rXFx0LyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovXFxuK1xcdHRhZ19vZmYgPSBkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgLSBkYXRhLVxcdTAwM2VjcnlwdF9zaXplO1xcbitcXHRpZiAodGFnX29mZiBcXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXFxuK1xcdFxcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xcbitcXG4rXFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcXG4rXFx0cmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB2b2lkICoqYnVmKVxcbit7XFxuK1xcdHNpemVfdCBzaXplX2F2YWlsO1xcbitcXHRzaXplX3QgdGFnX29mZjtcXG4rXFxuK1xcdC8qIFJldHVybiBkYXRhIHBhZ2VzIGlmIHRoZSBvZmZzZXQgaXMgaW4gdGhhdCByZWdpb24uICovXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgXFx1MDAzYyAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkpIHtcXG4rXFx0XFx0c2l6ZV90IHBnX2lkeCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRcXHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xcbitcXG4rXFx0XFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XFxuK1xcdFxcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFVzZSBvZmZzZXRzIGp1c3QgYmV5b25kIHRoZSBzaXplIHRvIHJldHVybiB0aGUgdGFnLiAqL1xcbitcXHRcXHR0YWdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xcbitcXHRcXHRpZiAodGFnX29mZiBcXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXFxuK1xcdFxcdFxcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xcbitcXG4rXFx0XFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcXG4rXFx0XFx0c2l6ZV9hdmFpbCA9IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXFx1MDAzYyBkYXRhLVxcdTAwM2VjcnlwdF9tZXRhX3NpemUpIHtcXG4rXFx0XFx0dTY0IG1ldGFfYXZhaWwgPSBkYXRhLVxcdTAwM2VjcnlwdF9tZXRhX3NpemUgLSBkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWw7XFxuK1xcbitcXHRcXHRzaXplX2F2YWlsID0gbWluX3QodTY0LCBzaXplX2F2YWlsLCBtZXRhX2F2YWlsKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHNpemVfYXZhaWw7XFxuK31cXG4rXFxuK3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXFxuK1xcdFxcdFxcdFxcdGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxcbit7XFxuK1xcdHNpemVfdCBjb3B5X3NpemU7XFxuK1xcdHNpemVfdCBub3RfZG9uZTtcXG4rXFx0c2l6ZV90IHBnX29mZjtcXG4rXFx0dm9pZCAqc3JjO1xcbitcXHRzc2l6ZV90IHNyY19zaXplO1xcbitcXG4rXFx0aWYgKCFjb3VudClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRwZ19vZmYgPSAqb2ZmcCBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xcbitcXG4rXFx0c3JjX3NpemUgPSBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKGRhdGEsIFxcdTAwMjZzcmMpO1xcbitcXHRpZiAoc3JjX3NpemUgXFx1MDAzYz0gMClcXG4rXFx0XFx0cmV0dXJuIHNyY19zaXplO1xcbitcXG4rXFx0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgc3JjX3NpemUpO1xcbitcXHRub3RfZG9uZSA9IGNvcHlfdG9fdXNlcihidWYsIHNyYywgY29weV9zaXplKTtcXG4rXFx0Y29weV9zaXplIC09IG5vdF9kb25lO1xcbitcXHRpZiAoIWNvcHlfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgKz0gY29weV9zaXplO1xcbitcXHQqb2ZmcCArPSBjb3B5X3NpemU7XFxuK1xcdHNuYXBzaG90X3JlY29yZF9lbmNyeXB0ZWRfcmVhZChkYXRhLCBjb3B5X3NpemUpO1xcbitcXHRyZXR1cm4gY29weV9zaXplO1xcbit9XFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0IGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRzaXplX3QgY29weV9zaXplO1xcbitcXHRzaXplX3Qgbm90X2RvbmU7XFxuK1xcdHNpemVfdCBwZ19vZmY7XFxuK1xcdHZvaWQgKmRzdDtcXG4rXFx0c3NpemVfdCBkc3Rfc2l6ZTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0aWYgKCFjb3VudClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRwZ19vZmYgPSAqb2ZmcCBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xcbitcXG4rXFx0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcXHUwMDI2ZHN0KTtcXG4rXFx0aWYgKGRzdF9zaXplIFxcdTAwM2M9IDApXFxuK1xcdFxcdHJldHVybiBkc3Rfc2l6ZTtcXG4rXFxuK1xcdGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTtcXG4rXFx0bm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTtcXG4rXFx0Y29weV9zaXplIC09IG5vdF9kb25lO1xcbitcXHRpZiAoIWNvcHlfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgKz0gY29weV9zaXplO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgKz0gY29weV9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZVxcbitcXHQgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwM2U9XFxuK1xcdCAgICAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFIHx8XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgZGF0YS1cXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSkpIHtcXG4rXFx0XFx0cmMgPSBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKGRhdGEpO1xcbitcXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmM7XFxuK1xcdH1cXG4rXFxuK1xcdCpvZmZwICs9IGNvcHlfc2l6ZTtcXG4rXFx0cmV0dXJuIGNvcHlfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9sb3cgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9oaWdoID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlbWV0YV9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNldXNlcl9rZXlfdmFsaWQgPSBmYWxzZTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcdG1lbXNldChkYXRhLVxcdTAwM2VhdXRoX3RhZywgMCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWF1dGhfdGFnKSk7XFxuK31cXG4rXFxuK3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VhZWFkX3JlcSkge1xcbitcXHRcXHRhZWFkX3JlcXVlc3RfZnJlZShkYXRhLVxcdTAwM2VhZWFkX3JlcSk7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWFlYWRfcmVxID0gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWFlYWRfdGZtKSB7XFxuK1xcdFxcdGNyeXB0b19mcmVlX2FlYWQoZGF0YS1cXHUwMDNlYWVhZF90Zm0pO1xcbitcXHRcXHRkYXRhLVxcdTAwM2VhZWFkX3RmbSA9IE5VTEw7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBDSFVOS19TSVpFOyBpKyspIHtcXG4rXFx0XFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldKSB7XFxuK1xcdFxcdFxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1tpXSk7XFxuK1xcdFxcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChkYXRhLVxcdTAwM2V1c2VyX2tleSwgc2l6ZW9mKGRhdGEtXFx1MDAzZXVzZXJfa2V5KSk7XFxuK1xcdHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0aW50IGksIHJjO1xcbitcXG4rXFx0LyogVGhpcyBvbmx5IHdvcmtzIG9uY2UgcGVyIGhpYmVybmF0ZS4gKi9cXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWFlYWRfdGZtKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7XFxuK1xcdG1lbXNldChkYXRhLVxcdTAwM2VjcnlwdF9wYWdlcywgMCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzKSk7XFxuK1xcbitcXHQvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovXFxuK1xcdGRhdGEtXFx1MDAzZWFlYWRfdGZtID0gY3J5cHRvX2FsbG9jX2FlYWQoXFxcImdjbShhZXMpXFxcIiwgMCwgMCk7XFxuK1xcdGlmIChJU19FUlIoZGF0YS1cXHUwMDNlYWVhZF90Zm0pKSB7XFxuK1xcdFxcdHJjID0gUFRSX0VSUihkYXRhLVxcdTAwM2VhZWFkX3RmbSk7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWFlYWRfdGZtID0gTlVMTDtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbitcXHRyYyA9IC1FTk9NRU07XFxuK1xcdGRhdGEtXFx1MDAzZWFlYWRfcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKGRhdGEtXFx1MDAzZWFlYWRfdGZtLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFkYXRhLVxcdTAwM2VhZWFkX3JlcSlcXG4rXFx0XFx0Z290byBzZXR1cF9mYWlsO1xcbitcXG4rXFx0LyogQWxsb2NhdGUgdGhlIHN0YWdpbmcgYXJlYSAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQ0hVTktfU0laRTsgaSsrKSB7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdGlmICghZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbaV0pXFxuK1xcdFxcdFxcdGdvdG8gc2V0dXBfZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0c2dfaW5pdF90YWJsZShkYXRhLVxcdTAwM2VzZywgQ0hVTktfU0laRSArIDIpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsIGJlIHRoZSBvZmZzZXQgc28gdGhhdCBibG9ja3MgY2FuJ3QgYmVcXG4rXFx0ICogcmVhcnJhbmdlZC5cXG4rXFx0ICovXFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfYWQoZGF0YS1cXHUwMDNlYWVhZF9yZXEsIHNpemVvZihkYXRhLVxcdTAwM2VjcnlwdF90b3RhbCkpO1xcbitcXHRyYyA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGRhdGEtXFx1MDAzZWFlYWRfdGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIHNldHVwX2ZhaWw7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK3NldHVwX2ZhaWw6XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4raW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcXG4rXFx0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XFxuK1xcdHU4IG5vbmNlW1VTV1NVU1BfS0VZX05PTkNFX1NJWkVdO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHQvKiBEb24ndCBwdWxsIGEgcmFuZG9tIGtleSBmcm9tIGEgd29ybGQgdGhhdCBjYW4gYmUgcmVzZXQuICovXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VyZWFkeSlcXG4rXFx0XFx0cmV0dXJuIC1FUElQRTtcXG4rXFxuK1xcdHJjID0gc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oZGF0YSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXG4rXFx0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXFxuK1xcdGdldF9yYW5kb21fYnl0ZXMobm9uY2UsIHNpemVvZihub25jZSkpO1xcbitcXHRtZW1jcHkoXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2xvdywgXFx1MDAyNm5vbmNlWzBdLCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcdG1lbWNweShcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCwgXFx1MDAyNm5vbmNlWzhdLCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCkpO1xcbitcXG4rXFx0LyogQnVpbGQgYW5kIGluc3RhbGwgYSByYW5kb20gaW1hZ2UgZW5jcnlwdGlvbiBrZXkuICovXFxuK1xcdGdldF9yYW5kb21fYnl0ZXMoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdHJjID0gc25hcHNob3RfaW5zdGFsbF9pbWFnZV9rZXkoZGF0YSwgaW1hZ2Vfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRyYyA9IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGltYWdlX2tleSwgXFx1MDAyNndyYXBwZWQpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIEhhbmQgdGhlIHdyYXBwZWQga2V5IGFuZCBjbGVhciBub25jZSBiYWNrIHRvIHVzZXIgbW9kZS4gKi9cXG4rXFx0cmMgPSBwdXRfdXNlcihzaXplb2Yod3JhcHBlZCksIFxcdTAwMjZrZXktXFx1MDAzZWJsb2JfbGVuKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpIFxcdTAwM2VcXG4rXFx0XFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVxcdTAwM2VibG9iKSk7XFxuK1xcdGlmIChjb3B5X3RvX3VzZXIoXFx1MDAyNmtleS1cXHUwMDNlYmxvYiwgXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHtcXG4rXFx0XFx0cmMgPSAtRUZBVUxUO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjb3B5X3RvX3VzZXIoXFx1MDAyNmtleS1cXHUwMDNlbm9uY2UsIFxcdTAwMjZub25jZSwgc2l6ZW9mKG5vbmNlKSkpIHtcXG4rXFx0XFx0cmMgPSAtRUZBVUxUO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbDpcXG4rXFx0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChcXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcXG4rXFx0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcXG4re1xcbitcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjtcXG4rXFx0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcXG4rXFx0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XFxuK1xcdGludCByYztcXG4rXFxuK1xcdC8qIEl0J3MgdG9vIGxhdGUgaWYgZGF0YSdzIGJlZW4gcHVzaGVkIGluLiAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlaGFuZGxlLmN1cilcXG4rXFx0XFx0cmV0dXJuIC1FUElQRTtcXG4rXFxuK1xcdHJjID0gc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oZGF0YSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXG4rXFx0LyogTG9hZCB0aGUga2V5IGZyb20gdXNlciBtb2RlLiAqL1xcbitcXHRibG9iID0gbWVtZHVwX3VzZXIoa2V5LCBzaXplb2YoKmJsb2IpKTtcXG4rXFx0aWYgKElTX0VSUihibG9iKSkge1xcbitcXHRcXHRyYyA9IFBUUl9FUlIoYmxvYik7XFxuK1xcdFxcdGdvdG8gY3J5cHRvX3NldHVwX2ZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChibG9iLVxcdTAwM2VibG9iX2xlbiAhPSBzaXplb2Yod3JhcHBlZCkpIHtcXG4rXFx0XFx0cmMgPSAtRUlOVkFMO1xcbitcXHRcXHRnb3RvIG91dF9ibG9iO1xcbitcXHR9XFxuK1xcbitcXHRtZW1jcHkoXFx1MDAyNndyYXBwZWQsIGJsb2ItXFx1MDAzZWJsb2IsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdHJjID0gc25hcHNob3RfdW53cmFwX2ltYWdlX2tleShcXHUwMDI2d3JhcHBlZCwgaW1hZ2Vfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIG91dF9ibG9iO1xcbitcXG4rXFx0cmMgPSBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShkYXRhLCBpbWFnZV9rZXkpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X2Jsb2I7XFxuK1xcbitcXHQvKiBMb2FkIHRoZSBzdGFydGluZyBub25jZS4gKi9cXG4rXFx0bWVtY3B5KFxcdTAwMjZkYXRhLVxcdTAwM2Vub25jZV9sb3csIFxcdTAwMjZibG9iLVxcdTAwM2Vub25jZVswXSwgc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdykpO1xcbitcXHRtZW1jcHkoXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gsIFxcdTAwMjZibG9iLVxcdTAwM2Vub25jZVs4XSwgc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gpKTtcXG4rXFxuK291dF9ibG9iOlxcbitcXHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY3J5cHRvX3NldHVwX2ZhaWw6XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcXG4re1xcbitcXHRsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGxvZmZfdCBjaHVua3MgPSAocGFnZXMgKyAoQ0hVTktfU0laRSAtIDEpKSAvIENIVU5LX1NJWkU7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBlbmNyeXB0ZWQgc2l6ZSBpcyB0aGUgbm9ybWFsIHNpemUsIHBsdXMgYSBzdGl0Y2hlZCBpblxcbitcXHQgKiBhdXRoZW50aWNhdGlvbiB0YWcgZm9yIGV2ZXJ5IGNodW5rIG9mIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIHBsYWluX3NpemUgKyAoY2h1bmtzICogU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XFxuK31cXG4rXFxuK3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX3NwbGl0X2J5dGVfY291bnQobG9mZl90IHJhd19zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgIGxvZmZfdCBtZXRhX3BsYWluX3NpemUpXFxuK3tcXG4rXFx0aWYgKHJhd19zaXplIFxcdTAwM2M9IG1ldGFfcGxhaW5fc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KHJhd19zaXplKTtcXG4rXFxuK1xcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICtcXG4rXFx0XFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUgLSBtZXRhX3BsYWluX3NpemUpO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KVxcbit7XFxuK1xcdHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHVzZXJfa2V5ID0ge307XFxuK1xcdHVuc2lnbmVkIGludCBrZXlfbGVuO1xcbitcXHR1NjQgc2l6ZTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0aWYgKCFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtXFx1MDAzZXVzZXJfa2V5KSBcXHUwMDNjIHNpemVvZih1c2VyX2tleS5rZXkpKTtcXG4rXFx0cmMgPSAtRUlOVkFMO1xcbitcXHRpZiAodXNlcl9rZXkucmVzZXJ2ZWQpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcXHUwMDNlIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcXHUwMDNjIDgpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXFx1MDAyNlxcdTAwMjYgIWRhdGEtXFx1MDAzZXJlYWR5KSB7XFxuK1xcdFxcdHJjID0gLUVOT0RBVEE7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIHNpemUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgZmVkIGluIGJlZm9yZVxcbitcXHQgKiB0aGUgdXNlciBkYXRhIGtleSBpcyBuZWVkZWQgYXQgcmVzdW1lIHRpbWUuXFxuK1xcdCAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1dST05MWSBcXHUwMDI2XFx1MDAyNiAhZGF0YS1cXHUwMDNlbWV0YV9zaXplKSB7XFxuK1xcdFxcdGlmICh1c2VyX2tleS5tZXRhX3NpemUgXFx1MDAzYyBQQUdFX1NJWkUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9IHVzZXJfa2V5Lm1ldGFfc2l6ZTtcXG4rXFx0XFx0c2l6ZSA9IGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpO1xcbitcXHRcXHRzaXplID0gZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplO1xcbitcXHR9XFxuK1xcbitcXHRyYyA9IHB1dF91c2VyKHNpemUsIFxcdTAwMjZrZXktXFx1MDAzZW1ldGFfc2l6ZSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRrZXlfbGVuID0gdXNlcl9rZXkua2V5X2xlbjtcXG4rXFxuK1xcdC8qIERvbid0IGFsbG93IGl0IGlmIGl0J3MgdG9vIGxhdGUuICovXFxuK1xcdGlmICgoZGF0YS1cXHUwMDNlbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2IGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsIFxcdTAwM2UgZGF0YS1cXHUwMDNlbWV0YV9zaXplKSB8fFxcbitcXHQgICAgKGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIGRhdGEtXFx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbCBcXHUwMDNlIGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSkpIHtcXG4rXFx0XFx0cmMgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRtZW1zZXQoZGF0YS1cXHUwMDNldXNlcl9rZXksIDAsIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpO1xcbitcXHRtZW1jcHkoZGF0YS1cXHUwMDNldXNlcl9rZXksIHVzZXJfa2V5LmtleSwga2V5X2xlbik7XFxuK1xcdGRhdGEtXFx1MDAzZXVzZXJfa2V5X3ZhbGlkID0gdHJ1ZTtcXG4rXFx0LyogSW5zdGFsbCB0aGUga2V5IGlmIHRoZSB1c2VyIGlzIGp1c3QgdW5kZXIgdGhlIHdpcmUuICovXFxuK1xcdHJjID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0cmMgPSAwO1xcbitcXG4rb3V0OlxcbitcXHRtZW16ZXJvX2V4cGxpY2l0KFxcdTAwMjZ1c2VyX2tleSwgc2l6ZW9mKHVzZXJfa2V5KSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IGxvZmZfdCByYXdfc2l6ZSlcXG4re1xcbitcXHRsb2ZmX3QgbWV0YV9wbGFpbl9zaXplID0gZGF0YS1cXHUwMDNlbWV0YV9zaXplO1xcbitcXHRsb2ZmX3Qgc3BsaXRfc2l6ZTtcXG4rXFxuK1xcdGlmICghbWV0YV9wbGFpbl9zaXplKVxcbitcXHRcXHRtZXRhX3BsYWluX3NpemUgPSBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdHNwbGl0X3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChyYXdfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0IG1ldGFfcGxhaW5fc2l6ZSk7XFxuK1xcdGlmICghZGF0YS1cXHUwMDNldXNlcl9rZXlfdmFsaWQpXFxuK1xcdFxcdHJldHVybiBtYXgoc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpLCBzcGxpdF9zaXplKTtcXG4rXFxuK1xcdHJldHVybiBzcGxpdF9zaXplO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgIT0gMCkge1xcbitcXHRcXHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XFxuK1xcdFxcdGlmIChyYylcXG4rXFx0XFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXFxuaW5kZXggZDkzM2I1YjJjMDVkNC4uMDI0MDBhYzEyNWM1OCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xcbisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXFxuQEAgLTIxNzcsNiArMjE3NywxMSBAQCB1bnNpZ25lZCBsb25nIHNuYXBzaG90X2dldF9pbWFnZV9zaXplKHZvaWQpXFxuIFxcdHJldHVybiBucl9jb3B5X3BhZ2VzICsgbnJfbWV0YV9wYWdlcyArIDE7XFxuIH1cXG4gXFxuK3Vuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBucl9tZXRhX3BhZ2VzICsgMTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBpbml0X2hlYWRlcihzdHJ1Y3Qgc3dzdXNwX2luZm8gKmluZm8pXFxuIHtcXG4gXFx0bWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3dzdXNwX2luZm8pKTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3YXAuYyBiL2tlcm5lbC9wb3dlci9zd2FwLmNcXG5pbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9wb3dlci9zd2FwLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXFxuQEAgLTE2Niw2ICsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBzd3N1c3BfZXh0ZW50c19jb250YWluX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQsXFxuK1xcdFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdHN0cnVjdCByYl9ub2RlICpub2RlID0gc3dzdXNwX2V4dGVudHMucmJfbm9kZTtcXG4rXFx0c3RydWN0IHN3c3VzcF9leHRlbnQgKmV4dDtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbmQ7XFxuK1xcbitcXHRpZiAoIW5yX3BhZ2VzKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlbmQgPSBzd2FwX29mZnNldCArIG5yX3BhZ2VzIC0gMTtcXG4rXFx0aWYgKGVuZCBcXHUwMDNjIHN3YXBfb2Zmc2V0KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHR3aGlsZSAobm9kZSkge1xcbitcXHRcXHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XFxuK1xcdFxcdGlmIChzd2FwX29mZnNldCBcXHUwMDNjIGV4dC1cXHUwMDNlc3RhcnQpXFxuK1xcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbitcXHRcXHRlbHNlIGlmIChzd2FwX29mZnNldCBcXHUwMDNlIGV4dC1cXHUwMDNlZW5kKVxcbitcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Z290byBmb3VuZDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rZm91bmQ6XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKHN3YXBfb2Zmc2V0IFxcdTAwM2MgZXh0LVxcdTAwM2VzdGFydClcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoZW5kIFxcdTAwM2M9IGV4dC1cXHUwMDNlZW5kKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0aWYgKGV4dC1cXHUwMDNlZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRzd2FwX29mZnNldCA9IGV4dC1cXHUwMDNlZW5kICsgMTtcXG4rXFx0XFx0bm9kZSA9IHJiX25leHQoXFx1MDAyNmV4dC1cXHUwMDNlbm9kZSk7XFxuK1xcdFxcdGlmICghbm9kZSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0XFx0ZXh0ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHN3c3VzcF9leHRlbnQsIG5vZGUpO1xcbitcXHR9XFxuK31cXG4rXFxuK2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0dTY0IGJsb2NrO1xcbitcXHR1NjQgZW5kO1xcbitcXHR1NjQgZW5kX2Jsb2NrO1xcbitcXG4rXFx0aWYgKHN3YXAgXFx1MDAzYyAwIHx8IHBvcyBcXHUwMDNjIDAgfHwgIWNvdW50KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlbmQgPSAodTY0KXBvcyArIGNvdW50IC0gMTtcXG4rXFx0aWYgKGVuZCBcXHUwMDNjICh1NjQpcG9zKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRibG9jayA9ICh1NjQpcG9zIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGVuZF9ibG9jayA9IGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXG4rXFx0Zm9yICg7Oykge1xcbitcXHRcXHR1NjQgcmVtYWluaW5nX3BhZ2VzID0gZW5kX2Jsb2NrIC0gYmxvY2sgKyAxO1xcbitcXHRcXHRwZ29mZl90IHN3YXBfb2Zmc2V0O1xcbitcXHRcXHRwZ29mZl90IG1hcHBlZF9wYWdlcztcXG4rXFx0XFx0c2VjdG9yX3QgcGFnZV9ibG9jayA9IGJsb2NrO1xcbitcXHRcXHR1NjQgcGFnZXM7XFxuK1xcbitcXHRcXHRpZiAoIXJlbWFpbmluZ19wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdGlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCBcXHUwMDI2c3dhcF9vZmZzZXQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBcXHUwMDI2bWFwcGVkX3BhZ2VzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoIW1hcHBlZF9wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRwYWdlcyA9IG1pbl90KHU2NCwgbWFwcGVkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpO1xcbitcXHRcXHRpZiAoKHU2NCkodW5zaWduZWQgbG9uZylwYWdlcyAhPSBwYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAocGFnZXMgPT0gcmVtYWluaW5nX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0YmxvY2sgKz0gcGFnZXM7XFxuK1xcdH1cXG4rfVxcbitcXG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpXFxuK3tcXG4rXFx0dTY0IGltYWdlX3BhZ2VzID0gRElWX1JPVU5EX1VQX1VMTChpbWFnZV9ieXRlcywgUEFHRV9TSVpFKTtcXG4rXFx0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyArIDE7XFxuK1xcbitcXHRpZiAobWFwX3BhZ2VzIFxcdTAwM2UgVTY0X01BWCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKVxcbitcXHRcXHRyZXR1cm4gVTY0X01BWDtcXG4rXFxuK1xcdHJldHVybiBtYXBfcGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rfVxcbitcXG4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmNcXG5pbmRleCBkMGZjZmJhN2FjMjM1Li41N2I4Y2U4M2E2MjZmIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jXFxuQEAgLTIxLDU0ICsyMSwxODUgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NvbnNvbGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnJlZXplci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcInBvd2VyLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ1c2VyLmhcXFwiXFxuIFxcbiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7XFxuLVxcbi1zdGF0aWMgc3RydWN0IHNuYXBzaG90X2RhdGEge1xcbi1cXHRzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlIGhhbmRsZTtcXG4tXFx0aW50IHN3YXA7XFxuLVxcdGludCBtb2RlO1xcbi1cXHRib29sIGZyb3plbjtcXG4tXFx0Ym9vbCByZWFkeTtcXG4tXFx0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xcbi1cXHRib29sIGZyZWVfYml0bWFwcztcXG4tXFx0ZGV2X3QgZGV2O1xcbi19IHNuYXBzaG90X3N0YXRlO1xcbitzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTtcXG4gXFxuIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpXFxuIHtcXG4gXFx0cmV0dXJuIGhpYmVybmF0aW9uX2F2YWlsYWJsZSgpIFxcdTAwMjZcXHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XFxuIH1cXG4gXFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK3N0YXRpYyBib29sIHNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCBkZXZfdCBkZXYpXFxuK3tcXG4rXFx0cmV0dXJuIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQgXFx1MDAyNlxcdTAwMjYgZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1JET05MWSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRkYXRhLVxcdTAwM2VyZWFkeSBcXHUwMDI2XFx1MDAyNiBkYXRhLVxcdTAwM2VkZXYgPT0gZGV2IFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdGRhdGEtXFx1MDAzZW93bmVyX3RnaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHRsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0bG9mZl90IGhlYWRlcl9vZmZzZXQgPSBkYXRhLVxcdTAwM2Vzd2FwX2hlYWRlcl9vZmZzZXQ7XFxuK1xcdGxvZmZfdCBvZmZzZXQ7XFxuK1xcbitcXHRpZiAocG9zIFxcdTAwM2MgaGVhZGVyX29mZnNldClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0b2Zmc2V0ID0gcG9zIC0gaGVhZGVyX29mZnNldDtcXG4rXFx0cmV0dXJuIG9mZnNldCBcXHUwMDNjIFBBR0VfU0laRSBcXHUwMDI2XFx1MDAyNiBjb3VudCBcXHUwMDNjPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyB1NjQgc25hcHNob3Rfc3dhcF93cml0ZV9idWRnZXQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0dTY0IGltYWdlX2J5dGVzID0gcm91bmRfdXAoZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCwgUEFHRV9TSVpFKTtcXG4rXFx0dTY0IG1hcF9ieXRlcyA9IHN3c3VzcF9zd2FwX21hcF9ieXRlcyhkYXRhLVxcdTAwM2VjcnlwdF9ieXRlc19yZWFkKTtcXG4rXFx0dTY0IGJ1ZGdldCA9IGltYWdlX2J5dGVzICsgbWFwX2J5dGVzO1xcbitcXG4rXFx0aWYgKGltYWdlX2J5dGVzIFxcdTAwM2MgZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCB8fCBidWRnZXQgXFx1MDAzYyBpbWFnZV9ieXRlcylcXG4rXFx0XFx0cmV0dXJuIFU2NF9NQVg7XFxuK1xcbitcXHRyZXR1cm4gYnVkZ2V0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK31cXG4rI2VuZGlmXFxuK1xcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZVxcbitoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcXHUwMDI2c25hcHNob3Rfc3RhdGU7XFxuK1xcdGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFx0Ym9vbCBpbWFnZV9yYW5nZV9hbGxvY2F0ZWQ7XFxuK1xcdHU2NCBzd2FwX2J1ZGdldDtcXG4rXFxuK1xcdGlmICghY291bnQgfHwgIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpXFxuK1xcdFxcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnN5c3RlbV90cmFuc2l0aW9uX211dGV4KTtcXG4rXFxuK1xcdGlmICghc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcbitcXHRpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgPSBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoZGF0YS1cXHUwMDNlc3dhcCwgcG9zLCBjb3VudCk7XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbitcXHRzd2FwX2J1ZGdldCA9IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KGRhdGEpO1xcbitcXHRpZiAoc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKGRhdGEsIHBvcywgY291bnQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXFx1MDAzYz0gUEFHRV9TSVpFIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBQQUdFX1NJWkUgLSBkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXFx1MDAzZT0gY291bnQpIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkICs9IGNvdW50O1xcbitcXHRcXHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUjtcXG4rXFx0fSBlbHNlIGlmIChpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgc3dhcF9idWRnZXQgXFx1MDAzZT0gZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICBzd2FwX2J1ZGdldCAtIGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgXFx1MDAzZT0gY291bnQpIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCArPSBjb3VudDtcXG4rXFx0XFx0dHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9JTUFHRTtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcbitcXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcbitcXHRyZXR1cm4gdHlwZTtcXG4rXFxuK3VubG9jazpcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzeXN0ZW1fdHJhbnNpdGlvbl9tdXRleCk7XFxuK1xcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rI2Vsc2VcXG4rXFx0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rdm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pXFxuK3tcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcXHUwMDI2c25hcHNob3Rfc3RhdGU7XFxuK1xcdHU2NCAqcmVzZXJ2ZWRfdG90YWw7XFxuK1xcdHNpemVfdCB1bnVzZWQ7XFxuK1xcbitcXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIXJlc2VydmVkKVxcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFxuK1xcdGlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIpXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkO1xcbitcXHRlbHNlIGlmICh3cml0dGVuIFxcdTAwM2M9IDApXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkO1xcbitcXHRlbHNlIGlmICh3cml0dGVuIFxcdTAwM2MgcmVzZXJ2ZWQpXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkIC0gd3JpdHRlbjtcXG4rXFx0ZWxzZVxcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFxuK1xcdHJlc2VydmVkX3RvdGFsID0gdHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSID9cXG4rXFx0XFx0XFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA6IFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0KnJlc2VydmVkX3RvdGFsIC09IG1pbl90KHU2NCwgKnJlc2VydmVkX3RvdGFsLCB1bnVzZWQpO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcbit1bmxvY2s6XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkID0gc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pO1xcbitcXHRyZXR1cm4gZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZDtcXG4rfVxcbitcXG4gc3RhdGljIGludCBzbmFwc2hvdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxcbiB7XFxuIFxcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhO1xcbiBcXHR1bnNpZ25lZCBpbnQgc2xlZXBfZmxhZ3M7XFxuIFxcdGludCBlcnJvcjtcXG4gXFxuLVxcdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXFxuK1xcdGlmICghaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbiBcXG4gXFx0c2xlZXBfZmxhZ3MgPSBsb2NrX3N5c3RlbV9zbGVlcCgpO1xcbiBcXG4gXFx0aWYgKCFoaWJlcm5hdGVfYWNxdWlyZSgpKSB7XFxuIFxcdFxcdGVycm9yID0gLUVCVVNZO1xcbi1cXHRcXHRnb3RvIFVubG9jaztcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdH1cXG4gXFxuIFxcdGlmICgoZmlscC1cXHUwMDNlZl9mbGFncyBcXHUwMDI2IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7XFxuIFxcdFxcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XFxuIFxcdFxcdGVycm9yID0gLUVOT1NZUztcXG4tXFx0XFx0Z290byBVbmxvY2s7XFxuK1xcdFxcdGdvdG8gdW5sb2NrO1xcbiBcXHR9XFxuIFxcdG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApO1xcbiBcXHRkYXRhID0gXFx1MDAyNnNuYXBzaG90X3N0YXRlO1xcbiBcXHRmaWxwLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xcbiBcXHRtZW1zZXQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUpKTtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9ieXRlc19yZWFkID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZW93bmVyX3RnaWQgPSBOVUxMO1xcbisjZW5kaWZcXG4gXFx0aWYgKChmaWxwLVxcdTAwM2VmX2ZsYWdzIFxcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkge1xcbiBcXHRcXHQvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovXFxuIFxcdFxcdGRhdGEtXFx1MDAzZXN3YXAgPSBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKHN3c3VzcF9yZXN1bWVfZGV2aWNlLCAwKTtcXG5AQCAtOTksOCArMjMwLDEzIEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0ZGF0YS1cXHUwMDNlcmVhZHkgPSBmYWxzZTtcXG4gXFx0ZGF0YS1cXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCA9IGZhbHNlO1xcbiBcXHRkYXRhLVxcdTAwM2VkZXYgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkID0gc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKTtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0aWYgKCFlcnJvcilcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlb3duZXJfdGdpZCA9IGdldF90YXNrX3BpZChjdXJyZW50LCBQSURUWVBFX1RHSUQpO1xcbisjZW5kaWZcXG4gXFxuLSBVbmxvY2s6XFxuKyB1bmxvY2s6XFxuIFxcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xcbiBcXG4gXFx0cmV0dXJuIGVycm9yO1xcbkBAIC0xMTYsNiArMjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0c3dzdXNwX2ZyZWUoKTtcXG4gXFx0ZGF0YSA9IGZpbHAtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFx0ZGF0YS1cXHUwMDNlZGV2ID0gMDtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0cHV0X3BpZChkYXRhLVxcdTAwM2Vvd25lcl90Z2lkKTtcXG4rXFx0ZGF0YS1cXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XFxuKyNlbmRpZlxcbiBcXHRmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtXFx1MDAzZXN3YXApO1xcbiBcXHR1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGF0YS1cXHUwMDNlc3dhcCk7XFxuIFxcdGlmIChkYXRhLVxcdTAwM2Vmcm96ZW4pIHtcXG5AQCAtMTI1LDYgKzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0fSBlbHNlIGlmIChkYXRhLVxcdTAwM2VmcmVlX2JpdG1hcHMpIHtcXG4gXFx0XFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xcbiBcXHR9XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuIFxcdHBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1JET05MWSA/XFxuIFxcdFxcdFxcdFBNX1BPU1RfSElCRVJOQVRJT04gOiBQTV9QT1NUX1JFU1RPUkUpO1xcbiBcXHRoaWJlcm5hdGVfcmVsZWFzZSgpO1xcbkBAIC0xNDcsMTIgKzI4OCwyMyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXHRkYXRhID0gZmlscC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiBcXHRpZiAoIWRhdGEtXFx1MDAzZXJlYWR5KSB7XFxuIFxcdFxcdHJlcyA9IC1FTk9EQVRBO1xcbi1cXHRcXHRnb3RvIFVubG9jaztcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcXG4rXFx0XFx0cmVzID0gLUVQRVJNO1xcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdH1cXG4rXFxuIFxcdGlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqL1xcbiBcXHRcXHRyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuIFxcdFxcdGlmIChyZXMgXFx1MDAzYz0gMClcXG4tXFx0XFx0XFx0Z290byBVbmxvY2s7XFxuK1xcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xcbiBcXHR9XFxuQEAgLTE2Miw3ICszMTQsNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXHRpZiAocmVzIFxcdTAwM2UgMClcXG4gXFx0XFx0Km9mZnAgKz0gcmVzO1xcbiBcXG4tIFVubG9jazpcXG4rIHVubG9jazpcXG4gXFx0dW5sb2NrX3N5c3RlbV9zbGVlcChzbGVlcF9mbGFncyk7XFxuIFxcbiBcXHRyZXR1cm4gcmVzO1xcbkBAIC0xODUsNiArMzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXG4gXFx0ZGF0YSA9IGZpbHAtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFxuK1xcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XFxuK1xcdFxcdHJlcyA9IC1FUEVSTTtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcXG4rXFx0XFx0cmVzID0gc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKGRhdGEsIGJ1ZiwgY291bnQsIG9mZnApO1xcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFx0fVxcbitcXG4gXFx0aWYgKCFwZ19vZmZwKSB7XFxuIFxcdFxcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuIFxcdFxcdGlmIChyZXMgXFx1MDAzYz0gMClcXG5AQCAtMjUyLDYgKzQxNSw5IEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfc2V0X3N3YXBfYXJlYShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4gXFx0aWYgKGRhdGEtXFx1MDAzZXN3YXAgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gc3dkZXYgPyAtRU5PREVWIDogLUVJTlZBTDtcXG4gXFx0ZGF0YS1cXHUwMDNlZGV2ID0gc3dkZXY7XFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcdGRhdGEtXFx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuKyNlbmRpZlxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG5AQCAtMzE4LDYgKzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG4gXFx0XFx0XFx0ZXJyb3IgPSAtRVBFUk07XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuK1xcdFxcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XFxuK1xcdFxcdFxcdGVycm9yID0gLUVQRVJNO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbiBcXHRcXHRwbV9yZXN0b3JlX2dmcF9tYXNrKCk7XFxuIFxcdFxcdGVycm9yID0gaGliZXJuYXRpb25fc25hcHNob3QoZGF0YS1cXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCk7XFxuIFxcdFxcdGlmICghZXJyb3IpIHtcXG5AQCAtMzI4LDYgKzQ5OSwxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRjYXNlIFNOQVBTSE9UX0FUT01JQ19SRVNUT1JFOlxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcXG4rXFx0XFx0XFx0aWYgKGVycm9yKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4gXFx0XFx0ZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShcXHUwMDI2ZGF0YS1cXHUwMDNlaGFuZGxlKTtcXG4gXFx0XFx0aWYgKGVycm9yKVxcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMzQ2LDYgKzUyOCw3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHRzd3N1c3BfZnJlZSgpO1xcbiBcXHRcXHRtZW1zZXQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUpKTtcXG4gXFx0XFx0ZGF0YS1cXHUwMDNlcmVhZHkgPSBmYWxzZTtcXG4rXFx0XFx0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogSXQgaXMgbmVjZXNzYXJ5IHRvIHRoYXcga2VybmVsIHRocmVhZHMgaGVyZSwgYmVjYXVzZVxcbiBcXHRcXHQgKiBTTkFQU0hPVF9DUkVBVEVfSU1BR0UgbWF5IGJlIGludm9rZWQgZGlyZWN0bHkgYWZ0ZXJcXG5AQCAtMzY4LDYgKzU1MSw4IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHR9XFxuIFxcdFxcdHNpemUgPSBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSgpO1xcbiBcXHRcXHRzaXplIFxcdTAwM2NcXHUwMDNjPSBQQUdFX1NISUZUO1xcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxcbitcXHRcXHRcXHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xcbiBcXHRcXHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbkBAIC0zOTcsNiArNTgyLDkgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cXHUwMDNlc3dhcCk7XFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcdFxcdHNuYXBzaG90X3Jlc2V0X3N3YXBfd3JpdGVfcmVzZXJ2YXRpb24oZGF0YSk7XFxuKyNlbmRpZlxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgU05BUFNIT1RfUzJSQU06XFxuQEAgLTQwNCw2ICs1OTIsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdFxcdGVycm9yID0gLUVQRVJNO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGhcXG4gXFx0XFx0ICogUE1fSElCRVJOQVRJT05fUFJFUEFSRVxcbkBAIC00MTcsNiArNjEwLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgU05BUFNIT1RfUE9XRVJfT0ZGOlxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0aWYgKGRhdGEtXFx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpXFxuIFxcdFxcdFxcdGVycm9yID0gaGliZXJuYXRpb25fcGxhdGZvcm1fZW50ZXIoKTtcXG4gXFx0XFx0YnJlYWs7XFxuQEAgLTQyNSw2ICs2MjMsMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X3N3YXBfYXJlYShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xcbiBcXHRcXHRicmVhaztcXG4gXFxuK1xcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XFxuK1xcdFxcdGlmIChkYXRhLVxcdTAwM2Vtb2RlID09IE9fUkRPTkxZKVxcbitcXHRcXHRcXHRlcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4rXFx0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XFxuK1xcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X3VzZXJfa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0ZXJyb3IgPSAtRU5PVFRZO1xcbiBcXG5AQCAtNDQ4LDYgKzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIFxcdGNhc2UgU05BUFNIT1RfQUxMT0NfU1dBUF9QQUdFOlxcbiBcXHRjYXNlIFNOQVBTSE9UX0NSRUFURV9JTUFHRTpcXG4gXFx0Y2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOlxcbitcXHRjYXNlIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OOlxcbitcXHRjYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWTpcXG4gXFx0XFx0cmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvbXBhdF9wdHIoYXJnKSk7XFxuIFxcdGRlZmF1bHQ6XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmggYi9rZXJuZWwvcG93ZXIvdXNlci5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi40ZGYyZjlhZTlhZGE0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmhcXG5AQCAtMCwwICsxLDE1MSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyeXB0by5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NhdHRlcmxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdXNwZW5kX2lvY3Rscy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3J5cHRvL2FlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9hZXMuaFxcdTAwM2VcXG4rXFxuK3N0cnVjdCBwaWQ7XFxuK1xcbisjZGVmaW5lIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUgQUVTX0tFWVNJWkVfMTI4XFxuKyNkZWZpbmUgU05BUFNIT1RfQVVUSF9UQUdfU0laRSAxNlxcbitcXG4rLyogRGVmaW5lIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gYSBzaW5nbGUgQUVBRCBlbmNyeXB0aW9uIGNodW5rLiAqL1xcbisjZGVmaW5lIENIVU5LX1NJWkUgMTZcXG4rXFxuK3N0cnVjdCBzbmFwc2hvdF9kYXRhIHtcXG4rXFx0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XFxuK1xcdGludCBzd2FwO1xcbitcXHRpbnQgbW9kZTtcXG4rXFx0Ym9vbCBmcm96ZW47XFxuK1xcdGJvb2wgcmVhZHk7XFxuK1xcdGJvb2wgcGxhdGZvcm1fc3VwcG9ydDtcXG4rXFx0Ym9vbCBmcmVlX2JpdG1hcHM7XFxuK1xcdGJvb2wgZW5jcnlwdGlvbl9yZXF1aXJlZDtcXG4rXFx0ZGV2X3QgZGV2O1xcbitcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTtcXG4rXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqYWVhZF9yZXE7XFxuK1xcdHZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdO1xcbitcXHR1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTtcXG4rXFx0c3RydWN0IHNjYXR0ZXJsaXN0IHNnW0NIVU5LX1NJWkUgKyAyXTsgLyogQWRkIHJvb20gZm9yIEFEIGFuZCBhdXRoIHRhZy4gKi9cXG4rXFx0c2l6ZV90IGNyeXB0X29mZnNldDtcXG4rXFx0c2l6ZV90IGNyeXB0X3NpemU7XFxuK1xcdHU2NCBjcnlwdF90b3RhbDtcXG4rXFx0dTY0IGNyeXB0X3N0cmVhbV90b3RhbDtcXG4rXFx0dTY0IG5vbmNlX2xvdztcXG4rXFx0dTY0IG5vbmNlX2hpZ2g7XFxuK1xcdHU4IGVuY3J5cHRpb25fa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHR1OCB1c2VyX2tleVtVU1dTVVNQX1VTRVJfS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHRib29sIHVzZXJfa2V5X3ZhbGlkO1xcbitcXHR1NjQgbWV0YV9zaXplO1xcbitcXHR1NjQgY3J5cHRfbWV0YV9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBQcm90ZWN0cyBjcnlwdF9ieXRlc19yZWFkIGFuZCB0aGUgcmVzZXJ2YXRpb24gY291bnRlcnMgYmVsb3cuXFxuK1xcdCAqIGNyeXB0X3N3YXBfcmVzZXJ2ZWQgY292ZXJzIGVuY3J5cHRlZCBzbmFwc2hvdCBieXRlcyBhbmQgdXNlcnNwYWNlXFxuK1xcdCAqIGdlbmVyYXRlZCBzd2FwLW1hcCBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHNwaW5sb2NrX3QgY3J5cHRfbG9jaztcXG4rXFx0dTY0IGNyeXB0X2J5dGVzX3JlYWQ7XFxuK1xcdHU2NCBjcnlwdF9zd2FwX3Jlc2VydmVkO1xcbitcXHR1NjQgY3J5cHRfaGVhZGVyX3Jlc2VydmVkO1xcbitcXHRsb2ZmX3Qgc3dhcF9oZWFkZXJfb2Zmc2V0O1xcbitcXHRzdHJ1Y3QgcGlkICpvd25lcl90Z2lkO1xcbisjZW5kaWZcXG4rXFxuK307XFxuK1xcbitleHRlcm4gc3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XFxuK1xcbisvKiBrZXJuZWwvcG93ZXIvc25hcGVuYy5jIHJvdXRpbmVzICovXFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7XFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0IGxvZmZfdCAqb2ZmcCk7XFxuK1xcbit2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpO1xcbitpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcXG4rXFxuK2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpO1xcbitcXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IGxvZmZfdCByYXdfc2l6ZSk7XFxuK1xcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0cmV0dXJuIGRhdGEtXFx1MDAzZWFlYWRfdGZtO1xcbit9XFxuK1xcbisjZWxzZVxcbitcXG4rc3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpIHt9XFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgbG9mZl90IHJhd19zaXplKVxcbit7XFxuK1xcdHJldHVybiByYXdfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHJldHVybiAtRU5PVFRZO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rI2VuZGlmXFxuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXFxuaW5kZXggNzhiNDliMDY1OGFkZC4uMTFkZjBjNTU2ZjRlOSAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwZmlsZS5jXFxuKysrIGIvbW0vc3dhcGZpbGUuY1xcbkBAIC0yMzY2LDYgKzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpXFxuIFxcdHJldHVybiBzZS1cXHUwMDNlc3RhcnRfYmxvY2sgKyAob2Zmc2V0IC0gc2UtXFx1MDAzZXN0YXJ0X3BhZ2UpO1xcbiB9XFxuIFxcbitpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQsXFxuK1xcdFxcdFxcdCAgICBwZ29mZl90ICpucl9wYWdlcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcXG4rXFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZTtcXG4rXFx0c3RydWN0IHJiX25vZGUgKnJiO1xcbitcXG4rXFx0aWYgKCFzaSB8fCAhKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcbitcXHRmb3IgKHJiID0gcmJfZmlyc3QoXFx1MDAyNnNpLVxcdTAwM2Vzd2FwX2V4dGVudF9yb290KTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHtcXG4rXFx0XFx0c2UgPSByYl9lbnRyeShyYiwgc3RydWN0IHN3YXBfZXh0ZW50LCByYl9ub2RlKTtcXG4rXFx0XFx0aWYgKGJsb2NrIFxcdTAwM2U9IHNlLVxcdTAwM2VzdGFydF9ibG9jayBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgYmxvY2sgLSBzZS1cXHUwMDNlc3RhcnRfYmxvY2sgXFx1MDAzYyBzZS1cXHUwMDNlbnJfcGFnZXMpIHtcXG4rXFx0XFx0XFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cXHUwMDNlc3RhcnRfYmxvY2s7XFxuK1xcbitcXHRcXHRcXHQqb2Zmc2V0ID0gc2UtXFx1MDAzZXN0YXJ0X3BhZ2UgKyBwYWdlO1xcbitcXHRcXHRcXHQqbnJfcGFnZXMgPSBzZS1cXHUwMDNlbnJfcGFnZXMgLSBwYWdlO1xcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLUVOT0VOVDtcXG4rfVxcbitcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxcbit7XFxuK1xcdHBnb2ZmX3QgbnJfcGFnZXM7XFxuK1xcbitcXHRyZXR1cm4gc3dhcGRldl9ibG9ja190b19leHRlbnQodHlwZSwgYmxvY2ssIG9mZnNldCwgXFx1MDAyNm5yX3BhZ2VzKTtcXG4rfVxcbitcXG4gLypcXG4gICogUmV0dXJuIGVpdGhlciB0aGUgdG90YWwgbnVtYmVyIG9mIHN3YXAgcGFnZXMgb2YgZ2l2ZW4gdHlwZSwgb3IgdGhlIG51bWJlclxcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxMjoxMjo1OC4yMDI3MDk4NTJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxODM0MzkzMjQ4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFTkNSWVBURURfSElCRVJOQVRJT05cIixcbiAgICBcIkhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlwiLFxuICAgIFwiSElCRVJOQVRJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWRcIixcbiAgICBcInNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9zZXRfdXNlcl9rZXlcIixcbiAgICBcInNuYXBzaG90X3JlYWRfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRcIixcbiAgICBcInNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZVwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luXCIsXG4gICAgXCJoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kXCIsXG4gICAgXCJzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWRcIixcbiAgICBcInN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhMDNjMDIwZTdhMmMyZmZmMmVhMmI0ZDM4MDg3YzA4NGQ2NjQ1N2FhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgNCAxMjoxMjo1NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG5pbmRleCBkMzhkYTA3NzkwNWE5Li41N2Y2MDYzZWY4OGM5IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxuQEAgLTQ3MCwzICs0NzAsMTcgQEAgRGVzY3JpcHRpb246XG4gXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogM1xuK1xuK1doYXQ6XHRcdC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZFxuK0RhdGU6XHRcdEp1bHkgMjAyNlxuK0NvbnRhY3Q6XHRsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmdcbitEZXNjcmlwdGlvbjpcbitcdFx0V3JpdGUtb25seSBmaWxlIHByZXNlbnQgd2hlbiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OPXkuXG4rXG4rXHRcdFRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIHdyaXRlcyBhIDMyLWJ5dGUgc2VlZCwgZW5jb2RlZCBhc1xuK1x0XHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXG4rXHRcdGVuYWJsaW5nIGVuY3J5cHRlZCB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLlxuK1xuK1x0XHRUaGUgZmlyc3Qgc3VjY2Vzc2Z1bCB3cml0ZSBsb2NrcyB0aGUgc2VlZCB1bnRpbCB0aGUgbmV4dCBib290LlxuK1x0XHRXcml0aW5nIHRoZSBzYW1lIHNlZWQgYWdhaW4gc3VjY2VlZHMuIFdyaXRpbmcgYSBkaWZmZXJlbnQgc2VlZFxuK1x0XHRmYWlscyB3aXRoIEVQRVJNLlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdFxuaW5kZXggMWNmNjJkODBhOWNhMS4uZGY4ZWNhOWU2ZTM2MyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG5AQCAtMTE1LDYgKzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxuIFx0dG8gcmVzdW1lIHRoZSBzeXN0ZW0gZnJvbSBSQU0gaWYgdGhlcmUncyBlbm91Z2ggYmF0dGVyeSBwb3dlciBvciByZXN0b3JlXG4gXHRpdHMgc3RhdGUgb24gdGhlIGJhc2lzIG9mIHRoZSBzYXZlZCBzdXNwZW5kIGltYWdlIG90aGVyd2lzZSlcbiBcbitTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTlxuK1x0RW5hYmxlcyBlbmNyeXB0aW9uIG9mIHRoZSBoaWJlcm5hdGUgaW1hZ2Ugd2l0aGluIHRoZSBrZXJuZWwuIFRydXN0ZWRcbitcdGVhcmx5IHVzZXJzcGFjZSBtdXN0IHdyaXRlIHRoZSAzMi1ieXRlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCB0b1xuK1x0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgaW9jdGwuIFVwb24gc3VzcGVuZFxuK1x0KGllIHdoZW4gdGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nKSwgdGhpcyBpb2N0bCByZXR1cm5zXG4rXHRhbiBvcGFxdWUgd3JhcHBlZCBrZXkgYmxvYiBhbmQgdGhlIHN0YXJ0aW5nIG5vbmNlLiBVcG9uIHJlc3VtZSAoaWUgd2hlblxuK1x0dGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciB3cml0aW5nKSwgdGhpcyBpb2N0bCByZWNlaXZlcyB0aGVcbitcdHNhbWUgYmxvYiBhbmQgbm9uY2UgZnJvbSB1c2VybW9kZSBhZnRlciB0aGUgc2FtZSBzZWVkIGhhcyBiZWVuIHdyaXR0ZW5cbitcdHRvIC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZC4gVGhlIHBsYWludGV4dCBpbWFnZSBrZXkgaXMgZ2VuZXJhdGVkIGFuZFxuK1x0dW53cmFwcGVkIGluc2lkZSB0aGUga2VybmVsLlxuK1xuK1NOQVBTSE9UX1NFVF9VU0VSX0tFWVxuK1x0TWl4ZXMgYWRkaXRpb25hbCB1c2VyIGtleSBtYXRlcmlhbCBpbnRvIHRoZSBkYXRhIHBvcnRpb24gb2YgYW4gZW5jcnlwdGVkXG4rXHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXG4rXHRrZXlfbGVuIG11c3QgYmUgYmV0d2VlbiA4IGFuZCBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgYnl0ZXMsIGFuZCByZXNlcnZlZFxuK1x0bXVzdCBiZSB6ZXJvLiBEdXJpbmcgaGliZXJuYXRpb24gdGhlIGtlcm5lbCB3cml0ZXMgbWV0YV9zaXplIHdpdGggdGhlXG4rXHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcbitcdG1ldGFfc2l6ZSBiYWNrIHNvIHRoZSBrZXJuZWwgY2FuIHN3aXRjaCBrZXlzIGF0IHRoZSBtZXRhZGF0YSBib3VuZGFyeVxuK1x0YmVmb3JlIHRoZSBzbmFwc2hvdCBoZWFkZXIgaGFzIGJlZW4gZGVjcnlwdGVkLlxuK1xuIFRoZSBkZXZpY2UncyByZWFkKCkgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBzbmFwc2hvdCBpbWFnZSBmcm9tXG4gdGhlIGtlcm5lbC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOlxuIFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2ZvcHMuYyBiL2Jsb2NrL2ZvcHMuY1xuaW5kZXggMTU3ODNhNjE4MGRlYy4uZWZlYjQ4NWU5MWU2YyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2ZvcHMuY1xuKysrIGIvYmxvY2svZm9wcy5jXG5AQCAtNzIzLDQzICs3MjMsNjUgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItXHUwMDNla2lfZmlscDtcbiBcdHN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBiZGV2X2ZpbGVfaW5vZGUoZmlsZSk7XG4gXHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGJkX2lub2RlKTtcbitcdGRldl90IGRldiA9IGJkX2lub2RlLVx1MDAzZWlfcmRldjtcbiBcdGJvb2wgYXRvbWljID0gaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgSU9DQl9BVE9NSUM7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGJkZXZfbnJfYnl0ZXMoYmRldik7XG4rXHRlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSBoaWJlcm5hdGVfd3JpdGU7XG4rXHRzaXplX3QgaGliZXJuYXRlX2xlbiA9IDA7XG4gXHRzaXplX3Qgc2hvcnRlZCA9IDA7XG4rXHRzc2l6ZV90IGhpYmVybmF0ZV93cml0dGVuID0gMDtcbiBcdHNzaXplX3QgcmV0O1xuIFxuIFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFxuLVx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcdTAwMjZcdTAwMjYgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGJkX2lub2RlLVx1MDAzZWlfcmRldikpXG4tXHRcdHJldHVybiAtRVRYVEJTWTtcbitcdGlmIChJU19TV0FQRklMRShiZF9pbm9kZSkgXHUwMDI2XHUwMDI2ICFpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXYpKSB7XG4rXHRcdGlmICghaXNfc3luY19raW9jYihpb2NiKSB8fCAhaW9jYl9pc19kc3luYyhpb2NiKSB8fFxuK1x0XHQgICAgKGlvY2ItXHUwMDNla2lfZmxhZ3MgXHUwMDI2IElPQ0JfRElSRUNUKSlcbitcdFx0XHRyZXR1cm4gLUVUWFRCU1k7XG4gXG4tXHRpZiAoIWlvdl9pdGVyX2NvdW50KGZyb20pKVxuLVx0XHRyZXR1cm4gMDtcbitcdFx0aGliZXJuYXRlX2xlbiA9IGlvdl9pdGVyX2NvdW50KGZyb20pO1xuK1x0XHRoaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLVx1MDAzZWtpX3BvcywgaGliZXJuYXRlX2xlbik7XG4rXHRcdGlmIChoaWJlcm5hdGVfd3JpdGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUpXG4rXHRcdFx0cmV0dXJuIC1FVFhUQlNZO1xuK1x0fSBlbHNlIHtcbitcdFx0aGliZXJuYXRlX3dyaXRlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4rXHR9XG4gXG4tXHRpZiAoaW9jYi1cdTAwM2VraV9wb3MgXHUwMDNlPSBzaXplKVxuLVx0XHRyZXR1cm4gLUVOT1NQQztcbitcdGlmICghaW92X2l0ZXJfY291bnQoZnJvbSkpIHtcbitcdFx0cmV0ID0gMDtcbitcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0fVxuIFxuLVx0aWYgKChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHRpZiAoaW9jYi1cdTAwM2VraV9wb3MgXHUwMDNlPSBzaXplKSB7XG4rXHRcdHJldCA9IC1FTk9TUEM7XG4rXHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbitcdH1cbitcbitcdGlmICgoaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgKElPQ0JfTk9XQUlUIHwgSU9DQl9ESVJFQ1QpKSA9PSBJT0NCX05PV0FJVCkge1xuK1x0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0fVxuIFxuIFx0aWYgKGF0b21pYykge1xuIFx0XHRyZXQgPSBnZW5lcmljX2F0b21pY193cml0ZV92YWxpZChpb2NiLCBmcm9tKTtcbiBcdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcdH1cbiBcbiBcdHNpemUgLT0gaW9jYi1cdTAwM2VraV9wb3M7XG4gXHRpZiAoaW92X2l0ZXJfY291bnQoZnJvbSkgXHUwMDNlIHNpemUpIHtcbi1cdFx0aWYgKGF0b21pYylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0aWYgKGF0b21pYykge1xuK1x0XHRcdHJldCA9IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0XHR9XG4gXHRcdHNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7XG4gXHRcdGlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpO1xuIFx0fVxuIFxuIFx0cmV0ID0gZmlsZV91cGRhdGVfdGltZShmaWxlKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiByZXQ7XG4rXHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcbiBcdGlmIChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiBJT0NCX0RJUkVDVCkge1xuIFx0XHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xuQEAgLTc3Nyw5ICs3OTksMTYgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gXHRcdGlub2RlX3VubG9ja19zaGFyZWQoYmRfaW5vZGUpO1xuIFx0fVxuIFxuLVx0aWYgKHJldCBcdTAwM2UgMClcbitcdGlmIChyZXQgXHUwMDNlIDApIHtcbitcdFx0aGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7XG4gXHRcdHJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpO1xuK1x0fVxuIFx0aW92X2l0ZXJfcmVleHBhbmQoZnJvbSwgaW92X2l0ZXJfY291bnQoZnJvbSkgKyBzaG9ydGVkKTtcbitcbitvdXRfaGliZXJuYXRlOlxuK1x0aWYgKGhpYmVybmF0ZV9sZW4pXG4rXHRcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxuK1x0XHRcdFx0XHQgICAgIGhpYmVybmF0ZV93cml0dGVuKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbmluZGV4IGIwMjg3NmYxYWUzOGEuLjgzMDhhNjU4Mzc1NmMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbkBAIC00MjYsMTAgKzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gXG4gaW50IGFyY2hfcmVzdW1lX25vc210KHZvaWQpO1xuIFxuK2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHtcbitcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FLFxuK1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFLFxuK1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUixcbit9O1xuK1xuICNpZmRlZiBDT05GSUdfSElCRVJOQVRJT05fU05BUFNIT1RfREVWXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldik7XG4rZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbitoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpO1xuK3ZvaWQgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZChlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlLFxuK1x0XHRcdFx0ICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cbitcbitzdGF0aWMgaW5saW5lIGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuK3tcbitcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbitcdFx0XHRcdFx0XHRzaXplX3QgcmVzZXJ2ZWQsXG4rXHRcdFx0XHRcdFx0c3NpemVfdCB3cml0dGVuKVxuK3tcbit9XG4gI2VuZGlmXG4gXG4gLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTQzOSw2ICs0MzksOSBAQCBleHRlcm4gaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KTtcbiBpbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpO1xuIGV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQsIGludCk7XG4gZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTtcbitpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQpO1xuK2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbitcdFx0XHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpO1xuIGV4dGVybiBpbnQgX19zd2FwX2NvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcbiBleHRlcm4gYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4gZXh0ZXJuIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcbkBAIC01MzUsNiArNTM4LDE5IEBAIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9zd2FwX2V4dGVudChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxuIHtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbitcbitzdGF0aWMgaW5saW5lIGludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssXG4rXHRcdFx0XHRcdCAgcGdvZmZfdCAqb2Zmc2V0KVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssXG4rXHRcdFx0XHRcdCAgcGdvZmZfdCAqb2Zmc2V0LFxuK1x0XHRcdFx0XHQgIHBnb2ZmX3QgKm5yX3BhZ2VzKVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cbiAjaWZkZWYgQ09ORklHX01FTUNHXG4gc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5pbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5AQCAtMTMsNiArMTMsMzEgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xuIFx0X191MzIgZGV2O1xuIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4gXG4rI2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2XG4rI2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzJcbitcbisvKlxuKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlXG4rICogZW5jcnlwdGlvbiBrZXkgYW5kIHN0YXJ0aW5nIG5vbmNlIGluIGVpdGhlciBkaXJlY3Rpb24uXG4rICovXG4rc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2Ige1xuK1x0X191MzIgYmxvYl9sZW47XG4rXHRfX3U4IGJsb2JbNTEyXTtcbitcdF9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4rXG4rLypcbisgKiBBbGxvdyB1c2VyIG1vZGUgdG8gZm9sZCBpbiBrZXkgbWF0ZXJpYWwgZm9yIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGhpYmVybmF0ZVxuKyAqIGltYWdlLlxuKyAqL1xuK3N0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHtcbitcdC8qIEtlcm5lbCByZXR1cm5zIHRoZSBtZXRhZGF0YSBzaXplOyByZXN1bWUgcGFzc2VzIHRoZSBzYXZlZCB2YWx1ZSBpbi4gKi9cbitcdF9fdTY0IG1ldGFfc2l6ZTtcbitcdF9fdTMyIGtleV9sZW47XG4rXHRfX3UzMiByZXNlcnZlZDtcbitcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4rXG4gI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUNcdCczJ1xuICNkZWZpbmUgU05BUFNIT1RfRlJFRVpFXHRcdFx0X0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSlcbiAjZGVmaW5lIFNOQVBTSE9UX1VORlJFRVpFXHRcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDIpXG5AQCAtMjksNiArNTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xuICNkZWZpbmUgU05BUFNIT1RfUFJFRl9JTUFHRV9TSVpFXHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxOClcbiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRVx0X0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDE5LCBfX2tlcm5lbF9sb2ZmX3QpXG4gI2RlZmluZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0VcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KVxuLSNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXHQyMFxuKyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFxcXG4rXHRcdFx0XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYilcbisjZGVmaW5lIFNOQVBTSE9UX1NFVF9VU0VSX0tFWVx0XHRfSU9XUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIyLCBcXFxuK1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXG4rI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlJcdDIyXG4gXG4gI2VuZGlmIC8qIF9MSU5VWF9TVVNQRU5EX0lPQ1RMU19IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuaW5kZXggNTMwYzg5NzMxMWQ0NC4uYTliZWU3MTU3MWNmYSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnXG4rKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuQEAgLTExNSw2ICsxMTUsMjEgQEAgY29uZmlnIEhJQkVSTkFUSU9OX0RFRl9DT01QXG4gXHRoZWxwXG4gXHQgIERlZmF1bHQgY29tcHJlc3NvciB0byBiZSB1c2VkIGZvciBoaWJlcm5hdGlvbi5cbiBcbitjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rXHRib29sIFwiRW5jcnlwdGlvbiBzdXBwb3J0IGZvciB1c2Vyc3BhY2Ugc25hcHNob3RzXCJcbitcdGRlcGVuZHMgb24gSElCRVJOQVRJT05fU05BUFNIT1RfREVWXG4rXHRzZWxlY3QgQ1JZUFRPX0FFU1xuK1x0c2VsZWN0IENSWVBUT19HQ01cbitcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxuK1x0aGVscFxuK1x0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXG4rXHQgIGNyZWF0ZWQgYnkgdXN3c3VzcCB0b29scy4gQSB0cnVzdGVkIGVhcmx5IHVzZXJzcGFjZSBjb21wb25lbnQgbXVzdFxuK1x0ICBwcm92aWRlIHRoZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgYmVmb3JlIGVuYWJsaW5nIGVuY3J5cHRpb24uXG4rXG4rXHQgIFNheSBOIGlmIHVzZXJzcGFjZSBoYW5kbGVzIHRoZSBpbWFnZSBlbmNyeXB0aW9uLlxuK1xuK1x0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4rXG4gY29uZmlnIFBNX1NURF9QQVJUSVRJT05cbiBcdHN0cmluZyBcIkRlZmF1bHQgcmVzdW1lIHBhcnRpdGlvblwiXG4gXHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXG5pbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlXG4rKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcbkBAIC0xNiw2ICsxNiw3IEBAIG9iai0kKENPTkZJR19TVVNQRU5EKVx0XHQrPSBzdXNwZW5kLm9cbiBvYmotJChDT05GSUdfUE1fVEVTVF9TVVNQRU5EKVx0Kz0gc3VzcGVuZF90ZXN0Lm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXHQrPSBoaWJlcm5hdGUubyBzbmFwc2hvdC5vIHN3YXAub1xuIG9iai0kKENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYpICs9IHVzZXIub1xuK29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICs9IHNuYXBlbmMub1xuIG9iai0kKENPTkZJR19QTV9BVVRPU0xFRVApXHQrPSBhdXRvc2xlZXAub1xuIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpXHQrPSB3YWtlbG9jay5vXG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG5pbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG4rKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcbkBAIC0zNiw2ICszNiw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjdHJhY2UvZXZlbnRzL3Bvd2VyLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInBvd2VyLmhcIlxuKyNpbmNsdWRlIFwidXNlci5oXCJcbiBcbiBcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XG5AQCAtMTEzLDYgKzExNCwxNCBAQCBib29sIGhpYmVybmF0aW9uX2F2YWlsYWJsZSh2b2lkKVxuIFx0XHQhc2VjcmV0bWVtX2FjdGl2ZSgpIFx1MDAyNlx1MDAyNiAhY3hsX21lbV9hY3RpdmUoKTtcbiB9XG4gXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0cmV0dXJuIG5vaGliZXJuYXRlID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCghc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pIHx8XG4rXHRcdCBJU19FTkFCTEVEKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pKSBcdTAwMjZcdTAwMjZcbitcdFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcdTAwMjZcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XG4rfVxuK1xuIC8qKlxuICAqIGhpYmVybmF0aW9uX3NldF9vcHMgLSBTZXQgdGhlIGdsb2JhbCBoaWJlcm5hdGUgb3BlcmF0aW9ucy5cbiAgKiBAb3BzOiBIaWJlcm5hdGlvbiBvcGVyYXRpb25zIHRvIHVzZSBpbiBzdWJzZXF1ZW50IGhpYmVybmF0aW9uIHRyYW5zaXRpb25zLlxuQEAgLTEzNzYsMTIgKzEzODUsMzUgQEAgc3RhdGljIHNzaXplX3QgcmVzZXJ2ZWRfc2l6ZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiBcbiBwb3dlcl9hdHRyKHJlc2VydmVkX3NpemUpO1xuIFxuKyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3Rfc2VlZF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbitcdFx0XHRcdCAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0cixcbitcdFx0XHRcdCAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xuK1x0cmV0dXJuIHJldCA/IHJldCA6IG47XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgc25hcHNob3Rfc2VlZF9hdHRyID0ge1xuK1x0LmF0dHJcdD0ge1xuK1x0XHQubmFtZSA9IFwic25hcHNob3Rfc2VlZFwiLFxuK1x0XHQubW9kZSA9IDAyMDAsXG4rXHR9LFxuK1x0LnN0b3JlXHQ9IHNuYXBzaG90X3NlZWRfc3RvcmUsXG4rfTtcbisjZW5kaWZcbitcbiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ1tdID0ge1xuIFx0XHUwMDI2ZGlza19hdHRyLmF0dHIsXG4gXHRcdTAwMjZyZXN1bWVfb2Zmc2V0X2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc3VtZV9hdHRyLmF0dHIsXG4gXHRcdTAwMjZpbWFnZV9zaXplX2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc2VydmVkX3NpemVfYXR0ci5hdHRyLFxuKyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rXHRcdTAwMjZzbmFwc2hvdF9zZWVkX2F0dHIuYXR0cixcbisjZW5kaWZcbiBcdE5VTEwsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcG93ZXIuaCBiL2tlcm5lbC9wb3dlci9wb3dlci5oXG5pbmRleCA3NWI2Mzg0Mzg4NmVlLi4zOWVmMDRiZTI4M2RkIDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbisrKyBiL2tlcm5lbC9wb3dlci9wb3dlci5oXG5AQCAtMTYwLDYgKzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUge1xuIFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7XG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7XG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpO1xuIGV4dGVybiBpbnQgc25hcHNob3RfcmVhZF9uZXh0KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gZXh0ZXJuIGludCBzbmFwc2hvdF93cml0ZV9uZXh0KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG5AQCAtMTY3LDggKzE2OCwxMSBAQCBleHRlcm4gaW50IHNuYXBzaG90X2ltYWdlX2xvYWRlZChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIFxuIGV4dGVybiBib29sIGhpYmVybmF0ZV9hY3F1aXJlKHZvaWQpO1xuIGV4dGVybiB2b2lkIGhpYmVybmF0ZV9yZWxlYXNlKHZvaWQpO1xuK2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTtcbiBcbiBleHRlcm4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCk7XG4rYm9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCk7XG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpO1xuIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXApO1xuIGV4dGVybiBpbnQgc3dzdXNwX3N3YXBfaW5fdXNlKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwZW5jLmMgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uY2QyOTgwM2VjNmM1YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIva2VybmVsL3Bvd2VyL3NuYXBlbmMuY1xuQEAgLTAsMCArMSw5NDAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLyogVGhpcyBmaWxlIHByb3ZpZGVzIGVuY3J5cHRpb24gc3VwcG9ydCBmb3Igc3lzdGVtIHNuYXBzaG90cy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcnlwdG8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vZ2NtLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vc2hhMi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3J5cHRvL3V0aWxzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L211dGV4LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yYW5kb20uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwicG93ZXIuaFwiXG4rI2luY2x1ZGUgXCJ1c2VyLmhcIlxuK1xuKyNkZWZpbmUgU05BUFNIT1RfU0VFRF9TSVpFIFNIQTI1Nl9ESUdFU1RfU0laRVxuKyNkZWZpbmUgU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTiAxXG4rXG4rc3RhdGljIGNvbnN0IHU4IHNuYXBzaG90X2tleV9ibG9iX21hZ2ljWzhdID0ge1xuK1x0J1MnLCAnVycsICdTJywgJ1UnLCAnUycsICdQJywgJ0snLCAnMScsXG4rfTtcbitcbitzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkge1xuK1x0dTggbWFnaWNbc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKV07XG4rXHRfX2xlMzIgdmVyc2lvbjtcbitcdHU4IHdyYXBfbm9uY2VbR0NNX0FFU19JVl9TSVpFXSBfX25vbnN0cmluZztcbitcdHU4IGVuY3J5cHRlZF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4rXHR1OCB0YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XG4rfSBfX3BhY2tlZDtcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKHNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuK3N0YXRpYyB1OCBzbmFwc2hvdF9zZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4rc3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcbitcbitpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxuK3tcbitcdHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbitcdHNpemVfdCBsZW4gPSBjb3VudDtcbitcdGludCByZXQ7XG4rXG4rXHRpZiAobGVuIFx1MDAyNlx1MDAyNiBidWZbbGVuIC0gMV0gPT0gJ1xcbicpXG4rXHRcdGxlbi0tO1xuK1x0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHRpZiAoc25hcHNob3Rfc2VlZF92YWxpZCkge1xuK1x0XHRyZXQgPSBjcnlwdG9fbWVtbmVxKHNuYXBzaG90X3NlZWQsIHNlZWQsIHNpemVvZihzZWVkKSkgPyAtRVBFUk0gOiAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG1lbWNweShzbmFwc2hvdF9zZWVkLCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0c25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7XG4rXHRwcl9pbmZvKFwiUE06IGhpYmVybmF0ZTogc25hcHNob3QgZW5jcnlwdGlvbiBzZWVkIGxvY2tlZFxcblwiKTtcbitcbitvdXQ6XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZCh1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0pXG4re1xuK1x0Ym9vbCB2YWxpZDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHR2YWxpZCA9IHNuYXBzaG90X3NlZWRfdmFsaWQ7XG4rXHRpZiAodmFsaWQpXG4rXHRcdG1lbWNweShzZWVkLCBzbmFwc2hvdF9zZWVkLCBTTkFQU0hPVF9TRUVEX1NJWkUpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuK1xuK1x0cmV0dXJuIHZhbGlkO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X2Rlcml2ZV93cmFwcGluZ19rZXkodTgga2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyIGxhYmVsW10gPSBcIkxpbnV4IGhpYmVybmF0ZSBzbmFwc2hvdCBrZXkgd3JhcCB2MVwiO1xuK1x0dTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07XG4rXHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4rXHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuK1xuK1x0aWYgKCFzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZChzZWVkKSlcbitcdFx0cmV0dXJuIC1FTk9LRVk7XG4rXG4rXHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbitcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xuK1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0c2hhMjU2X2ZpbmFsKFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XG4rXG4rXHRtZW1jcHkoa2V5LCBkaWdlc3QsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0bWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X2NyeXB0X3dyYXBwZWRfa2V5KHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbitcdFx0XHRcdCAgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcbitcdFx0XHRcdCAgICAgIGJvb2wgZW5jcnlwdClcbit7XG4rXHR1OCB3cmFwX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbitcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XG4rXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbTtcbitcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcTtcbitcdHN0cnVjdCBzY2F0dGVybGlzdCBzZztcbitcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XG4rXHRpbnQgcmM7XG4rXG4rXHRyYyA9IHNuYXBzaG90X2Rlcml2ZV93cmFwcGluZ19rZXkod3JhcF9rZXkpO1xuK1x0aWYgKHJjKVxuK1x0XHRyZXR1cm4gcmM7XG4rXG4rXHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcImdjbShhZXMpXCIsIDAsIDApO1xuK1x0aWYgKElTX0VSUih0Zm0pKSB7XG4rXHRcdHJjID0gUFRSX0VSUih0Zm0pO1xuK1x0XHRnb3RvIG91dF9rZXk7XG4rXHR9XG4rXG4rXHRyYyA9IGNyeXB0b19hZWFkX3NldGtleSh0Zm0sIHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcbitcdGlmIChyYylcbitcdFx0Z290byBvdXRfdGZtO1xuK1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZSh0Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dF90Zm07XG4rXG4rXHRyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTtcbitcdGlmICghcmVxKSB7XG4rXHRcdHJjID0gLUVOT01FTTtcbitcdFx0Z290byBvdXRfdGZtO1xuK1x0fVxuK1xuK1x0aWYgKGVuY3J5cHQpIHtcbitcdFx0Z2V0X3JhbmRvbV9ieXRlcyh3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UsIHNpemVvZih3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UpKTtcbitcdFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbitcdH0gZWxzZSB7XG4rXHRcdG1lbWNweShidWYsIHdyYXBwZWQtXHUwMDNlZW5jcnlwdGVkX2tleSwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHRcdG1lbWNweShidWYgKyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLVx1MDAzZXRhZyxcbitcdFx0ICAgICAgIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK1x0fVxuK1xuK1x0c2dfaW5pdF9vbmUoXHUwMDI2c2csIGJ1Ziwgc2l6ZW9mKGJ1ZikpO1xuK1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKHJlcSwgMCk7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgXHUwMDI2c2csIFx1MDAyNnNnLFxuK1x0XHRcdCAgICAgICBlbmNyeXB0ID8gU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSA6XG4rXHRcdFx0XHRcdCBzaXplb2YoYnVmKSxcbitcdFx0XHQgICAgICAgd3JhcHBlZC1cdTAwM2V3cmFwX25vbmNlKTtcbitcbitcdHJjID0gY3J5cHRvX3dhaXRfcmVxKGVuY3J5cHQgPyBjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOlxuK1x0XHRcdFx0ICAgICAgIGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSxcbitcdFx0XHQgICAgIFx1MDAyNndhaXQpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dF9yZXE7XG4rXG4rXHRpZiAoZW5jcnlwdCkge1xuK1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2VlbmNyeXB0ZWRfa2V5LCBidWYsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2V0YWcsIGJ1ZiArIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUsXG4rXHRcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdH0gZWxzZSB7XG4rXHRcdG1lbWNweShpbWFnZV9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHR9XG4rXG4rb3V0X3JlcTpcbitcdGFlYWRfcmVxdWVzdF9mcmVlKHJlcSk7XG4rb3V0X3RmbTpcbitcdGNyeXB0b19mcmVlX2FlYWQodGZtKTtcbitvdXRfa2V5OlxuK1x0bWVtemVyb19leHBsaWNpdChidWYsIHNpemVvZihidWYpKTtcbitcdG1lbXplcm9fZXhwbGljaXQod3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcbitcdFx0XHRcdCAgIHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZClcbit7XG4rXHR1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4rXHRpbnQgcmM7XG4rXG4rXHRtZW1zZXQod3JhcHBlZCwgMCwgc2l6ZW9mKCp3cmFwcGVkKSk7XG4rXHRtZW1jcHkod3JhcHBlZC1cdTAwM2VtYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsIHNpemVvZih3cmFwcGVkLVx1MDAzZW1hZ2ljKSk7XG4rXHR3cmFwcGVkLVx1MDAzZXZlcnNpb24gPSBjcHVfdG9fbGUzMihTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKTtcbitcbitcdG1lbWNweShrZXksIGltYWdlX2tleSwgc2l6ZW9mKGtleSkpO1xuK1x0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleSh3cmFwcGVkLCBrZXksIHRydWUpO1xuK1x0bWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KGNvbnN0IHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbitcdFx0XHRcdCAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxuK3tcbitcdHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7XG4rXHRpbnQgcmM7XG4rXG4rXHRpZiAobWVtY21wKHdyYXBwZWQtXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLFxuK1x0XHQgICBzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cdTAwM2V2ZXJzaW9uKSAhPSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHRtcCA9ICp3cmFwcGVkO1xuK1x0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShcdTAwMjZ0bXAsIGltYWdlX2tleSwgZmFsc2UpO1xuK1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ0bXAsIHNpemVvZih0bXApKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdCAgICAgIGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcbit7XG4rXHRpbnQgcmM7XG4rXG4rXHRtZW1jcHkoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0XHRcdHNpemVvZihkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XG4rXHRpZiAocmMpXG4rXHRcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0XHRcdCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKiBEZXJpdmUgYSBrZXkgZnJvbSB0aGUga2VybmVsIGFuZCB1c2VyIGtleXMgZm9yIGRhdGEgZW5jcnlwdGlvbi4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X3VzZV91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcbitcdHN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7XG4rXHRpbnQgcmM7XG4rXG4rXHQvKlxuK1x0ICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyXG4rXHQgKiBrZXksIGJ1dCBub3QgaW4gYSB3YXkgdGhhdCBnaXZlcyB0aGUgdXNlciBtb2RlIHByZWRpY3RhYmxlIGNvbnRyb2xcbitcdCAqIG92ZXIgdGhlIGtleSBiaXRzLlxuK1x0ICovXG4rXHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbitcbitcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0ICAgICAgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHRzaGEyNTZfdXBkYXRlKFx1MDAyNnNoYTI1Nl9jdHgsIGRhdGEtXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4rXHRzaGEyNTZfZmluYWwoXHUwMDI2c2hhMjU2X2N0eCwgZGlnZXN0KTtcbitcbitcdEJVSUxEX0JVR19PTihTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIFx1MDAzZSBTSEEyNTZfRElHRVNUX1NJWkUpO1xuK1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSxcbitcdFx0XHRcdGRpZ2VzdCxcbitcdFx0XHRcdFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbitcbitcdHJldHVybiByYztcbit9XG4rXG4rLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXG4rc3RhdGljIGludCBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gZGF0YS1cdTAwM2VtZXRhX3NpemUpIHtcbitcdFx0cmV0dXJuIHNuYXBzaG90X3VzZV91c2VyX2tleShkYXRhKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgbG9mZl90IHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KGxvZmZfdCBwbGFpbl9zaXplKTtcbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9zZXRfbWV0YV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCB1NjQgbWV0YV9zaXplKVxuK3tcbitcdGRhdGEtXHUwMDNlbWV0YV9zaXplID0gbWV0YV9zaXplO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3NpemUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgIHNpemVfdCBjb3VudClcbit7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCArPSBjb3VudDtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rfVxuK1xuKy8qIEVuY3J5cHQgbW9yZSBkYXRhIGZyb20gdGhlIHNuYXBzaG90IGludG8gdGhlIHN0YWdpbmcgYXJlYS4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X2VuY3J5cHRfcmVmaWxsKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGEtXHUwMDNlYWVhZF9yZXE7XG4rXHR1OCBub25jZVtHQ01fQUVTX0lWX1NJWkVdO1xuK1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbitcdHNpemVfdCB0b3RhbCA9IDA7XG4rXHRpbnQgcGdfaWR4O1xuK1x0aW50IHJlcztcbitcbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID09IDApIHtcbitcdFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxuK1x0XHRcdFx0ICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCk7XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4rXHRcdGlmIChyZXMpXG4rXHRcdFx0cmV0dXJuIHJlcztcbitcdH1cbitcbitcdC8qXG4rXHQgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnRcbitcdCAqIGF0dGFja3MgdGhhdCByZWFycmFuZ2UgY2h1bmtzLlxuK1x0ICovXG4rXHRzZ19zZXRfYnVmKFx1MDAyNmRhdGEtXHUwMDNlc2dbMF0sIFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfdG90YWwsIHNpemVvZihkYXRhLVx1MDAzZWNyeXB0X3RvdGFsKSk7XG4rXG4rXHQvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi9cbitcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgrKykge1xuK1x0XHR2b2lkICpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF07XG4rXG4rXHRcdC8qIFN0b3AgYXQgdGhlIG1ldGEgcGFnZSBib3VuZGFyeSBiZWZvcmUgc3dpdGNoaW5nIGtleXMuICovXG4rXHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkIFx1MDAyNlx1MDAyNiB0b3RhbCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICgoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArIHRvdGFsKSA9PSBkYXRhLVx1MDAzZW1ldGFfc2l6ZSkpXG4rXHRcdFx0YnJlYWs7XG4rXG4rXHRcdHJlcyA9IHNuYXBzaG90X3JlYWRfbmV4dChcdTAwMjZkYXRhLVx1MDAzZWhhbmRsZSk7XG4rXHRcdGlmIChyZXMgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJlcztcbitcdFx0aWYgKHJlcyA9PSAwKVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0XHRXQVJOX09OKHJlcyAhPSBQQUdFX1NJWkUpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBDb3B5IHRoZSBwYWdlIGludG8gdGhlIHN0YWdpbmcgYXJlYS4gQSBmdXR1cmUgb3B0aW1pemF0aW9uXG4rXHRcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXG4rXHRcdCAqL1xuK1x0XHRtZW1jcHkoYnVmLCBkYXRhX29mKGRhdGEtXHUwMDNlaGFuZGxlKSwgUEFHRV9TSVpFKTtcbitcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBidWYsIFBBR0VfU0laRSk7XG4rXHRcdHRvdGFsICs9IFBBR0VfU0laRTtcbitcdH1cbitcbitcdGlmICghdG90YWwpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBcdTAwMjZkYXRhLVx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuK1x0LypcbitcdCAqIFVzZSBpbmNyZW1lbnRpbmcgbm9uY2VzIGZvciBlYWNoIGNodW5rLCBzaW5jZSBhIDY0IGJpdCB2YWx1ZSB3b24ndFxuK1x0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cbitcdCAqL1xuK1x0bWVtY3B5KFx1MDAyNm5vbmNlWzBdLCBcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4rXHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuK1x0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbitcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICs9IDE7XG4rXHQvKiBUb3RhbCBkb2VzIG5vdCBpbmNsdWRlIEFBRCBvciB0aGUgYXV0aCB0YWcuICovXG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cdTAwM2VzZywgZGF0YS1cdTAwM2VzZywgdG90YWwsIG5vbmNlKTtcbitcdHJlcyA9IGNyeXB0b193YWl0X3JlcShjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSksIFx1MDAyNndhaXQpO1xuK1x0aWYgKHJlcylcbitcdFx0cmV0dXJuIHJlcztcbitcbitcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IHRvdGFsO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArPSB0b3RhbDtcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cdTAwM2VhZWFkX3JlcTtcbitcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XG4rXHRERUNMQVJFX0NSWVBUT19XQUlUKHdhaXQpO1xuK1x0aW50IHBhZ2VfY291bnQ7XG4rXHRzaXplX3QgdG90YWw7XG4rXHRpbnQgcGdfaWR4O1xuK1x0aW50IHJlcztcbitcbitcdC8qIFNldCB1cCB0aGUgYXNzb2NpYXRlZCBkYXRhLiAqL1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzBdLCBcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuK1xuK1x0LypcbitcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXG4rXHQgKiBzaG91bGQgYWxzbyBiZSBhIHRhZyBhdCB0aGUgZW5kLCBzbyB0aGUgb2Zmc2V0IHdvbid0IGJlIGFuIGV2ZW4gcGFnZS5cbitcdCAqL1xuK1x0cGFnZV9jb3VudCA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dG90YWwgPSBwYWdlX2NvdW50IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0LypcbitcdCAqIExvYWQgdGhlIHNnIGxpc3Qgd2l0aCB0aGUgY3J5cHQgYnVmZmVyLiBJbmxpbmUgZGVjcnlwdCBiYWNrIGludG8gdGhlXG4rXHQgKiBzdGFnaW5nIGJ1ZmZlci4gQSBmdXR1cmUgb3B0aW1pemF0aW9uIGNvdWxkIGRlY3J5cHQgZGlyZWN0bHkgaW50b1xuK1x0ICogbG93bWVtIHBhZ2VzLlxuK1x0ICovXG4rXHRmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCBcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspXG4rXHRcdHNnX3NldF9idWYoXHUwMDI2ZGF0YS1cdTAwM2VzZ1sxICsgcGdfaWR4XSwgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xuK1xuK1x0LypcbitcdCAqIEl0J3MgcG9zc2libGUgdGhpcyBpcyB0aGUgZmluYWwgZGVjcnlwdCwgb3IgdGhlIGZpbmFsIGRlY3J5cHQgb2YgdGhlXG4rXHQgKiBtZXRhIHJlZ2lvbiwgYW5kIHRoZXJlIGFyZSBmZXdlciB0aGFuIENIVU5LX1NJWkUgcGFnZXMuIElmIHRoaXMgaXNcbitcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcbitcdCAqIGJ5dGVzIG9mIGEgbmV3IHBhZ2UuIENvcHkgdG8gdGhlIHRhZyBpZiBzby5cbitcdCAqL1xuK1x0aWYgKHBhZ2VfY291bnQgXHUwMDNjIENIVU5LX1NJWkUgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gdG90YWwpID09IHNpemVvZihkYXRhLVx1MDAzZWF1dGhfdGFnKSkge1xuK1x0XHRtZW1jcHkoZGF0YS1cdTAwM2VhdXRoX3RhZywgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLFxuK1x0XHQgICAgICAgc2l6ZW9mKGRhdGEtXHUwMDNlYXV0aF90YWcpKTtcbitcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgIT1cbitcdFx0ICAgKChDSFVOS19TSVpFIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBcdTAwMjZkYXRhLVx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuK1x0bWVtY3B5KFx1MDAyNm5vbmNlWzBdLCBcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4rXHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuK1x0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbitcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICs9IDE7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cdTAwM2VzZywgZGF0YS1cdTAwM2VzZywgdG90YWwgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFLCBub25jZSk7XG4rXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCBcdTAwMjZ3YWl0KTtcbitcdGlmIChyZXMpXG4rXHRcdHJldHVybiByZXM7XG4rXG4rXHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xuK1xuK1x0LyogUHVzaCB0aGUgZGVjcnlwdGVkIHBhZ2VzIGZ1cnRoZXIgZG93biB0aGUgc3RhY2suICovXG4rXHR0b3RhbCA9IDA7XG4rXHRmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCBcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspIHtcbitcdFx0dm9pZCAqYnVmID0gZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdO1xuK1xuK1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbitcdFx0aWYgKHJlcyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmVzO1xuK1x0XHRpZiAocmVzID09IDApXG4rXHRcdFx0YnJlYWs7XG4rXG4rXHRcdGlmICghZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSkpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4rXG4rXHRcdC8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqL1xuK1x0XHRtZW1jcHkoZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSksIGJ1ZiwgUEFHRV9TSVpFKTtcbitcdFx0dG90YWwgKz0gUEFHRV9TSVpFO1xuK1x0fVxuK1xuK1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xuK1x0XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQpXG4rXHRcdFx0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPVxuK1x0XHRcdFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cdTAwM2VtZXRhX3NpemUpO1xuK1x0fVxuK1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArPSB0b3RhbDtcbitcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcbitcdGlmIChyZXMpXG4rXHRcdHJldHVybiByZXM7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgIHZvaWQgKipidWYpXG4re1xuK1x0c2l6ZV90IHRhZ19vZmY7XG4rXG4rXHQvKiBSZWZpbGwgdGhlIGVuY3J5cHRlZCBidWZmZXIgaWYgaXQncyBlbXB0eS4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgPT0gMCB8fFxuK1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2U9XG4rXHQgICAgIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKSkpIHtcbitcdFx0aW50IHJjO1xuK1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCA9IDA7XG4rXHRcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XG4rXHRcdGlmIChyYyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9zaXplKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9zaXplKSB7XG4rXHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdFx0c2l6ZV90IHBnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4rXHRcdCpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XG4rXHRcdHJldHVybiBQQUdFX1NJWkUgLSBwZ19vZmY7XG4rXHR9XG4rXG4rXHQvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi9cbitcdHRhZ19vZmYgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAtIGRhdGEtXHUwMDNlY3J5cHRfc2l6ZTtcbitcdGlmICh0YWdfb2ZmIFx1MDAzZSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxuK1x0XHR0YWdfb2ZmID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRTtcbitcbitcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcbitcdHJldHVybiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFIC0gdGFnX29mZjtcbit9XG4rXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3Rfd3JpdGVfbmV4dF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgICAgdm9pZCAqKmJ1Zilcbit7XG4rXHRzaXplX3Qgc2l6ZV9hdmFpbDtcbitcdHNpemVfdCB0YWdfb2ZmO1xuK1xuK1x0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpKSB7XG4rXHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdFx0c2l6ZV90IHBnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4rXG4rXHRcdCpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XG4rXHRcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi9cbitcdFx0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xuK1x0XHRpZiAodGFnX29mZiBcdTAwM2UgU05BUFNIT1RfQVVUSF9UQUdfU0laRSlcbitcdFx0XHR0YWdfb2ZmID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRTtcbitcbitcdFx0KmJ1ZiA9IGRhdGEtXHUwMDNlYXV0aF90YWcgKyB0YWdfb2ZmO1xuK1x0XHRzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7XG4rXHR9XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4rXHQgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXHUwMDNjIGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSB7XG4rXHRcdHU2NCBtZXRhX2F2YWlsID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgLSBkYXRhLVx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbDtcbitcbitcdFx0c2l6ZV9hdmFpbCA9IG1pbl90KHU2NCwgc2l6ZV9hdmFpbCwgbWV0YV9hdmFpbCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gc2l6ZV9hdmFpbDtcbit9XG4rXG4rc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxuK3tcbitcdHNpemVfdCBjb3B5X3NpemU7XG4rXHRzaXplX3Qgbm90X2RvbmU7XG4rXHRzaXplX3QgcGdfb2ZmO1xuK1x0dm9pZCAqc3JjO1xuK1x0c3NpemVfdCBzcmNfc2l6ZTtcbitcbitcdGlmICghY291bnQpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cGdfb2ZmID0gKm9mZnAgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFIC0gcGdfb2ZmKTtcbitcbitcdHNyY19zaXplID0gc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZzcmMpO1xuK1x0aWYgKHNyY19zaXplIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIHNyY19zaXplO1xuK1xuK1x0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgc3JjX3NpemUpO1xuK1x0bm90X2RvbmUgPSBjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGNvcHlfc2l6ZSk7XG4rXHRjb3B5X3NpemUgLT0gbm90X2RvbmU7XG4rXHRpZiAoIWNvcHlfc2l6ZSlcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXG4rXHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCArPSBjb3B5X3NpemU7XG4rXHQqb2ZmcCArPSBjb3B5X3NpemU7XG4rXHRzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTtcbitcdHJldHVybiBjb3B5X3NpemU7XG4rfVxuK1xuK3NzaXplX3Qgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcbitcdFx0XHRcdCBsb2ZmX3QgKm9mZnApXG4re1xuK1x0c2l6ZV90IGNvcHlfc2l6ZTtcbitcdHNpemVfdCBub3RfZG9uZTtcbitcdHNpemVfdCBwZ19vZmY7XG4rXHR2b2lkICpkc3Q7XG4rXHRzc2l6ZV90IGRzdF9zaXplO1xuK1x0aW50IHJjO1xuK1xuK1x0aWYgKCFjb3VudClcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRwZ19vZmYgPSAqb2ZmcCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuK1x0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xuK1xuK1x0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZkc3QpO1xuK1x0aWYgKGRzdF9zaXplIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIGRzdF9zaXplO1xuK1xuK1x0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgZHN0X3NpemUpO1xuK1x0bm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTtcbitcdGNvcHlfc2l6ZSAtPSBub3RfZG9uZTtcbitcdGlmICghY29weV9zaXplKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcbitcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICs9IGNvcHlfc2l6ZTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsICs9IGNvcHlfc2l6ZTtcbitcdC8qXG4rXHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZVxuK1x0ICogZW5jcnlwdGVkIG1ldGFkYXRhIGFuZCBuZWVkIGEga2V5IGNoYW5nZSBiZWZvcmUgdXNlciBkYXRhIHBhZ2VzLlxuK1x0ICovXG4rXHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDNlPVxuK1x0ICAgIChQQUdFX1NJWkUgKiBDSFVOS19TSVpFKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgfHxcbitcdCAgICAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4rXHQgICAgIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSkge1xuK1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4rXHRcdGlmIChyYyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4rXHQqb2ZmcCArPSBjb3B5X3NpemU7XG4rXHRyZXR1cm4gY29weV9zaXplO1xuK31cbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID0gMDtcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ID0gMDtcbitcdGRhdGEtXHUwMDNlbm9uY2VfaGlnaCA9IDA7XG4rXHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkID0gZmFsc2U7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdG1lbXNldChkYXRhLVx1MDAzZWF1dGhfdGFnLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VhdXRoX3RhZykpO1xuK31cbitcbit2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VhZWFkX3JlcSkge1xuK1x0XHRhZWFkX3JlcXVlc3RfZnJlZShkYXRhLVx1MDAzZWFlYWRfcmVxKTtcbitcdFx0ZGF0YS1cdTAwM2VhZWFkX3JlcSA9IE5VTEw7XG4rXHR9XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VhZWFkX3RmbSkge1xuK1x0XHRjcnlwdG9fZnJlZV9hZWFkKGRhdGEtXHUwMDNlYWVhZF90Zm0pO1xuK1x0XHRkYXRhLVx1MDAzZWFlYWRfdGZtID0gTlVMTDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkrKykge1xuK1x0XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1tpXSkge1xuK1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldKTtcbitcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0bWVtemVyb19leHBsaWNpdChkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1x0bWVtemVyb19leHBsaWNpdChkYXRhLVx1MDAzZXVzZXJfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkpO1xuK1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHRpbnQgaSwgcmM7XG4rXG4rXHQvKiBUaGlzIG9ubHkgd29ya3Mgb25jZSBwZXIgaGliZXJuYXRlLiAqL1xuK1x0aWYgKGRhdGEtXHUwMDNlYWVhZF90Zm0pXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbitcdG1lbXNldChkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF9wYWdlcykpO1xuK1xuK1x0LyogU2V0IHVwIHRoZSBlbmNyeXB0aW9uIHRyYW5zZm9ybSAqL1xuK1x0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IGNyeXB0b19hbGxvY19hZWFkKFwiZ2NtKGFlcylcIiwgMCwgMCk7XG4rXHRpZiAoSVNfRVJSKGRhdGEtXHUwMDNlYWVhZF90Zm0pKSB7XG4rXHRcdHJjID0gUFRSX0VSUihkYXRhLVx1MDAzZWFlYWRfdGZtKTtcbitcdFx0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IE5VTEw7XG4rXHRcdHJldHVybiByYztcbitcdH1cbitcbitcdHJjID0gLUVOT01FTTtcbitcdGRhdGEtXHUwMDNlYWVhZF9yZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2MoZGF0YS1cdTAwM2VhZWFkX3RmbSwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWRhdGEtXHUwMDNlYWVhZF9yZXEpXG4rXHRcdGdvdG8gc2V0dXBfZmFpbDtcbitcbitcdC8qIEFsbG9jYXRlIHRoZSBzdGFnaW5nIGFyZWEgKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkrKykge1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1tpXSlcbitcdFx0XHRnb3RvIHNldHVwX2ZhaWw7XG4rXHR9XG4rXG4rXHRzZ19pbml0X3RhYmxlKGRhdGEtXHUwMDNlc2csIENIVU5LX1NJWkUgKyAyKTtcbitcbitcdC8qXG4rXHQgKiBUaGUgYXNzb2NpYXRlZCBkYXRhIHdpbGwgYmUgdGhlIG9mZnNldCBzbyB0aGF0IGJsb2NrcyBjYW4ndCBiZVxuK1x0ICogcmVhcnJhbmdlZC5cbitcdCAqL1xuK1x0YWVhZF9yZXF1ZXN0X3NldF9hZChkYXRhLVx1MDAzZWFlYWRfcmVxLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShkYXRhLVx1MDAzZWFlYWRfdGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGlmIChyYylcbitcdFx0Z290byBzZXR1cF9mYWlsO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rc2V0dXBfZmFpbDpcbitcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbit7XG4rXHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgd3JhcHBlZCA9IHt9O1xuK1x0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XG4rXHR1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTtcbitcdGludCByYztcbitcbitcdC8qIERvbid0IHB1bGwgYSByYW5kb20ga2V5IGZyb20gYSB3b3JsZCB0aGF0IGNhbiBiZSByZXNldC4gKi9cbitcdGlmIChkYXRhLVx1MDAzZXJlYWR5KVxuK1x0XHRyZXR1cm4gLUVQSVBFO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbitcdGlmIChyYylcbitcdFx0cmV0dXJuIHJjO1xuK1xuK1x0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXG4rXHRnZXRfcmFuZG9tX2J5dGVzKG5vbmNlLCBzaXplb2Yobm9uY2UpKTtcbitcdG1lbWNweShcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgXHUwMDI2bm9uY2VbMF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuK1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCwgXHUwMDI2bm9uY2VbOF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2hpZ2gpKTtcbitcbitcdC8qIEJ1aWxkIGFuZCBpbnN0YWxsIGEgcmFuZG9tIGltYWdlIGVuY3J5cHRpb24ga2V5LiAqL1xuK1x0Z2V0X3JhbmRvbV9ieXRlcyhpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbitcdHJjID0gc25hcHNob3RfaW5zdGFsbF9pbWFnZV9rZXkoZGF0YSwgaW1hZ2Vfa2V5KTtcbitcdGlmIChyYylcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF93cmFwX2ltYWdlX2tleShpbWFnZV9rZXksIFx1MDAyNndyYXBwZWQpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBIYW5kIHRoZSB3cmFwcGVkIGtleSBhbmQgY2xlYXIgbm9uY2UgYmFjayB0byB1c2VyIG1vZGUuICovXG4rXHRyYyA9IHB1dF91c2VyKHNpemVvZih3cmFwcGVkKSwgXHUwMDI2a2V5LVx1MDAzZWJsb2JfbGVuKTtcbitcdGlmIChyYylcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0QlVJTERfQlVHX09OKHNpemVvZih3cmFwcGVkKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVx1MDAzZWJsb2IpKTtcbitcdGlmIChjb3B5X3RvX3VzZXIoXHUwMDI2a2V5LVx1MDAzZWJsb2IsIFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHtcbitcdFx0cmMgPSAtRUZBVUxUO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2Vub25jZSwgXHUwMDI2bm9uY2UsIHNpemVvZihub25jZSkpKSB7XG4rXHRcdHJjID0gLUVGQVVMVDtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbitcdG1lbXplcm9fZXhwbGljaXQoXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWw6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpO1xuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbitcdHJldHVybiByYztcbit9XG4rXG4raW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KVxuK3tcbitcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iICpibG9iO1xuK1x0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcbitcdHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9O1xuK1x0aW50IHJjO1xuK1xuK1x0LyogSXQncyB0b28gbGF0ZSBpZiBkYXRhJ3MgYmVlbiBwdXNoZWQgaW4uICovXG4rXHRpZiAoZGF0YS1cdTAwM2VoYW5kbGUuY3VyKVxuK1x0XHRyZXR1cm4gLUVQSVBFO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbitcdGlmIChyYylcbitcdFx0cmV0dXJuIHJjO1xuK1xuK1x0LyogTG9hZCB0aGUga2V5IGZyb20gdXNlciBtb2RlLiAqL1xuK1x0YmxvYiA9IG1lbWR1cF91c2VyKGtleSwgc2l6ZW9mKCpibG9iKSk7XG4rXHRpZiAoSVNfRVJSKGJsb2IpKSB7XG4rXHRcdHJjID0gUFRSX0VSUihibG9iKTtcbitcdFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcbitcdH1cbitcbitcdGlmIChibG9iLVx1MDAzZWJsb2JfbGVuICE9IHNpemVvZih3cmFwcGVkKSkge1xuK1x0XHRyYyA9IC1FSU5WQUw7XG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXHR9XG4rXG4rXHRtZW1jcHkoXHUwMDI2d3JhcHBlZCwgYmxvYi1cdTAwM2VibG9iLCBzaXplb2Yod3JhcHBlZCkpO1xuK1x0cmMgPSBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KFx1MDAyNndyYXBwZWQsIGltYWdlX2tleSk7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXG4rXHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXG4rXHQvKiBMb2FkIHRoZSBzdGFydGluZyBub25jZS4gKi9cbitcdG1lbWNweShcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgXHUwMDI2YmxvYi1cdTAwM2Vub25jZVswXSwgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzhdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9oaWdoKSk7XG4rXG4rb3V0X2Jsb2I6XG4rXHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIGNyeXB0b19zZXR1cF9mYWlsO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY3J5cHRvX3NldHVwX2ZhaWw6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcbit7XG4rXHRsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0bG9mZl90IGNodW5rcyA9IChwYWdlcyArIChDSFVOS19TSVpFIC0gMSkpIC8gQ0hVTktfU0laRTtcbitcdC8qXG4rXHQgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW5cbitcdCAqIGF1dGhlbnRpY2F0aW9uIHRhZyBmb3IgZXZlcnkgY2h1bmsgb2YgcGFnZXMuXG4rXHQgKi9cbitcdHJldHVybiBwbGFpbl9zaXplICsgKGNodW5rcyAqIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK31cbitcbitzdGF0aWMgbG9mZl90IHNuYXBzaG90X2VuY3J5cHRlZF9zcGxpdF9ieXRlX2NvdW50KGxvZmZfdCByYXdfc2l6ZSxcbitcdFx0XHRcdFx0XHQgIGxvZmZfdCBtZXRhX3BsYWluX3NpemUpXG4re1xuK1x0aWYgKHJhd19zaXplIFx1MDAzYz0gbWV0YV9wbGFpbl9zaXplKVxuK1x0XHRyZXR1cm4gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpO1xuK1xuK1x0cmV0dXJuIHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KG1ldGFfcGxhaW5fc2l6ZSkgK1xuK1x0XHRzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0ICBzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSlcbit7XG4rXHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB1c2VyX2tleSA9IHt9O1xuK1x0dW5zaWduZWQgaW50IGtleV9sZW47XG4rXHR1NjQgc2l6ZTtcbitcdGludCByYztcbitcbitcdGlmICghc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZ1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSlcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtXHUwMDNldXNlcl9rZXkpIFx1MDAzYyBzaXplb2YodXNlcl9rZXkua2V5KSk7XG4rXHRyYyA9IC1FSU5WQUw7XG4rXHRpZiAodXNlcl9rZXkucmVzZXJ2ZWQpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKHVzZXJfa2V5LmtleV9sZW4gXHUwMDNlIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcdTAwM2MgOClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZIFx1MDAyNlx1MDAyNiAhZGF0YS1cdTAwM2VyZWFkeSkge1xuK1x0XHRyYyA9IC1FTk9EQVRBO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIHNpemUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgZmVkIGluIGJlZm9yZVxuK1x0ICogdGhlIHVzZXIgZGF0YSBrZXkgaXMgbmVlZGVkIGF0IHJlc3VtZSB0aW1lLlxuK1x0ICovXG4rXHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fV1JPTkxZIFx1MDAyNlx1MDAyNiAhZGF0YS1cdTAwM2VtZXRhX3NpemUpIHtcbitcdFx0aWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSBcdTAwM2MgUEFHRV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSlcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSB1c2VyX2tleS5tZXRhX3NpemU7XG4rXHRcdHNpemUgPSBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZTtcbitcdH0gZWxzZSB7XG4rXHRcdHNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSxcbitcdFx0XHRcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpO1xuK1x0XHRzaXplID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemU7XG4rXHR9XG4rXG4rXHRyYyA9IHB1dF91c2VyKHNpemUsIFx1MDAyNmtleS1cdTAwM2VtZXRhX3NpemUpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGtleV9sZW4gPSB1c2VyX2tleS5rZXlfbGVuO1xuK1xuK1x0LyogRG9uJ3QgYWxsb3cgaXQgaWYgaXQncyB0b28gbGF0ZS4gKi9cbitcdGlmICgoZGF0YS1cdTAwM2VtZXRhX3NpemUgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlbWV0YV9zaXplKSB8fFxuK1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSBcdTAwMjZcdTAwMjZcbitcdCAgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSkge1xuK1x0XHRyYyA9IC1FQlVTWTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRtZW1zZXQoZGF0YS1cdTAwM2V1c2VyX2tleSwgMCwgc2l6ZW9mKGRhdGEtXHUwMDNldXNlcl9rZXkpKTtcbitcdG1lbWNweShkYXRhLVx1MDAzZXVzZXJfa2V5LCB1c2VyX2tleS5rZXksIGtleV9sZW4pO1xuK1x0ZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZCA9IHRydWU7XG4rXHQvKiBJbnN0YWxsIHRoZSBrZXkgaWYgdGhlIHVzZXIgaXMganVzdCB1bmRlciB0aGUgd2lyZS4gKi9cbitcdHJjID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHJjID0gMDtcbitcbitvdXQ6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnVzZXJfa2V5LCBzaXplb2YodXNlcl9rZXkpKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0IGxvZmZfdCByYXdfc2l6ZSlcbit7XG4rXHRsb2ZmX3QgbWV0YV9wbGFpbl9zaXplID0gZGF0YS1cdTAwM2VtZXRhX3NpemU7XG4rXHRsb2ZmX3Qgc3BsaXRfc2l6ZTtcbitcbitcdGlmICghbWV0YV9wbGFpbl9zaXplKVxuK1x0XHRtZXRhX3BsYWluX3NpemUgPSBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRzcGxpdF9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX3NwbGl0X2J5dGVfY291bnQocmF3X3NpemUsXG4rXHRcdFx0XHRcdFx0XHQgbWV0YV9wbGFpbl9zaXplKTtcbitcdGlmICghZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZClcbitcdFx0cmV0dXJuIG1heChzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSksIHNwbGl0X3NpemUpO1xuK1xuK1x0cmV0dXJuIHNwbGl0X3NpemU7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aW50IHJjO1xuK1xuK1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICE9IDApIHtcbitcdFx0cmMgPSBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKGRhdGEpO1xuK1x0XHRpZiAocmMpXG4rXHRcdFx0cmV0dXJuIHJjO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmNcbmluZGV4IGQ5MzNiNWIyYzA1ZDQuLjAyNDAwYWMxMjVjNTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmNcbkBAIC0yMTc3LDYgKzIxNzcsMTEgQEAgdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIG5yX2NvcHlfcGFnZXMgKyBucl9tZXRhX3BhZ2VzICsgMTtcbiB9XG4gXG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpXG4re1xuK1x0cmV0dXJuIG5yX21ldGFfcGFnZXMgKyAxO1xuK31cbitcbiBzdGF0aWMgaW50IGluaXRfaGVhZGVyKHN0cnVjdCBzd3N1c3BfaW5mbyAqaW5mbylcbiB7XG4gXHRtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzd3N1c3BfaW5mbykpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd2FwLmMgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXG5pbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL3N3YXAuY1xuKysrIGIva2VybmVsL3Bvd2VyL3N3YXAuY1xuQEAgLTE2Niw2ICsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rc3RhdGljIGJvb2wgc3dzdXNwX2V4dGVudHNfY29udGFpbl9yYW5nZSh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0LFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbit7XG4rXHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHN3c3VzcF9leHRlbnRzLnJiX25vZGU7XG4rXHRzdHJ1Y3Qgc3dzdXNwX2V4dGVudCAqZXh0O1xuK1x0dW5zaWduZWQgbG9uZyBlbmQ7XG4rXG4rXHRpZiAoIW5yX3BhZ2VzKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRlbmQgPSBzd2FwX29mZnNldCArIG5yX3BhZ2VzIC0gMTtcbitcdGlmIChlbmQgXHUwMDNjIHN3YXBfb2Zmc2V0KVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHR3aGlsZSAobm9kZSkge1xuK1x0XHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XG4rXHRcdGlmIChzd2FwX29mZnNldCBcdTAwM2MgZXh0LVx1MDAzZXN0YXJ0KVxuK1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4rXHRcdGVsc2UgaWYgKHN3YXBfb2Zmc2V0IFx1MDAzZSBleHQtXHUwMDNlZW5kKVxuK1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuK1x0XHRlbHNlXG4rXHRcdFx0Z290byBmb3VuZDtcbitcdH1cbitcbitcdHJldHVybiBmYWxzZTtcbitcbitmb3VuZDpcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHN3YXBfb2Zmc2V0IFx1MDAzYyBleHQtXHUwMDNlc3RhcnQpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoZW5kIFx1MDAzYz0gZXh0LVx1MDAzZWVuZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0aWYgKGV4dC1cdTAwM2VlbmQgPT0gKHVuc2lnbmVkIGxvbmcpLTEpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRzd2FwX29mZnNldCA9IGV4dC1cdTAwM2VlbmQgKyAxO1xuK1x0XHRub2RlID0gcmJfbmV4dChcdTAwMjZleHQtXHUwMDNlbm9kZSk7XG4rXHRcdGlmICghbm9kZSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRcdGV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTtcbitcdH1cbit9XG4rXG4rYm9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rXHR1NjQgYmxvY2s7XG4rXHR1NjQgZW5kO1xuK1x0dTY0IGVuZF9ibG9jaztcbitcbitcdGlmIChzd2FwIFx1MDAzYyAwIHx8IHBvcyBcdTAwM2MgMCB8fCAhY291bnQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGVuZCA9ICh1NjQpcG9zICsgY291bnQgLSAxO1xuK1x0aWYgKGVuZCBcdTAwM2MgKHU2NClwb3MpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGJsb2NrID0gKHU2NClwb3MgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRlbmRfYmxvY2sgPSBlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHRmb3IgKDs7KSB7XG4rXHRcdHU2NCByZW1haW5pbmdfcGFnZXMgPSBlbmRfYmxvY2sgLSBibG9jayArIDE7XG4rXHRcdHBnb2ZmX3Qgc3dhcF9vZmZzZXQ7XG4rXHRcdHBnb2ZmX3QgbWFwcGVkX3BhZ2VzO1xuK1x0XHRzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7XG4rXHRcdHU2NCBwYWdlcztcbitcbitcdFx0aWYgKCFyZW1haW5pbmdfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0aWYgKHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KHN3YXAsIHBhZ2VfYmxvY2ssIFx1MDAyNnN3YXBfb2Zmc2V0LFxuK1x0XHRcdFx0XHQgICAgXHUwMDI2bWFwcGVkX3BhZ2VzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmICghbWFwcGVkX3BhZ2VzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cGFnZXMgPSBtaW5fdCh1NjQsIG1hcHBlZF9wYWdlcywgcmVtYWluaW5nX3BhZ2VzKTtcbitcdFx0aWYgKCh1NjQpKHVuc2lnbmVkIGxvbmcpcGFnZXMgIT0gcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmIChwYWdlcyA9PSByZW1haW5pbmdfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRcdGJsb2NrICs9IHBhZ2VzO1xuK1x0fVxuK31cbitcbit1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcylcbit7XG4rXHR1NjQgaW1hZ2VfcGFnZXMgPSBESVZfUk9VTkRfVVBfVUxMKGltYWdlX2J5dGVzLCBQQUdFX1NJWkUpO1xuK1x0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyArIDE7XG4rXG4rXHRpZiAobWFwX3BhZ2VzIFx1MDAzZSBVNjRfTUFYIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKVxuK1x0XHRyZXR1cm4gVTY0X01BWDtcbitcbitcdHJldHVybiBtYXBfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rfVxuK1xuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBvZmZzZXQ7XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmNcbmluZGV4IGQwZmNmYmE3YWMyMzUuLjU3YjhjZTgzYTYyNmYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jXG4rKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jXG5AQCAtMjEsNTQgKzIxLDE4NSBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnNvbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInBvd2VyLmhcIlxuKyNpbmNsdWRlIFwidXNlci5oXCJcbiBcbiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7XG4tXG4tc3RhdGljIHN0cnVjdCBzbmFwc2hvdF9kYXRhIHtcbi1cdHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgaGFuZGxlO1xuLVx0aW50IHN3YXA7XG4tXHRpbnQgbW9kZTtcbi1cdGJvb2wgZnJvemVuO1xuLVx0Ym9vbCByZWFkeTtcbi1cdGJvb2wgcGxhdGZvcm1fc3VwcG9ydDtcbi1cdGJvb2wgZnJlZV9iaXRtYXBzO1xuLVx0ZGV2X3QgZGV2O1xuLX0gc25hcHNob3Rfc3RhdGU7XG4rc3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XG4gXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldilcbiB7XG4gXHRyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgXHUwMDI2XHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XG4gfVxuIFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rc3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsIGRldl90IGRldilcbit7XG4rXHRyZXR1cm4gZGF0YS1cdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkIFx1MDAyNlx1MDAyNiBkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXHUwMDI2XHUwMDI2XG4rXHRcdGRhdGEtXHUwMDNlcmVhZHkgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlZGV2ID09IGRldiBcdTAwMjZcdTAwMjZcbitcdFx0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSBcdTAwMjZcdTAwMjZcbitcdFx0c25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpO1xuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9oZWFkZXJfd3JpdGVfcmFuZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rXHRsb2ZmX3QgaGVhZGVyX29mZnNldCA9IGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0O1xuK1x0bG9mZl90IG9mZnNldDtcbitcbitcdGlmIChwb3MgXHUwMDNjIGhlYWRlcl9vZmZzZXQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdG9mZnNldCA9IHBvcyAtIGhlYWRlcl9vZmZzZXQ7XG4rXHRyZXR1cm4gb2Zmc2V0IFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IGNvdW50IFx1MDAzYz0gUEFHRV9TSVpFIC0gb2Zmc2V0O1xuK31cbitcbitzdGF0aWMgdTY0IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHU2NCBpbWFnZV9ieXRlcyA9IHJvdW5kX3VwKGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCwgUEFHRV9TSVpFKTtcbitcdHU2NCBtYXBfYnl0ZXMgPSBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXMoZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkKTtcbitcdHU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyArIG1hcF9ieXRlcztcbitcbitcdGlmIChpbWFnZV9ieXRlcyBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkIHx8IGJ1ZGdldCBcdTAwM2MgaW1hZ2VfYnl0ZXMpXG4rXHRcdHJldHVybiBVNjRfTUFYO1xuK1xuK1x0cmV0dXJuIGJ1ZGdldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4rXHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK31cbisjZW5kaWZcbitcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZVxuK2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4rXHRlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4rXHRib29sIGltYWdlX3JhbmdlX2FsbG9jYXRlZDtcbitcdHU2NCBzd2FwX2J1ZGdldDtcbitcbitcdGlmICghY291bnQgfHwgIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpXG4rXHRcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuK1xuK1x0aWYgKCFzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShkYXRhLCBkZXYpKVxuK1x0XHRnb3RvIHVubG9jaztcbitcbitcdGltYWdlX3JhbmdlX2FsbG9jYXRlZCA9IHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChkYXRhLVx1MDAzZXN3YXAsIHBvcywgY291bnQpO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rXHRzd2FwX2J1ZGdldCA9IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KGRhdGEpO1xuK1x0aWYgKHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShkYXRhLCBwb3MsIGNvdW50KSBcdTAwMjZcdTAwMjZcbitcdCAgICBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2M9IFBBR0VfU0laRSBcdTAwMjZcdTAwMjZcbitcdCAgICBQQUdFX1NJWkUgLSBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2U9IGNvdW50KSB7XG4rXHRcdGRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkICs9IGNvdW50O1xuK1x0XHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUjtcbitcdH0gZWxzZSBpZiAoaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkIFx1MDAyNlx1MDAyNlxuK1x0XHQgICBzd2FwX2J1ZGdldCBcdTAwM2U9IGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgc3dhcF9idWRnZXQgLSBkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgXHUwMDNlPSBjb3VudCkge1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgKz0gY291bnQ7XG4rXHRcdHR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0U7XG4rXHR9XG4rXHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK1xuK1x0aWYgKHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUpXG4rXHRcdGdvdG8gdW5sb2NrO1xuK1xuK1x0cmV0dXJuIHR5cGU7XG4rXG4rdW5sb2NrOlxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnN5c3RlbV90cmFuc2l0aW9uX211dGV4KTtcbitcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbisjZWxzZVxuK1x0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuKyNlbmRpZlxuK31cbitcbit2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbitcdFx0XHRcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pXG4re1xuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSA9IFx1MDAyNnNuYXBzaG90X3N0YXRlO1xuK1x0dTY0ICpyZXNlcnZlZF90b3RhbDtcbitcdHNpemVfdCB1bnVzZWQ7XG4rXG4rXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFyZXNlcnZlZClcbitcdFx0Z290byB1bmxvY2s7XG4rXG4rXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZDtcbitcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjPSAwKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZDtcbitcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjIHJlc2VydmVkKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47XG4rXHRlbHNlXG4rXHRcdGdvdG8gdW5sb2NrO1xuK1xuK1x0cmVzZXJ2ZWRfdG90YWwgPSB0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIgP1xuK1x0XHRcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA6IFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZDtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK1x0KnJlc2VydmVkX3RvdGFsIC09IG1pbl90KHU2NCwgKnJlc2VydmVkX3RvdGFsLCB1bnVzZWQpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcbit1bmxvY2s6XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuKyNlbmRpZlxuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNlY3VyaXR5X2xvY2tlZF9kb3duKExPQ0tET1dOX0hJQkVSTkFUSU9OKTtcbitcdHJldHVybiBkYXRhLVx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQ7XG4rfVxuK1xuIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiB7XG4gXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTtcbiBcdHVuc2lnbmVkIGludCBzbGVlcF9mbGFncztcbiBcdGludCBlcnJvcjtcbiBcbi1cdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXG4rXHRpZiAoIWhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUoKSlcbiBcdFx0cmV0dXJuIC1FUEVSTTtcbiBcbiBcdHNsZWVwX2ZsYWdzID0gbG9ja19zeXN0ZW1fc2xlZXAoKTtcbiBcbiBcdGlmICghaGliZXJuYXRlX2FjcXVpcmUoKSkge1xuIFx0XHRlcnJvciA9IC1FQlVTWTtcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFxuIFx0aWYgKChmaWxwLVx1MDAzZWZfZmxhZ3MgXHUwMDI2IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7XG4gXHRcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XG4gXHRcdGVycm9yID0gLUVOT1NZUztcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFx0bm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7XG4gXHRkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4gXHRmaWxwLVx1MDAzZXByaXZhdGVfZGF0YSA9IGRhdGE7XG4gXHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHNwaW5fbG9ja19pbml0KFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkID0gMDtcbitcdGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0ID0gMDtcbitcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XG4rI2VuZGlmXG4gXHRpZiAoKGZpbHAtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkge1xuIFx0XHQvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovXG4gXHRcdGRhdGEtXHUwMDNlc3dhcCA9IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoc3dzdXNwX3Jlc3VtZV9kZXZpY2UsIDApO1xuQEAgLTk5LDggKzIzMCwxMyBAQCBzdGF0aWMgaW50IHNuYXBzaG90X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4gXHRkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQgPSBmYWxzZTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbitcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSk7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdGlmICghZXJyb3IpXG4rXHRcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IGdldF90YXNrX3BpZChjdXJyZW50LCBQSURUWVBFX1RHSUQpO1xuKyNlbmRpZlxuIFxuLSBVbmxvY2s6XG4rIHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIGVycm9yO1xuQEAgLTExNiw2ICsyNTIsMTAgQEAgc3RhdGljIGludCBzbmFwc2hvdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxuIFx0c3dzdXNwX2ZyZWUoKTtcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1x0cHV0X3BpZChkYXRhLVx1MDAzZW93bmVyX3RnaWQpO1xuK1x0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID0gTlVMTDtcbisjZW5kaWZcbiBcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cdTAwM2Vzd2FwKTtcbiBcdHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkYXRhLVx1MDAzZXN3YXApO1xuIFx0aWYgKGRhdGEtXHUwMDNlZnJvemVuKSB7XG5AQCAtMTI1LDYgKzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VmcmVlX2JpdG1hcHMpIHtcbiBcdFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xuIFx0fVxuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbiBcdHBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZID9cbiBcdFx0XHRQTV9QT1NUX0hJQkVSTkFUSU9OIDogUE1fUE9TVF9SRVNUT1JFKTtcbiBcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XG5AQCAtMTQ3LDEyICsyODgsMjMgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZixcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcdGlmICghZGF0YS1cdTAwM2VyZWFkeSkge1xuIFx0XHRyZXMgPSAtRU5PREFUQTtcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSAtRVBFUk07XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcbitcdFx0Z290byB1bmxvY2s7XG4gXHR9XG4rXG4gXHRpZiAoIXBnX29mZnApIHsgLyogb24gcGFnZSBib3VuZGFyeT8gKi9cbiBcdFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiBcdFx0aWYgKHJlcyBcdTAwM2M9IDApXG4tXHRcdFx0Z290byBVbmxvY2s7XG4rXHRcdFx0Z290byB1bmxvY2s7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xuIFx0fVxuQEAgLTE2Miw3ICszMTQsNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxuIFx0aWYgKHJlcyBcdTAwM2UgMClcbiBcdFx0Km9mZnAgKz0gcmVzO1xuIFxuLSBVbmxvY2s6XG4rIHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIHJlcztcbkBAIC0xODUsNiArMzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuIFxuIFx0ZGF0YSA9IGZpbHAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFxuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSAtRVBFUk07XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuIFx0aWYgKCFwZ19vZmZwKSB7XG4gXHRcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbkBAIC0yNTIsNiArNDE1LDkgQEAgc3RhdGljIGludCBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuIFx0aWYgKGRhdGEtXHUwMDNlc3dhcCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHN3ZGV2ID8gLUVOT0RFViA6IC1FSU5WQUw7XG4gXHRkYXRhLVx1MDAzZWRldiA9IHN3ZGV2O1xuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rXHRkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuKyNlbmRpZlxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTMxOCw2ICs0ODQsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4rXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbiBcdFx0cG1fcmVzdG9yZV9nZnBfbWFzaygpO1xuIFx0XHRlcnJvciA9IGhpYmVybmF0aW9uX3NuYXBzaG90KGRhdGEtXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCk7XG4gXHRcdGlmICghZXJyb3IpIHtcbkBAIC0zMjgsNiArNDk5LDE3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfQVRPTUlDX1JFU1RPUkU6XG4rXHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRcdGVycm9yID0gLUVQRVJNO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbitcdFx0XHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcbitcdFx0XHRpZiAoZXJyb3IpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuIFx0XHRlcnJvciA9IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiBcdFx0aWYgKGVycm9yKVxuIFx0XHRcdGJyZWFrO1xuQEAgLTM0Niw2ICs1MjgsNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0c3dzdXNwX2ZyZWUoKTtcbiBcdFx0bWVtc2V0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IHNuYXBzaG90X2hhbmRsZSkpO1xuIFx0XHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4rXHRcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRcdC8qXG4gXHRcdCAqIEl0IGlzIG5lY2Vzc2FyeSB0byB0aGF3IGtlcm5lbCB0aHJlYWRzIGhlcmUsIGJlY2F1c2VcbiBcdFx0ICogU05BUFNIT1RfQ1JFQVRFX0lNQUdFIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5IGFmdGVyXG5AQCAtMzY4LDYgKzU1MSw4IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHR9XG4gXHRcdHNpemUgPSBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSgpO1xuIFx0XHRzaXplIFx1MDAzY1x1MDAzYz0gUEFHRV9TSElGVDtcbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSlcbitcdFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xuIFx0XHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcbiBcdFx0YnJlYWs7XG4gXG5AQCAtMzk3LDYgKzU4Miw5IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHRcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cdTAwM2Vzd2FwKTtcbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1x0XHRzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKGRhdGEpO1xuKyNlbmRpZlxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfUzJSQU06XG5AQCAtNDA0LDYgKzU5MiwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuK1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbitcdFx0XHRlcnJvciA9IC1FUEVSTTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUYXNrcyBhcmUgZnJvemVuIGFuZCB0aGUgbm90aWZpZXJzIGhhdmUgYmVlbiBjYWxsZWQgd2l0aFxuIFx0XHQgKiBQTV9ISUJFUk5BVElPTl9QUkVQQVJFXG5AQCAtNDE3LDYgKzYxMCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIFNOQVBTSE9UX1BPV0VSX09GRjpcbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4rXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbiBcdFx0aWYgKGRhdGEtXHUwMDNlcGxhdGZvcm1fc3VwcG9ydClcbiBcdFx0XHRlcnJvciA9IGhpYmVybmF0aW9uX3BsYXRmb3JtX2VudGVyKCk7XG4gXHRcdGJyZWFrO1xuQEAgLTQyNSw2ICs2MjMsMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGVycm9yID0gc25hcHNob3Rfc2V0X3N3YXBfYXJlYShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuIFx0XHRicmVhaztcbiBcbitcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4rXHRcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkpXG4rXHRcdFx0ZXJyb3IgPSBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoZGF0YSwgKHZvaWQgX191c2VyICopYXJnKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XG4rXHRcdGVycm9yID0gc25hcHNob3Rfc2V0X3VzZXJfa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4rXHRcdGJyZWFrO1xuK1xuIFx0ZGVmYXVsdDpcbiBcdFx0ZXJyb3IgPSAtRU5PVFRZO1xuIFxuQEAgLTQ0OCw2ICs2NTcsOCBAQCBzbmFwc2hvdF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0Y2FzZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0U6XG4gXHRjYXNlIFNOQVBTSE9UX0NSRUFURV9JTUFHRTpcbiBcdGNhc2UgU05BUFNIT1RfU0VUX1NXQVBfQVJFQTpcbitcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4rXHRjYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWTpcbiBcdFx0cmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCxcbiBcdFx0XHRcdCAgICAgICh1bnNpZ25lZCBsb25nKSBjb21wYXRfcHRyKGFyZykpO1xuIFx0ZGVmYXVsdDpcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5oIGIva2VybmVsL3Bvd2VyL3VzZXIuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjRkZjJmOWFlOWFkYTRcbi0tLSAvZGV2L251bGxcbisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmhcbkBAIC0wLDAgKzEsMTUxIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcnlwdG8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjYXR0ZXJsaXN0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZF9pb2N0bHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vYWVzLmhcdTAwM2VcbitcbitzdHJ1Y3QgcGlkO1xuK1xuKyNkZWZpbmUgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBBRVNfS0VZU0laRV8xMjhcbisjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTZcbitcbisvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBwYWdlcyBpbiBhIHNpbmdsZSBBRUFEIGVuY3J5cHRpb24gY2h1bmsuICovXG4rI2RlZmluZSBDSFVOS19TSVpFIDE2XG4rXG4rc3RydWN0IHNuYXBzaG90X2RhdGEge1xuK1x0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4rXHRpbnQgc3dhcDtcbitcdGludCBtb2RlO1xuK1x0Ym9vbCBmcm96ZW47XG4rXHRib29sIHJlYWR5O1xuK1x0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xuK1x0Ym9vbCBmcmVlX2JpdG1hcHM7XG4rXHRib29sIGVuY3J5cHRpb25fcmVxdWlyZWQ7XG4rXHRkZXZfdCBkZXY7XG4rXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZF90Zm07XG4rXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcTtcbitcdHZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdO1xuK1x0dTggYXV0aF90YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV07XG4rXHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQ0hVTktfU0laRSArIDJdOyAvKiBBZGQgcm9vbSBmb3IgQUQgYW5kIGF1dGggdGFnLiAqL1xuK1x0c2l6ZV90IGNyeXB0X29mZnNldDtcbitcdHNpemVfdCBjcnlwdF9zaXplO1xuK1x0dTY0IGNyeXB0X3RvdGFsO1xuK1x0dTY0IGNyeXB0X3N0cmVhbV90b3RhbDtcbitcdHU2NCBub25jZV9sb3c7XG4rXHR1NjQgbm9uY2VfaGlnaDtcbitcdHU4IGVuY3J5cHRpb25fa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xuK1x0dTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbitcdGJvb2wgdXNlcl9rZXlfdmFsaWQ7XG4rXHR1NjQgbWV0YV9zaXplO1xuK1x0dTY0IGNyeXB0X21ldGFfc2l6ZTtcbitcdC8qXG4rXHQgKiBQcm90ZWN0cyBjcnlwdF9ieXRlc19yZWFkIGFuZCB0aGUgcmVzZXJ2YXRpb24gY291bnRlcnMgYmVsb3cuXG4rXHQgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZVxuK1x0ICogZ2VuZXJhdGVkIHN3YXAtbWFwIHBhZ2VzLlxuK1x0ICovXG4rXHRzcGlubG9ja190IGNyeXB0X2xvY2s7XG4rXHR1NjQgY3J5cHRfYnl0ZXNfcmVhZDtcbitcdHU2NCBjcnlwdF9zd2FwX3Jlc2VydmVkO1xuK1x0dTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDtcbitcdGxvZmZfdCBzd2FwX2hlYWRlcl9vZmZzZXQ7XG4rXHRzdHJ1Y3QgcGlkICpvd25lcl90Z2lkO1xuKyNlbmRpZlxuK1xuK307XG4rXG4rZXh0ZXJuIHN0cnVjdCBzbmFwc2hvdF9kYXRhIHNuYXBzaG90X3N0YXRlO1xuK1xuKy8qIGtlcm5lbC9wb3dlci9zbmFwZW5jLmMgcm91dGluZXMgKi9cbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1xuK3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7XG4rXG4rc3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHQgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuK1x0XHRcdFx0IGxvZmZfdCAqb2ZmcCk7XG4rXG4rdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcbitpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpO1xuK1xuK2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XG4rXG4raW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcbitcbitpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTtcbitcbitsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0XHQgbG9mZl90IHJhd19zaXplKTtcbitcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcbitcbitzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHJldHVybiBkYXRhLVx1MDAzZWFlYWRfdGZtO1xuK31cbitcbisjZWxzZVxuK1xuK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuK1x0XHRcdFx0XHQgICAgICBsb2ZmX3QgKm9mZnApXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuK1x0XHRcdFx0XHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKSB7fVxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbit7XG4rXHRyZXR1cm4gLUVOT1RUWTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0XHRcdCAgICAgICBsb2ZmX3QgcmF3X3NpemUpXG4re1xuK1x0cmV0dXJuIHJhd19zaXplO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisjZW5kaWZcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggNzhiNDliMDY1OGFkZC4uMTFkZjBjNTU2ZjRlOSAxMDA2NDRcbi0tLSBhL21tL3N3YXBmaWxlLmNcbisrKyBiL21tL3N3YXBmaWxlLmNcbkBAIC0yMzY2LDYgKzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpXG4gXHRyZXR1cm4gc2UtXHUwMDNlc3RhcnRfYmxvY2sgKyAob2Zmc2V0IC0gc2UtXHUwMDNlc3RhcnRfcGFnZSk7XG4gfVxuIFxuK2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbitcdFx0XHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpXG4re1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHRzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlO1xuK1x0c3RydWN0IHJiX25vZGUgKnJiO1xuK1xuK1x0aWYgKCFzaSB8fCAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4rXHRcdHJldHVybiAtRU5PREVWO1xuK1xuK1x0Zm9yIChyYiA9IHJiX2ZpcnN0KFx1MDAyNnNpLVx1MDAzZXN3YXBfZXh0ZW50X3Jvb3QpOyByYjsgcmIgPSByYl9uZXh0KHJiKSkge1xuK1x0XHRzZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIHJiX25vZGUpO1xuK1x0XHRpZiAoYmxvY2sgXHUwMDNlPSBzZS1cdTAwM2VzdGFydF9ibG9jayBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGJsb2NrIC0gc2UtXHUwMDNlc3RhcnRfYmxvY2sgXHUwMDNjIHNlLVx1MDAzZW5yX3BhZ2VzKSB7XG4rXHRcdFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jaztcbitcbitcdFx0XHQqb2Zmc2V0ID0gc2UtXHUwMDNlc3RhcnRfcGFnZSArIHBhZ2U7XG4rXHRcdFx0Km5yX3BhZ2VzID0gc2UtXHUwMDNlbnJfcGFnZXMgLSBwYWdlO1xuK1x0XHRcdHJldHVybiAwO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxuK3tcbitcdHBnb2ZmX3QgbnJfcGFnZXM7XG4rXG4rXHRyZXR1cm4gc3dhcGRldl9ibG9ja190b19leHRlbnQodHlwZSwgYmxvY2ssIG9mZnNldCwgXHUwMDI2bnJfcGFnZXMpO1xuK31cbitcbiAvKlxuICAqIFJldHVybiBlaXRoZXIgdGhlIHRvdGFsIG51bWJlciBvZiBzd2FwIHBhZ2VzIG9mIGdpdmVuIHR5cGUsIG9yIHRoZSBudW1iZXJcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTguMjAyNzEyODMyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgxNDQ3MTQ2NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRW5jcnlwdGlvbiBmb3IgVXNlcnNwYWNlIEhpYmVybmF0aW9uIFNuYXBzaG90cyAtIEtleSBBcmVhcyBmb3IgSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQgaW50cm9kdWNlcyBlbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0J3MgYSBwcmV0dHkgc3Vic3RhbnRpYWwgY2hhbmdlIGFuZCBkZWZpbml0ZWx5IHdhcnJhbnRzIGEgZ29vZCBmdXp6aW5nIGNhbXBhaWduLiBJdCB0b3VjaGVzIHF1aXRlIGEgZmV3IGtleSBhcmVhcyBvZiB0aGUga2VybmVsLlxuXG5GaXJzdCwgdGhlIGNvcmUgb2YgaXQgaXMgdGhlIGVuY3J5cHRpb24gaXRzZWxmLiBJJ20gc2VlaW5nIGNoYW5nZXMgaW4gc2V2ZXJhbCBmaWxlczogYGJsb2NrL2ZvcHMuY2AsIHZhcmlvdXMgaGVhZGVyIGZpbGVzIChgc3VzcGVuZC5oYCwgYHN3YXAuaGAsIGBzdXNwZW5kX2lvY3Rscy5oYCksIHRoZSBrZXJuZWwgcG93ZXIgY29uZmlnIGZpbGVzIChgS2NvbmZpZ2AsIGBNYWtlZmlsZWAsIGBwb3dlci5oYCksIGFuZCBjcnVjaWFsbHksIGZpbGVzIGxpa2UgYGhpYmVybmF0ZS5jYCwgYHNuYXBlbmMuY2AsIGBzbmFwc2hvdC5jYCwgYHN3YXAuY2AsIGFuZCBgdXNlci5jYCB3aXRoaW4gdGhlIGBrZXJuZWwvcG93ZXJgIGRpcmVjdG9yeSwgYWxvbmcgd2l0aCBgbW0vc3dhcGZpbGUuY2AuXG5cblRoZSBnaXN0IG9mIGl0IGlzIGVuYWJsaW5nIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uLiBUaGV5J3ZlIGFkZGVkIHNvbWUgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGA6IGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAgYW5kIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgLiBUaGVyZSdzIGFsc28gYSBuZXcgc3lzZnMgZmlsZSwgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAuXG5cbkxldCdzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgdGhlIG5ldyBgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTmAgb3B0aW9uIGlzIHRoZSBrZXkgb25lLiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgY29uZmlnIGZvciBgL2Rldi9zbmFwc2hvdGAuIE9mIGNvdXJzZSwgd2UnbGwgbmVlZCBgSElCRVJOQVRJT05gIGFzIHdlbGwuXG5cbk5vdywgbGV0J3MgemVybyBpbiBvbiB0aGUgaW50ZXJlc3RpbmcgZnVuY3Rpb25zLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBzbmFwc2hvdF9pb2N0bGAgaXMgZ29pbmcgdG8gaGFuZGxlIHRob3NlIG5ldyBpb2N0bHMuIGBrZXJuZWwvcG93ZXIvc25hcGVuYy5jYCBpcyBnb2luZyB0byBiZSB0aGUgaGVhcnQgb2YgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgYXQ6IGBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlgLCBgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5YCwgYHNuYXBzaG90X3NldF91c2VyX2tleWAsIGBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZGAsIGBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRgLCBgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkYCwgYW5kIGBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VgLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5gIGFuZCBgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZGAgYXJlIGltcG9ydGFudCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgc25hcHNob3Qgd3JpdGUgcHJvY2Vzcy4gVGhlbiwgb3ZlciBpbiBgbW0vc3dhcGZpbGUuY2AsIHRoZSBgc3dhcGRldl9ibG9ja190b19leHRlbnRgIGFuZCBgc3dhcGRldl9ibG9ja190b19vZmZzZXRgIGZ1bmN0aW9ucyBoYXZlIGJlY29tZSByZWxldmFudCBiZWNhdXNlIG9mIHRoZSBzd2FwIGFsbG9jYXRpb24gdHJhY2tpbmcuIEFuZCwgYGtlcm5lbC9wb3dlci9zd2FwLmNgIGhhcyBgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkYCBhbmQgYHN3c3VzcF9zd2FwX21hcF9ieXRlc2AuXG5cblNvLCBmcm9tIGEgZnV6emluZyBwZXJzcGVjdGl2ZSwgdGhlIHBsYW4gaXMgdG8gZm9jdXMgb24gdGhlc2UgZnVuY3Rpb25zOlxuXG4qICAgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGBcbiogICBgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5YFxuKiAgIGBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXlgXG4qICAgYHNuYXBzaG90X3NldF91c2VyX2tleWBcbiogICBgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWRgXG4qICAgYHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZGBcbiogICBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYFxuKiAgIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5gXG4qICAgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRgXG4qICAgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGBcbiogICBgc3dhcGRldl9ibG9ja190b19leHRlbnRgXG5cbkFuZCB0aGUga2V5IGNvbmZpZ3MgdG8gZW5hYmxlIGFyZTpcblxuKiAgIGBFTkNSWVBURURfSElCRVJOQVRJT05gXG4qICAgYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmBcbiogICBgSElCRVJOQVRJT05gXG5cblRoaXMgbG9va3MgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgdGhvcm91Z2ggZnV6emluZyBjYW1wYWlnbi4gV2UgYXJlIGFpbWluZyB0byB1bmNvdmVyIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIHJlYWQvd3JpdGUgcGF0aHMsIGtleSBtYW5hZ2VtZW50LCBhbmQgc3dhcCBhbGxvY2F0aW9uIGR1cmluZyB0aGUgaGliZXJuYXRpb24gcHJvY2Vzcy4gR2l2ZW4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIGFuZCB0aGUgY29yZSBzeXN0ZW0gZnVuY3Rpb25hbGl0eSBpbnZvbHZlZCwgSSdtIGV4cGVjdGluZyBzb21lIGludGVyZXN0aW5nIGZpbmRpbmdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDgxMSwiT3V0cHV0VG9rZW5zIjoyNjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTM6MTYuMzQ3NDMxNDUyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTkyMDU5NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVOQ1JZUFRFRF9ISUJFUk5BVElPTlwiLFxuICAgIFwiSElCRVJOQVRJT05fU05BUFNIT1RfREVWXCIsXG4gICAgXCJISUJFUk5BVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZFwiLFxuICAgIFwic25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF91c2VyX2tleVwiLFxuICAgIFwic25hcHNob3RfcmVhZF9lbmNyeXB0ZWRcIixcbiAgICBcInNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlXCIsXG4gICAgXCJoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5cIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRcIixcbiAgICBcInN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZFwiLFxuICAgIFwic3dhcGRldl9ibG9ja190b19leHRlbnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uIGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBJdCBhZGRzIG5ldyBpb2N0bHMgdG8gYC9kZXYvc25hcHNob3RgIChgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05gLCBgU05BUFNIT1RfU0VUX1VTRVJfS0VZYCksIGEgc3lzZnMgaW50ZXJmYWNlIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLCBhbmQgbW9kaWZpZXMgdGhlIHJlYWQvd3JpdGUgcGF0aHMgZm9yIHRoZSBzbmFwc2hvdCBkZXZpY2UgdG8gc3VwcG9ydCBlbmNyeXB0aW9uL2RlY3J5cHRpb24uIEl0IGFsc28gaG9va3MgaW50byBibG9jayBkZXZpY2Ugd3JpdGVzIHRvIHRyYWNrIHN3YXAgYWxsb2NhdGlvbnMuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRU5DUllQVEVEX0hJQkVSTkFUSU9OXCIsXG4gICAgXCJISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcIixcbiAgICBcIkhJQkVSTkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkXCIsXG4gICAgXCJzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X3VzZXJfa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VcIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpblwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZFwiLFxuICAgIFwic3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkXCIsXG4gICAgXCJzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-04 11:27:00 +0000 UTC FinishedAt: 2026-08-04 12:13:18 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "fabfaaa8090a83cbc97836cc70d47c69fa9e8c61", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ENCRYPTED_HIBERNATION", "HIBERNATION_SNAPSHOT_DEV", "HIBERNATION" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "fabfaaa8090a83cbc97836cc70d47c69fa9e8c61", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "ENCRYPTED_HIBERNATION", "HIBERNATION_SNAPSHOT_DEV", "HIBERNATION" ], "series_id": "9920218f-c6aa-426c-9b8f-6b119b2d2bd2" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "snapshot_store_encryption_seed", "snapshot_get_encryption_key", "snapshot_set_encryption_key", "snapshot_set_user_key", "snapshot_read_encrypted", "snapshot_write_encrypted", "snapshot_finalize_decrypted_image", "hibernate_snapshot_write_begin", "hibernate_snapshot_write_end", "swsusp_swap_range_allocated", "swapdev_block_to_extent" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VOQ1JZUFRFRF9ISUJFUk5BVElPTiYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYmIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfdXNlcl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3RfcmVhZF9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZSYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4mIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZCYjMzQ7LAogICAgJiMzNDtzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQmIzM0OywKICAgICYjMzQ7c3dhcGRldl9ibG9ja190b19leHRlbnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTAzYzAyMGU3YTJjMmZmZjJlYTJiNGQzODA4N2MwODRkNjY0NTdhYVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDQgMTI6MTI6NTQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXJcbmluZGV4IGQzOGRhMDc3OTA1YTkuLjU3ZjYwNjNlZjg4YzkgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG5AQCAtNDcwLDMgJiM0Mzs0NzAsMTcgQEAgRGVzY3JpcHRpb246XG4gXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogM1xuJiM0MztcbiYjNDM7V2hhdDpcdFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkXG4mIzQzO0RhdGU6XHRcdEp1bHkgMjAyNlxuJiM0MztDb250YWN0Olx0bGludXgtcG1Admdlci5rZXJuZWwub3JnXG4mIzQzO0Rlc2NyaXB0aW9uOlxuJiM0MztcdFx0V3JpdGUtb25seSBmaWxlIHByZXNlbnQgd2hlbiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OPXkuXG4mIzQzO1xuJiM0MztcdFx0VHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2Ugd3JpdGVzIGEgMzItYnl0ZSBzZWVkLCBlbmNvZGVkIGFzXG4mIzQzO1x0XHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXG4mIzQzO1x0XHRlbmFibGluZyBlbmNyeXB0ZWQgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy5cbiYjNDM7XG4mIzQzO1x0XHRUaGUgZmlyc3Qgc3VjY2Vzc2Z1bCB3cml0ZSBsb2NrcyB0aGUgc2VlZCB1bnRpbCB0aGUgbmV4dCBib290LlxuJiM0MztcdFx0V3JpdGluZyB0aGUgc2FtZSBzZWVkIGFnYWluIHN1Y2NlZWRzLiBXcml0aW5nIGEgZGlmZmVyZW50IHNlZWRcbiYjNDM7XHRcdGZhaWxzIHdpdGggRVBFUk0uXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG5pbmRleCAxY2Y2MmQ4MGE5Y2ExLi5kZjhlY2E5ZTZlMzYzIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcbkBAIC0xMTUsNiAmIzQzOzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxuIFx0dG8gcmVzdW1lIHRoZSBzeXN0ZW0gZnJvbSBSQU0gaWYgdGhlcmUmIzM5O3MgZW5vdWdoIGJhdHRlcnkgcG93ZXIgb3IgcmVzdG9yZVxuIFx0aXRzIHN0YXRlIG9uIHRoZSBiYXNpcyBvZiB0aGUgc2F2ZWQgc3VzcGVuZCBpbWFnZSBvdGhlcndpc2UpXG4gXG4mIzQzO1NOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OXG4mIzQzO1x0RW5hYmxlcyBlbmNyeXB0aW9uIG9mIHRoZSBoaWJlcm5hdGUgaW1hZ2Ugd2l0aGluIHRoZSBrZXJuZWwuIFRydXN0ZWRcbiYjNDM7XHRlYXJseSB1c2Vyc3BhY2UgbXVzdCB3cml0ZSB0aGUgMzItYnl0ZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgdG9cbiYjNDM7XHQvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBpb2N0bC4gVXBvbiBzdXNwZW5kXG4mIzQzO1x0KGllIHdoZW4gdGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nKSwgdGhpcyBpb2N0bCByZXR1cm5zXG4mIzQzO1x0YW4gb3BhcXVlIHdyYXBwZWQga2V5IGJsb2IgYW5kIHRoZSBzdGFydGluZyBub25jZS4gVXBvbiByZXN1bWUgKGllIHdoZW5cbiYjNDM7XHR0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcpLCB0aGlzIGlvY3RsIHJlY2VpdmVzIHRoZVxuJiM0MztcdHNhbWUgYmxvYiBhbmQgbm9uY2UgZnJvbSB1c2VybW9kZSBhZnRlciB0aGUgc2FtZSBzZWVkIGhhcyBiZWVuIHdyaXR0ZW5cbiYjNDM7XHR0byAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQuIFRoZSBwbGFpbnRleHQgaW1hZ2Uga2V5IGlzIGdlbmVyYXRlZCBhbmRcbiYjNDM7XHR1bndyYXBwZWQgaW5zaWRlIHRoZSBrZXJuZWwuXG4mIzQzO1xuJiM0MztTTkFQU0hPVF9TRVRfVVNFUl9LRVlcbiYjNDM7XHRNaXhlcyBhZGRpdGlvbmFsIHVzZXIga2V5IG1hdGVyaWFsIGludG8gdGhlIGRhdGEgcG9ydGlvbiBvZiBhbiBlbmNyeXB0ZWRcbiYjNDM7XHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXG4mIzQzO1x0a2V5X2xlbiBtdXN0IGJlIGJldHdlZW4gOCBhbmQgVVNXU1VTUF9VU0VSX0tFWV9TSVpFIGJ5dGVzLCBhbmQgcmVzZXJ2ZWRcbiYjNDM7XHRtdXN0IGJlIHplcm8uIER1cmluZyBoaWJlcm5hdGlvbiB0aGUga2VybmVsIHdyaXRlcyBtZXRhX3NpemUgd2l0aCB0aGVcbiYjNDM7XHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcbiYjNDM7XHRtZXRhX3NpemUgYmFjayBzbyB0aGUga2VybmVsIGNhbiBzd2l0Y2gga2V5cyBhdCB0aGUgbWV0YWRhdGEgYm91bmRhcnlcbiYjNDM7XHRiZWZvcmUgdGhlIHNuYXBzaG90IGhlYWRlciBoYXMgYmVlbiBkZWNyeXB0ZWQuXG4mIzQzO1xuIFRoZSBkZXZpY2UmIzM5O3MgcmVhZCgpIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbVxuIHRoZSBrZXJuZWwuICBJdCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcbiBcbmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmNcbmluZGV4IDE1NzgzYTYxODBkZWMuLmVmZWI0ODVlOTFlNmMgMTAwNjQ0XG4tLS0gYS9ibG9jay9mb3BzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2ZvcHMuY1xuQEAgLTcyMyw0MyAmIzQzOzcyMyw2NSBAQCBzdGF0aWMgc3NpemVfdCBibGtkZXZfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSlcbiBcdHN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi1cdTAwM2VraV9maWxwO1xuIFx0c3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGJkZXZfZmlsZV9pbm9kZShmaWxlKTtcbiBcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpO1xuJiM0MztcdGRldl90IGRldiA9IGJkX2lub2RlLVx1MDAzZWlfcmRldjtcbiBcdGJvb2wgYXRvbWljID0gaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgSU9DQl9BVE9NSUM7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGJkZXZfbnJfYnl0ZXMoYmRldik7XG4mIzQzO1x0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgaGliZXJuYXRlX3dyaXRlO1xuJiM0MztcdHNpemVfdCBoaWJlcm5hdGVfbGVuID0gMDtcbiBcdHNpemVfdCBzaG9ydGVkID0gMDtcbiYjNDM7XHRzc2l6ZV90IGhpYmVybmF0ZV93cml0dGVuID0gMDtcbiBcdHNzaXplX3QgcmV0O1xuIFxuIFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFxuLVx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcdTAwMjZcdTAwMjYgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGJkX2lub2RlLVx1MDAzZWlfcmRldikpXG4tXHRcdHJldHVybiAtRVRYVEJTWTtcbiYjNDM7XHRpZiAoSVNfU1dBUEZJTEUoYmRfaW5vZGUpIFx1MDAyNlx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2KSkge1xuJiM0MztcdFx0aWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpIHx8ICFpb2NiX2lzX2RzeW5jKGlvY2IpIHx8XG4mIzQzO1x0XHQgICAgKGlvY2ItXHUwMDNla2lfZmxhZ3MgXHUwMDI2IElPQ0JfRElSRUNUKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FVFhUQlNZO1xuIFxuLVx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSlcbi1cdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHRoaWJlcm5hdGVfbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7XG4mIzQzO1x0XHRoaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLVx1MDAzZWtpX3BvcywgaGliZXJuYXRlX2xlbik7XG4mIzQzO1x0XHRpZiAoaGliZXJuYXRlX3dyaXRlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVUWFRCU1k7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGhpYmVybmF0ZV93cml0ZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0MztcdH1cbiBcbi1cdGlmIChpb2NiLVx1MDAzZWtpX3BvcyBcdTAwM2U9IHNpemUpXG4tXHRcdHJldHVybiAtRU5PU1BDO1xuJiM0MztcdGlmICghaW92X2l0ZXJfY291bnQoZnJvbSkpIHtcbiYjNDM7XHRcdHJldCA9IDA7XG4mIzQzO1x0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4mIzQzO1x0fVxuIFxuLVx0aWYgKChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1x0aWYgKGlvY2ItXHUwMDNla2lfcG9zIFx1MDAzZT0gc2l6ZSkge1xuJiM0MztcdFx0cmV0ID0gLUVOT1NQQztcbiYjNDM7XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICgoaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgKElPQ0JfTk9XQUlUIHwgSU9DQl9ESVJFQ1QpKSA9PSBJT0NCX05PV0FJVCkge1xuJiM0MztcdFx0cmV0ID0gLUVPUE5PVFNVUFA7XG4mIzQzO1x0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4mIzQzO1x0fVxuIFxuIFx0aWYgKGF0b21pYykge1xuIFx0XHRyZXQgPSBnZW5lcmljX2F0b21pY193cml0ZV92YWxpZChpb2NiLCBmcm9tKTtcbiBcdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0XHRnb3RvIG91dF9oaWJlcm5hdGU7XG4gXHR9XG4gXG4gXHRzaXplIC09IGlvY2ItXHUwMDNla2lfcG9zO1xuIFx0aWYgKGlvdl9pdGVyX2NvdW50KGZyb20pIFx1MDAzZSBzaXplKSB7XG4tXHRcdGlmIChhdG9taWMpXG4tXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1x0XHRpZiAoYXRvbWljKSB7XG4mIzQzO1x0XHRcdHJldCA9IC1FSU5WQUw7XG4mIzQzO1x0XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiYjNDM7XHRcdH1cbiBcdFx0c2hvcnRlZCA9IGlvdl9pdGVyX2NvdW50KGZyb20pIC0gc2l6ZTtcbiBcdFx0aW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgc2l6ZSk7XG4gXHR9XG4gXG4gXHRyZXQgPSBmaWxlX3VwZGF0ZV90aW1lKGZpbGUpO1xuIFx0aWYgKHJldClcbi1cdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcbiBcdGlmIChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiBJT0NCX0RJUkVDVCkge1xuIFx0XHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xuQEAgLTc3Nyw5ICYjNDM7Nzk5LDE2IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxuIFx0XHRpbm9kZV91bmxvY2tfc2hhcmVkKGJkX2lub2RlKTtcbiBcdH1cbiBcbi1cdGlmIChyZXQgXHUwMDNlIDApXG4mIzQzO1x0aWYgKHJldCBcdTAwM2UgMCkge1xuJiM0MztcdFx0aGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7XG4gXHRcdHJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpO1xuJiM0MztcdH1cbiBcdGlvdl9pdGVyX3JlZXhwYW5kKGZyb20sIGlvdl9pdGVyX2NvdW50KGZyb20pICYjNDM7IHNob3J0ZWQpO1xuJiM0MztcbiYjNDM7b3V0X2hpYmVybmF0ZTpcbiYjNDM7XHRpZiAoaGliZXJuYXRlX2xlbilcbiYjNDM7XHRcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxuJiM0MztcdFx0XHRcdFx0ICAgICBoaWJlcm5hdGVfd3JpdHRlbik7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oXG5pbmRleCBiMDI4NzZmMWFlMzhhLi44MzA4YTY1ODM3NTZjIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oXG5AQCAtNDI2LDEwICYjNDM7NDI2LDMyIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBwbV9oaWJlcm5hdGlvbl9tb2RlX2lzX3N1c3BlbmQodm9pZCkgeyByZXR1cm4gZmFsc2U7IH1cbiBcbiBpbnQgYXJjaF9yZXN1bWVfbm9zbXQodm9pZCk7XG4gXG4mIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHtcbiYjNDM7XHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSxcbiYjNDM7XHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0UsXG4mIzQzO1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUixcbiYjNDM7fTtcbiYjNDM7XG4gI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcbiBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KTtcbiYjNDM7ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcbiYjNDM7dm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXG4mIzQzO1x0XHRcdFx0ICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZChlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlLFxuJiM0MztcdFx0XHRcdFx0XHRzaXplX3QgcmVzZXJ2ZWQsXG4mIzQzO1x0XHRcdFx0XHRcdHNzaXplX3Qgd3JpdHRlbilcbiYjNDM7e1xuJiM0Mzt9XG4gI2VuZGlmXG4gXG4gLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTQzOSw2ICYjNDM7NDM5LDkgQEAgZXh0ZXJuIGludCBmaW5kX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkZXZfdCBkZXZpY2UsIHNlY3Rvcl90IG9mZnNldCk7XG4gaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTtcbiBleHRlcm4gdW5zaWduZWQgaW50IGNvdW50X3N3YXBfcGFnZXMoaW50LCBpbnQpO1xuIGV4dGVybiBzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCwgcGdvZmZfdCk7XG4mIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCk7XG4mIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbiYjNDM7XHRcdFx0ICAgIHBnb2ZmX3QgKm5yX3BhZ2VzKTtcbiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XG4gZXh0ZXJuIGJvb2wgc3dhcF9lbnRyeV9zd2FwcGVkKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSwgc3dwX2VudHJ5X3QgZW50cnkpO1xuIGV4dGVybiBpbnQgc3dwX3N3YXBjb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XG5AQCAtNTM1LDYgJiM0Mzs1MzgsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgYWRkX3N3YXBfZXh0ZW50KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsXG4ge1xuIFx0cmV0dXJuIC1FSU5WQUw7XG4gfVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxuJiM0MztcdFx0XHRcdFx0ICBwZ29mZl90ICpvZmZzZXQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxuJiM0MztcdFx0XHRcdFx0ICBwZ29mZl90ICpvZmZzZXQsXG4mIzQzO1x0XHRcdFx0XHQgIHBnb2ZmX3QgKm5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO31cbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cbiAjaWZkZWYgQ09ORklHX01FTUNHXG4gc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5pbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5AQCAtMTMsNiAmIzQzOzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHtcbiBcdF9fdTMyIGRldjtcbiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuIFxuJiM0MzsjZGVmaW5lIFVTV1NVU1BfS0VZX05PTkNFX1NJWkUgMTZcbiYjNDM7I2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzJcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlXG4mIzQzOyAqIGVuY3J5cHRpb24ga2V5IGFuZCBzdGFydGluZyBub25jZSBpbiBlaXRoZXIgZGlyZWN0aW9uLlxuJiM0MzsgKi9cbiYjNDM7c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2Ige1xuJiM0MztcdF9fdTMyIGJsb2JfbGVuO1xuJiM0MztcdF9fdTggYmxvYls1MTJdO1xuJiM0MztcdF9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogQWxsb3cgdXNlciBtb2RlIHRvIGZvbGQgaW4ga2V5IG1hdGVyaWFsIGZvciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBoaWJlcm5hdGVcbiYjNDM7ICogaW1hZ2UuXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB7XG4mIzQzO1x0LyogS2VybmVsIHJldHVybnMgdGhlIG1ldGFkYXRhIHNpemU7IHJlc3VtZSBwYXNzZXMgdGhlIHNhdmVkIHZhbHVlIGluLiAqL1xuJiM0MztcdF9fdTY0IG1ldGFfc2l6ZTtcbiYjNDM7XHRfX3UzMiBrZXlfbGVuO1xuJiM0MztcdF9fdTMyIHJlc2VydmVkO1xuJiM0MztcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xuJiM0MztcbiAjZGVmaW5lIFNOQVBTSE9UX0lPQ19NQUdJQ1x0JiMzOTszJiMzOTtcbiAjZGVmaW5lIFNOQVBTSE9UX0ZSRUVaRVx0XHRcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDEpXG4gI2RlZmluZSBTTkFQU0hPVF9VTkZSRUVaRVx0XHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAyKVxuQEAgLTI5LDYgJiM0Mzs1NCwxMCBAQCBzdHJ1Y3QgcmVzdW1lX3N3YXBfYXJlYSB7XG4gI2RlZmluZSBTTkFQU0hPVF9QUkVGX0lNQUdFX1NJWkVcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE4KVxuICNkZWZpbmUgU05BUFNIT1RfQVZBSUxfU1dBUF9TSVpFXHRfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMTksIF9fa2VybmVsX2xvZmZfdClcbiAjZGVmaW5lIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRVx0X0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIwLCBfX2tlcm5lbF9sb2ZmX3QpXG4tI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlJcdDIwXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFxcXG4mIzQzO1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IpXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfU0VUX1VTRVJfS0VZXHRcdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFxcXG4mIzQzO1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXHQyMlxuIFxuICNlbmRpZiAvKiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSCAqL1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWdcbmluZGV4IDUzMGM4OTczMTFkNDQuLmE5YmVlNzE1NzFjZmEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL0tjb25maWdcbkBAIC0xMTUsNiAmIzQzOzExNSwyMSBAQCBjb25maWcgSElCRVJOQVRJT05fREVGX0NPTVBcbiBcdGhlbHBcbiBcdCAgRGVmYXVsdCBjb21wcmVzc29yIHRvIGJlIHVzZWQgZm9yIGhpYmVybmF0aW9uLlxuIFxuJiM0Mztjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4mIzQzO1x0Ym9vbCBcJiMzNDtFbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBzbmFwc2hvdHNcJiMzNDtcbiYjNDM7XHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlxuJiM0MztcdHNlbGVjdCBDUllQVE9fQUVTXG4mIzQzO1x0c2VsZWN0IENSWVBUT19HQ01cbiYjNDM7XHRzZWxlY3QgQ1JZUFRPX0xJQl9TSEEyNTZcbiYjNDM7XHRoZWxwXG4mIzQzO1x0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXG4mIzQzO1x0ICBjcmVhdGVkIGJ5IHVzd3N1c3AgdG9vbHMuIEEgdHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2UgY29tcG9uZW50IG11c3RcbiYjNDM7XHQgIHByb3ZpZGUgdGhlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBiZWZvcmUgZW5hYmxpbmcgZW5jcnlwdGlvbi5cbiYjNDM7XG4mIzQzO1x0ICBTYXkgTiBpZiB1c2Vyc3BhY2UgaGFuZGxlcyB0aGUgaW1hZ2UgZW5jcnlwdGlvbi5cbiYjNDM7XG4mIzQzO1x0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4mIzQzO1xuIGNvbmZpZyBQTV9TVERfUEFSVElUSU9OXG4gXHRzdHJpbmcgXCYjMzQ7RGVmYXVsdCByZXN1bWUgcGFydGl0aW9uXCYjMzQ7XG4gXHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXG5pbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcbkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORClcdFx0JiM0Mzs9IHN1c3BlbmQub1xuIG9iai0kKENPTkZJR19QTV9URVNUX1NVU1BFTkQpXHQmIzQzOz0gc3VzcGVuZF90ZXN0Lm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXHQmIzQzOz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT05fU05BUFNIT1RfREVWKSAmIzQzOz0gdXNlci5vXG4mIzQzO29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICYjNDM7PSBzbmFwZW5jLm9cbiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKVx0JiM0Mzs9IGF1dG9zbGVlcC5vXG4gb2JqLSQoQ09ORklHX1BNX1dBS0VMT0NLUylcdCYjNDM7PSB3YWtlbG9jay5vXG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG5pbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcbkBAIC0zNiw2ICYjNDM7MzYsNyBAQFxuICNpbmNsdWRlIFx1MDAzY3RyYWNlL2V2ZW50cy9wb3dlci5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7cG93ZXIuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1c2VyLmhcJiMzNDtcbiBcbiBcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XG5AQCAtMTEzLDYgJiM0MzsxMTQsMTQgQEAgYm9vbCBoaWJlcm5hdGlvbl9hdmFpbGFibGUodm9pZClcbiBcdFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcdTAwMjZcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XG4gfVxuIFxuJiM0Mztib29sIGhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBub2hpYmVybmF0ZSA9PSAwIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0KCFzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTikgfHxcbiYjNDM7XHRcdCBJU19FTkFCTEVEKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCFzZWNyZXRtZW1fYWN0aXZlKCkgXHUwMDI2XHUwMDI2ICFjeGxfbWVtX2FjdGl2ZSgpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGhpYmVybmF0aW9uX3NldF9vcHMgLSBTZXQgdGhlIGdsb2JhbCBoaWJlcm5hdGUgb3BlcmF0aW9ucy5cbiAgKiBAb3BzOiBIaWJlcm5hdGlvbiBvcGVyYXRpb25zIHRvIHVzZSBpbiBzdWJzZXF1ZW50IGhpYmVybmF0aW9uIHRyYW5zaXRpb25zLlxuQEAgLTEzNzYsMTIgJiM0MzsxMzg1LDM1IEBAIHN0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosXG4gXG4gcG93ZXJfYXR0cihyZXNlcnZlZF9zaXplKTtcbiBcbiYjNDM7I2lmZGVmIENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT05cbiYjNDM7c3RhdGljIHNzaXplX3Qgc25hcHNob3Rfc2VlZF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiYjNDM7XHRcdFx0XHQgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsXG4mIzQzO1x0XHRcdFx0ICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbilcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xuJiM0MztcdHJldHVybiByZXQgPyByZXQgOiBuO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHNuYXBzaG90X3NlZWRfYXR0ciA9IHtcbiYjNDM7XHQuYXR0clx0PSB7XG4mIzQzO1x0XHQubmFtZSA9IFwmIzM0O3NuYXBzaG90X3NlZWRcJiMzNDssXG4mIzQzO1x0XHQubW9kZSA9IDAyMDAsXG4mIzQzO1x0fSxcbiYjNDM7XHQuc3RvcmVcdD0gc25hcHNob3Rfc2VlZF9zdG9yZSxcbiYjNDM7fTtcbiYjNDM7I2VuZGlmXG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpnW10gPSB7XG4gXHRcdTAwMjZkaXNrX2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc3VtZV9vZmZzZXRfYXR0ci5hdHRyLFxuIFx0XHUwMDI2cmVzdW1lX2F0dHIuYXR0cixcbiBcdFx1MDAyNmltYWdlX3NpemVfYXR0ci5hdHRyLFxuIFx0XHUwMDI2cmVzZXJ2ZWRfc2l6ZV9hdHRyLmF0dHIsXG4mIzQzOyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4mIzQzO1x0XHUwMDI2c25hcHNob3Rfc2VlZF9hdHRyLmF0dHIsXG4mIzQzOyNlbmRpZlxuIFx0TlVMTCxcbiB9O1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaFxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbkBAIC0xNjAsNiAmIzQzOzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUge1xuIFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7XG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCh2b2lkKTtcbiBleHRlcm4gaW50IHNuYXBzaG90X3JlYWRfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIGV4dGVybiBpbnQgc25hcHNob3Rfd3JpdGVfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIGludCBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuQEAgLTE2Nyw4ICYjNDM7MTY4LDExIEBAIGV4dGVybiBpbnQgc25hcHNob3RfaW1hZ2VfbG9hZGVkKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gXG4gZXh0ZXJuIGJvb2wgaGliZXJuYXRlX2FjcXVpcmUodm9pZCk7XG4gZXh0ZXJuIHZvaWQgaGliZXJuYXRlX3JlbGVhc2Uodm9pZCk7XG4mIzQzO2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTtcbiBcbiBleHRlcm4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCk7XG4mIzQzO2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpO1xuJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcyk7XG4gZXh0ZXJuIHZvaWQgZnJlZV9hbGxfc3dhcF9wYWdlcyhpbnQgc3dhcCk7XG4gZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7XG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBlbmMuYyBiL2tlcm5lbC9wb3dlci9zbmFwZW5jLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jZDI5ODAzZWM2YzVhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXG5AQCAtMCwwICYjNDM7MSw5NDAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqL1xuJiM0MztcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY3J5cHRvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL2FlYWQuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NjcnlwdG8vZ2NtLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL3NoYTIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NjcnlwdG8vdXRpbHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tdXRleC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JhbmRvbS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7cG93ZXIuaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt1c2VyLmhcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU05BUFNIT1RfU0VFRF9TSVpFIFNIQTI1Nl9ESUdFU1RfU0laRVxuJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0tFWV9CTE9CX1ZFUlNJT04gMVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHU4IHNuYXBzaG90X2tleV9ibG9iX21hZ2ljWzhdID0ge1xuJiM0MztcdCYjMzk7UyYjMzk7LCAmIzM5O1cmIzM5OywgJiMzOTtTJiMzOTssICYjMzk7VSYjMzk7LCAmIzM5O1MmIzM5OywgJiMzOTtQJiMzOTssICYjMzk7SyYjMzk7LCAmIzM5OzEmIzM5OyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB7XG4mIzQzO1x0dTggbWFnaWNbc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKV07XG4mIzQzO1x0X19sZTMyIHZlcnNpb247XG4mIzQzO1x0dTggd3JhcF9ub25jZVtHQ01fQUVTX0lWX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHU4IGVuY3J5cHRlZF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0dTggdGFnW1NOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0Mzt9IF9fcGFja2VkO1xuJiM0MztcbiYjNDM7c3RhdGljIERFRklORV9NVVRFWChzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7c3RhdGljIHU4IHNuYXBzaG90X3NlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0c2l6ZV90IGxlbiA9IGNvdW50O1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChsZW4gXHUwMDI2XHUwMDI2IGJ1ZltsZW4gLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuJiM0MztcdFx0bGVuLS07XG4mIzQzO1x0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuJiM0MztcdGlmIChzbmFwc2hvdF9zZWVkX3ZhbGlkKSB7XG4mIzQzO1x0XHRyZXQgPSBjcnlwdG9fbWVtbmVxKHNuYXBzaG90X3NlZWQsIHNlZWQsIHNpemVvZihzZWVkKSkgPyAtRVBFUk0gOiAwO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcbiYjNDM7XHRzbmFwc2hvdF9zZWVkX3ZhbGlkID0gdHJ1ZTtcbiYjNDM7XHRwcl9pbmZvKFwmIzM0O1BNOiBoaWJlcm5hdGU6IHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBsb2NrZWRcXG5cJiMzNDspO1xuJiM0MztcbiYjNDM7b3V0OlxuJiM0MztcdG11dGV4X3VubG9jayhcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfY29weV9lbmNyeXB0aW9uX3NlZWQodTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdKVxuJiM0Mzt7XG4mIzQzO1x0Ym9vbCB2YWxpZDtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcbiYjNDM7XHR2YWxpZCA9IHNuYXBzaG90X3NlZWRfdmFsaWQ7XG4mIzQzO1x0aWYgKHZhbGlkKVxuJiM0MztcdFx0bWVtY3B5KHNlZWQsIHNuYXBzaG90X3NlZWQsIFNOQVBTSE9UX1NFRURfU0laRSk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdmFsaWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pXG4mIzQzO3tcbiYjNDM7XHRzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gXCYjMzQ7TGludXggaGliZXJuYXRlIHNuYXBzaG90IGtleSB3cmFwIHYxXCYjMzQ7O1xuJiM0MztcdHU4IGRpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdO1xuJiM0MztcdHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuJiM0MztcbiYjNDM7XHRpZiAoIXNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHNlZWQpKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9LRVk7XG4mIzQzO1xuJiM0MztcdHNoYTI1Nl9pbml0KFx1MDAyNnNoYTI1Nl9jdHgpO1xuJiM0MztcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xuJiM0MztcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcbiYjNDM7XHRzaGEyNTZfZmluYWwoXHUwMDI2c2hhMjU2X2N0eCwgZGlnZXN0KTtcbiYjNDM7XG4mIzQzO1x0bWVtY3B5KGtleSwgZGlnZXN0LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgKndyYXBwZWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxuJiM0MztcdFx0XHRcdCAgICAgIGJvb2wgZW5jcnlwdClcbiYjNDM7e1xuJiM0MztcdHU4IHdyYXBfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xuJiM0MztcdHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtO1xuJiM0MztcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcTtcbiYjNDM7XHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7XG4mIzQzO1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdHJjID0gc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh3cmFwX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0cmV0dXJuIHJjO1xuJiM0MztcbiYjNDM7XHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcJiMzNDtnY20oYWVzKVwmIzM0OywgMCwgMCk7XG4mIzQzO1x0aWYgKElTX0VSUih0Zm0pKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIodGZtKTtcbiYjNDM7XHRcdGdvdG8gb3V0X2tleTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZSh0Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XG4mIzQzO1x0cmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKHRmbSwgR0ZQX0tFUk5FTCk7XG4mIzQzO1x0aWYgKCFyZXEpIHtcbiYjNDM7XHRcdHJjID0gLUVOT01FTTtcbiYjNDM7XHRcdGdvdG8gb3V0X3RmbTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChlbmNyeXB0KSB7XG4mIzQzO1x0XHRnZXRfcmFuZG9tX2J5dGVzKHdyYXBwZWQtXHUwMDNld3JhcF9ub25jZSwgc2l6ZW9mKHdyYXBwZWQtXHUwMDNld3JhcF9ub25jZSkpO1xuJiM0MztcdFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0bWVtY3B5KGJ1Ziwgd3JhcHBlZC1cdTAwM2VlbmNyeXB0ZWRfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbiYjNDM7XHRcdG1lbWNweShidWYgJiM0MzsgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSwgd3JhcHBlZC1cdTAwM2V0YWcsXG4mIzQzO1x0XHQgICAgICAgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRzZ19pbml0X29uZShcdTAwMjZzZywgYnVmLCBzaXplb2YoYnVmKSk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9hZChyZXEsIDApO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBcdTAwMjZzZywgXHUwMDI2c2csXG4mIzQzO1x0XHRcdCAgICAgICBlbmNyeXB0ID8gU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSA6XG4mIzQzO1x0XHRcdFx0XHQgc2l6ZW9mKGJ1ZiksXG4mIzQzO1x0XHRcdCAgICAgICB3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UpO1xuJiM0MztcbiYjNDM7XHRyYyA9IGNyeXB0b193YWl0X3JlcShlbmNyeXB0ID8gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpIDpcbiYjNDM7XHRcdFx0XHQgICAgICAgY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNndhaXQpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0X3JlcTtcbiYjNDM7XG4mIzQzO1x0aWYgKGVuY3J5cHQpIHtcbiYjNDM7XHRcdG1lbWNweSh3cmFwcGVkLVx1MDAzZWVuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2V0YWcsIGJ1ZiAmIzQzOyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLFxuJiM0MztcdFx0ICAgICAgIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtZW1jcHkoaW1hZ2Vfa2V5LCBidWYsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO291dF9yZXE6XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X2ZyZWUocmVxKTtcbiYjNDM7b3V0X3RmbTpcbiYjNDM7XHRjcnlwdG9fZnJlZV9hZWFkKHRmbSk7XG4mIzQzO291dF9rZXk6XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChidWYsIHNpemVvZihidWYpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3Rfd3JhcF9pbWFnZV9rZXkoY29uc3QgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxuJiM0MztcdFx0XHRcdCAgIHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZClcbiYjNDM7e1xuJiM0MztcdHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdG1lbXNldCh3cmFwcGVkLCAwLCBzaXplb2YoKndyYXBwZWQpKTtcbiYjNDM7XHRtZW1jcHkod3JhcHBlZC1cdTAwM2VtYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsIHNpemVvZih3cmFwcGVkLVx1MDAzZW1hZ2ljKSk7XG4mIzQzO1x0d3JhcHBlZC1cdTAwM2V2ZXJzaW9uID0gY3B1X3RvX2xlMzIoU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTik7XG4mIzQzO1xuJiM0MztcdG1lbWNweShrZXksIGltYWdlX2tleSwgc2l6ZW9mKGtleSkpO1xuJiM0MztcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGtleSwgc2l6ZW9mKGtleSkpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KGNvbnN0IHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbiYjNDM7XHRcdFx0XHQgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7XG4mIzQzO1x0aW50IHJjO1xuJiM0MztcbiYjNDM7XHRpZiAobWVtY21wKHdyYXBwZWQtXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLFxuJiM0MztcdFx0ICAgc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cdTAwM2V2ZXJzaW9uKSAhPSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdHRtcCA9ICp3cmFwcGVkO1xuJiM0MztcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkoXHUwMDI2dG1wLCBpbWFnZV9rZXksIGZhbHNlKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnRtcCwgc2l6ZW9mKHRtcCkpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHQgICAgICBjb25zdCB1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdG1lbWNweShkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LCBpbWFnZV9rZXksIHNpemVvZihkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbiYjNDM7XHRcdFx0XHRzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbiYjNDM7XHRcdFx0XHQgc2l6ZW9mKGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEZXJpdmUgYSBrZXkgZnJvbSB0aGUga2VybmVsIGFuZCB1c2VyIGtleXMgZm9yIGRhdGEgZW5jcnlwdGlvbi4gKi9cbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF91c2VfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcbiYjNDM7XHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBIYXNoIHRoZSBrZXJuZWwga2V5IGFuZCB0aGUgdXNlciBrZXkgdG9nZXRoZXIuIFRoaXMgZm9sZHMgaW4gdGhlIHVzZXJcbiYjNDM7XHQgKiBrZXksIGJ1dCBub3QgaW4gYSB3YXkgdGhhdCBnaXZlcyB0aGUgdXNlciBtb2RlIHByZWRpY3RhYmxlIGNvbnRyb2xcbiYjNDM7XHQgKiBvdmVyIHRoZSBrZXkgYml0cy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbiYjNDM7XG4mIzQzO1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LFxuJiM0MztcdFx0ICAgICAgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBkYXRhLVx1MDAzZXVzZXJfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkpO1xuJiM0MztcdHNoYTI1Nl9maW5hbChcdTAwMjZzaGEyNTZfY3R4LCBkaWdlc3QpO1xuJiM0MztcbiYjNDM7XHRCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBcdTAwM2UgU0hBMjU2X0RJR0VTVF9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSxcbiYjNDM7XHRcdFx0XHRkaWdlc3QsXG4mIzQzO1x0XHRcdFx0U05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBDaGVjayB0byBzZWUgaWYgaXQmIzM5O3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID09IGRhdGEtXHUwMDNlbWV0YV9zaXplKSB7XG4mIzQzO1x0XHRyZXR1cm4gc25hcHNob3RfdXNlX3VzZXJfa2V5KGRhdGEpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpO1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3Rfc2V0X21ldGFfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgdTY0IG1ldGFfc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlbWV0YV9zaXplID0gbWV0YV9zaXplO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobWV0YV9zaXplKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVjb3JkX2VuY3J5cHRlZF9yZWFkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0ICAgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkICYjNDM7PSBjb3VudDtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBFbmNyeXB0IG1vcmUgZGF0YSBmcm9tIHRoZSBzbmFwc2hvdCBpbnRvIHRoZSBzdGFnaW5nIGFyZWEuICovXG4mIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLVx1MDAzZWFlYWRfcmVxO1xuJiM0MztcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XG4mIzQzO1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbiYjNDM7XHRzaXplX3QgdG90YWwgPSAwO1xuJiM0MztcdGludCBwZ19pZHg7XG4mIzQzO1x0aW50IHJlcztcbiYjNDM7XG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xuJiM0MztcdFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxuJiM0MztcdFx0XHRcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4mIzQzO1x0XHRpZiAocmVzKVxuJiM0MztcdFx0XHRyZXR1cm4gcmVzO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnRcbiYjNDM7XHQgKiBhdHRhY2tzIHRoYXQgcmVhcnJhbmdlIGNodW5rcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzZ19zZXRfYnVmKFx1MDAyNmRhdGEtXHUwMDNlc2dbMF0sIFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfdG90YWwsIHNpemVvZihkYXRhLVx1MDAzZWNyeXB0X3RvdGFsKSk7XG4mIzQzO1xuJiM0MztcdC8qIExvYWQgdGhlIGNyeXB0IGJ1ZmZlciB3aXRoIHNuYXBzaG90IHBhZ2VzLiAqL1xuJiM0MztcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR2b2lkICpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF07XG4mIzQzO1xuJiM0MztcdFx0LyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi9cbiYjNDM7XHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkIFx1MDAyNlx1MDAyNiB0b3RhbCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAoKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgJiM0MzsgdG90YWwpID09IGRhdGEtXHUwMDNlbWV0YV9zaXplKSlcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiYjNDM7XHRcdGlmIChyZXMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXM7XG4mIzQzO1x0XHRpZiAocmVzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIENvcHkgdGhlIHBhZ2UgaW50byB0aGUgc3RhZ2luZyBhcmVhLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb25cbiYjNDM7XHRcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdG1lbWNweShidWYsIGRhdGFfb2YoZGF0YS1cdTAwM2VoYW5kbGUpLCBQQUdFX1NJWkUpO1xuJiM0MztcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgYnVmLCBQQUdFX1NJWkUpO1xuJiM0MztcdFx0dG90YWwgJiM0Mzs9IFBBR0VfU0laRTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghdG90YWwpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgXHUwMDI2ZGF0YS1cdTAwM2VhdXRoX3RhZywgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBVc2UgaW5jcmVtZW50aW5nIG5vbmNlcyBmb3IgZWFjaCBjaHVuaywgc2luY2UgYSA2NCBiaXQgdmFsdWUgd29uJiMzOTt0XG4mIzQzO1x0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRtZW1jcHkoXHUwMDI2bm9uY2VbMF0sIFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbiYjNDM7XHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4mIzQzO1x0ICAgICAgIFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCxcbiYjNDM7XHQgICAgICAgc2l6ZW9mKG5vbmNlKSAtIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuJiM0MztcbiYjNDM7XHRkYXRhLVx1MDAzZW5vbmNlX2xvdyAmIzQzOz0gMTtcbiYjNDM7XHQvKiBUb3RhbCBkb2VzIG5vdCBpbmNsdWRlIEFBRCBvciB0aGUgYXV0aCB0YWcuICovXG4mIzQzO1x0YWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIGRhdGEtXHUwMDNlc2csIGRhdGEtXHUwMDNlc2csIHRvdGFsLCBub25jZSk7XG4mIzQzO1x0cmVzID0gY3J5cHRvX3dhaXRfcmVxKGNyeXB0b19hZWFkX2VuY3J5cHQocmVxKSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0aWYgKHJlcylcbiYjNDM7XHRcdHJldHVybiByZXM7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IHRvdGFsO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgJiM0Mzs9IHRvdGFsO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi9cbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cdTAwM2VhZWFkX3JlcTtcbiYjNDM7XHR1OCBub25jZVtHQ01fQUVTX0lWX1NJWkVdO1xuJiM0MztcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XG4mIzQzO1x0aW50IHBhZ2VfY291bnQ7XG4mIzQzO1x0c2l6ZV90IHRvdGFsO1xuJiM0MztcdGludCBwZ19pZHg7XG4mIzQzO1x0aW50IHJlcztcbiYjNDM7XG4mIzQzO1x0LyogU2V0IHVwIHRoZSBhc3NvY2lhdGVkIGRhdGEuICovXG4mIzQzO1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzBdLCBcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXG4mIzQzO1x0ICogc2hvdWxkIGFsc28gYmUgYSB0YWcgYXQgdGhlIGVuZCwgc28gdGhlIG9mZnNldCB3b24mIzM5O3QgYmUgYW4gZXZlbiBwYWdlLlxuJiM0MztcdCAqL1xuJiM0MztcdHBhZ2VfY291bnQgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHR0b3RhbCA9IHBhZ2VfY291bnQgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO1x0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBMb2FkIHRoZSBzZyBsaXN0IHdpdGggdGhlIGNyeXB0IGJ1ZmZlci4gSW5saW5lIGRlY3J5cHQgYmFjayBpbnRvIHRoZVxuJiM0MztcdCAqIHN0YWdpbmcgYnVmZmVyLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgZGVjcnlwdCBkaXJlY3RseSBpbnRvXG4mIzQzO1x0ICogbG93bWVtIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBwYWdlX2NvdW50OyBwZ19pZHgmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgJiM0MzsgcGdfaWR4XSwgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEl0JiMzOTtzIHBvc3NpYmxlIHRoaXMgaXMgdGhlIGZpbmFsIGRlY3J5cHQsIG9yIHRoZSBmaW5hbCBkZWNyeXB0IG9mIHRoZVxuJiM0MztcdCAqIG1ldGEgcmVnaW9uLCBhbmQgdGhlcmUgYXJlIGZld2VyIHRoYW4gQ0hVTktfU0laRSBwYWdlcy4gSWYgdGhpcyBpc1xuJiM0MztcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcbiYjNDM7XHQgKiBieXRlcyBvZiBhIG5ldyBwYWdlLiBDb3B5IHRvIHRoZSB0YWcgaWYgc28uXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKHBhZ2VfY291bnQgXHUwMDNjIENIVU5LX1NJWkUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAtIHRvdGFsKSA9PSBzaXplb2YoZGF0YS1cdTAwM2VhdXRoX3RhZykpIHtcbiYjNDM7XHRcdG1lbWNweShkYXRhLVx1MDAzZWF1dGhfdGFnLCBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0sXG4mIzQzO1x0XHQgICAgICAgc2l6ZW9mKGRhdGEtXHUwMDNlYXV0aF90YWcpKTtcbiYjNDM7XHR9IGVsc2UgaWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICE9XG4mIzQzO1x0XHQgICAoKENIVU5LX1NJWkUgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNnX3NldF9idWYoXHUwMDI2ZGF0YS1cdTAwM2VzZ1sxICYjNDM7IHBnX2lkeF0sIFx1MDAyNmRhdGEtXHUwMDNlYXV0aF90YWcsIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuJiM0MztcdG1lbWNweShcdTAwMjZub25jZVswXSwgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9sb3csIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuJiM0MztcdG1lbWNweShcdTAwMjZub25jZVtzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpXSxcbiYjNDM7XHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuJiM0MztcdCAgICAgICBzaXplb2Yobm9uY2UpIC0gc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICYjNDM7PSAxO1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBkYXRhLVx1MDAzZXNnLCBkYXRhLVx1MDAzZXNnLCB0b3RhbCAmIzQzOyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFLCBub25jZSk7XG4mIzQzO1x0cmVzID0gY3J5cHRvX3dhaXRfcmVxKGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSwgXHUwMDI2d2FpdCk7XG4mIzQzO1x0aWYgKHJlcylcbiYjNDM7XHRcdHJldHVybiByZXM7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xuJiM0MztcbiYjNDM7XHQvKiBQdXNoIHRoZSBkZWNyeXB0ZWQgcGFnZXMgZnVydGhlciBkb3duIHRoZSBzdGFjay4gKi9cbiYjNDM7XHR0b3RhbCA9IDA7XG4mIzQzO1x0Zm9yIChwZ19pZHggPSAwOyBwZ19pZHggXHUwMDNjIHBhZ2VfY291bnQ7IHBnX2lkeCYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdHZvaWQgKmJ1ZiA9IGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XTtcbiYjNDM7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiYjNDM7XHRcdGlmIChyZXMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByZXM7XG4mIzQzO1x0XHRpZiAocmVzID09IDApXG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdGlmICghZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSkpXG4mIzQzO1x0XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4mIzQzO1xuJiM0MztcdFx0LyogQ29weSB0aGUgZGVjcnlwdGVkIHBhZ2UgaW50byB0aGUgc25hcHNob3QgaW1hZ2UuICovXG4mIzQzO1x0XHRtZW1jcHkoZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSksIGJ1ZiwgUEFHRV9TSVpFKTtcbiYjNDM7XHRcdHRvdGFsICYjNDM7PSBQQUdFX1NJWkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCA9PSAwKSB7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkKVxuJiM0MztcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9XG4mIzQzO1x0XHRcdFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cdTAwM2VtZXRhX3NpemUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7XG4mIzQzO1x0cmVzID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xuJiM0MztcdGlmIChyZXMpXG4mIzQzO1x0XHRyZXR1cm4gcmVzO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICB2b2lkICoqYnVmKVxuJiM0Mzt7XG4mIzQzO1x0c2l6ZV90IHRhZ19vZmY7XG4mIzQzO1xuJiM0MztcdC8qIFJlZmlsbCB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCYjMzk7cyBlbXB0eS4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9zaXplID09IDAgfHxcbiYjNDM7XHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZT1cbiYjNDM7XHQgICAgIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkpKSB7XG4mIzQzO1x0XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VjcnlwdF9zaXplID0gMDtcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbiYjNDM7XHRcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9zaXplKVxuJiM0MztcdFx0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFJldHVybiBkYXRhIHBhZ2VzIGlmIHRoZSBvZmZzZXQgaXMgaW4gdGhhdCByZWdpb24uICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzYyBkYXRhLVx1MDAzZWNyeXB0X3NpemUpIHtcbiYjNDM7XHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XHRcdHNpemVfdCBwZ19vZmYgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdFx0KmJ1ZiA9IGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XSAmIzQzOyBwZ19vZmY7XG4mIzQzO1x0XHRyZXR1cm4gUEFHRV9TSVpFIC0gcGdfb2ZmO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovXG4mIzQzO1x0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gZGF0YS1cdTAwM2VjcnlwdF9zaXplO1xuJiM0MztcdGlmICh0YWdfb2ZmIFx1MDAzZSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxuJiM0MztcdFx0dGFnX29mZiA9IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkU7XG4mIzQzO1xuJiM0MztcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICYjNDM7IHRhZ19vZmY7XG4mIzQzO1x0cmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgdm9pZCAqKmJ1ZilcbiYjNDM7e1xuJiM0MztcdHNpemVfdCBzaXplX2F2YWlsO1xuJiM0MztcdHNpemVfdCB0YWdfb2ZmO1xuJiM0MztcbiYjNDM7XHQvKiBSZXR1cm4gZGF0YSBwYWdlcyBpZiB0aGUgb2Zmc2V0IGlzIGluIHRoYXQgcmVnaW9uLiAqL1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpKSB7XG4mIzQzO1x0XHRzaXplX3QgcGdfaWR4ID0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbiYjNDM7XG4mIzQzO1x0XHQqYnVmID0gZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdICYjNDM7IHBnX29mZjtcbiYjNDM7XHRcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFVzZSBvZmZzZXRzIGp1c3QgYmV5b25kIHRoZSBzaXplIHRvIHJldHVybiB0aGUgdGFnLiAqL1xuJiM0MztcdFx0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xuJiM0MztcdFx0aWYgKHRhZ19vZmYgXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXG4mIzQzO1x0XHRcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xuJiM0MztcbiYjNDM7XHRcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICYjNDM7IHRhZ19vZmY7XG4mIzQzO1x0XHRzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsIFx1MDAzYyBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSkge1xuJiM0MztcdFx0dTY0IG1ldGFfYXZhaWwgPSBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSAtIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsO1xuJiM0MztcbiYjNDM7XHRcdHNpemVfYXZhaWwgPSBtaW5fdCh1NjQsIHNpemVfYXZhaWwsIG1ldGFfYXZhaWwpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNpemVfYXZhaWw7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0Y2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgY29weV9zaXplO1xuJiM0MztcdHNpemVfdCBub3RfZG9uZTtcbiYjNDM7XHRzaXplX3QgcGdfb2ZmO1xuJiM0MztcdHZvaWQgKnNyYztcbiYjNDM7XHRzc2l6ZV90IHNyY19zaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIWNvdW50KVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHBnX29mZiA9ICpvZmZwIFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4mIzQzO1x0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xuJiM0MztcbiYjNDM7XHRzcmNfc2l6ZSA9IHNuYXBzaG90X3JlYWRfbmV4dF9lbmNyeXB0ZWQoZGF0YSwgXHUwMDI2c3JjKTtcbiYjNDM7XHRpZiAoc3JjX3NpemUgXHUwMDNjPSAwKVxuJiM0MztcdFx0cmV0dXJuIHNyY19zaXplO1xuJiM0MztcbiYjNDM7XHRjb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIGNvdW50LCBzcmNfc2l6ZSk7XG4mIzQzO1x0bm90X2RvbmUgPSBjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGNvcHlfc2l6ZSk7XG4mIzQzO1x0Y29weV9zaXplIC09IG5vdF9kb25lO1xuJiM0MztcdGlmICghY29weV9zaXplKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0Km9mZnAgJiM0Mzs9IGNvcHlfc2l6ZTtcbiYjNDM7XHRzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTtcbiYjNDM7XHRyZXR1cm4gY29weV9zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mztzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHQgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuJiM0MztcdFx0XHRcdCBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRzaXplX3QgY29weV9zaXplO1xuJiM0MztcdHNpemVfdCBub3RfZG9uZTtcbiYjNDM7XHRzaXplX3QgcGdfb2ZmO1xuJiM0MztcdHZvaWQgKmRzdDtcbiYjNDM7XHRzc2l6ZV90IGRzdF9zaXplO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3VudClcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRwZ19vZmYgPSAqb2ZmcCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuJiM0MztcdGNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFIC0gcGdfb2ZmKTtcbiYjNDM7XG4mIzQzO1x0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZkc3QpO1xuJiM0MztcdGlmIChkc3Rfc2l6ZSBcdTAwM2M9IDApXG4mIzQzO1x0XHRyZXR1cm4gZHN0X3NpemU7XG4mIzQzO1xuJiM0MztcdGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTtcbiYjNDM7XHRub3RfZG9uZSA9IGNvcHlfZnJvbV91c2VyKGRzdCwgYnVmLCBjb3B5X3NpemUpO1xuJiM0MztcdGNvcHlfc2l6ZSAtPSBub3RfZG9uZTtcbiYjNDM7XHRpZiAoIWNvcHlfc2l6ZSlcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAmIzQzOz0gY29weV9zaXplO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCYjMzk7cyBmdWxsLCBvciBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGVcbiYjNDM7XHQgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZT1cbiYjNDM7XHQgICAgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgfHxcbiYjNDM7XHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUpKSB7XG4mIzQzO1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMgXHUwMDNjIDApXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdCpvZmZwICYjNDM7PSBjb3B5X3NpemU7XG4mIzQzO1x0cmV0dXJuIGNvcHlfc2l6ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW5vbmNlX2xvdyA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2Vub25jZV9oaWdoID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgPSBmYWxzZTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0bWVtc2V0KGRhdGEtXHUwMDNlYXV0aF90YWcsIDAsIHNpemVvZihkYXRhLVx1MDAzZWF1dGhfdGFnKSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCBpO1xuJiM0MztcbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VhZWFkX3JlcSkge1xuJiM0MztcdFx0YWVhZF9yZXF1ZXN0X2ZyZWUoZGF0YS1cdTAwM2VhZWFkX3JlcSk7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWFlYWRfcmVxID0gTlVMTDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWFlYWRfdGZtKSB7XG4mIzQzO1x0XHRjcnlwdG9fZnJlZV9hZWFkKGRhdGEtXHUwMDNlYWVhZF90Zm0pO1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBDSFVOS19TSVpFOyBpJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aWYgKGRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pIHtcbiYjNDM7XHRcdFx0ZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pO1xuJiM0MztcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSwgc2l6ZW9mKGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4mIzQzO1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGludCBpLCByYztcbiYjNDM7XG4mIzQzO1x0LyogVGhpcyBvbmx5IHdvcmtzIG9uY2UgcGVyIGhpYmVybmF0ZS4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VhZWFkX3RmbSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKGRhdGEpO1xuJiM0MztcdG1lbXNldChkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF9wYWdlcykpO1xuJiM0MztcbiYjNDM7XHQvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovXG4mIzQzO1x0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IGNyeXB0b19hbGxvY19hZWFkKFwmIzM0O2djbShhZXMpXCYjMzQ7LCAwLCAwKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGRhdGEtXHUwMDNlYWVhZF90Zm0pKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIoZGF0YS1cdTAwM2VhZWFkX3RmbSk7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWFlYWRfdGZtID0gTlVMTDtcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJjID0gLUVOT01FTTtcbiYjNDM7XHRkYXRhLVx1MDAzZWFlYWRfcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKGRhdGEtXHUwMDNlYWVhZF90Zm0sIEdGUF9LRVJORUwpO1xuJiM0MztcdGlmICghZGF0YS1cdTAwM2VhZWFkX3JlcSlcbiYjNDM7XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0LyogQWxsb2NhdGUgdGhlIHN0YWdpbmcgYXJlYSAqL1xuJiM0MztcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XG4mIzQzO1x0XHRpZiAoIWRhdGEtXHUwMDNlY3J5cHRfcGFnZXNbaV0pXG4mIzQzO1x0XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNnX2luaXRfdGFibGUoZGF0YS1cdTAwM2VzZywgQ0hVTktfU0laRSAmIzQzOyAyKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgYXNzb2NpYXRlZCBkYXRhIHdpbGwgYmUgdGhlIG9mZnNldCBzbyB0aGF0IGJsb2NrcyBjYW4mIzM5O3QgYmVcbiYjNDM7XHQgKiByZWFycmFuZ2VkLlxuJiM0MztcdCAqL1xuJiM0MztcdGFlYWRfcmVxdWVzdF9zZXRfYWQoZGF0YS1cdTAwM2VhZWFkX3JlcSwgc2l6ZW9mKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwpKTtcbiYjNDM7XHRyYyA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGRhdGEtXHUwMDNlYWVhZF90Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztzZXR1cF9mYWlsOlxuJiM0MztcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4mIzQzO1x0cmV0dXJuIHJjO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcbiYjNDM7XHR1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmcgPSB7fTtcbiYjNDM7XHR1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTtcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdC8qIERvbiYjMzk7dCBwdWxsIGEgcmFuZG9tIGtleSBmcm9tIGEgd29ybGQgdGhhdCBjYW4gYmUgcmVzZXQuICovXG4mIzQzO1x0aWYgKGRhdGEtXHUwMDNlcmVhZHkpXG4mIzQzO1x0XHRyZXR1cm4gLUVQSVBFO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdHJldHVybiByYztcbiYjNDM7XG4mIzQzO1x0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXG4mIzQzO1x0Z2V0X3JhbmRvbV9ieXRlcyhub25jZSwgc2l6ZW9mKG5vbmNlKSk7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBcdTAwMjZub25jZVswXSwgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCwgXHUwMDI2bm9uY2VbOF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2hpZ2gpKTtcbiYjNDM7XG4mIzQzO1x0LyogQnVpbGQgYW5kIGluc3RhbGwgYSByYW5kb20gaW1hZ2UgZW5jcnlwdGlvbiBrZXkuICovXG4mIzQzO1x0Z2V0X3JhbmRvbV9ieXRlcyhpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGltYWdlX2tleSwgXHUwMDI2d3JhcHBlZCk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHQvKiBIYW5kIHRoZSB3cmFwcGVkIGtleSBhbmQgY2xlYXIgbm9uY2UgYmFjayB0byB1c2VyIG1vZGUuICovXG4mIzQzO1x0cmMgPSBwdXRfdXNlcihzaXplb2Yod3JhcHBlZCksIFx1MDAyNmtleS1cdTAwM2VibG9iX2xlbik7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBmYWlsO1xuJiM0MztcbiYjNDM7XHRCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpIFx1MDAzZVxuJiM0MztcdFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVx1MDAzZWJsb2IpKTtcbiYjNDM7XHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2VibG9iLCBcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpKSB7XG4mIzQzO1x0XHRyYyA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2Vub25jZSwgXHUwMDI2bm9uY2UsIHNpemVvZihub25jZSkpKSB7XG4mIzQzO1x0XHRyYyA9IC1FRkFVTFQ7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2ZhaWw6XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4mIzQzO1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjtcbiYjNDM7XHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgd3JhcHBlZCA9IHt9O1xuJiM0MztcdHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9O1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0LyogSXQmIzM5O3MgdG9vIGxhdGUgaWYgZGF0YSYjMzk7cyBiZWVuIHB1c2hlZCBpbi4gKi9cbiYjNDM7XHRpZiAoZGF0YS1cdTAwM2VoYW5kbGUuY3VyKVxuJiM0MztcdFx0cmV0dXJuIC1FUElQRTtcbiYjNDM7XG4mIzQzO1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRyZXR1cm4gcmM7XG4mIzQzO1xuJiM0MztcdC8qIExvYWQgdGhlIGtleSBmcm9tIHVzZXIgbW9kZS4gKi9cbiYjNDM7XHRibG9iID0gbWVtZHVwX3VzZXIoa2V5LCBzaXplb2YoKmJsb2IpKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGJsb2IpKSB7XG4mIzQzO1x0XHRyYyA9IFBUUl9FUlIoYmxvYik7XG4mIzQzO1x0XHRnb3RvIGNyeXB0b19zZXR1cF9mYWlsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKGJsb2ItXHUwMDNlYmxvYl9sZW4gIT0gc2l6ZW9mKHdyYXBwZWQpKSB7XG4mIzQzO1x0XHRyYyA9IC1FSU5WQUw7XG4mIzQzO1x0XHRnb3RvIG91dF9ibG9iO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtY3B5KFx1MDAyNndyYXBwZWQsIGJsb2ItXHUwMDNlYmxvYiwgc2l6ZW9mKHdyYXBwZWQpKTtcbiYjNDM7XHRyYyA9IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoXHUwMDI2d3JhcHBlZCwgaW1hZ2Vfa2V5KTtcbiYjNDM7XHRpZiAocmMpXG4mIzQzO1x0XHRnb3RvIG91dF9ibG9iO1xuJiM0MztcbiYjNDM7XHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXRfYmxvYjtcbiYjNDM7XG4mIzQzO1x0LyogTG9hZCB0aGUgc3RhcnRpbmcgbm9uY2UuICovXG4mIzQzO1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfbG93LCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzBdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbiYjNDM7XHRtZW1jcHkoXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzhdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9oaWdoKSk7XG4mIzQzO1xuJiM0MztvdXRfYmxvYjpcbiYjNDM7XHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpO1xuJiM0MztcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjcnlwdG9fc2V0dXBfZmFpbDpcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4mIzQzO1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbiYjNDM7XHRzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpO1xuJiM0MztcdHJldHVybiByYztcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGxvZmZfdCBwYWdlcyA9IHBsYWluX3NpemUgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4mIzQzO1x0bG9mZl90IGNodW5rcyA9IChwYWdlcyAmIzQzOyAoQ0hVTktfU0laRSAtIDEpKSAvIENIVU5LX1NJWkU7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW5cbiYjNDM7XHQgKiBhdXRoZW50aWNhdGlvbiB0YWcgZm9yIGV2ZXJ5IGNodW5rIG9mIHBhZ2VzLlxuJiM0MztcdCAqL1xuJiM0MztcdHJldHVybiBwbGFpbl9zaXplICYjNDM7IChjaHVua3MgKiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChsb2ZmX3QgcmF3X3NpemUsXG4mIzQzO1x0XHRcdFx0XHRcdCAgbG9mZl90IG1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7e1xuJiM0MztcdGlmIChyYXdfc2l6ZSBcdTAwM2M9IG1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7XHRcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICYjNDM7XG4mIzQzO1x0XHRzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdCAgc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB1c2VyX2tleSA9IHt9O1xuJiM0MztcdHVuc2lnbmVkIGludCBrZXlfbGVuO1xuJiM0MztcdHU2NCBzaXplO1xuJiM0MztcdGludCByYztcbiYjNDM7XG4mIzQzO1x0aWYgKCFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNnVzZXJfa2V5LCBrZXksIHNpemVvZihzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSkpKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1xuJiM0MztcdEJVSUxEX0JVR19PTihzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkgXHUwMDNjIHNpemVvZih1c2VyX2tleS5rZXkpKTtcbiYjNDM7XHRyYyA9IC1FSU5WQUw7XG4mIzQzO1x0aWYgKHVzZXJfa2V5LnJlc2VydmVkKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0aWYgKHVzZXJfa2V5LmtleV9sZW4gXHUwMDNlIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICh1c2VyX2tleS5rZXlfbGVuIFx1MDAzYyA4KVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXHUwMDI2XHUwMDI2ICFkYXRhLVx1MDAzZXJlYWR5KSB7XG4mIzQzO1x0XHRyYyA9IC1FTk9EQVRBO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFJldHVybiB0aGUgbWV0YWRhdGEgc2l6ZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBmZWQgaW4gYmVmb3JlXG4mIzQzO1x0ICogdGhlIHVzZXIgZGF0YSBrZXkgaXMgbmVlZGVkIGF0IHJlc3VtZSB0aW1lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19XUk9OTFkgXHUwMDI2XHUwMDI2ICFkYXRhLVx1MDAzZW1ldGFfc2l6ZSkge1xuJiM0MztcdFx0aWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSBcdTAwM2MgUEFHRV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gdXNlcl9rZXkubWV0YV9zaXplO1xuJiM0MztcdFx0c2l6ZSA9IGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRzbmFwc2hvdF9zZXRfbWV0YV9zaXplKGRhdGEsXG4mIzQzO1x0XHRcdFx0ICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCk7XG4mIzQzO1x0XHRzaXplID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyYyA9IHB1dF91c2VyKHNpemUsIFx1MDAyNmtleS1cdTAwM2VtZXRhX3NpemUpO1xuJiM0MztcdGlmIChyYylcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRrZXlfbGVuID0gdXNlcl9rZXkua2V5X2xlbjtcbiYjNDM7XG4mIzQzO1x0LyogRG9uJiMzOTt0IGFsbG93IGl0IGlmIGl0JiMzOTtzIHRvbyBsYXRlLiAqL1xuJiM0MztcdGlmICgoZGF0YS1cdTAwM2VtZXRhX3NpemUgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlbWV0YV9zaXplKSB8fFxuJiM0MztcdCAgICAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICBkYXRhLVx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbCBcdTAwM2UgZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUpKSB7XG4mIzQzO1x0XHRyYyA9IC1FQlVTWTtcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGRhdGEtXHUwMDNldXNlcl9rZXksIDAsIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4mIzQzO1x0bWVtY3B5KGRhdGEtXHUwMDNldXNlcl9rZXksIHVzZXJfa2V5LmtleSwga2V5X2xlbik7XG4mIzQzO1x0ZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZCA9IHRydWU7XG4mIzQzO1x0LyogSW5zdGFsbCB0aGUga2V5IGlmIHRoZSB1c2VyIGlzIGp1c3QgdW5kZXIgdGhlIHdpcmUuICovXG4mIzQzO1x0cmMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4mIzQzO1x0aWYgKHJjKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJjID0gMDtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnVzZXJfa2V5LCBzaXplb2YodXNlcl9rZXkpKTtcbiYjNDM7XHRyZXR1cm4gcmM7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgbG9mZl90IHJhd19zaXplKVxuJiM0Mzt7XG4mIzQzO1x0bG9mZl90IG1ldGFfcGxhaW5fc2l6ZSA9IGRhdGEtXHUwMDNlbWV0YV9zaXplO1xuJiM0MztcdGxvZmZfdCBzcGxpdF9zaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIW1ldGFfcGxhaW5fc2l6ZSlcbiYjNDM7XHRcdG1ldGFfcGxhaW5fc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0c3BsaXRfc2l6ZSA9IHNuYXBzaG90X2VuY3J5cHRlZF9zcGxpdF9ieXRlX2NvdW50KHJhd19zaXplLFxuJiM0MztcdFx0XHRcdFx0XHRcdCBtZXRhX3BsYWluX3NpemUpO1xuJiM0MztcdGlmICghZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZClcbiYjNDM7XHRcdHJldHVybiBtYXgoc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpLCBzcGxpdF9zaXplKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHNwbGl0X3NpemU7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmM7XG4mIzQzO1xuJiM0MztcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAhPSAwKSB7XG4mIzQzO1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4mIzQzO1x0XHRpZiAocmMpXG4mIzQzO1x0XHRcdHJldHVybiByYztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuaW5kZXggZDkzM2I1YjJjMDVkNC4uMDI0MDBhYzEyNWM1OCAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuQEAgLTIxNzcsNiAmIzQzOzIxNzcsMTEgQEAgdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIG5yX2NvcHlfcGFnZXMgJiM0MzsgbnJfbWV0YV9wYWdlcyAmIzQzOyAxO1xuIH1cbiBcbiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbnJfbWV0YV9wYWdlcyAmIzQzOyAxO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgaW5pdF9oZWFkZXIoc3RydWN0IHN3c3VzcF9pbmZvICppbmZvKVxuIHtcbiBcdG1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHN3c3VzcF9pbmZvKSk7XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3YXAuYyBiL2tlcm5lbC9wb3dlci9zd2FwLmNcbmluZGV4IGM2MjZlOWRjM2MxYzEuLjNiZGQ1OGQ1YjYyY2IgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvc3dhcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXG5AQCAtMTY2LDYgJiM0MzsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIHN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBzd2FwX29mZnNldCxcbiYjNDM7XHRcdFx0XHRcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJiX25vZGUgKm5vZGUgPSBzd3N1c3BfZXh0ZW50cy5yYl9ub2RlO1xuJiM0MztcdHN0cnVjdCBzd3N1c3BfZXh0ZW50ICpleHQ7XG4mIzQzO1x0dW5zaWduZWQgbG9uZyBlbmQ7XG4mIzQzO1xuJiM0MztcdGlmICghbnJfcGFnZXMpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGVuZCA9IHN3YXBfb2Zmc2V0ICYjNDM7IG5yX3BhZ2VzIC0gMTtcbiYjNDM7XHRpZiAoZW5kIFx1MDAzYyBzd2FwX29mZnNldClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKG5vZGUpIHtcbiYjNDM7XHRcdGV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTtcbiYjNDM7XHRcdGlmIChzd2FwX29mZnNldCBcdTAwM2MgZXh0LVx1MDAzZXN0YXJ0KVxuJiM0MztcdFx0XHRub2RlID0gbm9kZS1cdTAwM2VyYl9sZWZ0O1xuJiM0MztcdFx0ZWxzZSBpZiAoc3dhcF9vZmZzZXQgXHUwMDNlIGV4dC1cdTAwM2VlbmQpXG4mIzQzO1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRnb3RvIGZvdW5kO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7Zm91bmQ6XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHN3YXBfb2Zmc2V0IFx1MDAzYyBleHQtXHUwMDNlc3RhcnQpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmIChlbmQgXHUwMDNjPSBleHQtXHUwMDNlZW5kKVxuJiM0MztcdFx0XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7XHRcdGlmIChleHQtXHUwMDNlZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdFx0c3dhcF9vZmZzZXQgPSBleHQtXHUwMDNlZW5kICYjNDM7IDE7XG4mIzQzO1x0XHRub2RlID0gcmJfbmV4dChcdTAwMjZleHQtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRpZiAoIW5vZGUpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0XHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0Mztib29sIHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChpbnQgc3dhcCwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGJsb2NrO1xuJiM0MztcdHU2NCBlbmQ7XG4mIzQzO1x0dTY0IGVuZF9ibG9jaztcbiYjNDM7XG4mIzQzO1x0aWYgKHN3YXAgXHUwMDNjIDAgfHwgcG9zIFx1MDAzYyAwIHx8ICFjb3VudClcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZW5kID0gKHU2NClwb3MgJiM0MzsgY291bnQgLSAxO1xuJiM0MztcdGlmIChlbmQgXHUwMDNjICh1NjQpcG9zKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRibG9jayA9ICh1NjQpcG9zIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuJiM0MztcdGVuZF9ibG9jayA9IGVuZCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbiYjNDM7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0dTY0IHJlbWFpbmluZ19wYWdlcyA9IGVuZF9ibG9jayAtIGJsb2NrICYjNDM7IDE7XG4mIzQzO1x0XHRwZ29mZl90IHN3YXBfb2Zmc2V0O1xuJiM0MztcdFx0cGdvZmZfdCBtYXBwZWRfcGFnZXM7XG4mIzQzO1x0XHRzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7XG4mIzQzO1x0XHR1NjQgcGFnZXM7XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFyZW1haW5pbmdfcGFnZXMpXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmICgodTY0KXBhZ2VfYmxvY2sgIT0gYmxvY2spXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRcdGlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCBcdTAwMjZzd2FwX29mZnNldCxcbiYjNDM7XHRcdFx0XHRcdCAgICBcdTAwMjZtYXBwZWRfcGFnZXMpKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRpZiAoIW1hcHBlZF9wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0cGFnZXMgPSBtaW5fdCh1NjQsIG1hcHBlZF9wYWdlcywgcmVtYWluaW5nX3BhZ2VzKTtcbiYjNDM7XHRcdGlmICgodTY0KSh1bnNpZ25lZCBsb25nKXBhZ2VzICE9IHBhZ2VzKVxuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdFx0aWYgKHBhZ2VzID09IHJlbWFpbmluZ19wYWdlcylcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHRibG9jayAmIzQzOz0gcGFnZXM7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcylcbiYjNDM7e1xuJiM0MztcdHU2NCBpbWFnZV9wYWdlcyA9IERJVl9ST1VORF9VUF9VTEwoaW1hZ2VfYnl0ZXMsIFBBR0VfU0laRSk7XG4mIzQzO1x0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyAmIzQzOyAxO1xuJiM0MztcbiYjNDM7XHRpZiAobWFwX3BhZ2VzIFx1MDAzZSBVNjRfTUFYIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKVxuJiM0MztcdFx0cmV0dXJuIFU2NF9NQVg7XG4mIzQzO1xuJiM0MztcdHJldHVybiBtYXBfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4mIzQzO31cbiYjNDM7XG4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcClcbiB7XG4gXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5jIGIva2VybmVsL3Bvd2VyL3VzZXIuY1xuaW5kZXggZDBmY2ZiYTdhYzIzNS4uNTdiOGNlODNhNjI2ZiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci91c2VyLmNcbkBAIC0yMSw1NCAmIzQzOzIxLDE4NSBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnNvbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BpZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL3NpZ25hbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcJiMzNDtwb3dlci5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3VzZXIuaFwmIzM0O1xuIFxuIHN0YXRpYyBib29sIG5lZWRfd2FpdDtcbi1cbi1zdGF0aWMgc3RydWN0IHNuYXBzaG90X2RhdGEge1xuLVx0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4tXHRpbnQgc3dhcDtcbi1cdGludCBtb2RlO1xuLVx0Ym9vbCBmcm96ZW47XG4tXHRib29sIHJlYWR5O1xuLVx0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xuLVx0Ym9vbCBmcmVlX2JpdG1hcHM7XG4tXHRkZXZfdCBkZXY7XG4tfSBzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7c3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XG4gXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldilcbiB7XG4gXHRyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgXHUwMDI2XHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XG4gfVxuIFxuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgZGV2X3QgZGV2KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCBcdTAwMjZcdTAwMjYgZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ZGF0YS1cdTAwM2VyZWFkeSBcdTAwMjZcdTAwMjYgZGF0YS1cdTAwM2VkZXYgPT0gZGV2IFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0bG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuJiM0Mzt7XG4mIzQzO1x0bG9mZl90IGhlYWRlcl9vZmZzZXQgPSBkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldDtcbiYjNDM7XHRsb2ZmX3Qgb2Zmc2V0O1xuJiM0MztcbiYjNDM7XHRpZiAocG9zIFx1MDAzYyBoZWFkZXJfb2Zmc2V0KVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHRvZmZzZXQgPSBwb3MgLSBoZWFkZXJfb2Zmc2V0O1xuJiM0MztcdHJldHVybiBvZmZzZXQgXHUwMDNjIFBBR0VfU0laRSBcdTAwMjZcdTAwMjYgY291bnQgXHUwMDNjPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgc25hcHNob3Rfc3dhcF93cml0ZV9idWRnZXQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaW1hZ2VfYnl0ZXMgPSByb3VuZF91cChkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQsIFBBR0VfU0laRSk7XG4mIzQzO1x0dTY0IG1hcF9ieXRlcyA9IHN3c3VzcF9zd2FwX21hcF9ieXRlcyhkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQpO1xuJiM0MztcdHU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyAmIzQzOyBtYXBfYnl0ZXM7XG4mIzQzO1xuJiM0MztcdGlmIChpbWFnZV9ieXRlcyBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkIHx8IGJ1ZGdldCBcdTAwM2MgaW1hZ2VfYnl0ZXMpXG4mIzQzO1x0XHRyZXR1cm4gVTY0X01BWDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGJ1ZGdldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7fVxuJiM0MzsjZW5kaWZcbiYjNDM7XG4mIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlXG4mIzQzO2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbiYjNDM7e1xuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4mIzQzO1x0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuJiM0MztcdGJvb2wgaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkO1xuJiM0MztcdHU2NCBzd2FwX2J1ZGdldDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFjb3VudCB8fCAhc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcbiYjNDM7XHRcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbiYjNDM7XG4mIzQzO1x0bXV0ZXhfbG9jayhcdTAwMjZzeXN0ZW1fdHJhbnNpdGlvbl9tdXRleCk7XG4mIzQzO1xuJiM0MztcdGlmICghc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcbiYjNDM7XHRpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgPSBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoZGF0YS1cdTAwM2Vzd2FwLCBwb3MsIGNvdW50KTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4mIzQzO1x0c3dhcF9idWRnZXQgPSBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChkYXRhKTtcbiYjNDM7XHRpZiAoc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKGRhdGEsIHBvcywgY291bnQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2M9IFBBR0VfU0laRSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgUEFHRV9TSVpFIC0gZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXHUwMDNlPSBjb3VudCkge1xuJiM0MztcdFx0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgJiM0Mzs9IGNvdW50O1xuJiM0MztcdFx0dHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVI7XG4mIzQzO1x0fSBlbHNlIGlmIChpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICBzd2FwX2J1ZGdldCBcdTAwM2U9IGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgIHN3YXBfYnVkZ2V0IC0gZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkIFx1MDAzZT0gY291bnQpIHtcbiYjNDM7XHRcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCAmIzQzOz0gY291bnQ7XG4mIzQzO1x0XHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFO1xuJiM0MztcdH1cbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuJiM0MztcbiYjNDM7XHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gdHlwZTtcbiYjNDM7XG4mIzQzO3VubG9jazpcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuJiM0MztcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbiYjNDM7I2Vsc2VcbiYjNDM7XHRyZXR1cm4gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4mIzQzOyNlbmRpZlxuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbiYjNDM7XHRcdFx0XHQgIHNpemVfdCByZXNlcnZlZCwgc3NpemVfdCB3cml0dGVuKVxuJiM0Mzt7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcdTAwMjZzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7XHR1NjQgKnJlc2VydmVkX3RvdGFsO1xuJiM0MztcdHNpemVfdCB1bnVzZWQ7XG4mIzQzO1xuJiM0MztcdGlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghcmVzZXJ2ZWQpXG4mIzQzO1x0XHRnb3RvIHVubG9jaztcbiYjNDM7XG4mIzQzO1x0aWYgKHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUilcbiYjNDM7XHRcdHVudXNlZCA9IHJlc2VydmVkO1xuJiM0MztcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjPSAwKVxuJiM0MztcdFx0dW51c2VkID0gcmVzZXJ2ZWQ7XG4mIzQzO1x0ZWxzZSBpZiAod3JpdHRlbiBcdTAwM2MgcmVzZXJ2ZWQpXG4mIzQzO1x0XHR1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1xuJiM0MztcdHJlc2VydmVkX3RvdGFsID0gdHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSID9cbiYjNDM7XHRcdFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkIDogXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkO1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHQqcmVzZXJ2ZWRfdG90YWwgLT0gbWluX3QodTY0LCAqcmVzZXJ2ZWRfdG90YWwsIHVudXNlZCk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XG4mIzQzO3VubG9jazpcbiYjNDM7XHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuJiM0MzsjZW5kaWZcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNlY3VyaXR5X2xvY2tlZF9kb3duKExPQ0tET1dOX0hJQkVSTkFUSU9OKTtcbiYjNDM7XHRyZXR1cm4gZGF0YS1cdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiB7XG4gXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTtcbiBcdHVuc2lnbmVkIGludCBzbGVlcF9mbGFncztcbiBcdGludCBlcnJvcjtcbiBcbi1cdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXG4mIzQzO1x0aWYgKCFoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKCkpXG4gXHRcdHJldHVybiAtRVBFUk07XG4gXG4gXHRzbGVlcF9mbGFncyA9IGxvY2tfc3lzdGVtX3NsZWVwKCk7XG4gXG4gXHRpZiAoIWhpYmVybmF0ZV9hY3F1aXJlKCkpIHtcbiBcdFx0ZXJyb3IgPSAtRUJVU1k7XG4tXHRcdGdvdG8gVW5sb2NrO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4gXHR9XG4gXG4gXHRpZiAoKGZpbHAtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JEV1IpIHtcbiBcdFx0aGliZXJuYXRlX3JlbGVhc2UoKTtcbiBcdFx0ZXJyb3IgPSAtRU5PU1lTO1xuLVx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFx0bm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7XG4gXHRkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4gXHRmaWxwLVx1MDAzZXByaXZhdGVfZGF0YSA9IGRhdGE7XG4gXHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3Bpbl9sb2NrX2luaXQoXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbiYjNDM7XHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4mIzQzO1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuJiM0MztcdGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZW93bmVyX3RnaWQgPSBOVUxMO1xuJiM0MzsjZW5kaWZcbiBcdGlmICgoZmlscC1cdTAwM2VmX2ZsYWdzIFx1MDAyNiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSB7XG4gXHRcdC8qIEhpYmVybmF0aW5nLiAgVGhlIGltYWdlIGRldmljZSBzaG91bGQgYmUgYWNjZXNzaWJsZS4gKi9cbiBcdFx0ZGF0YS1cdTAwM2Vzd2FwID0gcGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShzd3N1c3BfcmVzdW1lX2RldmljZSwgMCk7XG5AQCAtOTksOCAmIzQzOzIzMCwxMyBAQCBzdGF0aWMgaW50IHNuYXBzaG90X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4gXHRkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQgPSBmYWxzZTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbiYjNDM7XHRkYXRhLVx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQgPSBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpO1xuJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuJiM0MztcdGlmICghZXJyb3IpXG4mIzQzO1x0XHRkYXRhLVx1MDAzZW93bmVyX3RnaWQgPSBnZXRfdGFza19waWQoY3VycmVudCwgUElEVFlQRV9UR0lEKTtcbiYjNDM7I2VuZGlmXG4gXG4tIFVubG9jazpcbiYjNDM7IHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIGVycm9yO1xuQEAgLTExNiw2ICYjNDM7MjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdHN3c3VzcF9mcmVlKCk7XG4gXHRkYXRhID0gZmlscC1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gXHRkYXRhLVx1MDAzZWRldiA9IDA7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0cHV0X3BpZChkYXRhLVx1MDAzZW93bmVyX3RnaWQpO1xuJiM0MztcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XG4mIzQzOyNlbmRpZlxuIFx0ZnJlZV9hbGxfc3dhcF9wYWdlcyhkYXRhLVx1MDAzZXN3YXApO1xuIFx0dW5waW5faGliZXJuYXRpb25fc3dhcF90eXBlKGRhdGEtXHUwMDNlc3dhcCk7XG4gXHRpZiAoZGF0YS1cdTAwM2Vmcm96ZW4pIHtcbkBAIC0xMjUsNiAmIzQzOzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VmcmVlX2JpdG1hcHMpIHtcbiBcdFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xuIFx0fVxuJiM0MztcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRwbV9ub3RpZmllcl9jYWxsX2NoYWluKGRhdGEtXHUwMDNlbW9kZSA9PSBPX1JET05MWSA/XG4gXHRcdFx0UE1fUE9TVF9ISUJFUk5BVElPTiA6IFBNX1BPU1RfUkVTVE9SRSk7XG4gXHRoaWJlcm5hdGVfcmVsZWFzZSgpO1xuQEAgLTE0NywxMiAmIzQzOzI4OCwyMyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxuIFx0ZGF0YSA9IGZpbHAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0aWYgKCFkYXRhLVx1MDAzZXJlYWR5KSB7XG4gXHRcdHJlcyA9IC1FTk9EQVRBO1xuLVx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0cmVzID0gLUVQRVJNO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcbiYjNDM7XHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuJiM0MztcbiBcdGlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqL1xuIFx0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbi1cdFx0XHRnb3RvIFVubG9jaztcbiYjNDM7XHRcdFx0Z290byB1bmxvY2s7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xuIFx0fVxuQEAgLTE2Miw3ICYjNDM7MzE0LDcgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZixcbiBcdGlmIChyZXMgXHUwMDNlIDApXG4gXHRcdCpvZmZwICYjNDM7PSByZXM7XG4gXG4tIFVubG9jazpcbiYjNDM7IHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIHJlcztcbkBAIC0xODUsNiAmIzQzOzMzNywxNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZixcbiBcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0cmVzID0gLUVQRVJNO1xuJiM0MztcdFx0Z290byB1bmxvY2s7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7XG4mIzQzO1x0XHRnb3RvIHVubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuIFx0aWYgKCFwZ19vZmZwKSB7XG4gXHRcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbkBAIC0yNTIsNiAmIzQzOzQxNSw5IEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfc2V0X3N3YXBfYXJlYShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiBcdGlmIChkYXRhLVx1MDAzZXN3YXAgXHUwMDNjIDApXG4gXHRcdHJldHVybiBzd2RldiA/IC1FTk9ERVYgOiAtRUlOVkFMO1xuIFx0ZGF0YS1cdTAwM2VkZXYgPSBzd2RldjtcbiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbiYjNDM7XHRkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuJiM0MzsjZW5kaWZcbiBcdHJldHVybiAwO1xuIH1cbiBcbkBAIC0zMTgsNiAmIzQzOzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4gXHRcdHBtX3Jlc3RvcmVfZ2ZwX21hc2soKTtcbiBcdFx0ZXJyb3IgPSBoaWJlcm5hdGlvbl9zbmFwc2hvdChkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpO1xuIFx0XHRpZiAoIWVycm9yKSB7XG5AQCAtMzI4LDYgJiM0Mzs0OTksMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGJyZWFrO1xuIFxuIFx0Y2FzZSBTTkFQU0hPVF9BVE9NSUNfUkVTVE9SRTpcbiYjNDM7XHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbiYjNDM7XHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4mIzQzO1x0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcbiYjNDM7XHRcdFx0aWYgKGVycm9yKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0fVxuJiM0MztcbiBcdFx0ZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShcdTAwMjZkYXRhLVx1MDAzZWhhbmRsZSk7XG4gXHRcdGlmIChlcnJvcilcbiBcdFx0XHRicmVhaztcbkBAIC0zNDYsNiAmIzQzOzUyOCw3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRzd3N1c3BfZnJlZSgpO1xuIFx0XHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4gXHRcdGRhdGEtXHUwMDNlcmVhZHkgPSBmYWxzZTtcbiYjNDM7XHRcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRcdC8qXG4gXHRcdCAqIEl0IGlzIG5lY2Vzc2FyeSB0byB0aGF3IGtlcm5lbCB0aHJlYWRzIGhlcmUsIGJlY2F1c2VcbiBcdFx0ICogU05BUFNIT1RfQ1JFQVRFX0lNQUdFIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5IGFmdGVyXG5AQCAtMzY4LDYgJiM0Mzs1NTEsOCBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0fVxuIFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2ltYWdlX3NpemUoKTtcbiBcdFx0c2l6ZSBcdTAwM2NcdTAwM2M9IFBBR0VfU0hJRlQ7XG4mIzQzO1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxuJiM0MztcdFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xuIFx0XHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcbiBcdFx0YnJlYWs7XG4gXG5AQCAtMzk3LDYgJiM0Mzs1ODIsOSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuIFx0XHRmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtXHUwMDNlc3dhcCk7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0XHRzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKGRhdGEpO1xuJiM0MzsjZW5kaWZcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIFNOQVBTSE9UX1MyUkFNOlxuQEAgLTQwNCw2ICYjNDM7NTkyLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRcdGVycm9yID0gLUVQRVJNO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4mIzQzO1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4mIzQzO1x0XHRcdGVycm9yID0gLUVQRVJNO1xuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdH1cbiBcdFx0LypcbiBcdFx0ICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGhcbiBcdFx0ICogUE1fSElCRVJOQVRJT05fUFJFUEFSRVxuQEAgLTQxNyw2ICYjNDM7NjEwLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfUE9XRVJfT0ZGOlxuJiM0MztcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuJiM0MztcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiYjNDM7XHRcdFx0YnJlYWs7XG4mIzQzO1x0XHR9XG4gXHRcdGlmIChkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpXG4gXHRcdFx0ZXJyb3IgPSBoaWJlcm5hdGlvbl9wbGF0Zm9ybV9lbnRlcigpO1xuIFx0XHRicmVhaztcbkBAIC00MjUsNiAmIzQzOzYyMywxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0ZXJyb3IgPSBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4gXHRcdGJyZWFrO1xuIFxuJiM0MztcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4mIzQzO1x0XHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZKVxuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRlcnJvciA9IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1xuJiM0MztcdGNhc2UgU05BUFNIT1RfU0VUX1VTRVJfS0VZOlxuJiM0MztcdFx0ZXJyb3IgPSBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoZGF0YSwgKHZvaWQgX191c2VyICopYXJnKTtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiBcdGRlZmF1bHQ6XG4gXHRcdGVycm9yID0gLUVOT1RUWTtcbiBcbkBAIC00NDgsNiAmIzQzOzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRjYXNlIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRTpcbiBcdGNhc2UgU05BUFNIT1RfQ1JFQVRFX0lNQUdFOlxuIFx0Y2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOlxuJiM0MztcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4mIzQzO1x0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XG4gXHRcdHJldHVybiBzbmFwc2hvdF9pb2N0bChmaWxlLCBjbWQsXG4gXHRcdFx0XHQgICAgICAodW5zaWduZWQgbG9uZykgY29tcGF0X3B0cihhcmcpKTtcbiBcdGRlZmF1bHQ6XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuaCBiL2tlcm5lbC9wb3dlci91c2VyLmhcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi40ZGYyZjlhZTlhZGE0XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvdXNlci5oXG5AQCAtMCwwICYjNDM7MSwxNTEgQEBcbiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyeXB0by5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjYXR0ZXJsaXN0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc3BpbmxvY2suaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9zdXNwZW5kX2lvY3Rscy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjY3J5cHRvL2Flcy5oXHUwMDNlXG4mIzQzO1xuJiM0MztzdHJ1Y3QgcGlkO1xuJiM0MztcbiYjNDM7I2RlZmluZSBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIEFFU19LRVlTSVpFXzEyOFxuJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTZcbiYjNDM7XG4mIzQzOy8qIERlZmluZSB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIGEgc2luZ2xlIEFFQUQgZW5jcnlwdGlvbiBjaHVuay4gKi9cbiYjNDM7I2RlZmluZSBDSFVOS19TSVpFIDE2XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgc25hcHNob3RfZGF0YSB7XG4mIzQzO1x0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4mIzQzO1x0aW50IHN3YXA7XG4mIzQzO1x0aW50IG1vZGU7XG4mIzQzO1x0Ym9vbCBmcm96ZW47XG4mIzQzO1x0Ym9vbCByZWFkeTtcbiYjNDM7XHRib29sIHBsYXRmb3JtX3N1cHBvcnQ7XG4mIzQzO1x0Ym9vbCBmcmVlX2JpdG1hcHM7XG4mIzQzO1x0Ym9vbCBlbmNyeXB0aW9uX3JlcXVpcmVkO1xuJiM0MztcdGRldl90IGRldjtcbiYjNDM7XG4mIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4mIzQzO1x0c3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTtcbiYjNDM7XHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcTtcbiYjNDM7XHR2b2lkICpjcnlwdF9wYWdlc1tDSFVOS19TSVpFXTtcbiYjNDM7XHR1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTtcbiYjNDM7XHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQ0hVTktfU0laRSAmIzQzOyAyXTsgLyogQWRkIHJvb20gZm9yIEFEIGFuZCBhdXRoIHRhZy4gKi9cbiYjNDM7XHRzaXplX3QgY3J5cHRfb2Zmc2V0O1xuJiM0MztcdHNpemVfdCBjcnlwdF9zaXplO1xuJiM0MztcdHU2NCBjcnlwdF90b3RhbDtcbiYjNDM7XHR1NjQgY3J5cHRfc3RyZWFtX3RvdGFsO1xuJiM0MztcdHU2NCBub25jZV9sb3c7XG4mIzQzO1x0dTY0IG5vbmNlX2hpZ2g7XG4mIzQzO1x0dTggZW5jcnlwdGlvbl9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4mIzQzO1x0dTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbiYjNDM7XHRib29sIHVzZXJfa2V5X3ZhbGlkO1xuJiM0MztcdHU2NCBtZXRhX3NpemU7XG4mIzQzO1x0dTY0IGNyeXB0X21ldGFfc2l6ZTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFByb3RlY3RzIGNyeXB0X2J5dGVzX3JlYWQgYW5kIHRoZSByZXNlcnZhdGlvbiBjb3VudGVycyBiZWxvdy5cbiYjNDM7XHQgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZVxuJiM0MztcdCAqIGdlbmVyYXRlZCBzd2FwLW1hcCBwYWdlcy5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzcGlubG9ja190IGNyeXB0X2xvY2s7XG4mIzQzO1x0dTY0IGNyeXB0X2J5dGVzX3JlYWQ7XG4mIzQzO1x0dTY0IGNyeXB0X3N3YXBfcmVzZXJ2ZWQ7XG4mIzQzO1x0dTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDtcbiYjNDM7XHRsb2ZmX3Qgc3dhcF9oZWFkZXJfb2Zmc2V0O1xuJiM0MztcdHN0cnVjdCBwaWQgKm93bmVyX3RnaWQ7XG4mIzQzOyNlbmRpZlxuJiM0MztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO2V4dGVybiBzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTtcbiYjNDM7XG4mIzQzOy8qIGtlcm5lbC9wb3dlci9zbmFwZW5jLmMgcm91dGluZXMgKi9cbiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbiYjNDM7XG4mIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0Y2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApO1xuJiM0MztcbiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcbiYjNDM7XHRcdFx0XHQgbG9mZl90ICpvZmZwKTtcbiYjNDM7XG4mIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7XG4mIzQzO2ludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpO1xuJiM0MztcbiYjNDM7aW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XG4mIzQzO1xuJiM0MztpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcbiYjNDM7XG4mIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpO1xuJiM0MztcbiYjNDM7bG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCBsb2ZmX3QgcmF3X3NpemUpO1xuJiM0MztcbiYjNDM7aW50IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGRhdGEtXHUwMDNlYWVhZF90Zm07XG4mIzQzO31cbiYjNDM7XG4mIzQzOyNlbHNlXG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHNzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBsb2ZmX3QgKm9mZnApXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIC1FTk9UVFk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKSB7fVxuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4mIzQzO1x0XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiAtRU5PVFRZO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICAgbG9mZl90IHJhd19zaXplKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHJhd19zaXplO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gLUVOT1RUWTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2VuZGlmXG5kaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmNcbmluZGV4IDc4YjQ5YjA2NThhZGQuLjExZGYwYzU1NmY0ZTkgMTAwNjQ0XG4tLS0gYS9tbS9zd2FwZmlsZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9zd2FwZmlsZS5jXG5AQCAtMjM2Niw2ICYjNDM7MjM2NiwzOCBAQCBzZWN0b3JfdCBzd2FwZGV2X2Jsb2NrKGludCB0eXBlLCBwZ29mZl90IG9mZnNldClcbiBcdHJldHVybiBzZS1cdTAwM2VzdGFydF9ibG9jayAmIzQzOyAob2Zmc2V0IC0gc2UtXHUwMDNlc3RhcnRfcGFnZSk7XG4gfVxuIFxuJiM0MztpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQsXG4mIzQzO1x0XHRcdCAgICBwZ29mZl90ICpucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpO1xuJiM0MztcdHN0cnVjdCBzd2FwX2V4dGVudCAqc2U7XG4mIzQzO1x0c3RydWN0IHJiX25vZGUgKnJiO1xuJiM0MztcbiYjNDM7XHRpZiAoIXNpIHx8ICEoc2ktXHUwMDNlZmxhZ3MgXHUwMDI2IFNXUF9XUklURU9LKSlcbiYjNDM7XHRcdHJldHVybiAtRU5PREVWO1xuJiM0MztcbiYjNDM7XHRmb3IgKHJiID0gcmJfZmlyc3QoXHUwMDI2c2ktXHUwMDNlc3dhcF9leHRlbnRfcm9vdCk7IHJiOyByYiA9IHJiX25leHQocmIpKSB7XG4mIzQzO1x0XHRzZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIHJiX25vZGUpO1xuJiM0MztcdFx0aWYgKGJsb2NrIFx1MDAzZT0gc2UtXHUwMDNlc3RhcnRfYmxvY2sgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jayBcdTAwM2Mgc2UtXHUwMDNlbnJfcGFnZXMpIHtcbiYjNDM7XHRcdFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jaztcbiYjNDM7XG4mIzQzO1x0XHRcdCpvZmZzZXQgPSBzZS1cdTAwM2VzdGFydF9wYWdlICYjNDM7IHBhZ2U7XG4mIzQzO1x0XHRcdCpucl9wYWdlcyA9IHNlLVx1MDAzZW5yX3BhZ2VzIC0gcGFnZTtcbiYjNDM7XHRcdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gLUVOT0VOVDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxuJiM0Mzt7XG4mIzQzO1x0cGdvZmZfdCBucl9wYWdlcztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KHR5cGUsIGJsb2NrLCBvZmZzZXQsIFx1MDAyNm5yX3BhZ2VzKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIFJldHVybiBlaXRoZXIgdGhlIHRvdGFsIG51bWJlciBvZiBzd2FwIHBhZ2VzIG9mIGdpdmVuIHR5cGUsIG9yIHRoZSBudW1iZXJcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA0IDEyOjEyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFTkNSWVBURURfSElCRVJOQVRJT04mIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT05fU05BUFNIT1RfREVWJiMzNDssCiAgICAmIzM0O0hJQkVSTkFUSU9OJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfc2V0X3VzZXJfa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3JlYWRfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3dyaXRlX2VuY3J5cHRlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2UmIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luJiMzNDssCiAgICAmIzM0O2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQmIzM0OywKICAgICYjMzQ7c3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkJiMzNDssCiAgICAmIzM0O3N3YXBkZXZfYmxvY2tfdG9fZXh0ZW50JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGEwM2MwMjBlN2EyYzJmZmYyZWEyYjRkMzgwODdjMDg0ZDY2NDU3YWEKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyA0IDEyOjEyOjU0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKaW5kZXggZDM4ZGEwNzc5MDVhOS4uNTdmNjA2M2VmODhjOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlcgomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyCkBAIC00NzAsMyAmIzQzOzQ3MCwxNyBAQCBEZXNjcmlwdGlvbjoKIAogICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDEKICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAzCiYjNDM7CiYjNDM7V2hhdDoJCS9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZAomIzQzO0RhdGU6CQlKdWx5IDIwMjYKJiM0MztDb250YWN0OglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKJiM0MztEZXNjcmlwdGlvbjoKJiM0MzsJCVdyaXRlLW9ubHkgZmlsZSBwcmVzZW50IHdoZW4gQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTj15LgomIzQzOwomIzQzOwkJVHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2Ugd3JpdGVzIGEgMzItYnl0ZSBzZWVkLCBlbmNvZGVkIGFzCiYjNDM7CQk2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlCiYjNDM7CQllbmFibGluZyBlbmNyeXB0ZWQgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4KJiM0MzsKJiM0MzsJCVRoZSBmaXJzdCBzdWNjZXNzZnVsIHdyaXRlIGxvY2tzIHRoZSBzZWVkIHVudGlsIHRoZSBuZXh0IGJvb3QuCiYjNDM7CQlXcml0aW5nIHRoZSBzYW1lIHNlZWQgYWdhaW4gc3VjY2VlZHMuIFdyaXRpbmcgYSBkaWZmZXJlbnQgc2VlZAomIzQzOwkJZmFpbHMgd2l0aCBFUEVSTS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdAppbmRleCAxY2Y2MmQ4MGE5Y2ExLi5kZjhlY2E5ZTZlMzYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0CkBAIC0xMTUsNiAmIzQzOzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTQogCXRvIHJlc3VtZSB0aGUgc3lzdGVtIGZyb20gUkFNIGlmIHRoZXJlJiMzOTtzIGVub3VnaCBiYXR0ZXJ5IHBvd2VyIG9yIHJlc3RvcmUKIAlpdHMgc3RhdGUgb24gdGhlIGJhc2lzIG9mIHRoZSBzYXZlZCBzdXNwZW5kIGltYWdlIG90aGVyd2lzZSkKIAomIzQzO1NOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OCiYjNDM7CUVuYWJsZXMgZW5jcnlwdGlvbiBvZiB0aGUgaGliZXJuYXRlIGltYWdlIHdpdGhpbiB0aGUga2VybmVsLiBUcnVzdGVkCiYjNDM7CWVhcmx5IHVzZXJzcGFjZSBtdXN0IHdyaXRlIHRoZSAzMi1ieXRlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCB0bwomIzQzOwkvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQgYmVmb3JlIGNhbGxpbmcgdGhpcyBpb2N0bC4gVXBvbiBzdXNwZW5kCiYjNDM7CShpZSB3aGVuIHRoZSBzbmFwc2hvdCBkZXZpY2Ugd2FzIG9wZW5lZCBmb3IgcmVhZGluZyksIHRoaXMgaW9jdGwgcmV0dXJucwomIzQzOwlhbiBvcGFxdWUgd3JhcHBlZCBrZXkgYmxvYiBhbmQgdGhlIHN0YXJ0aW5nIG5vbmNlLiBVcG9uIHJlc3VtZSAoaWUgd2hlbgomIzQzOwl0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcpLCB0aGlzIGlvY3RsIHJlY2VpdmVzIHRoZQomIzQzOwlzYW1lIGJsb2IgYW5kIG5vbmNlIGZyb20gdXNlcm1vZGUgYWZ0ZXIgdGhlIHNhbWUgc2VlZCBoYXMgYmVlbiB3cml0dGVuCiYjNDM7CXRvIC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZC4gVGhlIHBsYWludGV4dCBpbWFnZSBrZXkgaXMgZ2VuZXJhdGVkIGFuZAomIzQzOwl1bndyYXBwZWQgaW5zaWRlIHRoZSBrZXJuZWwuCiYjNDM7CiYjNDM7U05BUFNIT1RfU0VUX1VTRVJfS0VZCiYjNDM7CU1peGVzIGFkZGl0aW9uYWwgdXNlciBrZXkgbWF0ZXJpYWwgaW50byB0aGUgZGF0YSBwb3J0aW9uIG9mIGFuIGVuY3J5cHRlZAomIzQzOwloaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuCiYjNDM7CWtleV9sZW4gbXVzdCBiZSBiZXR3ZWVuIDggYW5kIFVTV1NVU1BfVVNFUl9LRVlfU0laRSBieXRlcywgYW5kIHJlc2VydmVkCiYjNDM7CW11c3QgYmUgemVyby4gRHVyaW5nIGhpYmVybmF0aW9uIHRoZSBrZXJuZWwgd3JpdGVzIG1ldGFfc2l6ZSB3aXRoIHRoZQomIzQzOwllbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWQKJiM0MzsJbWV0YV9zaXplIGJhY2sgc28gdGhlIGtlcm5lbCBjYW4gc3dpdGNoIGtleXMgYXQgdGhlIG1ldGFkYXRhIGJvdW5kYXJ5CiYjNDM7CWJlZm9yZSB0aGUgc25hcHNob3QgaGVhZGVyIGhhcyBiZWVuIGRlY3J5cHRlZC4KJiM0MzsKIFRoZSBkZXZpY2UmIzM5O3MgcmVhZCgpIG9wZXJhdGlvbiBjYW4gYmUgdXNlZCB0byB0cmFuc2ZlciB0aGUgc25hcHNob3QgaW1hZ2UgZnJvbQogdGhlIGtlcm5lbC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgogCmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5kZXggMTU3ODNhNjE4MGRlYy4uZWZlYjQ4NWU5MWU2YyAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNzIzLDQzICYjNDM7NzIzLDY1IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0mZ3Q7a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldl9maWxlX2lub2RlKGZpbGUpOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpOwomIzQzOwlkZXZfdCBkZXYgPSBiZF9pbm9kZS0mZ3Q7aV9yZGV2OwogCWJvb2wgYXRvbWljID0gaW9jYi0mZ3Q7a2lfZmxhZ3MgJmFtcDsgSU9DQl9BVE9NSUM7CiAJbG9mZl90IHNpemUgPSBiZGV2X25yX2J5dGVzKGJkZXYpOwomIzQzOwllbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSBoaWJlcm5hdGVfd3JpdGU7CiYjNDM7CXNpemVfdCBoaWJlcm5hdGVfbGVuID0gMDsKIAlzaXplX3Qgc2hvcnRlZCA9IDA7CiYjNDM7CXNzaXplX3QgaGliZXJuYXRlX3dyaXR0ZW4gPSAwOwogCXNzaXplX3QgcmV0OwogCiAJaWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSAmYW1wOyZhbXA7ICFpc19oaWJlcm5hdGVfcmVzdW1lX2RldihiZF9pbm9kZS0mZ3Q7aV9yZGV2KSkKLQkJcmV0dXJuIC1FVFhUQlNZOwomIzQzOwlpZiAoSVNfU1dBUEZJTEUoYmRfaW5vZGUpICZhbXA7JmFtcDsgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldikpIHsKJiM0MzsJCWlmICghaXNfc3luY19raW9jYihpb2NiKSB8fCAhaW9jYl9pc19kc3luYyhpb2NiKSB8fAomIzQzOwkJICAgIChpb2NiLSZndDtraV9mbGFncyAmYW1wOyBJT0NCX0RJUkVDVCkpCiYjNDM7CQkJcmV0dXJuIC1FVFhUQlNZOwogCi0JaWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkKLQkJcmV0dXJuIDA7CiYjNDM7CQloaWJlcm5hdGVfbGVuID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiYjNDM7CQloaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLSZndDtraV9wb3MsIGhpYmVybmF0ZV9sZW4pOwomIzQzOwkJaWYgKGhpYmVybmF0ZV93cml0ZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSkKJiM0MzsJCQlyZXR1cm4gLUVUWFRCU1k7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQloaWJlcm5hdGVfd3JpdGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTsKJiM0MzsJfQogCi0JaWYgKGlvY2ItJmd0O2tpX3BvcyAmZ3Q7PSBzaXplKQotCQlyZXR1cm4gLUVOT1NQQzsKJiM0MzsJaWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkgewomIzQzOwkJcmV0ID0gMDsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKJiM0MzsJfQogCi0JaWYgKChpb2NiLSZndDtraV9mbGFncyAmYW1wOyAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiYjNDM7CWlmIChpb2NiLSZndDtraV9wb3MgJmd0Oz0gc2l6ZSkgewomIzQzOwkJcmV0ID0gLUVOT1NQQzsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoKGlvY2ItJmd0O2tpX2ZsYWdzICZhbXA7IChJT0NCX05PV0FJVCB8IElPQ0JfRElSRUNUKSkgPT0gSU9DQl9OT1dBSVQpIHsKJiM0MzsJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJZ290byBvdXRfaGliZXJuYXRlOwomIzQzOwl9CiAKIAlpZiAoYXRvbWljKSB7CiAJCXJldCA9IGdlbmVyaWNfYXRvbWljX3dyaXRlX3ZhbGlkKGlvY2IsIGZyb20pOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKJiM0MzsJCQlnb3RvIG91dF9oaWJlcm5hdGU7CiAJfQogCiAJc2l6ZSAtPSBpb2NiLSZndDtraV9wb3M7CiAJaWYgKGlvdl9pdGVyX2NvdW50KGZyb20pICZndDsgc2l6ZSkgewotCQlpZiAoYXRvbWljKQotCQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoYXRvbWljKSB7CiYjNDM7CQkJcmV0ID0gLUVJTlZBTDsKJiM0MzsJCQlnb3RvIG91dF9oaWJlcm5hdGU7CiYjNDM7CQl9CiAJCXNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7CiAJCWlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpOwogCX0KIAogCXJldCA9IGZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKJiM0MzsJCWdvdG8gb3V0X2hpYmVybmF0ZTsKIAogCWlmIChpb2NiLSZndDtraV9mbGFncyAmYW1wOyBJT0NCX0RJUkVDVCkgewogCQlyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pOwpAQCAtNzc3LDkgJiM0Mzs3OTksMTYgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiAJCWlub2RlX3VubG9ja19zaGFyZWQoYmRfaW5vZGUpOwogCX0KIAotCWlmIChyZXQgJmd0OyAwKQomIzQzOwlpZiAocmV0ICZndDsgMCkgewomIzQzOwkJaGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7CiAJCXJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpOwomIzQzOwl9CiAJaW92X2l0ZXJfcmVleHBhbmQoZnJvbSwgaW92X2l0ZXJfY291bnQoZnJvbSkgJiM0Mzsgc2hvcnRlZCk7CiYjNDM7CiYjNDM7b3V0X2hpYmVybmF0ZToKJiM0MzsJaWYgKGhpYmVybmF0ZV9sZW4pCiYjNDM7CQloaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGhpYmVybmF0ZV93cml0ZSwgaGliZXJuYXRlX2xlbiwKJiM0MzsJCQkJCSAgICAgaGliZXJuYXRlX3dyaXR0ZW4pOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKaW5kZXggYjAyODc2ZjFhZTM4YS4uODMwOGE2NTgzNzU2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKQEAgLTQyNiwxMCAmIzQzOzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CiAKIGludCBhcmNoX3Jlc3VtZV9ub3NtdCh2b2lkKTsKIAomIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHsKJiM0MzsJSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUsCiYjNDM7CUhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9JTUFHRSwKJiM0MzsJSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUiwKJiM0Mzt9OwomIzQzOwogI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYKIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpOwomIzQzO2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlCiYjNDM7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTsKJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KSB7IHJldHVybiAwOyB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZQomIzQzO2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJCQlzaXplX3QgcmVzZXJ2ZWQsCiYjNDM7CQkJCQkJc3NpemVfdCB3cml0dGVuKQomIzQzO3sKJiM0Mzt9CiAjZW5kaWYKIAogLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDhmMGY2OGUyNDViYWEuLmIzNjY4NWQxZjMxNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC00MzksNiAmIzQzOzQzOSw5IEBAIGV4dGVybiBpbnQgZmluZF9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGV2X3QgZGV2aWNlLCBzZWN0b3JfdCBvZmZzZXQpOwogaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQsIGludCk7CiBleHRlcm4gc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQsIHBnb2ZmX3QpOwomIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCk7CiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LAomIzQzOwkJCSAgICBwZ29mZl90ICpucl9wYWdlcyk7CiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7CiBleHRlcm4gYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSk7CiBleHRlcm4gaW50IHN3cF9zd2FwY291bnQoc3dwX2VudHJ5X3QgZW50cnkpOwpAQCAtNTM1LDYgJiM0Mzs1MzgsMTkgQEAgc3RhdGljIGlubGluZSBpbnQgYWRkX3N3YXBfZXh0ZW50KHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaXMsCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLAomIzQzOwkJCQkJICBwZ29mZl90ICpvZmZzZXQpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVJTlZBTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLAomIzQzOwkJCQkJICBwZ29mZl90ICpvZmZzZXQsCiYjNDM7CQkJCQkgIHBnb2ZmX3QgKm5yX3BhZ2VzKQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FSU5WQUw7CiYjNDM7fQogI2VuZGlmIC8qIENPTkZJR19TV0FQICovCiAjaWZkZWYgQ09ORklHX01FTUNHCiBzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaAppbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaApAQCAtMTMsNiAmIzQzOzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHsKIAlfX3UzMiBkZXY7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiYjNDM7I2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2CiYjNDM7I2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzIKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlCiYjNDM7ICogZW5jcnlwdGlvbiBrZXkgYW5kIHN0YXJ0aW5nIG5vbmNlIGluIGVpdGhlciBkaXJlY3Rpb24uCiYjNDM7ICovCiYjNDM7c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgewomIzQzOwlfX3UzMiBibG9iX2xlbjsKJiM0MzsJX191OCBibG9iWzUxMl07CiYjNDM7CV9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nOwomIzQzO30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBBbGxvdyB1c2VyIG1vZGUgdG8gZm9sZCBpbiBrZXkgbWF0ZXJpYWwgZm9yIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGhpYmVybmF0ZQomIzQzOyAqIGltYWdlLgomIzQzOyAqLwomIzQzO3N0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHsKJiM0MzsJLyogS2VybmVsIHJldHVybnMgdGhlIG1ldGFkYXRhIHNpemU7IHJlc3VtZSBwYXNzZXMgdGhlIHNhdmVkIHZhbHVlIGluLiAqLwomIzQzOwlfX3U2NCBtZXRhX3NpemU7CiYjNDM7CV9fdTMyIGtleV9sZW47CiYjNDM7CV9fdTMyIHJlc2VydmVkOwomIzQzOwlfX3U4IGtleVtVU1dTVVNQX1VTRVJfS0VZX1NJWkVdIF9fa2VybmVsX25vbnN0cmluZzsKJiM0Mzt9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwomIzQzOwogI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUMJJiMzOTszJiMzOTsKICNkZWZpbmUgU05BUFNIT1RfRlJFRVpFCQkJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSkKICNkZWZpbmUgU05BUFNIT1RfVU5GUkVFWkUJCV9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDIpCkBAIC0yOSw2ICYjNDM7NTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEgewogI2RlZmluZSBTTkFQU0hPVF9QUkVGX0lNQUdFX1NJWkUJX0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMTgpCiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRQlfSU9SKFNOQVBTSE9UX0lPQ19NQUdJQywgMTksIF9fa2VybmVsX2xvZmZfdCkKICNkZWZpbmUgU05BUFNIT1RfQUxMT0NfU1dBUF9QQUdFCV9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KQotI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlIJMjAKJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OCV9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFwKJiM0MzsJCQkJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IpCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVkJCV9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFwKJiM0MzsJCQkJCQkJc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlIJMjIKIAogI2VuZGlmIC8qIF9MSU5VWF9TVVNQRU5EX0lPQ1RMU19IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDUzMGM4OTczMTFkNDQuLmE5YmVlNzE1NzFjZmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xMTUsNiAmIzQzOzExNSwyMSBAQCBjb25maWcgSElCRVJOQVRJT05fREVGX0NPTVAKIAloZWxwCiAJICBEZWZhdWx0IGNvbXByZXNzb3IgdG8gYmUgdXNlZCBmb3IgaGliZXJuYXRpb24uCiAKJiM0Mztjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OCiYjNDM7CWJvb2wgJiMzNDtFbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBzbmFwc2hvdHMmIzM0OwomIzQzOwlkZXBlbmRzIG9uIEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVgomIzQzOwlzZWxlY3QgQ1JZUFRPX0FFUwomIzQzOwlzZWxlY3QgQ1JZUFRPX0dDTQomIzQzOwlzZWxlY3QgQ1JZUFRPX0xJQl9TSEEyNTYKJiM0MzsJaGVscAomIzQzOwkgIEVuYWJsZSBzdXBwb3J0IGZvciBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBvZiBoaWJlcm5hdGlvbiBzbmFwc2hvdHMKJiM0MzsJICBjcmVhdGVkIGJ5IHVzd3N1c3AgdG9vbHMuIEEgdHJ1c3RlZCBlYXJseSB1c2Vyc3BhY2UgY29tcG9uZW50IG11c3QKJiM0MzsJICBwcm92aWRlIHRoZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgYmVmb3JlIGVuYWJsaW5nIGVuY3J5cHRpb24uCiYjNDM7CiYjNDM7CSAgU2F5IE4gaWYgdXNlcnNwYWNlIGhhbmRsZXMgdGhlIGltYWdlIGVuY3J5cHRpb24uCiYjNDM7CiYjNDM7CSAgSWYgaW4gZG91YnQsIHNheSBOLgomIzQzOwogY29uZmlnIFBNX1NURF9QQVJUSVRJT04KIAlzdHJpbmcgJiMzNDtEZWZhdWx0IHJlc3VtZSBwYXJ0aXRpb24mIzM0OwogCWRlcGVuZHMgb24gSElCRVJOQVRJT04KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9NYWtlZmlsZSBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQppbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL01ha2VmaWxlCkBAIC0xNiw2ICYjNDM7MTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORCkJCSYjNDM7PSBzdXNwZW5kLm8KIG9iai0kKENPTkZJR19QTV9URVNUX1NVU1BFTkQpCSYjNDM7PSBzdXNwZW5kX3Rlc3Qubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkmIzQzOz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm8KIG9iai0kKENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYpICYjNDM7PSB1c2VyLm8KJiM0MztvYmotJChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKSAmIzQzOz0gc25hcGVuYy5vCiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKQkmIzQzOz0gYXV0b3NsZWVwLm8KIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpCSYjNDM7PSB3YWtlbG9jay5vCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYyBiL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYwppbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCkBAIC0zNiw2ICYjNDM7MzYsNyBAQAogI2luY2x1ZGUgJmx0O3RyYWNlL2V2ZW50cy9wb3dlci5oJmd0OwogCiAjaW5jbHVkZSAmIzM0O3Bvd2VyLmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7dXNlci5oJiMzNDsKIAogCiBzdGF0aWMgaW50IG5vY29tcHJlc3M7CkBAIC0xMTMsNiAmIzQzOzExNCwxNCBAQCBib29sIGhpYmVybmF0aW9uX2F2YWlsYWJsZSh2b2lkKQogCQkhc2VjcmV0bWVtX2FjdGl2ZSgpICZhbXA7JmFtcDsgIWN4bF9tZW1fYWN0aXZlKCk7CiB9CiAKJiM0Mztib29sIGhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBub2hpYmVybmF0ZSA9PSAwICZhbXA7JmFtcDsKJiM0MzsJCSghc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pIHx8CiYjNDM7CQkgSVNfRU5BQkxFRChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKSkgJmFtcDsmYW1wOwomIzQzOwkJIXNlY3JldG1lbV9hY3RpdmUoKSAmYW1wOyZhbXA7ICFjeGxfbWVtX2FjdGl2ZSgpOwomIzQzO30KJiM0MzsKIC8qKgogICogaGliZXJuYXRpb25fc2V0X29wcyAtIFNldCB0aGUgZ2xvYmFsIGhpYmVybmF0ZSBvcGVyYXRpb25zLgogICogQG9wczogSGliZXJuYXRpb24gb3BlcmF0aW9ucyB0byB1c2UgaW4gc3Vic2VxdWVudCBoaWJlcm5hdGlvbiB0cmFuc2l0aW9ucy4KQEAgLTEzNzYsMTIgJiM0MzsxMzg1LDM1IEBAIHN0YXRpYyBzc2l6ZV90IHJlc2VydmVkX3NpemVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiAKIHBvd2VyX2F0dHIocmVzZXJ2ZWRfc2l6ZSk7CiAKJiM0MzsjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTgomIzQzO3N0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3NlZWRfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCiYjNDM7CQkJCSAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKJiM0MzsJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pOwomIzQzOwlyZXR1cm4gcmV0ID8gcmV0IDogbjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzbmFwc2hvdF9zZWVkX2F0dHIgPSB7CiYjNDM7CS5hdHRyCT0gewomIzQzOwkJLm5hbWUgPSAmIzM0O3NuYXBzaG90X3NlZWQmIzM0OywKJiM0MzsJCS5tb2RlID0gMDIwMCwKJiM0MzsJfSwKJiM0MzsJLnN0b3JlCT0gc25hcHNob3Rfc2VlZF9zdG9yZSwKJiM0Mzt9OwomIzQzOyNlbmRpZgomIzQzOwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmdbXSA9IHsKIAkmYW1wO2Rpc2tfYXR0ci5hdHRyLAogCSZhbXA7cmVzdW1lX29mZnNldF9hdHRyLmF0dHIsCiAJJmFtcDtyZXN1bWVfYXR0ci5hdHRyLAogCSZhbXA7aW1hZ2Vfc2l6ZV9hdHRyLmF0dHIsCiAJJmFtcDtyZXNlcnZlZF9zaXplX2F0dHIuYXR0ciwKJiM0MzsjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTgomIzQzOwkmYW1wO3NuYXBzaG90X3NlZWRfYXR0ci5hdHRyLAomIzQzOyNlbmRpZgogCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcG93ZXIuaCBiL2tlcm5lbC9wb3dlci9wb3dlci5oCmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9wb3dlci5oCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9wb3dlci5oCkBAIC0xNjAsNiAmIzQzOzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgewogCiBleHRlcm4gdW5zaWduZWQgaW50IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7CiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpOwogZXh0ZXJuIGludCBzbmFwc2hvdF9yZWFkX25leHQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTsKIGV4dGVybiBpbnQgc25hcHNob3Rfd3JpdGVfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpOwogaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7CkBAIC0xNjcsOCAmIzQzOzE2OCwxMSBAQCBleHRlcm4gaW50IHNuYXBzaG90X2ltYWdlX2xvYWRlZChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpOwogCiBleHRlcm4gYm9vbCBoaWJlcm5hdGVfYWNxdWlyZSh2b2lkKTsKIGV4dGVybiB2b2lkIGhpYmVybmF0ZV9yZWxlYXNlKHZvaWQpOwomIzQzO2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTsKIAogZXh0ZXJuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApOwomIzQzO2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpOwomIzQzO3U2NCBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXModTY0IGltYWdlX2J5dGVzKTsKIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXApOwogZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwZW5jLmMgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmNkMjk4MDNlYzZjNWEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jCkBAIC0wLDAgJiM0MzsxLDk0MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKJiM0MzsvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9jcnlwdG8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3J5cHRvL2FlYWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7Y3J5cHRvL2djbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjcnlwdG8vc2hhMi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtjcnlwdG8vdXRpbHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvaGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L211dGV4LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JhbmRvbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tbS5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zbGFiLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N0cmluZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtwb3dlci5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3VzZXIuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBTTkFQU0hPVF9TRUVEX1NJWkUgU0hBMjU2X0RJR0VTVF9TSVpFCiYjNDM7I2RlZmluZSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OIDEKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgdTggc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWNbOF0gPSB7CiYjNDM7CSYjMzk7UyYjMzk7LCAmIzM5O1cmIzM5OywgJiMzOTtTJiMzOTssICYjMzk7VSYjMzk7LCAmIzM5O1MmIzM5OywgJiMzOTtQJiMzOTssICYjMzk7SyYjMzk7LCAmIzM5OzEmIzM5OywKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB7CiYjNDM7CXU4IG1hZ2ljW3NpemVvZihzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYyldOwomIzQzOwlfX2xlMzIgdmVyc2lvbjsKJiM0MzsJdTggd3JhcF9ub25jZVtHQ01fQUVTX0lWX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwl1OCBlbmNyeXB0ZWRfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwl1OCB0YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7fSBfX3BhY2tlZDsKJiM0MzsKJiM0MztzdGF0aWMgREVGSU5FX01VVEVYKHNuYXBzaG90X3NlZWRfbXV0ZXgpOwomIzQzO3N0YXRpYyB1OCBzbmFwc2hvdF9zZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDsKJiM0MzsKJiM0MztpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJdTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlzaXplX3QgbGVuID0gY291bnQ7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWlmIChsZW4gJmFtcDsmYW1wOyBidWZbbGVuIC0gMV0gPT0gJiMzOTtcbiYjMzk7KQomIzQzOwkJbGVuLS07CiYjNDM7CWlmIChsZW4gIT0gU05BUFNIT1RfU0VFRF9TSVpFICogMikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlyZXQgPSBoZXgyYmluKHNlZWQsIGJ1Ziwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtzbmFwc2hvdF9zZWVkX211dGV4KTsKJiM0MzsJaWYgKHNuYXBzaG90X3NlZWRfdmFsaWQpIHsKJiM0MzsJCXJldCA9IGNyeXB0b19tZW1uZXEoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKSA/IC1FUEVSTSA6IDA7CiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJc25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7CiYjNDM7CXByX2luZm8oJiMzNDtQTTogaGliZXJuYXRlOiBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgbG9ja2VkXG4mIzM0Oyk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwltdXRleF91bmxvY2soJmFtcDtzbmFwc2hvdF9zZWVkX211dGV4KTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZCh1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0pCiYjNDM7ewomIzQzOwlib29sIHZhbGlkOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7c25hcHNob3Rfc2VlZF9tdXRleCk7CiYjNDM7CXZhbGlkID0gc25hcHNob3Rfc2VlZF92YWxpZDsKJiM0MzsJaWYgKHZhbGlkKQomIzQzOwkJbWVtY3B5KHNlZWQsIHNuYXBzaG90X3NlZWQsIFNOQVBTSE9UX1NFRURfU0laRSk7CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3NuYXBzaG90X3NlZWRfbXV0ZXgpOwomIzQzOwomIzQzOwlyZXR1cm4gdmFsaWQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZGVyaXZlX3dyYXBwaW5nX2tleSh1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pCiYjNDM7ewomIzQzOwlzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gJiMzNDtMaW51eCBoaWJlcm5hdGUgc25hcHNob3Qga2V5IHdyYXAgdjEmIzM0OzsKJiM0MzsJdTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07CiYjNDM7CXU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJc3RydWN0IHNoYTI1Nl9jdHggc2hhMjU2X2N0eDsKJiM0MzsKJiM0MzsJaWYgKCFzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZChzZWVkKSkKJiM0MzsJCXJldHVybiAtRU5PS0VZOwomIzQzOwomIzQzOwlzaGEyNTZfaW5pdCgmYW1wO3NoYTI1Nl9jdHgpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKJiM0MzsJc2hhMjU2X2ZpbmFsKCZhbXA7c2hhMjU2X2N0eCwgZGlnZXN0KTsKJiM0MzsKJiM0MzsJbWVtY3B5KGtleSwgZGlnZXN0LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgKndyYXBwZWQsCiYjNDM7CQkJCSAgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSwKJiM0MzsJCQkJICAgICAgYm9vbCBlbmNyeXB0KQomIzQzO3sKJiM0MzsJdTggd3JhcF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7CiYjNDM7CXU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbTsKJiM0MzsJc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxOwomIzQzOwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CiYjNDM7CURFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJcmMgPSBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHdyYXBfa2V5KTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJcmV0dXJuIHJjOwomIzQzOwomIzQzOwl0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZCgmIzM0O2djbShhZXMpJiMzNDssIDAsIDApOwomIzQzOwlpZiAoSVNfRVJSKHRmbSkpIHsKJiM0MzsJCXJjID0gUFRSX0VSUih0Zm0pOwomIzQzOwkJZ290byBvdXRfa2V5OwomIzQzOwl9CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlnb3RvIG91dF90Zm07CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfdGZtOwomIzQzOwomIzQzOwlyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTsKJiM0MzsJaWYgKCFyZXEpIHsKJiM0MzsJCXJjID0gLUVOT01FTTsKJiM0MzsJCWdvdG8gb3V0X3RmbTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZW5jcnlwdCkgewomIzQzOwkJZ2V0X3JhbmRvbV9ieXRlcyh3cmFwcGVkLSZndDt3cmFwX25vbmNlLCBzaXplb2Yod3JhcHBlZC0mZ3Q7d3JhcF9ub25jZSkpOwomIzQzOwkJbWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW1lbWNweShidWYsIHdyYXBwZWQtJmd0O2VuY3J5cHRlZF9rZXksIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwkJbWVtY3B5KGJ1ZiAmIzQzOyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLSZndDt0YWcsCiYjNDM7CQkgICAgICAgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2dfaW5pdF9vbmUoJmFtcDtzZywgYnVmLCBzaXplb2YoYnVmKSk7CiYjNDM7CWFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsICZhbXA7d2FpdCk7CiYjNDM7CWFlYWRfcmVxdWVzdF9zZXRfYWQocmVxLCAwKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsICZhbXA7c2csICZhbXA7c2csCiYjNDM7CQkJICAgICAgIGVuY3J5cHQgPyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIDoKJiM0MzsJCQkJCSBzaXplb2YoYnVmKSwKJiM0MzsJCQkgICAgICAgd3JhcHBlZC0mZ3Q7d3JhcF9ub25jZSk7CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX3dhaXRfcmVxKGVuY3J5cHQgPyBjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOgomIzQzOwkJCQkgICAgICAgY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLAomIzQzOwkJCSAgICAgJmFtcDt3YWl0KTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXRfcmVxOwomIzQzOwomIzQzOwlpZiAoZW5jcnlwdCkgewomIzQzOwkJbWVtY3B5KHdyYXBwZWQtJmd0O2VuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7CiYjNDM7CQltZW1jcHkod3JhcHBlZC0mZ3Q7dGFnLCBidWYgJiM0MzsgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSwKJiM0MzsJCSAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW1lbWNweShpbWFnZV9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7CiYjNDM7CX0KJiM0MzsKJiM0MztvdXRfcmVxOgomIzQzOwlhZWFkX3JlcXVlc3RfZnJlZShyZXEpOwomIzQzO291dF90Zm06CiYjNDM7CWNyeXB0b19mcmVlX2FlYWQodGZtKTsKJiM0MztvdXRfa2V5OgomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGJ1Ziwgc2l6ZW9mKGJ1ZikpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSwKJiM0MzsJCQkJICAgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkKQomIzQzO3sKJiM0MzsJdTgga2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nOwomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CW1lbXNldCh3cmFwcGVkLCAwLCBzaXplb2YoKndyYXBwZWQpKTsKJiM0MzsJbWVtY3B5KHdyYXBwZWQtJmd0O21hZ2ljLCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYywgc2l6ZW9mKHdyYXBwZWQtJmd0O21hZ2ljKSk7CiYjNDM7CXdyYXBwZWQtJmd0O3ZlcnNpb24gPSBjcHVfdG9fbGUzMihTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKTsKJiM0MzsKJiM0MzsJbWVtY3B5KGtleSwgaW1hZ2Vfa2V5LCBzaXplb2Yoa2V5KSk7CiYjNDM7CXJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoY29uc3Qgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkLAomIzQzOwkJCQkgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJaWYgKG1lbWNtcCh3cmFwcGVkLSZndDttYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsCiYjNDM7CQkgICBzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwlpZiAobGUzMl90b19jcHUod3JhcHBlZC0mZ3Q7dmVyc2lvbikgIT0gU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTikKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwl0bXAgPSAqd3JhcHBlZDsKJiM0MzsJcmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleSgmYW1wO3RtcCwgaW1hZ2Vfa2V5LCBmYWxzZSk7CiYjNDM7CW1lbXplcm9fZXhwbGljaXQoJmFtcDt0bXAsIHNpemVvZih0bXApKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkgICAgICBjb25zdCB1OCBpbWFnZV9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0pCiYjNDM7ewomIzQzOwlpbnQgcmM7CiYjNDM7CiYjNDM7CW1lbWNweShkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJcmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS0mZ3Q7YWVhZF90Zm0sIGRhdGEtJmd0O2VuY3J5cHRpb25fa2V5LAomIzQzOwkJCQlzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJbWVtemVyb19leHBsaWNpdChkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwKJiM0MzsJCQkJIHNpemVvZihkYXRhLSZndDtlbmNyeXB0aW9uX2tleSkpOwomIzQzOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qIERlcml2ZSBhIGtleSBmcm9tIHRoZSBrZXJuZWwgYW5kIHVzZXIga2V5cyBmb3IgZGF0YSBlbmNyeXB0aW9uLiAqLwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfdXNlX3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJdTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07CiYjNDM7CXN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyCiYjNDM7CSAqIGtleSwgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGdpdmVzIHRoZSB1c2VyIG1vZGUgcHJlZGljdGFibGUgY29udHJvbAomIzQzOwkgKiBvdmVyIHRoZSBrZXkgYml0cy4KJiM0MzsJICovCiYjNDM7CXNoYTI1Nl9pbml0KCZhbXA7c2hhMjU2X2N0eCk7CiYjNDM7CiYjNDM7CXNoYTI1Nl91cGRhdGUoJmFtcDtzaGEyNTZfY3R4LCBkYXRhLSZndDtlbmNyeXB0aW9uX2tleSwKJiM0MzsJCSAgICAgIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwlzaGEyNTZfdXBkYXRlKCZhbXA7c2hhMjU2X2N0eCwgZGF0YS0mZ3Q7dXNlcl9rZXksIHNpemVvZihkYXRhLSZndDt1c2VyX2tleSkpOwomIzQzOwlzaGEyNTZfZmluYWwoJmFtcDtzaGEyNTZfY3R4LCBkaWdlc3QpOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSAmZ3Q7IFNIQTI1Nl9ESUdFU1RfU0laRSk7CiYjNDM7CiYjNDM7CXJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KGRhdGEtJmd0O2FlYWRfdGZtLAomIzQzOwkJCQlkaWdlc3QsCiYjNDM7CQkJCVNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRpZ2VzdCwgc2l6ZW9mKGRpZ2VzdCkpOwomIzQzOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzOy8qIENoZWNrIHRvIHNlZSBpZiBpdCYjMzk7cyB0aW1lIHRvIHN3aXRjaCB0byB0aGUgdXNlciBrZXksIGFuZCBkbyBpdCBpZiBzby4gKi8KJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CWlmIChkYXRhLSZndDt1c2VyX2tleV92YWxpZCAmYW1wOyZhbXA7IGRhdGEtJmd0O21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF90b3RhbCA9PSBkYXRhLSZndDttZXRhX3NpemUpIHsKJiM0MzsJCXJldHVybiBzbmFwc2hvdF91c2VfdXNlcl9rZXkoZGF0YSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpOwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3NldF9tZXRhX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsIHU2NCBtZXRhX3NpemUpCiYjNDM7ewomIzQzOwlkYXRhLSZndDttZXRhX3NpemUgPSBtZXRhX3NpemU7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSA9IHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KG1ldGFfc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3JlY29yZF9lbmNyeXB0ZWRfcmVhZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2RhdGEtJmd0O2NyeXB0X2xvY2spOwomIzQzOwlkYXRhLSZndDtjcnlwdF9ieXRlc19yZWFkICYjNDM7PSBjb3VudDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogRW5jcnlwdCBtb3JlIGRhdGEgZnJvbSB0aGUgc25hcHNob3QgaW50byB0aGUgc3RhZ2luZyBhcmVhLiAqLwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLSZndDthZWFkX3JlcTsKJiM0MzsJdTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTsKJiM0MzsJREVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTsKJiM0MzsJc2l6ZV90IHRvdGFsID0gMDsKJiM0MzsJaW50IHBnX2lkeDsKJiM0MzsJaW50IHJlczsKJiM0MzsKJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X3RvdGFsID09IDApIHsKJiM0MzsJCXNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSwKJiM0MzsJCQkJICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTsKJiM0MzsJCWlmIChyZXMpCiYjNDM7CQkJcmV0dXJuIHJlczsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnQKJiM0MzsJICogYXR0YWNrcyB0aGF0IHJlYXJyYW5nZSBjaHVua3MuCiYjNDM7CSAqLwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMF0sICZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfdG90YWwsIHNpemVvZihkYXRhLSZndDtjcnlwdF90b3RhbCkpOwomIzQzOwomIzQzOwkvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi8KJiM0MzsJZm9yIChwZ19pZHggPSAwOyBwZ19pZHggJmx0OyBDSFVOS19TSVpFOyBwZ19pZHgmIzQzOyYjNDM7KSB7CiYjNDM7CQl2b2lkICpidWYgPSBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdOwomIzQzOwomIzQzOwkJLyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi8KJiM0MzsJCWlmIChkYXRhLSZndDt1c2VyX2tleV92YWxpZCAmYW1wOyZhbXA7IHRvdGFsICZhbXA7JmFtcDsKJiM0MzsJCSAgICAoKGRhdGEtJmd0O2NyeXB0X3RvdGFsICYjNDM7IHRvdGFsKSA9PSBkYXRhLSZndDttZXRhX3NpemUpKQomIzQzOwkJCWJyZWFrOwomIzQzOwomIzQzOwkJcmVzID0gc25hcHNob3RfcmVhZF9uZXh0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlKTsKJiM0MzsJCWlmIChyZXMgJmx0OyAwKQomIzQzOwkJCXJldHVybiByZXM7CiYjNDM7CQlpZiAocmVzID09IDApCiYjNDM7CQkJYnJlYWs7CiYjNDM7CiYjNDM7CQlXQVJOX09OKHJlcyAhPSBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwkJLyoKJiM0MzsJCSAqIENvcHkgdGhlIHBhZ2UgaW50byB0aGUgc3RhZ2luZyBhcmVhLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24KJiM0MzsJCSAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuCiYjNDM7CQkgKi8KJiM0MzsJCW1lbWNweShidWYsIGRhdGFfb2YoZGF0YS0mZ3Q7aGFuZGxlKSwgUEFHRV9TSVpFKTsKJiM0MzsJCXNnX3NldF9idWYoJmFtcDtkYXRhLSZndDtzZ1sxICYjNDM7IHBnX2lkeF0sIGJ1ZiwgUEFHRV9TSVpFKTsKJiM0MzsJCXRvdGFsICYjNDM7PSBQQUdFX1NJWkU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCF0b3RhbCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCAmYW1wO2RhdGEtJmd0O2F1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgJmFtcDt3YWl0KTsKJiM0MzsJLyoKJiM0MzsJICogVXNlIGluY3JlbWVudGluZyBub25jZXMgZm9yIGVhY2ggY2h1bmssIHNpbmNlIGEgNjQgYml0IHZhbHVlIHdvbiYjMzk7dAomIzQzOwkgKiByb2xsIGludG8gcmUtdXNlIGZvciBhbnkgZ2l2ZW4gaGliZXJuYXRlIGltYWdlLgomIzQzOwkgKi8KJiM0MzsJbWVtY3B5KCZhbXA7bm9uY2VbMF0sICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO25vbmNlW3NpemVvZihkYXRhLSZndDtub25jZV9sb3cpXSwKJiM0MzsJICAgICAgICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwKJiM0MzsJICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O25vbmNlX2xvdyAmIzQzOz0gMTsKJiM0MzsJLyogVG90YWwgZG9lcyBub3QgaW5jbHVkZSBBQUQgb3IgdGhlIGF1dGggdGFnLiAqLwomIzQzOwlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS0mZ3Q7c2csIGRhdGEtJmd0O3NnLCB0b3RhbCwgbm9uY2UpOwomIzQzOwlyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpLCAmYW1wO3dhaXQpOwomIzQzOwlpZiAocmVzKQomIzQzOwkJcmV0dXJuIHJlczsKJiM0MzsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9IHRvdGFsOwomIzQzOwlkYXRhLSZndDtjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi8KJiM0MztzdGF0aWMgaW50IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLSZndDthZWFkX3JlcTsKJiM0MzsJdTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTsKJiM0MzsJREVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTsKJiM0MzsJaW50IHBhZ2VfY291bnQ7CiYjNDM7CXNpemVfdCB0b3RhbDsKJiM0MzsJaW50IHBnX2lkeDsKJiM0MzsJaW50IHJlczsKJiM0MzsKJiM0MzsJLyogU2V0IHVwIHRoZSBhc3NvY2lhdGVkIGRhdGEuICovCiYjNDM7CXNnX3NldF9idWYoJmFtcDtkYXRhLSZndDtzZ1swXSwgJmFtcDtkYXRhLSZndDtjcnlwdF90b3RhbCwgc2l6ZW9mKGRhdGEtJmd0O2NyeXB0X3RvdGFsKSk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlCiYjNDM7CSAqIHNob3VsZCBhbHNvIGJlIGEgdGFnIGF0IHRoZSBlbmQsIHNvIHRoZSBvZmZzZXQgd29uJiMzOTt0IGJlIGFuIGV2ZW4gcGFnZS4KJiM0MzsJICovCiYjNDM7CXBhZ2VfY291bnQgPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJdG90YWwgPSBwYWdlX2NvdW50ICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CWlmICh0b3RhbCA9PSAwIHx8IHRvdGFsID09IGRhdGEtJmd0O2NyeXB0X29mZnNldCkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBMb2FkIHRoZSBzZyBsaXN0IHdpdGggdGhlIGNyeXB0IGJ1ZmZlci4gSW5saW5lIGRlY3J5cHQgYmFjayBpbnRvIHRoZQomIzQzOwkgKiBzdGFnaW5nIGJ1ZmZlci4gQSBmdXR1cmUgb3B0aW1pemF0aW9uIGNvdWxkIGRlY3J5cHQgZGlyZWN0bHkgaW50bwomIzQzOwkgKiBsb3dtZW0gcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCAmbHQ7IHBhZ2VfY291bnQ7IHBnX2lkeCYjNDM7JiM0MzspCiYjNDM7CQlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBJdCYjMzk7cyBwb3NzaWJsZSB0aGlzIGlzIHRoZSBmaW5hbCBkZWNyeXB0LCBvciB0aGUgZmluYWwgZGVjcnlwdCBvZiB0aGUKJiM0MzsJICogbWV0YSByZWdpb24sIGFuZCB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBDSFVOS19TSVpFIHBhZ2VzLiBJZiB0aGlzIGlzCiYjNDM7CSAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXcKJiM0MzsJICogYnl0ZXMgb2YgYSBuZXcgcGFnZS4gQ29weSB0byB0aGUgdGFnIGlmIHNvLgomIzQzOwkgKi8KJiM0MzsJaWYgKHBhZ2VfY291bnQgJmx0OyBDSFVOS19TSVpFICZhbXA7JmFtcDsKJiM0MzsJICAgIChkYXRhLSZndDtjcnlwdF9vZmZzZXQgLSB0b3RhbCkgPT0gc2l6ZW9mKGRhdGEtJmd0O2F1dGhfdGFnKSkgewomIzQzOwkJbWVtY3B5KGRhdGEtJmd0O2F1dGhfdGFnLCBkYXRhLSZndDtjcnlwdF9wYWdlc1twZ19pZHhdLAomIzQzOwkJICAgICAgIHNpemVvZihkYXRhLSZndDthdXRoX3RhZykpOwomIzQzOwl9IGVsc2UgaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAhPQomIzQzOwkJICAgKChDSFVOS19TSVpFICZsdDsmbHQ7IFBBR0VfU0hJRlQpICYjNDM7IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7CiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJfQomIzQzOwomIzQzOwlzZ19zZXRfYnVmKCZhbXA7ZGF0YS0mZ3Q7c2dbMSAmIzQzOyBwZ19pZHhdLCAmYW1wO2RhdGEtJmd0O2F1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgJmFtcDt3YWl0KTsKJiM0MzsJbWVtY3B5KCZhbXA7bm9uY2VbMF0sICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO25vbmNlW3NpemVvZihkYXRhLSZndDtub25jZV9sb3cpXSwKJiM0MzsJICAgICAgICZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwKJiM0MzsJICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O25vbmNlX2xvdyAmIzQzOz0gMTsKJiM0MzsJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIGRhdGEtJmd0O3NnLCBkYXRhLSZndDtzZywgdG90YWwgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSwgbm9uY2UpOwomIzQzOwlyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCAmYW1wO3dhaXQpOwomIzQzOwlpZiAocmVzKQomIzQzOwkJcmV0dXJuIHJlczsKJiM0MzsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9IDA7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X29mZnNldCA9IDA7CiYjNDM7CiYjNDM7CS8qIFB1c2ggdGhlIGRlY3J5cHRlZCBwYWdlcyBmdXJ0aGVyIGRvd24gdGhlIHN0YWNrLiAqLwomIzQzOwl0b3RhbCA9IDA7CiYjNDM7CWZvciAocGdfaWR4ID0gMDsgcGdfaWR4ICZsdDsgcGFnZV9jb3VudDsgcGdfaWR4JiM0MzsmIzQzOykgewomIzQzOwkJdm9pZCAqYnVmID0gZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbcGdfaWR4XTsKJiM0MzsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoJmFtcDtkYXRhLSZndDtoYW5kbGUpOwomIzQzOwkJaWYgKHJlcyAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJlczsKJiM0MzsJCWlmIChyZXMgPT0gMCkKJiM0MzsJCQlicmVhazsKJiM0MzsKJiM0MzsJCWlmICghZGF0YV9vZihkYXRhLSZndDtoYW5kbGUpKQomIzQzOwkJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkJV0FSTl9PTihyZXMgIT0gUEFHRV9TSVpFKTsKJiM0MzsKJiM0MzsJCS8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqLwomIzQzOwkJbWVtY3B5KGRhdGFfb2YoZGF0YS0mZ3Q7aGFuZGxlKSwgYnVmLCBQQUdFX1NJWkUpOwomIzQzOwkJdG90YWwgJiM0Mzs9IFBBR0VfU0laRTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgPT0gMCkgewomIzQzOwkJZGF0YS0mZ3Q7bWV0YV9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQpCiYjNDM7CQkJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0KJiM0MzsJCQkJc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS0mZ3Q7bWV0YV9zaXplKTsKJiM0MzsJfQomIzQzOwomIzQzOwlkYXRhLSZndDtjcnlwdF90b3RhbCAmIzQzOz0gdG90YWw7CiYjNDM7CXJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTsKJiM0MzsJaWYgKHJlcykKJiM0MzsJCXJldHVybiByZXM7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgIHZvaWQgKipidWYpCiYjNDM7ewomIzQzOwlzaXplX3QgdGFnX29mZjsKJiM0MzsKJiM0MzsJLyogUmVmaWxsIHRoZSBlbmNyeXB0ZWQgYnVmZmVyIGlmIGl0JiMzOTtzIGVtcHR5LiAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfc2l6ZSA9PSAwIHx8CiYjNDM7CSAgICAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICZndDs9CiYjNDM7CSAgICAgKGRhdGEtJmd0O2NyeXB0X3NpemUgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkpKSB7CiYjNDM7CQlpbnQgcmM7CiYjNDM7CiYjNDM7CQlkYXRhLSZndDtjcnlwdF9zaXplID0gMDsKJiM0MzsJCWRhdGEtJmd0O2NyeXB0X29mZnNldCA9IDA7CiYjNDM7CQlyYyA9IHNuYXBzaG90X2VuY3J5cHRfcmVmaWxsKGRhdGEpOwomIzQzOwkJaWYgKHJjICZsdDsgMCkKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CQlpZiAoIWRhdGEtJmd0O2NyeXB0X3NpemUpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAmbHQ7IGRhdGEtJmd0O2NyeXB0X3NpemUpIHsKJiM0MzsJCXNpemVfdCBwZ19pZHggPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsJCXNpemVfdCBwZ19vZmYgPSBkYXRhLSZndDtjcnlwdF9vZmZzZXQgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwkJKmJ1ZiA9IGRhdGEtJmd0O2NyeXB0X3BhZ2VzW3BnX2lkeF0gJiM0MzsgcGdfb2ZmOwomIzQzOwkJcmV0dXJuIFBBR0VfU0laRSAtIHBnX29mZjsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi8KJiM0MzsJdGFnX29mZiA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAtIGRhdGEtJmd0O2NyeXB0X3NpemU7CiYjNDM7CWlmICh0YWdfb2ZmICZndDsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSkKJiM0MzsJCXRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFOwomIzQzOwomIzQzOwkqYnVmID0gZGF0YS0mZ3Q7YXV0aF90YWcgJiM0MzsgdGFnX29mZjsKJiM0MzsJcmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgICAgdm9pZCAqKmJ1ZikKJiM0Mzt7CiYjNDM7CXNpemVfdCBzaXplX2F2YWlsOwomIzQzOwlzaXplX3QgdGFnX29mZjsKJiM0MzsKJiM0MzsJLyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X29mZnNldCAmbHQ7IChQQUdFX1NJWkUgKiBDSFVOS19TSVpFKSkgewomIzQzOwkJc2l6ZV90IHBnX2lkeCA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwkJc2l6ZV90IHBnX29mZiA9IGRhdGEtJmd0O2NyeXB0X29mZnNldCAmYW1wOyAoUEFHRV9TSVpFIC0gMSk7CiYjNDM7CiYjNDM7CQkqYnVmID0gZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbcGdfaWR4XSAmIzQzOyBwZ19vZmY7CiYjNDM7CQlzaXplX2F2YWlsID0gUEFHRV9TSVpFIC0gcGdfb2ZmOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovCiYjNDM7CQl0YWdfb2ZmID0gZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpOwomIzQzOwkJaWYgKHRhZ19vZmYgJmd0OyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKQomIzQzOwkJCXRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFOwomIzQzOwomIzQzOwkJKmJ1ZiA9IGRhdGEtJmd0O2F1dGhfdGFnICYjNDM7IHRhZ19vZmY7CiYjNDM7CQlzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgJmx0OyBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemUpIHsKJiM0MzsJCXU2NCBtZXRhX2F2YWlsID0gZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplIC0gZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsOwomIzQzOwomIzQzOwkJc2l6ZV9hdmFpbCA9IG1pbl90KHU2NCwgc2l6ZV9hdmFpbCwgbWV0YV9hdmFpbCk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHNpemVfYXZhaWw7CiYjNDM7fQomIzQzOwomIzQzO3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCWNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKQomIzQzO3sKJiM0MzsJc2l6ZV90IGNvcHlfc2l6ZTsKJiM0MzsJc2l6ZV90IG5vdF9kb25lOwomIzQzOwlzaXplX3QgcGdfb2ZmOwomIzQzOwl2b2lkICpzcmM7CiYjNDM7CXNzaXplX3Qgc3JjX3NpemU7CiYjNDM7CiYjNDM7CWlmICghY291bnQpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJcGdfb2ZmID0gKm9mZnAgJmFtcDsgKFBBR0VfU0laRSAtIDEpOwomIzQzOwljb3VudCA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0VfU0laRSAtIHBnX29mZik7CiYjNDM7CiYjNDM7CXNyY19zaXplID0gc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChkYXRhLCAmYW1wO3NyYyk7CiYjNDM7CWlmIChzcmNfc2l6ZSAmbHQ7PSAwKQomIzQzOwkJcmV0dXJuIHNyY19zaXplOwomIzQzOwomIzQzOwljb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIGNvdW50LCBzcmNfc2l6ZSk7CiYjNDM7CW5vdF9kb25lID0gY29weV90b191c2VyKGJ1Ziwgc3JjLCBjb3B5X3NpemUpOwomIzQzOwljb3B5X3NpemUgLT0gbm90X2RvbmU7CiYjNDM7CWlmICghY29weV9zaXplKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X29mZnNldCAmIzQzOz0gY29weV9zaXplOwomIzQzOwkqb2ZmcCAmIzQzOz0gY29weV9zaXplOwomIzQzOwlzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTsKJiM0MzsJcmV0dXJuIGNvcHlfc2l6ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiYjNDM7CQkJCSBsb2ZmX3QgKm9mZnApCiYjNDM7ewomIzQzOwlzaXplX3QgY29weV9zaXplOwomIzQzOwlzaXplX3Qgbm90X2RvbmU7CiYjNDM7CXNpemVfdCBwZ19vZmY7CiYjNDM7CXZvaWQgKmRzdDsKJiM0MzsJc3NpemVfdCBkc3Rfc2l6ZTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoIWNvdW50KQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CXBnX29mZiA9ICpvZmZwICZhbXA7IChQQUdFX1NJWkUgLSAxKTsKJiM0MzsJY291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpOwomIzQzOwomIzQzOwlkc3Rfc2l6ZSA9IHNuYXBzaG90X3dyaXRlX25leHRfZW5jcnlwdGVkKGRhdGEsICZhbXA7ZHN0KTsKJiM0MzsJaWYgKGRzdF9zaXplICZsdDs9IDApCiYjNDM7CQlyZXR1cm4gZHN0X3NpemU7CiYjNDM7CiYjNDM7CWNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTsKJiM0MzsJbm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTsKJiM0MzsJY29weV9zaXplIC09IG5vdF9kb25lOwomIzQzOwlpZiAoIWNvcHlfc2l6ZSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlkYXRhLSZndDtjcnlwdF9vZmZzZXQgJiM0Mzs9IGNvcHlfc2l6ZTsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsICYjNDM7PSBjb3B5X3NpemU7CiYjNDM7CS8qCiYjNDM7CSAqIERyYWluIHRoZSBlbmNyeXB0ZWQgYnVmZmVyIGlmIGl0JiMzOTtzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZQomIzQzOwkgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICZndDs9CiYjNDM7CSAgICAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkgJiM0MzsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSB8fAomIzQzOwkgICAgKGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAgZGF0YS0mZ3Q7Y3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZSkpIHsKJiM0MzsJCXJjID0gc25hcHNob3RfZGVjcnlwdF9kcmFpbihkYXRhKTsKJiM0MzsJCWlmIChyYyAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIHJjOwomIzQzOwl9CiYjNDM7CiYjNDM7CSpvZmZwICYjNDM7PSBjb3B5X3NpemU7CiYjNDM7CXJldHVybiBjb3B5X3NpemU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlkYXRhLSZndDtjcnlwdF9vZmZzZXQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgPSAwOwomIzQzOwlkYXRhLSZndDtub25jZV9sb3cgPSAwOwomIzQzOwlkYXRhLSZndDtub25jZV9oaWdoID0gMDsKJiM0MzsJZGF0YS0mZ3Q7bWV0YV9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0gMDsKJiM0MzsJZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQgPSBmYWxzZTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfaGVhZGVyX3Jlc2VydmVkID0gMDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJbWVtc2V0KGRhdGEtJmd0O2F1dGhfdGFnLCAwLCBzaXplb2YoZGF0YS0mZ3Q7YXV0aF90YWcpKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJaW50IGk7CiYjNDM7CiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3JlcSkgewomIzQzOwkJYWVhZF9yZXF1ZXN0X2ZyZWUoZGF0YS0mZ3Q7YWVhZF9yZXEpOwomIzQzOwkJZGF0YS0mZ3Q7YWVhZF9yZXEgPSBOVUxMOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3RmbSkgewomIzQzOwkJY3J5cHRvX2ZyZWVfYWVhZChkYXRhLSZndDthZWFkX3RmbSk7CiYjNDM7CQlkYXRhLSZndDthZWFkX3RmbSA9IE5VTEw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbaV0pIHsKJiM0MzsJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0mZ3Q7Y3J5cHRfcGFnZXNbaV0pOwomIzQzOwkJCWRhdGEtJmd0O2NyeXB0X3BhZ2VzW2ldID0gTlVMTDsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGRhdGEtJmd0O2VuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS0mZ3Q7ZW5jcnlwdGlvbl9rZXkpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChkYXRhLSZndDt1c2VyX2tleSwgc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSk7CiYjNDM7CXNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlpbnQgaSwgcmM7CiYjNDM7CiYjNDM7CS8qIFRoaXMgb25seSB3b3JrcyBvbmNlIHBlciBoaWJlcm5hdGUuICovCiYjNDM7CWlmIChkYXRhLSZndDthZWFkX3RmbSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKGRhdGEpOwomIzQzOwltZW1zZXQoZGF0YS0mZ3Q7Y3J5cHRfcGFnZXMsIDAsIHNpemVvZihkYXRhLSZndDtjcnlwdF9wYWdlcykpOwomIzQzOwomIzQzOwkvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovCiYjNDM7CWRhdGEtJmd0O2FlYWRfdGZtID0gY3J5cHRvX2FsbG9jX2FlYWQoJiMzNDtnY20oYWVzKSYjMzQ7LCAwLCAwKTsKJiM0MzsJaWYgKElTX0VSUihkYXRhLSZndDthZWFkX3RmbSkpIHsKJiM0MzsJCXJjID0gUFRSX0VSUihkYXRhLSZndDthZWFkX3RmbSk7CiYjNDM7CQlkYXRhLSZndDthZWFkX3RmbSA9IE5VTEw7CiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmMgPSAtRU5PTUVNOwomIzQzOwlkYXRhLSZndDthZWFkX3JlcSA9IGFlYWRfcmVxdWVzdF9hbGxvYyhkYXRhLSZndDthZWFkX3RmbSwgR0ZQX0tFUk5FTCk7CiYjNDM7CWlmICghZGF0YS0mZ3Q7YWVhZF9yZXEpCiYjNDM7CQlnb3RvIHNldHVwX2ZhaWw7CiYjNDM7CiYjNDM7CS8qIEFsbG9jYXRlIHRoZSBzdGFnaW5nIGFyZWEgKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IENIVU5LX1NJWkU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlkYXRhLSZndDtjcnlwdF9wYWdlc1tpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwomIzQzOwkJaWYgKCFkYXRhLSZndDtjcnlwdF9wYWdlc1tpXSkKJiM0MzsJCQlnb3RvIHNldHVwX2ZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc2dfaW5pdF90YWJsZShkYXRhLSZndDtzZywgQ0hVTktfU0laRSAmIzQzOyAyKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsIGJlIHRoZSBvZmZzZXQgc28gdGhhdCBibG9ja3MgY2FuJiMzOTt0IGJlCiYjNDM7CSAqIHJlYXJyYW5nZWQuCiYjNDM7CSAqLwomIzQzOwlhZWFkX3JlcXVlc3Rfc2V0X2FkKGRhdGEtJmd0O2FlYWRfcmVxLCBzaXplb2YoZGF0YS0mZ3Q7Y3J5cHRfdG90YWwpKTsKJiM0MzsJcmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShkYXRhLSZndDthZWFkX3RmbSwgU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gc2V0dXBfZmFpbDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7c2V0dXBfZmFpbDoKJiM0MzsJc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTsKJiM0MzsJcmV0dXJuIHJjOwomIzQzO30KJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQlzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB3cmFwcGVkID0ge307CiYjNDM7CXU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9OwomIzQzOwl1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3QgcHVsbCBhIHJhbmRvbSBrZXkgZnJvbSBhIHdvcmxkIHRoYXQgY2FuIGJlIHJlc2V0LiAqLwomIzQzOwlpZiAoZGF0YS0mZ3Q7cmVhZHkpCiYjNDM7CQlyZXR1cm4gLUVQSVBFOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CiYjNDM7CS8qIEJ1aWxkIGEgcmFuZG9tIHN0YXJ0aW5nIG5vbmNlLiAqLwomIzQzOwlnZXRfcmFuZG9tX2J5dGVzKG5vbmNlLCBzaXplb2Yobm9uY2UpKTsKJiM0MzsJbWVtY3B5KCZhbXA7ZGF0YS0mZ3Q7bm9uY2VfbG93LCAmYW1wO25vbmNlWzBdLCBzaXplb2YoZGF0YS0mZ3Q7bm9uY2VfbG93KSk7CiYjNDM7CW1lbWNweSgmYW1wO2RhdGEtJmd0O25vbmNlX2hpZ2gsICZhbXA7bm9uY2VbOF0sIHNpemVvZihkYXRhLSZndDtub25jZV9oaWdoKSk7CiYjNDM7CiYjNDM7CS8qIEJ1aWxkIGFuZCBpbnN0YWxsIGEgcmFuZG9tIGltYWdlIGVuY3J5cHRpb24ga2V5LiAqLwomIzQzOwlnZXRfcmFuZG9tX2J5dGVzKGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwlyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJcmMgPSBzbmFwc2hvdF93cmFwX2ltYWdlX2tleShpbWFnZV9rZXksICZhbXA7d3JhcHBlZCk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsKJiM0MzsJLyogSGFuZCB0aGUgd3JhcHBlZCBrZXkgYW5kIGNsZWFyIG5vbmNlIGJhY2sgdG8gdXNlciBtb2RlLiAqLwomIzQzOwlyYyA9IHB1dF91c2VyKHNpemVvZih3cmFwcGVkKSwgJmFtcDtrZXktJmd0O2Jsb2JfbGVuKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpICZndDsKJiM0MzsJCSAgICAgc2l6ZW9mKCgoc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgKikwKS0mZ3Q7YmxvYikpOwomIzQzOwlpZiAoY29weV90b191c2VyKCZhbXA7a2V5LSZndDtibG9iLCAmYW1wO3dyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHsKJiM0MzsJCXJjID0gLUVGQVVMVDsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY29weV90b191c2VyKCZhbXA7a2V5LSZndDtub25jZSwgJmFtcDtub25jZSwgc2l6ZW9mKG5vbmNlKSkpIHsKJiM0MzsJCXJjID0gLUVGQVVMVDsKJiM0MzsJCWdvdG8gZmFpbDsKJiM0MzsJfQomIzQzOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZmFpbDoKJiM0MzsJbWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdCgmYW1wO3dyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7CiYjNDM7CXNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7CiYjNDM7CXJldHVybiByYzsKJiM0Mzt9CiYjNDM7CiYjNDM7aW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjsKJiM0MzsJc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTsKJiM0MzsJdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307CiYjNDM7CWludCByYzsKJiM0MzsKJiM0MzsJLyogSXQmIzM5O3MgdG9vIGxhdGUgaWYgZGF0YSYjMzk7cyBiZWVuIHB1c2hlZCBpbi4gKi8KJiM0MzsJaWYgKGRhdGEtJmd0O2hhbmRsZS5jdXIpCiYjNDM7CQlyZXR1cm4gLUVQSVBFOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X3NldHVwX2VuY3J5cHRpb25fY29tbW9uKGRhdGEpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlyZXR1cm4gcmM7CiYjNDM7CiYjNDM7CS8qIExvYWQgdGhlIGtleSBmcm9tIHVzZXIgbW9kZS4gKi8KJiM0MzsJYmxvYiA9IG1lbWR1cF91c2VyKGtleSwgc2l6ZW9mKCpibG9iKSk7CiYjNDM7CWlmIChJU19FUlIoYmxvYikpIHsKJiM0MzsJCXJjID0gUFRSX0VSUihibG9iKTsKJiM0MzsJCWdvdG8gY3J5cHRvX3NldHVwX2ZhaWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGJsb2ItJmd0O2Jsb2JfbGVuICE9IHNpemVvZih3cmFwcGVkKSkgewomIzQzOwkJcmMgPSAtRUlOVkFMOwomIzQzOwkJZ290byBvdXRfYmxvYjsKJiM0MzsJfQomIzQzOwomIzQzOwltZW1jcHkoJmFtcDt3cmFwcGVkLCBibG9iLSZndDtibG9iLCBzaXplb2Yod3JhcHBlZCkpOwomIzQzOwlyYyA9IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoJmFtcDt3cmFwcGVkLCBpbWFnZV9rZXkpOwomIzQzOwlpZiAocmMpCiYjNDM7CQlnb3RvIG91dF9ibG9iOwomIzQzOwomIzQzOwlyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0X2Jsb2I7CiYjNDM7CiYjNDM7CS8qIExvYWQgdGhlIHN0YXJ0aW5nIG5vbmNlLiAqLwomIzQzOwltZW1jcHkoJmFtcDtkYXRhLSZndDtub25jZV9sb3csICZhbXA7YmxvYi0mZ3Q7bm9uY2VbMF0sIHNpemVvZihkYXRhLSZndDtub25jZV9sb3cpKTsKJiM0MzsJbWVtY3B5KCZhbXA7ZGF0YS0mZ3Q7bm9uY2VfaGlnaCwgJmFtcDtibG9iLSZndDtub25jZVs4XSwgc2l6ZW9mKGRhdGEtJmd0O25vbmNlX2hpZ2gpKTsKJiM0MzsKJiM0MztvdXRfYmxvYjoKJiM0MzsJa2ZyZWVfc2Vuc2l0aXZlKGJsb2IpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTsKJiM0MzsJbWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBjcnlwdG9fc2V0dXBfZmFpbDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y3J5cHRvX3NldHVwX2ZhaWw6CiYjNDM7CW1lbXplcm9fZXhwbGljaXQoJmFtcDt3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpOwomIzQzOwltZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpOwomIzQzOwlzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobG9mZl90IHBsYWluX3NpemUpCiYjNDM7ewomIzQzOwlsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplICZndDsmZ3Q7IFBBR0VfU0hJRlQ7CiYjNDM7CWxvZmZfdCBjaHVua3MgPSAocGFnZXMgJiM0MzsgKENIVU5LX1NJWkUgLSAxKSkgLyBDSFVOS19TSVpFOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW4KJiM0MzsJICogYXV0aGVudGljYXRpb24gdGFnIGZvciBldmVyeSBjaHVuayBvZiBwYWdlcy4KJiM0MzsJICovCiYjNDM7CXJldHVybiBwbGFpbl9zaXplICYjNDM7IChjaHVua3MgKiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChsb2ZmX3QgcmF3X3NpemUsCiYjNDM7CQkJCQkJICBsb2ZmX3QgbWV0YV9wbGFpbl9zaXplKQomIzQzO3sKJiM0MzsJaWYgKHJhd19zaXplICZsdDs9IG1ldGFfcGxhaW5fc2l6ZSkKJiM0MzsJCXJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICYjNDM7CiYjNDM7CQlzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJICBzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHVzZXJfa2V5ID0ge307CiYjNDM7CXVuc2lnbmVkIGludCBrZXlfbGVuOwomIzQzOwl1NjQgc2l6ZTsKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDt1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSkKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSAmbHQ7IHNpemVvZih1c2VyX2tleS5rZXkpKTsKJiM0MzsJcmMgPSAtRUlOVkFMOwomIzQzOwlpZiAodXNlcl9rZXkucmVzZXJ2ZWQpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKHVzZXJfa2V5LmtleV9sZW4gJmd0OyBzaXplb2YoZGF0YS0mZ3Q7dXNlcl9rZXkpKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICh1c2VyX2tleS5rZXlfbGVuICZsdDsgOCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSAmYW1wOyZhbXA7ICFkYXRhLSZndDtyZWFkeSkgewomIzQzOwkJcmMgPSAtRU5PREFUQTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFJldHVybiB0aGUgbWV0YWRhdGEgc2l6ZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSBmZWQgaW4gYmVmb3JlCiYjNDM7CSAqIHRoZSB1c2VyIGRhdGEga2V5IGlzIG5lZWRlZCBhdCByZXN1bWUgdGltZS4KJiM0MzsJICovCiYjNDM7CWlmIChkYXRhLSZndDttb2RlID09IE9fV1JPTkxZICZhbXA7JmFtcDsgIWRhdGEtJmd0O21ldGFfc2l6ZSkgewomIzQzOwkJaWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSAmbHQ7IFBBR0VfU0laRSAmIzQzOyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplID0gdXNlcl9rZXkubWV0YV9zaXplOwomIzQzOwkJc2l6ZSA9IGRhdGEtJmd0O2NyeXB0X21ldGFfc2l6ZTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSwKJiM0MzsJCQkJICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSAmbHQ7Jmx0OyBQQUdFX1NISUZUKTsKJiM0MzsJCXNpemUgPSBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmMgPSBwdXRfdXNlcihzaXplLCAmYW1wO2tleS0mZ3Q7bWV0YV9zaXplKTsKJiM0MzsJaWYgKHJjKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWtleV9sZW4gPSB1c2VyX2tleS5rZXlfbGVuOwomIzQzOwomIzQzOwkvKiBEb24mIzM5O3QgYWxsb3cgaXQgaWYgaXQmIzM5O3MgdG9vIGxhdGUuICovCiYjNDM7CWlmICgoZGF0YS0mZ3Q7bWV0YV9zaXplICZhbXA7JmFtcDsgZGF0YS0mZ3Q7Y3J5cHRfdG90YWwgJmd0OyBkYXRhLSZndDttZXRhX3NpemUpIHx8CiYjNDM7CSAgICAoZGF0YS0mZ3Q7Y3J5cHRfbWV0YV9zaXplICZhbXA7JmFtcDsKJiM0MzsJICAgICBkYXRhLSZndDtjcnlwdF9zdHJlYW1fdG90YWwgJmd0OyBkYXRhLSZndDtjcnlwdF9tZXRhX3NpemUpKSB7CiYjNDM7CQlyYyA9IC1FQlVTWTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CW1lbXNldChkYXRhLSZndDt1c2VyX2tleSwgMCwgc2l6ZW9mKGRhdGEtJmd0O3VzZXJfa2V5KSk7CiYjNDM7CW1lbWNweShkYXRhLSZndDt1c2VyX2tleSwgdXNlcl9rZXkua2V5LCBrZXlfbGVuKTsKJiM0MzsJZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQgPSB0cnVlOwomIzQzOwkvKiBJbnN0YWxsIHRoZSBrZXkgaWYgdGhlIHVzZXIgaXMganVzdCB1bmRlciB0aGUgd2lyZS4gKi8KJiM0MzsJcmMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7CiYjNDM7CWlmIChyYykKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyYyA9IDA7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwltZW16ZXJvX2V4cGxpY2l0KCZhbXA7dXNlcl9rZXksIHNpemVvZih1c2VyX2tleSkpOwomIzQzOwlyZXR1cm4gcmM7CiYjNDM7fQomIzQzOwomIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCQkgbG9mZl90IHJhd19zaXplKQomIzQzO3sKJiM0MzsJbG9mZl90IG1ldGFfcGxhaW5fc2l6ZSA9IGRhdGEtJmd0O21ldGFfc2l6ZTsKJiM0MzsJbG9mZl90IHNwbGl0X3NpemU7CiYjNDM7CiYjNDM7CWlmICghbWV0YV9wbGFpbl9zaXplKQomIzQzOwkJbWV0YV9wbGFpbl9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7CiYjNDM7CXNwbGl0X3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChyYXdfc2l6ZSwKJiM0MzsJCQkJCQkJIG1ldGFfcGxhaW5fc2l6ZSk7CiYjNDM7CWlmICghZGF0YS0mZ3Q7dXNlcl9rZXlfdmFsaWQpCiYjNDM7CQlyZXR1cm4gbWF4KHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KHJhd19zaXplKSwgc3BsaXRfc2l6ZSk7CiYjNDM7CiYjNDM7CXJldHVybiBzcGxpdF9zaXplOwomIzQzO30KJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJaW50IHJjOwomIzQzOwomIzQzOwlpZiAoZGF0YS0mZ3Q7Y3J5cHRfb2Zmc2V0ICE9IDApIHsKJiM0MzsJCXJjID0gc25hcHNob3RfZGVjcnlwdF9kcmFpbihkYXRhKTsKJiM0MzsJCWlmIChyYykKJiM0MzsJCQlyZXR1cm4gcmM7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBkOTMzYjViMmMwNWQ0Li4wMjQwMGFjMTI1YzU4IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMjE3Nyw2ICYjNDM7MjE3NywxMSBAQCB1bnNpZ25lZCBsb25nIHNuYXBzaG90X2dldF9pbWFnZV9zaXplKHZvaWQpCiAJcmV0dXJuIG5yX2NvcHlfcGFnZXMgJiM0MzsgbnJfbWV0YV9wYWdlcyAmIzQzOyAxOwogfQogCiYjNDM7dW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbnJfbWV0YV9wYWdlcyAmIzQzOyAxOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgaW5pdF9oZWFkZXIoc3RydWN0IHN3c3VzcF9pbmZvICppbmZvKQogewogCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHN3c3VzcF9pbmZvKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dhcC5jIGIva2VybmVsL3Bvd2VyL3N3YXAuYwppbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3dhcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci9zd2FwLmMKQEAgLTE2Niw2ICYjNDM7MTY2LDEwNCBAQCBzdGF0aWMgaW50IHN3c3VzcF9leHRlbnRzX2luc2VydCh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0KQogCXJldHVybiAwOwogfQogCiYjNDM7c3RhdGljIGJvb2wgc3dzdXNwX2V4dGVudHNfY29udGFpbl9yYW5nZSh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0LAomIzQzOwkJCQkJIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHN3c3VzcF9leHRlbnRzLnJiX25vZGU7CiYjNDM7CXN0cnVjdCBzd3N1c3BfZXh0ZW50ICpleHQ7CiYjNDM7CXVuc2lnbmVkIGxvbmcgZW5kOwomIzQzOwomIzQzOwlpZiAoIW5yX3BhZ2VzKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwllbmQgPSBzd2FwX29mZnNldCAmIzQzOyBucl9wYWdlcyAtIDE7CiYjNDM7CWlmIChlbmQgJmx0OyBzd2FwX29mZnNldCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJd2hpbGUgKG5vZGUpIHsKJiM0MzsJCWV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTsKJiM0MzsJCWlmIChzd2FwX29mZnNldCAmbHQ7IGV4dC0mZ3Q7c3RhcnQpCiYjNDM7CQkJbm9kZSA9IG5vZGUtJmd0O3JiX2xlZnQ7CiYjNDM7CQllbHNlIGlmIChzd2FwX29mZnNldCAmZ3Q7IGV4dC0mZ3Q7ZW5kKQomIzQzOwkJCW5vZGUgPSBub2RlLSZndDtyYl9yaWdodDsKJiM0MzsJCWVsc2UKJiM0MzsJCQlnb3RvIGZvdW5kOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0MzsKJiM0Mztmb3VuZDoKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHN3YXBfb2Zmc2V0ICZsdDsgZXh0LSZndDtzdGFydCkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoZW5kICZsdDs9IGV4dC0mZ3Q7ZW5kKQomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJaWYgKGV4dC0mZ3Q7ZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJCXN3YXBfb2Zmc2V0ID0gZXh0LSZndDtlbmQgJiM0MzsgMTsKJiM0MzsJCW5vZGUgPSByYl9uZXh0KCZhbXA7ZXh0LSZndDtub2RlKTsKJiM0MzsJCWlmICghbm9kZSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CQlleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7Ym9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CXU2NCBibG9jazsKJiM0MzsJdTY0IGVuZDsKJiM0MzsJdTY0IGVuZF9ibG9jazsKJiM0MzsKJiM0MzsJaWYgKHN3YXAgJmx0OyAwIHx8IHBvcyAmbHQ7IDAgfHwgIWNvdW50KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwllbmQgPSAodTY0KXBvcyAmIzQzOyBjb3VudCAtIDE7CiYjNDM7CWlmIChlbmQgJmx0OyAodTY0KXBvcykKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJYmxvY2sgPSAodTY0KXBvcyAmZ3Q7Jmd0OyBQQUdFX1NISUZUOwomIzQzOwllbmRfYmxvY2sgPSBlbmQgJmd0OyZndDsgUEFHRV9TSElGVDsKJiM0MzsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJdTY0IHJlbWFpbmluZ19wYWdlcyA9IGVuZF9ibG9jayAtIGJsb2NrICYjNDM7IDE7CiYjNDM7CQlwZ29mZl90IHN3YXBfb2Zmc2V0OwomIzQzOwkJcGdvZmZfdCBtYXBwZWRfcGFnZXM7CiYjNDM7CQlzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7CiYjNDM7CQl1NjQgcGFnZXM7CiYjNDM7CiYjNDM7CQlpZiAoIXJlbWFpbmluZ19wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJCWlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCAmYW1wO3N3YXBfb2Zmc2V0LAomIzQzOwkJCQkJICAgICZhbXA7bWFwcGVkX3BhZ2VzKSkKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlpZiAoIW1hcHBlZF9wYWdlcykKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQlwYWdlcyA9IG1pbl90KHU2NCwgbWFwcGVkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpOwomIzQzOwkJaWYgKCh1NjQpKHVuc2lnbmVkIGxvbmcpcGFnZXMgIT0gcGFnZXMpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJaWYgKCFzd3N1c3BfZXh0ZW50c19jb250YWluX3JhbmdlKHN3YXBfb2Zmc2V0LCBwYWdlcykpCiYjNDM7CQkJcmV0dXJuIGZhbHNlOwomIzQzOwkJaWYgKHBhZ2VzID09IHJlbWFpbmluZ19wYWdlcykKJiM0MzsJCQlyZXR1cm4gdHJ1ZTsKJiM0MzsJCWJsb2NrICYjNDM7PSBwYWdlczsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0Mzt1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcykKJiM0Mzt7CiYjNDM7CXU2NCBpbWFnZV9wYWdlcyA9IERJVl9ST1VORF9VUF9VTEwoaW1hZ2VfYnl0ZXMsIFBBR0VfU0laRSk7CiYjNDM7CXU2NCBtYXBfcGFnZXMgPSBpbWFnZV9wYWdlcyAvIE1BUF9QQUdFX0VOVFJJRVMgJiM0MzsgMTsKJiM0MzsKJiM0MzsJaWYgKG1hcF9wYWdlcyAmZ3Q7IFU2NF9NQVggJmd0OyZndDsgUEFHRV9TSElGVCkKJiM0MzsJCXJldHVybiBVNjRfTUFYOwomIzQzOwomIzQzOwlyZXR1cm4gbWFwX3BhZ2VzICZsdDsmbHQ7IFBBR0VfU0hJRlQ7CiYjNDM7fQomIzQzOwogc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCkKIHsKIAl1bnNpZ25lZCBsb25nIG9mZnNldDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmMgYi9rZXJuZWwvcG93ZXIvdXNlci5jCmluZGV4IGQwZmNmYmE3YWMyMzUuLjU3YjhjZTgzYTYyNmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3Bvd2VyL3VzZXIuYwpAQCAtMjEsNTQgJiM0MzsyMSwxODUgQEAKICNpbmNsdWRlICZsdDtsaW51eC9jb25zb2xlLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvY3B1LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvZnJlZXplci5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9waWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2NoZWQvc2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NlY3VyaXR5LmgmZ3Q7CiAKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7cG93ZXIuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDt1c2VyLmgmIzM0OwogCiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25hcHNob3RfZGF0YSB7Ci0Jc3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7Ci0JaW50IHN3YXA7Ci0JaW50IG1vZGU7Ci0JYm9vbCBmcm96ZW47Ci0JYm9vbCByZWFkeTsKLQlib29sIHBsYXRmb3JtX3N1cHBvcnQ7Ci0JYm9vbCBmcmVlX2JpdG1hcHM7Ci0JZGV2X3QgZGV2OwotfSBzbmFwc2hvdF9zdGF0ZTsKJiM0MztzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTsKIAogaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldikKIHsKIAlyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgJmFtcDsmYW1wOyBzbmFwc2hvdF9zdGF0ZS5kZXYgPT0gZGV2OwogfQogCiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MztzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwgZGV2X3QgZGV2KQomIzQzO3sKJiM0MzsJcmV0dXJuIGRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgJmFtcDsmYW1wOyBkYXRhLSZndDttb2RlID09IE9fUkRPTkxZICZhbXA7JmFtcDsKJiM0MzsJCWRhdGEtJmd0O3JlYWR5ICZhbXA7JmFtcDsgZGF0YS0mZ3Q7ZGV2ID09IGRldiAmYW1wOyZhbXA7CiYjNDM7CQlkYXRhLSZndDtvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSAmYW1wOyZhbXA7CiYjNDM7CQlzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCWxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCkKJiM0Mzt7CiYjNDM7CWxvZmZfdCBoZWFkZXJfb2Zmc2V0ID0gZGF0YS0mZ3Q7c3dhcF9oZWFkZXJfb2Zmc2V0OwomIzQzOwlsb2ZmX3Qgb2Zmc2V0OwomIzQzOwomIzQzOwlpZiAocG9zICZsdDsgaGVhZGVyX29mZnNldCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJb2Zmc2V0ID0gcG9zIC0gaGVhZGVyX29mZnNldDsKJiM0MzsJcmV0dXJuIG9mZnNldCAmbHQ7IFBBR0VfU0laRSAmYW1wOyZhbXA7IGNvdW50ICZsdDs9IFBBR0VfU0laRSAtIG9mZnNldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHU2NCBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXU2NCBpbWFnZV9ieXRlcyA9IHJvdW5kX3VwKGRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQsIFBBR0VfU0laRSk7CiYjNDM7CXU2NCBtYXBfYnl0ZXMgPSBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXMoZGF0YS0mZ3Q7Y3J5cHRfYnl0ZXNfcmVhZCk7CiYjNDM7CXU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyAmIzQzOyBtYXBfYnl0ZXM7CiYjNDM7CiYjNDM7CWlmIChpbWFnZV9ieXRlcyAmbHQ7IGRhdGEtJmd0O2NyeXB0X2J5dGVzX3JlYWQgfHwgYnVkZ2V0ICZsdDsgaW1hZ2VfYnl0ZXMpCiYjNDM7CQlyZXR1cm4gVTY0X01BWDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJ1ZGdldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2RhdGEtJmd0O2NyeXB0X2xvY2spOwomIzQzOwlkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0Mzt9CiYjNDM7I2VuZGlmCiYjNDM7CiYjNDM7ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUKJiM0MztoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpCiYjNDM7ewomIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pCiYjNDM7CXN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gJmFtcDtzbmFwc2hvdF9zdGF0ZTsKJiM0MzsJZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOwlib29sIGltYWdlX3JhbmdlX2FsbG9jYXRlZDsKJiM0MzsJdTY0IHN3YXBfYnVkZ2V0OwomIzQzOwomIzQzOwlpZiAoIWNvdW50IHx8ICFzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShkYXRhLCBkZXYpKQomIzQzOwkJcmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOwomIzQzOwltdXRleF9sb2NrKCZhbXA7c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpOwomIzQzOwomIzQzOwlpZiAoIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpCiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsKJiM0MzsJaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkID0gc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGRhdGEtJmd0O3N3YXAsIHBvcywgY291bnQpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJc3dhcF9idWRnZXQgPSBzbmFwc2hvdF9zd2FwX3dyaXRlX2J1ZGdldChkYXRhKTsKJiM0MzsJaWYgKHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShkYXRhLCBwb3MsIGNvdW50KSAmYW1wOyZhbXA7CiYjNDM7CSAgICBkYXRhLSZndDtjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgJmx0Oz0gUEFHRV9TSVpFICZhbXA7JmFtcDsKJiM0MzsJICAgIFBBR0VfU0laRSAtIGRhdGEtJmd0O2NyeXB0X2hlYWRlcl9yZXNlcnZlZCAmZ3Q7PSBjb3VudCkgewomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfaGVhZGVyX3Jlc2VydmVkICYjNDM7PSBjb3VudDsKJiM0MzsJCXR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSOwomIzQzOwl9IGVsc2UgaWYgKGltYWdlX3JhbmdlX2FsbG9jYXRlZCAmYW1wOyZhbXA7CiYjNDM7CQkgICBzd2FwX2J1ZGdldCAmZ3Q7PSBkYXRhLSZndDtjcnlwdF9zd2FwX3Jlc2VydmVkICZhbXA7JmFtcDsKJiM0MzsJCSAgIHN3YXBfYnVkZ2V0IC0gZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZCAmZ3Q7PSBjb3VudCkgewomIzQzOwkJZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZCAmIzQzOz0gY291bnQ7CiYjNDM7CQl0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFOwomIzQzOwl9CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CiYjNDM7CWlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FKQomIzQzOwkJZ290byB1bmxvY2s7CiYjNDM7CiYjNDM7CXJldHVybiB0eXBlOwomIzQzOwomIzQzO3VubG9jazoKJiM0MzsJbXV0ZXhfdW5sb2NrKCZhbXA7c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpOwomIzQzOwlyZXR1cm4gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7CiYjNDM7I2Vsc2UKJiM0MzsJcmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FOwomIzQzOyNlbmRpZgomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSwKJiM0MzsJCQkJICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbikKJiM0Mzt7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSAmYW1wO3NuYXBzaG90X3N0YXRlOwomIzQzOwl1NjQgKnJlc2VydmVkX3RvdGFsOwomIzQzOwlzaXplX3QgdW51c2VkOwomIzQzOwomIzQzOwlpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaWYgKCFyZXNlcnZlZCkKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwomIzQzOwlpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSKQomIzQzOwkJdW51c2VkID0gcmVzZXJ2ZWQ7CiYjNDM7CWVsc2UgaWYgKHdyaXR0ZW4gJmx0Oz0gMCkKJiM0MzsJCXVudXNlZCA9IHJlc2VydmVkOwomIzQzOwllbHNlIGlmICh3cml0dGVuICZsdDsgcmVzZXJ2ZWQpCiYjNDM7CQl1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47CiYjNDM7CWVsc2UKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwomIzQzOwlyZXNlcnZlZF90b3RhbCA9IHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUiA/CiYjNDM7CQkmYW1wO2RhdGEtJmd0O2NyeXB0X2hlYWRlcl9yZXNlcnZlZCA6ICZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfc3dhcF9yZXNlcnZlZDsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7ZGF0YS0mZ3Q7Y3J5cHRfbG9jayk7CiYjNDM7CSpyZXNlcnZlZF90b3RhbCAtPSBtaW5fdCh1NjQsICpyZXNlcnZlZF90b3RhbCwgdW51c2VkKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsKJiM0Mzt1bmxvY2s6CiYjNDM7CW11dGV4X3VubG9jaygmYW1wO3N5c3RlbV90cmFuc2l0aW9uX211dGV4KTsKJiM0MzsjZW5kaWYKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CWRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgPSBzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTik7CiYjNDM7CXJldHVybiBkYXRhLSZndDtlbmNyeXB0aW9uX3JlcXVpcmVkOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTsKIAl1bnNpZ25lZCBpbnQgc2xlZXBfZmxhZ3M7CiAJaW50IGVycm9yOwogCi0JaWYgKCFoaWJlcm5hdGlvbl9hdmFpbGFibGUoKSkKJiM0MzsJaWYgKCFoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKCkpCiAJCXJldHVybiAtRVBFUk07CiAKIAlzbGVlcF9mbGFncyA9IGxvY2tfc3lzdGVtX3NsZWVwKCk7CiAKIAlpZiAoIWhpYmVybmF0ZV9hY3F1aXJlKCkpIHsKIAkJZXJyb3IgPSAtRUJVU1k7Ci0JCWdvdG8gVW5sb2NrOwomIzQzOwkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKChmaWxwLSZndDtmX2ZsYWdzICZhbXA7IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CiAJCWhpYmVybmF0ZV9yZWxlYXNlKCk7CiAJCWVycm9yID0gLUVOT1NZUzsKLQkJZ290byBVbmxvY2s7CiYjNDM7CQlnb3RvIHVubG9jazsKIAl9CiAJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CiAJZGF0YSA9ICZhbXA7c25hcHNob3Rfc3RhdGU7CiAJZmlscC0mZ3Q7cHJpdmF0ZV9kYXRhID0gZGF0YTsKIAltZW1zZXQoJmFtcDtkYXRhLSZndDtoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3Bpbl9sb2NrX2luaXQoJmFtcDtkYXRhLSZndDtjcnlwdF9sb2NrKTsKJiM0MzsJZGF0YS0mZ3Q7Y3J5cHRfYnl0ZXNfcmVhZCA9IDA7CiYjNDM7CWRhdGEtJmd0O2NyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwOwomIzQzOwlkYXRhLSZndDtjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwOwomIzQzOwlkYXRhLSZndDtzd2FwX2hlYWRlcl9vZmZzZXQgPSAwOwomIzQzOwlkYXRhLSZndDtvd25lcl90Z2lkID0gTlVMTDsKJiM0MzsjZW5kaWYKIAlpZiAoKGZpbHAtJmd0O2ZfZmxhZ3MgJmFtcDsgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkgewogCQkvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovCiAJCWRhdGEtJmd0O3N3YXAgPSBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKHN3c3VzcF9yZXN1bWVfZGV2aWNlLCAwKTsKQEAgLTk5LDggJiM0MzsyMzAsMTMgQEAgc3RhdGljIGludCBzbmFwc2hvdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogCWRhdGEtJmd0O3JlYWR5ID0gZmFsc2U7CiAJZGF0YS0mZ3Q7cGxhdGZvcm1fc3VwcG9ydCA9IGZhbHNlOwogCWRhdGEtJmd0O2RldiA9IDA7CiYjNDM7CWRhdGEtJmd0O2VuY3J5cHRpb25fcmVxdWlyZWQgPSBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpOwomIzQzOyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pCiYjNDM7CWlmICghZXJyb3IpCiYjNDM7CQlkYXRhLSZndDtvd25lcl90Z2lkID0gZ2V0X3Rhc2tfcGlkKGN1cnJlbnQsIFBJRFRZUEVfVEdJRCk7CiYjNDM7I2VuZGlmCiAKLSBVbmxvY2s6CiYjNDM7IHVubG9jazoKIAl1bmxvY2tfc3lzdGVtX3NsZWVwKHNsZWVwX2ZsYWdzKTsKIAogCXJldHVybiBlcnJvcjsKQEAgLTExNiw2ICYjNDM7MjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIAlzd3N1c3BfZnJlZSgpOwogCWRhdGEgPSBmaWxwLSZndDtwcml2YXRlX2RhdGE7CiAJZGF0YS0mZ3Q7ZGV2ID0gMDsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKQomIzQzOwlwdXRfcGlkKGRhdGEtJmd0O293bmVyX3RnaWQpOwomIzQzOwlkYXRhLSZndDtvd25lcl90Z2lkID0gTlVMTDsKJiM0MzsjZW5kaWYKIAlmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtJmd0O3N3YXApOwogCXVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkYXRhLSZndDtzd2FwKTsKIAlpZiAoZGF0YS0mZ3Q7ZnJvemVuKSB7CkBAIC0xMjUsNiAmIzQzOzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIAl9IGVsc2UgaWYgKGRhdGEtJmd0O2ZyZWVfYml0bWFwcykgewogCQlmcmVlX2Jhc2ljX21lbW9yeV9iaXRtYXBzKCk7CiAJfQomIzQzOwlzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKGRhdGEpOwogCXBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSA/CiAJCQlQTV9QT1NUX0hJQkVSTkFUSU9OIDogUE1fUE9TVF9SRVNUT1JFKTsKIAloaWJlcm5hdGVfcmVsZWFzZSgpOwpAQCAtMTQ3LDEyICYjNDM7Mjg4LDIzIEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCiAJZGF0YSA9IGZpbHAtJmd0O3ByaXZhdGVfZGF0YTsKIAlpZiAoIWRhdGEtJmd0O3JlYWR5KSB7CiAJCXJlcyA9IC1FTk9EQVRBOwotCQlnb3RvIFVubG9jazsKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwl9CiYjNDM7CWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCXJlcyA9IC1FUEVSTTsKJiM0MzsJCWdvdG8gdW5sb2NrOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCXJlcyA9IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKGRhdGEsIGJ1ZiwgY291bnQsIG9mZnApOwomIzQzOwkJZ290byB1bmxvY2s7CiAJfQomIzQzOwogCWlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqLwogCQlyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoJmFtcDtkYXRhLSZndDtoYW5kbGUpOwogCQlpZiAocmVzICZsdDs9IDApCi0JCQlnb3RvIFVubG9jazsKJiM0MzsJCQlnb3RvIHVubG9jazsKIAl9IGVsc2UgewogCQlyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwOwogCX0KQEAgLTE2Miw3ICYjNDM7MzE0LDcgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKIAlpZiAocmVzICZndDsgMCkKIAkJKm9mZnAgJiM0Mzs9IHJlczsKIAotIFVubG9jazoKJiM0MzsgdW5sb2NrOgogCXVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpOwogCiAJcmV0dXJuIHJlczsKQEAgLTE4NSw2ICYjNDM7MzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCiAJZGF0YSA9IGZpbHAtJmd0O3ByaXZhdGVfZGF0YTsKIAomIzQzOwlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQlyZXMgPSAtRVBFUk07CiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQlyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7CiYjNDM7CQlnb3RvIHVubG9jazsKJiM0MzsJfQomIzQzOwogCWlmICghcGdfb2ZmcCkgewogCQlyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlKTsKIAkJaWYgKHJlcyAmbHQ7PSAwKQpAQCAtMjUyLDYgJiM0Mzs0MTUsOSBAQCBzdGF0aWMgaW50IHNuYXBzaG90X3NldF9zd2FwX2FyZWEoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiAJaWYgKGRhdGEtJmd0O3N3YXAgJmx0OyAwKQogCQlyZXR1cm4gc3dkZXYgPyAtRU5PREVWIDogLUVJTlZBTDsKIAlkYXRhLSZndDtkZXYgPSBzd2RldjsKJiM0MzsjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKQomIzQzOwlkYXRhLSZndDtzd2FwX2hlYWRlcl9vZmZzZXQgPSAobG9mZl90KW9mZnNldCAmbHQ7Jmx0OyBQQUdFX1NISUZUOwomIzQzOyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0zMTgsNiAmIzQzOzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCWVycm9yID0gLUVQRVJNOwogCQkJYnJlYWs7CiAJCX0KJiM0MzsJCWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSAtRVBFUk07CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiAJCXBtX3Jlc3RvcmVfZ2ZwX21hc2soKTsKIAkJZXJyb3IgPSBoaWJlcm5hdGlvbl9zbmFwc2hvdChkYXRhLSZndDtwbGF0Zm9ybV9zdXBwb3J0KTsKIAkJaWYgKCFlcnJvcikgewpAQCAtMzI4LDYgJiM0Mzs0OTksMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9BVE9NSUNfUkVTVE9SRToKJiM0MzsJCWlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSAtRVBFUk07CiYjNDM7CQkJYnJlYWs7CiYjNDM7CQl9CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7CiYjNDM7CQkJZXJyb3IgPSBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2UoZGF0YSk7CiYjNDM7CQkJaWYgKGVycm9yKQomIzQzOwkJCQlicmVhazsKJiM0MzsJCX0KJiM0MzsKIAkJZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZSgmYW1wO2RhdGEtJmd0O2hhbmRsZSk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwpAQCAtMzQ2LDYgJiM0Mzs1MjgsNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJc3dzdXNwX2ZyZWUoKTsKIAkJbWVtc2V0KCZhbXA7ZGF0YS0mZ3Q7aGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IHNuYXBzaG90X2hhbmRsZSkpOwogCQlkYXRhLSZndDtyZWFkeSA9IGZhbHNlOwomIzQzOwkJc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTsKIAkJLyoKIAkJICogSXQgaXMgbmVjZXNzYXJ5IHRvIHRoYXcga2VybmVsIHRocmVhZHMgaGVyZSwgYmVjYXVzZQogCQkgKiBTTkFQU0hPVF9DUkVBVEVfSU1BR0UgbWF5IGJlIGludm9rZWQgZGlyZWN0bHkgYWZ0ZXIKQEAgLTM2OCw2ICYjNDM7NTUxLDggQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCX0KIAkJc2l6ZSA9IHNuYXBzaG90X2dldF9pbWFnZV9zaXplKCk7CiAJCXNpemUgJmx0OyZsdDs9IFBBR0VfU0hJRlQ7CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKQomIzQzOwkJCXNpemUgPSBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoZGF0YSwgc2l6ZSk7CiAJCWVycm9yID0gcHV0X3VzZXIoc2l6ZSwgKGxvZmZfdCBfX3VzZXIgKilhcmcpOwogCQlicmVhazsKIApAQCAtMzk3LDYgJiM0Mzs1ODIsOSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJCWJyZWFrOwogCQl9CiAJCWZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS0mZ3Q7c3dhcCk7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJCXNuYXBzaG90X3Jlc2V0X3N3YXBfd3JpdGVfcmVzZXJ2YXRpb24oZGF0YSk7CiYjNDM7I2VuZGlmCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9TMlJBTToKQEAgLTQwNCw2ICYjNDM7NTkyLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJZXJyb3IgPSAtRVBFUk07CiAJCQlicmVhazsKIAkJfQomIzQzOwkJaWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgJmFtcDsmYW1wOwomIzQzOwkJICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHsKJiM0MzsJCQllcnJvciA9IC1FUEVSTTsKJiM0MzsJCQlicmVhazsKJiM0MzsJCX0KIAkJLyoKIAkJICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGgKIAkJICogUE1fSElCRVJOQVRJT05fUFJFUEFSRQpAQCAtNDE3LDYgJiM0Mzs2MTAsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCiAJCWJyZWFrOwogCiAJY2FzZSBTTkFQU0hPVF9QT1dFUl9PRkY6CiYjNDM7CQlpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkgewomIzQzOwkJCWVycm9yID0gLUVQRVJNOwomIzQzOwkJCWJyZWFrOwomIzQzOwkJfQogCQlpZiAoZGF0YS0mZ3Q7cGxhdGZvcm1fc3VwcG9ydCkKIAkJCWVycm9yID0gaGliZXJuYXRpb25fcGxhdGZvcm1fZW50ZXIoKTsKIAkJYnJlYWs7CkBAIC00MjUsNiAmIzQzOzYyMywxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKIAkJZXJyb3IgPSBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7CiAJCWJyZWFrOwogCiYjNDM7CWNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046CiYjNDM7CQlpZiAoZGF0YS0mZ3Q7bW9kZSA9PSBPX1JET05MWSkKJiM0MzsJCQllcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpOwomIzQzOwkJZWxzZQomIzQzOwkJCWVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7CiYjNDM7CQlicmVhazsKJiM0MzsKJiM0MzsJY2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6CiYjNDM7CQllcnJvciA9IHNuYXBzaG90X3NldF91c2VyX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpOwomIzQzOwkJYnJlYWs7CiYjNDM7CiAJZGVmYXVsdDoKIAkJZXJyb3IgPSAtRU5PVFRZOwogCkBAIC00NDgsNiAmIzQzOzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAJY2FzZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0U6CiAJY2FzZSBTTkFQU0hPVF9DUkVBVEVfSU1BR0U6CiAJY2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOgomIzQzOwljYXNlIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OOgomIzQzOwljYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWToKIAkJcmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCwKIAkJCQkgICAgICAodW5zaWduZWQgbG9uZykgY29tcGF0X3B0cihhcmcpKTsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuaCBiL2tlcm5lbC9wb3dlci91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNGRmMmY5YWU5YWRhNAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9wb3dlci91c2VyLmgKQEAgLTAsMCAmIzQzOzEsMTUxIEBACiYjNDM7LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3J5cHRvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NjYXR0ZXJsaXN0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NwaW5sb2NrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N1c3BlbmRfaW9jdGxzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2NyeXB0by9hZWFkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2NyeXB0by9hZXMuaCZndDsKJiM0MzsKJiM0MztzdHJ1Y3QgcGlkOwomIzQzOwomIzQzOyNkZWZpbmUgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBBRVNfS0VZU0laRV8xMjgKJiM0MzsjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTYKJiM0MzsKJiM0MzsvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBwYWdlcyBpbiBhIHNpbmdsZSBBRUFEIGVuY3J5cHRpb24gY2h1bmsuICovCiYjNDM7I2RlZmluZSBDSFVOS19TSVpFIDE2CiYjNDM7CiYjNDM7c3RydWN0IHNuYXBzaG90X2RhdGEgewomIzQzOwlzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlIGhhbmRsZTsKJiM0MzsJaW50IHN3YXA7CiYjNDM7CWludCBtb2RlOwomIzQzOwlib29sIGZyb3plbjsKJiM0MzsJYm9vbCByZWFkeTsKJiM0MzsJYm9vbCBwbGF0Zm9ybV9zdXBwb3J0OwomIzQzOwlib29sIGZyZWVfYml0bWFwczsKJiM0MzsJYm9vbCBlbmNyeXB0aW9uX3JlcXVpcmVkOwomIzQzOwlkZXZfdCBkZXY7CiYjNDM7CiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsJc3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTsKJiM0MzsJc3RydWN0IGFlYWRfcmVxdWVzdCAqYWVhZF9yZXE7CiYjNDM7CXZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdOwomIzQzOwl1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTsKJiM0MzsJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW0NIVU5LX1NJWkUgJiM0MzsgMl07IC8qIEFkZCByb29tIGZvciBBRCBhbmQgYXV0aCB0YWcuICovCiYjNDM7CXNpemVfdCBjcnlwdF9vZmZzZXQ7CiYjNDM7CXNpemVfdCBjcnlwdF9zaXplOwomIzQzOwl1NjQgY3J5cHRfdG90YWw7CiYjNDM7CXU2NCBjcnlwdF9zdHJlYW1fdG90YWw7CiYjNDM7CXU2NCBub25jZV9sb3c7CiYjNDM7CXU2NCBub25jZV9oaWdoOwomIzQzOwl1OCBlbmNyeXB0aW9uX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJdTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZzsKJiM0MzsJYm9vbCB1c2VyX2tleV92YWxpZDsKJiM0MzsJdTY0IG1ldGFfc2l6ZTsKJiM0MzsJdTY0IGNyeXB0X21ldGFfc2l6ZTsKJiM0MzsJLyoKJiM0MzsJICogUHJvdGVjdHMgY3J5cHRfYnl0ZXNfcmVhZCBhbmQgdGhlIHJlc2VydmF0aW9uIGNvdW50ZXJzIGJlbG93LgomIzQzOwkgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZQomIzQzOwkgKiBnZW5lcmF0ZWQgc3dhcC1tYXAgcGFnZXMuCiYjNDM7CSAqLwomIzQzOwlzcGlubG9ja190IGNyeXB0X2xvY2s7CiYjNDM7CXU2NCBjcnlwdF9ieXRlc19yZWFkOwomIzQzOwl1NjQgY3J5cHRfc3dhcF9yZXNlcnZlZDsKJiM0MzsJdTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDsKJiM0MzsJbG9mZl90IHN3YXBfaGVhZGVyX29mZnNldDsKJiM0MzsJc3RydWN0IHBpZCAqb3duZXJfdGdpZDsKJiM0MzsjZW5kaWYKJiM0MzsKJiM0Mzt9OwomIzQzOwomIzQzO2V4dGVybiBzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTsKJiM0MzsKJiM0MzsvKiBrZXJuZWwvcG93ZXIvc25hcGVuYy5jIHJvdXRpbmVzICovCiYjNDM7I2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikKJiM0MzsKJiM0Mztzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQljaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7CiYjNDM7CiYjNDM7c3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiYjNDM7CQkJCSBsb2ZmX3QgKm9mZnApOwomIzQzOwomIzQzO3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSk7CiYjNDM7aW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpOwomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCXN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KTsKJiM0MzsKJiM0MztpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCSAgc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpOwomIzQzOwomIzQzO2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwomIzQzOwomIzQzO2xvZmZfdCBzbmFwc2hvdF9nZXRfZW5jcnlwdGVkX2ltYWdlX3NpemUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsCiYjNDM7CQkJCQkgbG9mZl90IHJhd19zaXplKTsKJiM0MzsKJiM0MztpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTsKJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKQomIzQzO3sKJiM0MzsJcmV0dXJuIGRhdGEtJmd0O2FlYWRfdGZtOwomIzQzO30KJiM0MzsKJiM0MzsjZWxzZQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCSAgICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKJiM0MzsJCQkJCSAgICAgIGxvZmZfdCAqb2ZmcCkKJiM0Mzt7CiYjNDM7CXJldHVybiAtRU5PVFRZOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHNzaXplX3Qgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiYjNDM7CQkJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpIHt9CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLAomIzQzOwkJCQkJc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQomIzQzO3sKJiM0MzsJcmV0dXJuIC1FTk9UVFk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSwKJiM0MzsJCQkJCQkgICAgICAgbG9mZl90IHJhd19zaXplKQomIzQzO3sKJiM0MzsJcmV0dXJuIHJhd19zaXplOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpCiYjNDM7ewomIzQzOwlyZXR1cm4gLUVOT1RUWTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSkKJiM0Mzt7CiYjNDM7CXJldHVybiBmYWxzZTsKJiM0Mzt9CiYjNDM7CiYjNDM7I2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA3OGI0OWIwNjU4YWRkLi4xMWRmMGM1NTZmNGU5IDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL3N3YXBmaWxlLmMKQEAgLTIzNjYsNiAmIzQzOzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpCiAJcmV0dXJuIHNlLSZndDtzdGFydF9ibG9jayAmIzQzOyAob2Zmc2V0IC0gc2UtJmd0O3N0YXJ0X3BhZ2UpOwogfQogCiYjNDM7aW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LAomIzQzOwkJCSAgICBwZ29mZl90ICpucl9wYWdlcykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSA9IHN3YXBfdHlwZV90b19pbmZvKHR5cGUpOwomIzQzOwlzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlOwomIzQzOwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CiYjNDM7CiYjNDM7CWlmICghc2kgfHwgIShzaS0mZ3Q7ZmxhZ3MgJmFtcDsgU1dQX1dSSVRFT0spKQomIzQzOwkJcmV0dXJuIC1FTk9ERVY7CiYjNDM7CiYjNDM7CWZvciAocmIgPSByYl9maXJzdCgmYW1wO3NpLSZndDtzd2FwX2V4dGVudF9yb290KTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHsKJiM0MzsJCXNlID0gcmJfZW50cnkocmIsIHN0cnVjdCBzd2FwX2V4dGVudCwgcmJfbm9kZSk7CiYjNDM7CQlpZiAoYmxvY2sgJmd0Oz0gc2UtJmd0O3N0YXJ0X2Jsb2NrICZhbXA7JmFtcDsKJiM0MzsJCSAgICBibG9jayAtIHNlLSZndDtzdGFydF9ibG9jayAmbHQ7IHNlLSZndDtucl9wYWdlcykgewomIzQzOwkJCXBnb2ZmX3QgcGFnZSA9IGJsb2NrIC0gc2UtJmd0O3N0YXJ0X2Jsb2NrOwomIzQzOwomIzQzOwkJCSpvZmZzZXQgPSBzZS0mZ3Q7c3RhcnRfcGFnZSAmIzQzOyBwYWdlOwomIzQzOwkJCSpucl9wYWdlcyA9IHNlLSZndDtucl9wYWdlcyAtIHBhZ2U7CiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIC1FTk9FTlQ7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCkKJiM0Mzt7CiYjNDM7CXBnb2ZmX3QgbnJfcGFnZXM7CiYjNDM7CiYjNDM7CXJldHVybiBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudCh0eXBlLCBibG9jaywgb2Zmc2V0LCAmYW1wO25yX3BhZ2VzKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogUmV0dXJuIGVpdGhlciB0aGUgdG90YWwgbnVtYmVyIG9mIHN3YXAgcGFnZXMgb2YgZ2l2ZW4gdHlwZSwgb3IgdGhlIG51bWJlcgogICogb2YgZnJlZSBwYWdlcyBvZiB0aGF0IHR5cGUgKGRlcGVuZGluZyBvbiBAZnJlZSkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDQgMTI6MTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQ4MTEKCQkJCQkJCW91dHB1dDogMjYzCgkJCQkJCQl0aG91Z2h0czogMTUxNgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipFbmNyeXB0aW9uIGZvciBVc2Vyc3BhY2UgSGliZXJuYXRpb24gU25hcHNob3RzIC0gS2V5IEFyZWFzIGZvciBJbnZlc3RpZ2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O3ZlIGdvdCB0aGlzIHBhdGNoIHNlcmllcyB0aGF0IGludHJvZHVjZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCBpdCYjMzk7cyBhIHByZXR0eSBzdWJzdGFudGlhbCBjaGFuZ2UgYW5kIGRlZmluaXRlbHkgd2FycmFudHMgYSBnb29kIGZ1enppbmcgY2FtcGFpZ24uIEl0IHRvdWNoZXMgcXVpdGUgYSBmZXcga2V5IGFyZWFzIG9mIHRoZSBrZXJuZWwuCgpGaXJzdCwgdGhlIGNvcmUgb2YgaXQgaXMgdGhlIGVuY3J5cHRpb24gaXRzZWxmLiBJJiMzOTttIHNlZWluZyBjaGFuZ2VzIGluIHNldmVyYWwgZmlsZXM6IGBibG9jay9mb3BzLmNgLCB2YXJpb3VzIGhlYWRlciBmaWxlcyAoYHN1c3BlbmQuaGAsIGBzd2FwLmhgLCBgc3VzcGVuZF9pb2N0bHMuaGApLCB0aGUga2VybmVsIHBvd2VyIGNvbmZpZyBmaWxlcyAoYEtjb25maWdgLCBgTWFrZWZpbGVgLCBgcG93ZXIuaGApLCBhbmQgY3J1Y2lhbGx5LCBmaWxlcyBsaWtlIGBoaWJlcm5hdGUuY2AsIGBzbmFwZW5jLmNgLCBgc25hcHNob3QuY2AsIGBzd2FwLmNgLCBhbmQgYHVzZXIuY2Agd2l0aGluIHRoZSBga2VybmVsL3Bvd2VyYCBkaXJlY3RvcnksIGFsb25nIHdpdGggYG1tL3N3YXBmaWxlLmNgLgoKVGhlIGdpc3Qgb2YgaXQgaXMgZW5hYmxpbmcga2VybmVsLWJhc2VkIGVuY3J5cHRpb24uIFRoZXkmIzM5O3ZlIGFkZGVkIHNvbWUgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGA6IGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAgYW5kIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgLiBUaGVyZSYjMzk7cyBhbHNvIGEgbmV3IHN5c2ZzIGZpbGUsIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLgoKTGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgdGhlIG5ldyBgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTmAgb3B0aW9uIGlzIHRoZSBrZXkgb25lLiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgY29uZmlnIGZvciBgL2Rldi9zbmFwc2hvdGAuIE9mIGNvdXJzZSwgd2UmIzM5O2xsIG5lZWQgYEhJQkVSTkFUSU9OYCBhcyB3ZWxsLgoKTm93LCBsZXQmIzM5O3MgemVybyBpbiBvbiB0aGUgaW50ZXJlc3RpbmcgZnVuY3Rpb25zLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBzbmFwc2hvdF9pb2N0bGAgaXMgZ29pbmcgdG8gaGFuZGxlIHRob3NlIG5ldyBpb2N0bHMuIGBrZXJuZWwvcG93ZXIvc25hcGVuYy5jYCBpcyBnb2luZyB0byBiZSB0aGUgaGVhcnQgb2YgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJJiMzOTtsbCBiZSBsb29raW5nIGF0OiBgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5YCwgYHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleWAsIGBzbmFwc2hvdF9zZXRfdXNlcl9rZXlgLCBgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWRgLCBgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkYCwgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGAsIGFuZCBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYC4gSW4gYGtlcm5lbC9wb3dlci91c2VyLmNgLCBgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luYCBhbmQgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRgIGFyZSBpbXBvcnRhbnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIHNuYXBzaG90IHdyaXRlIHByb2Nlc3MuIFRoZW4sIG92ZXIgaW4gYG1tL3N3YXBmaWxlLmNgLCB0aGUgYHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50YCBhbmQgYHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0YCBmdW5jdGlvbnMgaGF2ZSBiZWNvbWUgcmVsZXZhbnQgYmVjYXVzZSBvZiB0aGUgc3dhcCBhbGxvY2F0aW9uIHRyYWNraW5nLiBBbmQsIGBrZXJuZWwvcG93ZXIvc3dhcC5jYCBoYXMgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGAgYW5kIGBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXNgLgoKU28sIGZyb20gYSBmdXp6aW5nIHBlcnNwZWN0aXZlLCB0aGUgcGxhbiBpcyB0byBmb2N1cyBvbiB0aGVzZSBmdW5jdGlvbnM6CgoqICAgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGAKKiAgIGBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlgCiogICBgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5YAoqICAgYHNuYXBzaG90X3NldF91c2VyX2tleWAKKiAgIGBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZGAKKiAgIGBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRgCiogICBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYAoqICAgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbmAKKiAgIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kYAoqICAgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGAKKiAgIGBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudGAKCkFuZCB0aGUga2V5IGNvbmZpZ3MgdG8gZW5hYmxlIGFyZToKCiogICBgRU5DUllQVEVEX0hJQkVSTkFUSU9OYAoqICAgYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAKKiAgIGBISUJFUk5BVElPTmAKClRoaXMgbG9va3MgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgdGhvcm91Z2ggZnV6emluZyBjYW1wYWlnbi4gV2UgYXJlIGFpbWluZyB0byB1bmNvdmVyIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIHJlYWQvd3JpdGUgcGF0aHMsIGtleSBtYW5hZ2VtZW50LCBhbmQgc3dhcCBhbGxvY2F0aW9uIGR1cmluZyB0aGUgaGliZXJuYXRpb24gcHJvY2Vzcy4gR2l2ZW4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIGFuZCB0aGUgY29yZSBzeXN0ZW0gZnVuY3Rpb25hbGl0eSBpbnZvbHZlZCwgSSYjMzk7bSBleHBlY3Rpbmcgc29tZSBpbnRlcmVzdGluZyBmaW5kaW5ncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNCAxMjoxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RU5DUllQVEVEX0hJQkVSTkFUSU9OJiMzNDssCiAgICAmIzM0O0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFViYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF91c2VyX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZCYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlJiMzNDssCiAgICAmIzM0O2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbiYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kJiMzNDssCiAgICAmIzM0O3N3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZCYjMzQ7LAogICAgJiMzNDtzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uIGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBJdCBhZGRzIG5ldyBpb2N0bHMgdG8gYC9kZXYvc25hcHNob3RgIChgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05gLCBgU05BUFNIT1RfU0VUX1VTRVJfS0VZYCksIGEgc3lzZnMgaW50ZXJmYWNlIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLCBhbmQgbW9kaWZpZXMgdGhlIHJlYWQvd3JpdGUgcGF0aHMgZm9yIHRoZSBzbmFwc2hvdCBkZXZpY2UgdG8gc3VwcG9ydCBlbmNyeXB0aW9uL2RlY3J5cHRpb24uIEl0IGFsc28gaG9va3MgaW50byBibG9jayBkZXZpY2Ugd3JpdGVzIHRvIHRyYWNrIHN3YXAgYWxsb2NhdGlvbnMuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VOQ1JZUFRFRF9ISUJFUk5BVElPTiYjMzQ7LAogICAgJiMzNDtISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYmIzM0OywKICAgICYjMzQ7SElCRVJOQVRJT04mIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5JiMzNDssCiAgICAmIzM0O3NuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleSYjMzQ7LAogICAgJiMzNDtzbmFwc2hvdF9zZXRfdXNlcl9rZXkmIzM0OywKICAgICYjMzQ7c25hcHNob3RfcmVhZF9lbmNyeXB0ZWQmIzM0OywKICAgICYjMzQ7c25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkJiMzNDssCiAgICAmIzM0O3NuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZSYjMzQ7LAogICAgJiMzNDtoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4mIzM0OywKICAgICYjMzQ7aGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZCYjMzQ7LAogICAgJiMzNDtzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQmIzM0OywKICAgICYjMzQ7c3dhcGRldl9ibG9ja190b19leHRlbnQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTYuNzc1MzMzODgyWiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk3NzEzMjA5ODYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRU5DUllQVEVEX0hJQkVSTkFUSU9OXCIsXG4gICAgXCJISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcIixcbiAgICBcIkhJQkVSTkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkXCIsXG4gICAgXCJzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X3VzZXJfa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VcIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpblwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZFwiLFxuICAgIFwic3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkXCIsXG4gICAgXCJzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTYuNzc1MzQxOTkyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDI2MjM2NzAwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYTAzYzAyMGU3YTJjMmZmZjJlYTJiNGQzODA4N2MwODRkNjY0NTdhYVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyA0IDEyOjEyOjU0IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXFxuaW5kZXggZDM4ZGEwNzc5MDVhOS4uNTdmNjA2M2VmODhjOSAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXFxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxcbkBAIC00NzAsMyArNDcwLDE3IEBAIERlc2NyaXB0aW9uOlxcbiBcXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcXG4gICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IDNcXG4rXFxuK1doYXQ6XFx0XFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkXFxuK0RhdGU6XFx0XFx0SnVseSAyMDI2XFxuK0NvbnRhY3Q6XFx0bGludXgtcG1Admdlci5rZXJuZWwub3JnXFxuK0Rlc2NyaXB0aW9uOlxcbitcXHRcXHRXcml0ZS1vbmx5IGZpbGUgcHJlc2VudCB3aGVuIENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT049eS5cXG4rXFxuK1xcdFxcdFRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIHdyaXRlcyBhIDMyLWJ5dGUgc2VlZCwgZW5jb2RlZCBhc1xcbitcXHRcXHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXFxuK1xcdFxcdGVuYWJsaW5nIGVuY3J5cHRlZCB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLlxcbitcXG4rXFx0XFx0VGhlIGZpcnN0IHN1Y2Nlc3NmdWwgd3JpdGUgbG9ja3MgdGhlIHNlZWQgdW50aWwgdGhlIG5leHQgYm9vdC5cXG4rXFx0XFx0V3JpdGluZyB0aGUgc2FtZSBzZWVkIGFnYWluIHN1Y2NlZWRzLiBXcml0aW5nIGEgZGlmZmVyZW50IHNlZWRcXG4rXFx0XFx0ZmFpbHMgd2l0aCBFUEVSTS5cXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XFxuaW5kZXggMWNmNjJkODBhOWNhMS4uZGY4ZWNhOWU2ZTM2MyAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3VzZXJsYW5kLXN3c3VzcC5yc3RcXG5AQCAtMTE1LDYgKzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxcbiBcXHR0byByZXN1bWUgdGhlIHN5c3RlbSBmcm9tIFJBTSBpZiB0aGVyZSdzIGVub3VnaCBiYXR0ZXJ5IHBvd2VyIG9yIHJlc3RvcmVcXG4gXFx0aXRzIHN0YXRlIG9uIHRoZSBiYXNpcyBvZiB0aGUgc2F2ZWQgc3VzcGVuZCBpbWFnZSBvdGhlcndpc2UpXFxuIFxcbitTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTlxcbitcXHRFbmFibGVzIGVuY3J5cHRpb24gb2YgdGhlIGhpYmVybmF0ZSBpbWFnZSB3aXRoaW4gdGhlIGtlcm5lbC4gVHJ1c3RlZFxcbitcXHRlYXJseSB1c2Vyc3BhY2UgbXVzdCB3cml0ZSB0aGUgMzItYnl0ZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgdG9cXG4rXFx0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgaW9jdGwuIFVwb24gc3VzcGVuZFxcbitcXHQoaWUgd2hlbiB0aGUgc25hcHNob3QgZGV2aWNlIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcpLCB0aGlzIGlvY3RsIHJldHVybnNcXG4rXFx0YW4gb3BhcXVlIHdyYXBwZWQga2V5IGJsb2IgYW5kIHRoZSBzdGFydGluZyBub25jZS4gVXBvbiByZXN1bWUgKGllIHdoZW5cXG4rXFx0dGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciB3cml0aW5nKSwgdGhpcyBpb2N0bCByZWNlaXZlcyB0aGVcXG4rXFx0c2FtZSBibG9iIGFuZCBub25jZSBmcm9tIHVzZXJtb2RlIGFmdGVyIHRoZSBzYW1lIHNlZWQgaGFzIGJlZW4gd3JpdHRlblxcbitcXHR0byAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWQuIFRoZSBwbGFpbnRleHQgaW1hZ2Uga2V5IGlzIGdlbmVyYXRlZCBhbmRcXG4rXFx0dW53cmFwcGVkIGluc2lkZSB0aGUga2VybmVsLlxcbitcXG4rU05BUFNIT1RfU0VUX1VTRVJfS0VZXFxuK1xcdE1peGVzIGFkZGl0aW9uYWwgdXNlciBrZXkgbWF0ZXJpYWwgaW50byB0aGUgZGF0YSBwb3J0aW9uIG9mIGFuIGVuY3J5cHRlZFxcbitcXHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXFxuK1xcdGtleV9sZW4gbXVzdCBiZSBiZXR3ZWVuIDggYW5kIFVTV1NVU1BfVVNFUl9LRVlfU0laRSBieXRlcywgYW5kIHJlc2VydmVkXFxuK1xcdG11c3QgYmUgemVyby4gRHVyaW5nIGhpYmVybmF0aW9uIHRoZSBrZXJuZWwgd3JpdGVzIG1ldGFfc2l6ZSB3aXRoIHRoZVxcbitcXHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcXG4rXFx0bWV0YV9zaXplIGJhY2sgc28gdGhlIGtlcm5lbCBjYW4gc3dpdGNoIGtleXMgYXQgdGhlIG1ldGFkYXRhIGJvdW5kYXJ5XFxuK1xcdGJlZm9yZSB0aGUgc25hcHNob3QgaGVhZGVyIGhhcyBiZWVuIGRlY3J5cHRlZC5cXG4rXFxuIFRoZSBkZXZpY2UncyByZWFkKCkgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBzbmFwc2hvdCBpbWFnZSBmcm9tXFxuIHRoZSBrZXJuZWwuICBJdCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczpcXG4gXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2ZvcHMuYyBiL2Jsb2NrL2ZvcHMuY1xcbmluZGV4IDE1NzgzYTYxODBkZWMuLmVmZWI0ODVlOTFlNmMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svZm9wcy5jXFxuKysrIGIvYmxvY2svZm9wcy5jXFxuQEAgLTcyMyw0MyArNzIzLDY1IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbiBcXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItXFx1MDAzZWtpX2ZpbHA7XFxuIFxcdHN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBiZGV2X2ZpbGVfaW5vZGUoZmlsZSk7XFxuIFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpO1xcbitcXHRkZXZfdCBkZXYgPSBiZF9pbm9kZS1cXHUwMDNlaV9yZGV2O1xcbiBcXHRib29sIGF0b21pYyA9IGlvY2ItXFx1MDAzZWtpX2ZsYWdzIFxcdTAwMjYgSU9DQl9BVE9NSUM7XFxuIFxcdGxvZmZfdCBzaXplID0gYmRldl9ucl9ieXRlcyhiZGV2KTtcXG4rXFx0ZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgaGliZXJuYXRlX3dyaXRlO1xcbitcXHRzaXplX3QgaGliZXJuYXRlX2xlbiA9IDA7XFxuIFxcdHNpemVfdCBzaG9ydGVkID0gMDtcXG4rXFx0c3NpemVfdCBoaWJlcm5hdGVfd3JpdHRlbiA9IDA7XFxuIFxcdHNzaXplX3QgcmV0O1xcbiBcXG4gXFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxcbiBcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbiBcXG4tXFx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcXHUwMDI2XFx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoYmRfaW5vZGUtXFx1MDAzZWlfcmRldikpXFxuLVxcdFxcdHJldHVybiAtRVRYVEJTWTtcXG4rXFx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcXHUwMDI2XFx1MDAyNiAhaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2KSkge1xcbitcXHRcXHRpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikgfHwgIWlvY2JfaXNfZHN5bmMoaW9jYikgfHxcXG4rXFx0XFx0ICAgIChpb2NiLVxcdTAwM2VraV9mbGFncyBcXHUwMDI2IElPQ0JfRElSRUNUKSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FVFhUQlNZO1xcbiBcXG4tXFx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSlcXG4tXFx0XFx0cmV0dXJuIDA7XFxuK1xcdFxcdGhpYmVybmF0ZV9sZW4gPSBpb3ZfaXRlcl9jb3VudChmcm9tKTtcXG4rXFx0XFx0aGliZXJuYXRlX3dyaXRlID0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldiwgaW9jYi1cXHUwMDNla2lfcG9zLCBoaWJlcm5hdGVfbGVuKTtcXG4rXFx0XFx0aWYgKGhpYmVybmF0ZV93cml0ZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0XFx0cmV0dXJuIC1FVFhUQlNZO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRoaWJlcm5hdGVfd3JpdGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFx0fVxcbiBcXG4tXFx0aWYgKGlvY2ItXFx1MDAzZWtpX3BvcyBcXHUwMDNlPSBzaXplKVxcbi1cXHRcXHRyZXR1cm4gLUVOT1NQQztcXG4rXFx0aWYgKCFpb3ZfaXRlcl9jb3VudChmcm9tKSkge1xcbitcXHRcXHRyZXQgPSAwO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4gXFxuLVxcdGlmICgoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxcbi1cXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuK1xcdGlmIChpb2NiLVxcdTAwM2VraV9wb3MgXFx1MDAzZT0gc2l6ZSkge1xcbitcXHRcXHRyZXQgPSAtRU5PU1BDO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICgoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKSB7XFxuK1xcdFxcdHJldCA9IC1FT1BOT1RTVVBQO1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuK1xcdH1cXG4gXFxuIFxcdGlmIChhdG9taWMpIHtcXG4gXFx0XFx0cmV0ID0gZ2VuZXJpY19hdG9taWNfd3JpdGVfdmFsaWQoaW9jYiwgZnJvbSk7XFxuIFxcdFxcdGlmIChyZXQpXFxuLVxcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdFxcdGdvdG8gb3V0X2hpYmVybmF0ZTtcXG4gXFx0fVxcbiBcXG4gXFx0c2l6ZSAtPSBpb2NiLVxcdTAwM2VraV9wb3M7XFxuIFxcdGlmIChpb3ZfaXRlcl9jb3VudChmcm9tKSBcXHUwMDNlIHNpemUpIHtcXG4tXFx0XFx0aWYgKGF0b21pYylcXG4tXFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcdFxcdGlmIChhdG9taWMpIHtcXG4rXFx0XFx0XFx0cmV0ID0gLUVJTlZBTDtcXG4rXFx0XFx0XFx0Z290byBvdXRfaGliZXJuYXRlO1xcbitcXHRcXHR9XFxuIFxcdFxcdHNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7XFxuIFxcdFxcdGlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXQgPSBmaWxlX3VwZGF0ZV90aW1lKGZpbGUpO1xcbiBcXHRpZiAocmV0KVxcbi1cXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRnb3RvIG91dF9oaWJlcm5hdGU7XFxuIFxcbiBcXHRpZiAoaW9jYi1cXHUwMDNla2lfZmxhZ3MgXFx1MDAyNiBJT0NCX0RJUkVDVCkge1xcbiBcXHRcXHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xcbkBAIC03NzcsOSArNzk5LDE2IEBAIHN0YXRpYyBzc2l6ZV90IGJsa2Rldl93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKVxcbiBcXHRcXHRpbm9kZV91bmxvY2tfc2hhcmVkKGJkX2lub2RlKTtcXG4gXFx0fVxcbiBcXG4tXFx0aWYgKHJldCBcXHUwMDNlIDApXFxuK1xcdGlmIChyZXQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGhpYmVybmF0ZV93cml0dGVuID0gcmV0O1xcbiBcXHRcXHRyZXQgPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmV0KTtcXG4rXFx0fVxcbiBcXHRpb3ZfaXRlcl9yZWV4cGFuZChmcm9tLCBpb3ZfaXRlcl9jb3VudChmcm9tKSArIHNob3J0ZWQpO1xcbitcXG4rb3V0X2hpYmVybmF0ZTpcXG4rXFx0aWYgKGhpYmVybmF0ZV9sZW4pXFxuK1xcdFxcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgIGhpYmVybmF0ZV93cml0dGVuKTtcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxcbmluZGV4IGIwMjg3NmYxYWUzOGEuLjgzMDhhNjU4Mzc1NmMgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxcbkBAIC00MjYsMTAgKzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9XFxuIFxcbiBpbnQgYXJjaF9yZXN1bWVfbm9zbXQodm9pZCk7XFxuIFxcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB7XFxuK1xcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FLFxcbitcXHRISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0UsXFxuK1xcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIsXFxuK307XFxuK1xcbiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlxcbiBpbnQgaXNfaGliZXJuYXRlX3Jlc3VtZV9kZXYoZGV2X3QgZGV2KTtcXG4rZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcXG4rdm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pO1xcbiAjZWxzZVxcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cXG4rXFxuK3N0YXRpYyBpbmxpbmUgZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxcbit7XFxuK1xcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0c2l6ZV90IHJlc2VydmVkLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRzc2l6ZV90IHdyaXR0ZW4pXFxuK3tcXG4rfVxcbiAjZW5kaWZcXG4gXFxuIC8qIEhpYmVybmF0aW9uIGFuZCBzdXNwZW5kIGV2ZW50cyAqL1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oXFxuQEAgLTQzOSw2ICs0MzksOSBAQCBleHRlcm4gaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KTtcXG4gaW50IGZpbmRfZmlyc3Rfc3dhcChkZXZfdCAqZGV2aWNlKTtcXG4gZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zd2FwX3BhZ2VzKGludCwgaW50KTtcXG4gZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTtcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KTtcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0LFxcbitcXHRcXHRcXHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpO1xcbiBleHRlcm4gaW50IF9fc3dhcF9jb3VudChzd3BfZW50cnlfdCBlbnRyeSk7XFxuIGV4dGVybiBib29sIHN3YXBfZW50cnlfc3dhcHBlZChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2ksIHN3cF9lbnRyeV90IGVudHJ5KTtcXG4gZXh0ZXJuIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcXG5AQCAtNTM1LDYgKzUzOCwxOSBAQCBzdGF0aWMgaW5saW5lIGludCBhZGRfc3dhcF9leHRlbnQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyxcXG4ge1xcbiBcXHRyZXR1cm4gLUVJTlZBTDtcXG4gfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHQgIHBnb2ZmX3QgKm9mZnNldClcXG4re1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLFxcbitcXHRcXHRcXHRcXHRcXHQgIHBnb2ZmX3QgKm9mZnNldCxcXG4rXFx0XFx0XFx0XFx0XFx0ICBwZ29mZl90ICpucl9wYWdlcylcXG4re1xcbitcXHRyZXR1cm4gLUVJTlZBTDtcXG4rfVxcbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cXG4gI2lmZGVmIENPTkZJR19NRU1DR1xcbiBzdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3N3YXBwaW5lc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXFxuaW5kZXggYmNjZTA0ZTIxYzBkYy4uNWUyM2JmOTM2Mjc3ZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXFxuQEAgLTEzLDYgKzEzLDMxIEBAIHN0cnVjdCByZXN1bWVfc3dhcF9hcmVhIHtcXG4gXFx0X191MzIgZGV2O1xcbiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xcbiBcXG4rI2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2XFxuKyNkZWZpbmUgVVNXU1VTUF9VU0VSX0tFWV9TSVpFIDMyXFxuK1xcbisvKlxcbisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgdGhlIG9wYXF1ZSB3cmFwcGVkIGhpYmVybmF0ZSBpbWFnZVxcbisgKiBlbmNyeXB0aW9uIGtleSBhbmQgc3RhcnRpbmcgbm9uY2UgaW4gZWl0aGVyIGRpcmVjdGlvbi5cXG4rICovXFxuK3N0cnVjdCB1c3dzdXNwX2tleV9ibG9iIHtcXG4rXFx0X191MzIgYmxvYl9sZW47XFxuK1xcdF9fdTggYmxvYls1MTJdO1xcbitcXHRfX3U4IG5vbmNlW1VTV1NVU1BfS0VZX05PTkNFX1NJWkVdIF9fa2VybmVsX25vbnN0cmluZztcXG4rfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTtcXG4rXFxuKy8qXFxuKyAqIEFsbG93IHVzZXIgbW9kZSB0byBmb2xkIGluIGtleSBtYXRlcmlhbCBmb3IgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgaGliZXJuYXRlXFxuKyAqIGltYWdlLlxcbisgKi9cXG4rc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkge1xcbitcXHQvKiBLZXJuZWwgcmV0dXJucyB0aGUgbWV0YWRhdGEgc2l6ZTsgcmVzdW1lIHBhc3NlcyB0aGUgc2F2ZWQgdmFsdWUgaW4uICovXFxuK1xcdF9fdTY0IG1ldGFfc2l6ZTtcXG4rXFx0X191MzIga2V5X2xlbjtcXG4rXFx0X191MzIgcmVzZXJ2ZWQ7XFxuK1xcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xcbit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpO1xcbitcXG4gI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUNcXHQnMydcXG4gI2RlZmluZSBTTkFQU0hPVF9GUkVFWkVcXHRcXHRcXHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxKVxcbiAjZGVmaW5lIFNOQVBTSE9UX1VORlJFRVpFXFx0XFx0X0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMilcXG5AQCAtMjksNiArNTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xcbiAjZGVmaW5lIFNOQVBTSE9UX1BSRUZfSU1BR0VfU0laRVxcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDE4KVxcbiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRVxcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAxOSwgX19rZXJuZWxfbG9mZl90KVxcbiAjZGVmaW5lIFNOQVBTSE9UX0FMTE9DX1NXQVBfUEFHRVxcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KVxcbi0jZGVmaW5lIFNOQVBTSE9UX0lPQ19NQVhOUlxcdDIwXFxuKyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cXHRfSU9XUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIxLCBcXFxcXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iKVxcbisjZGVmaW5lIFNOQVBTSE9UX1NFVF9VU0VSX0tFWVxcdFxcdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjIsIFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXFxuKyNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXFx0MjJcXG4gXFxuICNlbmRpZiAvKiBfTElOVVhfU1VTUEVORF9JT0NUTFNfSCAqL1xcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnXFxuaW5kZXggNTMwYzg5NzMxMWQ0NC4uYTliZWU3MTU3MWNmYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xcbisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnXFxuQEAgLTExNSw2ICsxMTUsMjEgQEAgY29uZmlnIEhJQkVSTkFUSU9OX0RFRl9DT01QXFxuIFxcdGhlbHBcXG4gXFx0ICBEZWZhdWx0IGNvbXByZXNzb3IgdG8gYmUgdXNlZCBmb3IgaGliZXJuYXRpb24uXFxuIFxcbitjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXFxuK1xcdGJvb2wgXFxcIkVuY3J5cHRpb24gc3VwcG9ydCBmb3IgdXNlcnNwYWNlIHNuYXBzaG90c1xcXCJcXG4rXFx0ZGVwZW5kcyBvbiBISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcXG4rXFx0c2VsZWN0IENSWVBUT19BRVNcXG4rXFx0c2VsZWN0IENSWVBUT19HQ01cXG4rXFx0c2VsZWN0IENSWVBUT19MSUJfU0hBMjU2XFxuK1xcdGhlbHBcXG4rXFx0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXFxuK1xcdCAgY3JlYXRlZCBieSB1c3dzdXNwIHRvb2xzLiBBIHRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIGNvbXBvbmVudCBtdXN0XFxuK1xcdCAgcHJvdmlkZSB0aGUgc25hcHNob3QgZW5jcnlwdGlvbiBzZWVkIGJlZm9yZSBlbmFibGluZyBlbmNyeXB0aW9uLlxcbitcXG4rXFx0ICBTYXkgTiBpZiB1c2Vyc3BhY2UgaGFuZGxlcyB0aGUgaW1hZ2UgZW5jcnlwdGlvbi5cXG4rXFxuK1xcdCAgSWYgaW4gZG91YnQsIHNheSBOLlxcbitcXG4gY29uZmlnIFBNX1NURF9QQVJUSVRJT05cXG4gXFx0c3RyaW5nIFxcXCJEZWZhdWx0IHJlc3VtZSBwYXJ0aXRpb25cXFwiXFxuIFxcdGRlcGVuZHMgb24gSElCRVJOQVRJT05cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXFxuaW5kZXggNzczZTI3ODk0MTJiOS4uMmZkMzFiMmEyNTBmNSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcXG4rKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcXG5AQCAtMTYsNiArMTYsNyBAQCBvYmotJChDT05GSUdfU1VTUEVORClcXHRcXHQrPSBzdXNwZW5kLm9cXG4gb2JqLSQoQ09ORklHX1BNX1RFU1RfU1VTUEVORClcXHQrPSBzdXNwZW5kX3Rlc3Qub1xcbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXFx0Kz0gaGliZXJuYXRlLm8gc25hcHNob3QubyBzd2FwLm9cXG4gb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVikgKz0gdXNlci5vXFxuK29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICs9IHNuYXBlbmMub1xcbiBvYmotJChDT05GSUdfUE1fQVVUT1NMRUVQKVxcdCs9IGF1dG9zbGVlcC5vXFxuIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpXFx0Kz0gd2FrZWxvY2sub1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXFxuaW5kZXggZDI0NzljNjlkNzFhNC4uMGI4NjI2YmRmODFhOCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcXG5AQCAtMzYsNiArMzYsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjdHJhY2UvZXZlbnRzL3Bvd2VyLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwicG93ZXIuaFxcXCJcXG4rI2luY2x1ZGUgXFxcInVzZXIuaFxcXCJcXG4gXFxuIFxcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XFxuQEAgLTExMyw2ICsxMTQsMTQgQEAgYm9vbCBoaWJlcm5hdGlvbl9hdmFpbGFibGUodm9pZClcXG4gXFx0XFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcXHUwMDI2XFx1MDAyNiAhY3hsX21lbV9hY3RpdmUoKTtcXG4gfVxcbiBcXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIG5vaGliZXJuYXRlID09IDAgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0KCFzZWN1cml0eV9sb2NrZWRfZG93bihMT0NLRE9XTl9ISUJFUk5BVElPTikgfHxcXG4rXFx0XFx0IElTX0VOQUJMRUQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTikpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCFzZWNyZXRtZW1fYWN0aXZlKCkgXFx1MDAyNlxcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiBoaWJlcm5hdGlvbl9zZXRfb3BzIC0gU2V0IHRoZSBnbG9iYWwgaGliZXJuYXRlIG9wZXJhdGlvbnMuXFxuICAqIEBvcHM6IEhpYmVybmF0aW9uIG9wZXJhdGlvbnMgdG8gdXNlIGluIHN1YnNlcXVlbnQgaGliZXJuYXRpb24gdHJhbnNpdGlvbnMuXFxuQEAgLTEzNzYsMTIgKzEzODUsMzUgQEAgc3RhdGljIHNzaXplX3QgcmVzZXJ2ZWRfc2l6ZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcXG4gXFxuIHBvd2VyX2F0dHIocmVzZXJ2ZWRfc2l6ZSk7XFxuIFxcbisjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTlxcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9zZWVkX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsXFxuK1xcdFxcdFxcdFxcdCAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xcbitcXHRyZXR1cm4gcmV0ID8gcmV0IDogbjtcXG4rfVxcbitcXG4rc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzbmFwc2hvdF9zZWVkX2F0dHIgPSB7XFxuK1xcdC5hdHRyXFx0PSB7XFxuK1xcdFxcdC5uYW1lID0gXFxcInNuYXBzaG90X3NlZWRcXFwiLFxcbitcXHRcXHQubW9kZSA9IDAyMDAsXFxuK1xcdH0sXFxuK1xcdC5zdG9yZVxcdD0gc25hcHNob3Rfc2VlZF9zdG9yZSxcXG4rfTtcXG4rI2VuZGlmXFxuK1xcbiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ1tdID0ge1xcbiBcXHRcXHUwMDI2ZGlza19hdHRyLmF0dHIsXFxuIFxcdFxcdTAwMjZyZXN1bWVfb2Zmc2V0X2F0dHIuYXR0cixcXG4gXFx0XFx1MDAyNnJlc3VtZV9hdHRyLmF0dHIsXFxuIFxcdFxcdTAwMjZpbWFnZV9zaXplX2F0dHIuYXR0cixcXG4gXFx0XFx1MDAyNnJlc2VydmVkX3NpemVfYXR0ci5hdHRyLFxcbisjaWZkZWYgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTlxcbitcXHRcXHUwMDI2c25hcHNob3Rfc2VlZF9hdHRyLmF0dHIsXFxuKyNlbmRpZlxcbiBcXHROVUxMLFxcbiB9O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaFxcbmluZGV4IDc1YjYzODQzODg2ZWUuLjM5ZWYwNGJlMjgzZGQgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmhcXG4rKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaFxcbkBAIC0xNjAsNiArMTYwLDcgQEAgc3RydWN0IHNuYXBzaG90X2hhbmRsZSB7XFxuIFxcbiBleHRlcm4gdW5zaWduZWQgaW50IHNuYXBzaG90X2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IHpvbmUgKnpvbmUpO1xcbiBleHRlcm4gdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKTtcXG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpO1xcbiBleHRlcm4gaW50IHNuYXBzaG90X3JlYWRfbmV4dChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xcbiBleHRlcm4gaW50IHNuYXBzaG90X3dyaXRlX25leHQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTtcXG4gaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XFxuQEAgLTE2Nyw4ICsxNjgsMTEgQEAgZXh0ZXJuIGludCBzbmFwc2hvdF9pbWFnZV9sb2FkZWQoc3RydWN0IHNuYXBzaG90X2hhbmRsZSAqaGFuZGxlKTtcXG4gXFxuIGV4dGVybiBib29sIGhpYmVybmF0ZV9hY3F1aXJlKHZvaWQpO1xcbiBleHRlcm4gdm9pZCBoaWJlcm5hdGVfcmVsZWFzZSh2b2lkKTtcXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpO1xcbiBcXG4gZXh0ZXJuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApO1xcbitib29sIHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChpbnQgc3dhcCwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KTtcXG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpO1xcbiBleHRlcm4gdm9pZCBmcmVlX2FsbF9zd2FwX3BhZ2VzKGludCBzd2FwKTtcXG4gZXh0ZXJuIGludCBzd3N1c3Bfc3dhcF9pbl91c2Uodm9pZCk7XFxuIFxcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcGVuYy5jIGIva2VybmVsL3Bvd2VyL3NuYXBlbmMuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uY2QyOTgwM2VjNmM1YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXFxuQEAgLTAsMCArMSw5NDAgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgZW5jcnlwdGlvbiBzdXBwb3J0IGZvciBzeXN0ZW0gc25hcHNob3RzLiAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyeXB0by5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3J5cHRvL2FlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9nY20uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9zaGEyLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NjcnlwdG8vdXRpbHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2hleC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbXV0ZXguaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JhbmRvbS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW0uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3N0cmluZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbitcXG4rI2luY2x1ZGUgXFxcInBvd2VyLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ1c2VyLmhcXFwiXFxuK1xcbisjZGVmaW5lIFNOQVBTSE9UX1NFRURfU0laRSBTSEEyNTZfRElHRVNUX1NJWkVcXG4rI2RlZmluZSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OIDFcXG4rXFxuK3N0YXRpYyBjb25zdCB1OCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpY1s4XSA9IHtcXG4rXFx0J1MnLCAnVycsICdTJywgJ1UnLCAnUycsICdQJywgJ0snLCAnMScsXFxuK307XFxuK1xcbitzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkge1xcbitcXHR1OCBtYWdpY1tzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpXTtcXG4rXFx0X19sZTMyIHZlcnNpb247XFxuK1xcdHU4IHdyYXBfbm9uY2VbR0NNX0FFU19JVl9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0dTggZW5jcnlwdGVkX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0dTggdGFnW1NOQVBTSE9UX0FVVEhfVEFHX1NJWkVdIF9fbm9uc3RyaW5nO1xcbit9IF9fcGFja2VkO1xcbitcXG4rc3RhdGljIERFRklORV9NVVRFWChzbmFwc2hvdF9zZWVkX211dGV4KTtcXG4rc3RhdGljIHU4IHNuYXBzaG90X3NlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcXG4rc3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcXG4rXFxuK2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0dTggc2VlZFtTTkFQU0hPVF9TRUVEX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHRzaXplX3QgbGVuID0gY291bnQ7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRpZiAobGVuIFxcdTAwMjZcXHUwMDI2IGJ1ZltsZW4gLSAxXSA9PSAnXFxcXG4nKVxcbitcXHRcXHRsZW4tLTtcXG4rXFx0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XFxuK1xcdGlmIChzbmFwc2hvdF9zZWVkX3ZhbGlkKSB7XFxuK1xcdFxcdHJldCA9IGNyeXB0b19tZW1uZXEoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKSA/IC1FUEVSTSA6IDA7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRtZW1jcHkoc25hcHNob3Rfc2VlZCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTtcXG4rXFx0c25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7XFxuK1xcdHByX2luZm8oXFxcIlBNOiBoaWJlcm5hdGU6IHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCBsb2NrZWRcXFxcblxcXCIpO1xcbitcXG4rb3V0OlxcbitcXHRtdXRleF91bmxvY2soXFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSlcXG4re1xcbitcXHRib29sIHZhbGlkO1xcbitcXG4rXFx0bXV0ZXhfbG9jayhcXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XFxuK1xcdHZhbGlkID0gc25hcHNob3Rfc2VlZF92YWxpZDtcXG4rXFx0aWYgKHZhbGlkKVxcbitcXHRcXHRtZW1jcHkoc2VlZCwgc25hcHNob3Rfc2VlZCwgU05BUFNIT1RfU0VFRF9TSVpFKTtcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzbmFwc2hvdF9zZWVkX211dGV4KTtcXG4rXFxuK1xcdHJldHVybiB2YWxpZDtcXG4rfVxcbitcXG4rc3RhdGljIGludCBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciBsYWJlbFtdID0gXFxcIkxpbnV4IGhpYmVybmF0ZSBzbmFwc2hvdCBrZXkgd3JhcCB2MVxcXCI7XFxuK1xcdHU4IGRpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdO1xcbitcXHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7XFxuK1xcbitcXHRpZiAoIXNuYXBzaG90X2NvcHlfZW5jcnlwdGlvbl9zZWVkKHNlZWQpKVxcbitcXHRcXHRyZXR1cm4gLUVOT0tFWTtcXG4rXFxuK1xcdHNoYTI1Nl9pbml0KFxcdTAwMjZzaGEyNTZfY3R4KTtcXG4rXFx0c2hhMjU2X3VwZGF0ZShcXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xcbitcXHRzaGEyNTZfdXBkYXRlKFxcdTAwMjZzaGEyNTZfY3R4LCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xcbitcXHRzaGEyNTZfZmluYWwoXFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XFxuK1xcbitcXHRtZW1jcHkoa2V5LCBkaWdlc3QsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoZGlnZXN0LCBzaXplb2YoZGlnZXN0KSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X2NyeXB0X3dyYXBwZWRfa2V5KHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcXG4rXFx0XFx0XFx0XFx0ICAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdLFxcbitcXHRcXHRcXHRcXHQgICAgICBib29sIGVuY3J5cHQpXFxuK3tcXG4rXFx0dTggd3JhcF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XFxuK1xcdHN0cnVjdCBjcnlwdG9fYWVhZCAqdGZtO1xcbitcXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXE7XFxuK1xcdHN0cnVjdCBzY2F0dGVybGlzdCBzZztcXG4rXFx0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0cmMgPSBzbmFwc2hvdF9kZXJpdmVfd3JhcHBpbmdfa2V5KHdyYXBfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRyZXR1cm4gcmM7XFxuK1xcbitcXHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcXFwiZ2NtKGFlcylcXFwiLCAwLCAwKTtcXG4rXFx0aWYgKElTX0VSUih0Zm0pKSB7XFxuK1xcdFxcdHJjID0gUFRSX0VSUih0Zm0pO1xcbitcXHRcXHRnb3RvIG91dF9rZXk7XFxuK1xcdH1cXG4rXFxuK1xcdHJjID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwgd3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X3RmbTtcXG4rXFxuK1xcdHJjID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIG91dF90Zm07XFxuK1xcbitcXHRyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFyZXEpIHtcXG4rXFx0XFx0cmMgPSAtRU5PTUVNO1xcbitcXHRcXHRnb3RvIG91dF90Zm07XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChlbmNyeXB0KSB7XFxuK1xcdFxcdGdldF9yYW5kb21fYnl0ZXMod3JhcHBlZC1cXHUwMDNld3JhcF9ub25jZSwgc2l6ZW9mKHdyYXBwZWQtXFx1MDAzZXdyYXBfbm9uY2UpKTtcXG4rXFx0XFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bWVtY3B5KGJ1Ziwgd3JhcHBlZC1cXHUwMDNlZW5jcnlwdGVkX2tleSwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XFxuK1xcdFxcdG1lbWNweShidWYgKyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLVxcdTAwM2V0YWcsXFxuK1xcdFxcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0fVxcbitcXG4rXFx0c2dfaW5pdF9vbmUoXFx1MDAyNnNnLCBidWYsIHNpemVvZihidWYpKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKHJlcSwgMCk7XFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBcXHUwMDI2c2csIFxcdTAwMjZzZyxcXG4rXFx0XFx0XFx0ICAgICAgIGVuY3J5cHQgPyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIDpcXG4rXFx0XFx0XFx0XFx0XFx0IHNpemVvZihidWYpLFxcbitcXHRcXHRcXHQgICAgICAgd3JhcHBlZC1cXHUwMDNld3JhcF9ub25jZSk7XFxuK1xcbitcXHRyYyA9IGNyeXB0b193YWl0X3JlcShlbmNyeXB0ID8gY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpIDpcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSxcXG4rXFx0XFx0XFx0ICAgICBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXRfcmVxO1xcbitcXG4rXFx0aWYgKGVuY3J5cHQpIHtcXG4rXFx0XFx0bWVtY3B5KHdyYXBwZWQtXFx1MDAzZWVuY3J5cHRlZF9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XFxuK1xcdFxcdG1lbWNweSh3cmFwcGVkLVxcdTAwM2V0YWcsIGJ1ZiArIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUsXFxuK1xcdFxcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0bWVtY3B5KGltYWdlX2tleSwgYnVmLCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0fVxcbitcXG4rb3V0X3JlcTpcXG4rXFx0YWVhZF9yZXF1ZXN0X2ZyZWUocmVxKTtcXG4rb3V0X3RmbTpcXG4rXFx0Y3J5cHRvX2ZyZWVfYWVhZCh0Zm0pO1xcbitvdXRfa2V5OlxcbitcXHRtZW16ZXJvX2V4cGxpY2l0KGJ1Ziwgc2l6ZW9mKGJ1ZikpO1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcXG4rXFx0XFx0XFx0XFx0ICAgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkKVxcbit7XFxuK1xcdHU4IGtleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0bWVtc2V0KHdyYXBwZWQsIDAsIHNpemVvZigqd3JhcHBlZCkpO1xcbitcXHRtZW1jcHkod3JhcHBlZC1cXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLCBzaXplb2Yod3JhcHBlZC1cXHUwMDNlbWFnaWMpKTtcXG4rXFx0d3JhcHBlZC1cXHUwMDNldmVyc2lvbiA9IGNwdV90b19sZTMyKFNOQVBTSE9UX0tFWV9CTE9CX1ZFUlNJT04pO1xcbitcXG4rXFx0bWVtY3B5KGtleSwgaW1hZ2Vfa2V5LCBzaXplb2Yoa2V5KSk7XFxuK1xcdHJjID0gc25hcHNob3RfY3J5cHRfd3JhcHBlZF9rZXkod3JhcHBlZCwga2V5LCB0cnVlKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3Vud3JhcF9pbWFnZV9rZXkoY29uc3Qgc3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5ICp3cmFwcGVkLFxcbitcXHRcXHRcXHRcXHQgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcXG4re1xcbitcXHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgdG1wO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHRpZiAobWVtY21wKHdyYXBwZWQtXFx1MDAzZW1hZ2ljLCBzbmFwc2hvdF9rZXlfYmxvYl9tYWdpYyxcXG4rXFx0XFx0ICAgc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cXHUwMDNldmVyc2lvbikgIT0gU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTilcXG4rXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuK1xcbitcXHR0bXAgPSAqd3JhcHBlZDtcXG4rXFx0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShcXHUwMDI2dG1wLCBpbWFnZV9rZXksIGZhbHNlKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChcXHUwMDI2dG1wLCBzaXplb2YodG1wKSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rc3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgY29uc3QgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxcbit7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdG1lbWNweShkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cXHUwMDNlYWVhZF90Zm0sIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHRcXHRcXHRzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHRcXHRcXHQgc2l6ZW9mKGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XFxuK1xcbitcXHRyZXR1cm4gcmM7XFxuK31cXG4rXFxuKy8qIERlcml2ZSBhIGtleSBmcm9tIHRoZSBrZXJuZWwgYW5kIHVzZXIga2V5cyBmb3IgZGF0YSBlbmNyeXB0aW9uLiAqL1xcbitzdGF0aWMgaW50IHNuYXBzaG90X3VzZV91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcXG4rXFx0c3RydWN0IHNoYTI1Nl9jdHggc2hhMjU2X2N0eDtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyXFxuK1xcdCAqIGtleSwgYnV0IG5vdCBpbiBhIHdheSB0aGF0IGdpdmVzIHRoZSB1c2VyIG1vZGUgcHJlZGljdGFibGUgY29udHJvbFxcbitcXHQgKiBvdmVyIHRoZSBrZXkgYml0cy5cXG4rXFx0ICovXFxuK1xcdHNoYTI1Nl9pbml0KFxcdTAwMjZzaGEyNTZfY3R4KTtcXG4rXFxuK1xcdHNoYTI1Nl91cGRhdGUoXFx1MDAyNnNoYTI1Nl9jdHgsIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LFxcbitcXHRcXHQgICAgICBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0c2hhMjU2X3VwZGF0ZShcXHUwMDI2c2hhMjU2X2N0eCwgZGF0YS1cXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpO1xcbitcXHRzaGEyNTZfZmluYWwoXFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBcXHUwMDNlIFNIQTI1Nl9ESUdFU1RfU0laRSk7XFxuK1xcbitcXHRyYyA9IGNyeXB0b19hZWFkX3NldGtleShkYXRhLVxcdTAwM2VhZWFkX3RmbSxcXG4rXFx0XFx0XFx0XFx0ZGlnZXN0LFxcbitcXHRcXHRcXHRcXHRTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcXG4rXFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdGlmIChkYXRhLVxcdTAwM2V1c2VyX2tleV92YWxpZCBcXHUwMDI2XFx1MDAyNiBkYXRhLVxcdTAwM2VtZXRhX3NpemUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsID09IGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSkge1xcbitcXHRcXHRyZXR1cm4gc25hcHNob3RfdXNlX3VzZXJfa2V5KGRhdGEpO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSk7XFxuK1xcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9zZXRfbWV0YV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCB1NjQgbWV0YV9zaXplKVxcbit7XFxuK1xcdGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSA9IG1ldGFfc2l6ZTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQobWV0YV9zaXplKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVjb3JkX2VuY3J5cHRlZF9yZWFkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCArPSBjb3VudDtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbit9XFxuK1xcbisvKiBFbmNyeXB0IG1vcmUgZGF0YSBmcm9tIHRoZSBzbmFwc2hvdCBpbnRvIHRoZSBzdGFnaW5nIGFyZWEuICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cXHUwMDNlYWVhZF9yZXE7XFxuK1xcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XFxuK1xcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XFxuK1xcdHNpemVfdCB0b3RhbCA9IDA7XFxuK1xcdGludCBwZ19pZHg7XFxuK1xcdGludCByZXM7XFxuK1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xcbitcXHRcXHRzbmFwc2hvdF9zZXRfbWV0YV9zaXplKGRhdGEsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcXG4rXFx0XFx0aWYgKHJlcylcXG4rXFx0XFx0XFx0cmV0dXJuIHJlcztcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIGZpcnN0IGJ1ZmZlciBpcyB0aGUgYXNzb2NpYXRlZCBkYXRhLCBzZXQgdG8gdGhlIG9mZnNldCB0byBwcmV2ZW50XFxuK1xcdCAqIGF0dGFja3MgdGhhdCByZWFycmFuZ2UgY2h1bmtzLlxcbitcXHQgKi9cXG4rXFx0c2dfc2V0X2J1ZihcXHUwMDI2ZGF0YS1cXHUwMDNlc2dbMF0sIFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF90b3RhbCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsKSk7XFxuK1xcbitcXHQvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi9cXG4rXFx0Zm9yIChwZ19pZHggPSAwOyBwZ19pZHggXFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgrKykge1xcbitcXHRcXHR2b2lkICpidWYgPSBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdO1xcbitcXG4rXFx0XFx0LyogU3RvcCBhdCB0aGUgbWV0YSBwYWdlIGJvdW5kYXJ5IGJlZm9yZSBzd2l0Y2hpbmcga2V5cy4gKi9cXG4rXFx0XFx0aWYgKGRhdGEtXFx1MDAzZXVzZXJfa2V5X3ZhbGlkIFxcdTAwMjZcXHUwMDI2IHRvdGFsIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAoKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsICsgdG90YWwpID09IGRhdGEtXFx1MDAzZW1ldGFfc2l6ZSkpXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXG4rXFx0XFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFxcdTAwMjZkYXRhLVxcdTAwM2VoYW5kbGUpO1xcbitcXHRcXHRpZiAocmVzIFxcdTAwM2MgMClcXG4rXFx0XFx0XFx0cmV0dXJuIHJlcztcXG4rXFx0XFx0aWYgKHJlcyA9PSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XFxuK1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBDb3B5IHRoZSBwYWdlIGludG8gdGhlIHN0YWdpbmcgYXJlYS4gQSBmdXR1cmUgb3B0aW1pemF0aW9uXFxuK1xcdFxcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRtZW1jcHkoYnVmLCBkYXRhX29mKGRhdGEtXFx1MDAzZWhhbmRsZSksIFBBR0VfU0laRSk7XFxuK1xcdFxcdHNnX3NldF9idWYoXFx1MDAyNmRhdGEtXFx1MDAzZXNnWzEgKyBwZ19pZHhdLCBidWYsIFBBR0VfU0laRSk7XFxuK1xcdFxcdHRvdGFsICs9IFBBR0VfU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCF0b3RhbClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1sxICsgcGdfaWR4XSwgXFx1MDAyNmRhdGEtXFx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHQvKlxcbitcXHQgKiBVc2UgaW5jcmVtZW50aW5nIG5vbmNlcyBmb3IgZWFjaCBjaHVuaywgc2luY2UgYSA2NCBiaXQgdmFsdWUgd29uJ3RcXG4rXFx0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cXG4rXFx0ICovXFxuK1xcdG1lbWNweShcXHUwMDI2bm9uY2VbMF0sIFxcdTAwMjZkYXRhLVxcdTAwM2Vub25jZV9sb3csIHNpemVvZihkYXRhLVxcdTAwM2Vub25jZV9sb3cpKTtcXG4rXFx0bWVtY3B5KFxcdTAwMjZub25jZVtzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KV0sXFxuK1xcdCAgICAgICBcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCxcXG4rXFx0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9sb3cgKz0gMTtcXG4rXFx0LyogVG90YWwgZG9lcyBub3QgaW5jbHVkZSBBQUQgb3IgdGhlIGF1dGggdGFnLiAqL1xcbitcXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cXHUwMDNlc2csIGRhdGEtXFx1MDAzZXNnLCB0b3RhbCwgbm9uY2UpO1xcbitcXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZW5jcnlwdChyZXEpLCBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyZXMpXFxuK1xcdFxcdHJldHVybiByZXM7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gdG90YWw7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsICs9IHRvdGFsO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyogRGVjcnlwdCBkYXRhIGZyb20gdGhlIHN0YWdpbmcgYXJlYSBhbmQgcHVzaCBpdCB0byB0aGUgc25hcHNob3QuICovXFxuK3N0YXRpYyBpbnQgc25hcHNob3RfZGVjcnlwdF9kcmFpbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBkYXRhLVxcdTAwM2VhZWFkX3JlcTtcXG4rXFx0dTggbm9uY2VbR0NNX0FFU19JVl9TSVpFXTtcXG4rXFx0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcXG4rXFx0aW50IHBhZ2VfY291bnQ7XFxuK1xcdHNpemVfdCB0b3RhbDtcXG4rXFx0aW50IHBnX2lkeDtcXG4rXFx0aW50IHJlcztcXG4rXFxuK1xcdC8qIFNldCB1cCB0aGUgYXNzb2NpYXRlZCBkYXRhLiAqL1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1swXSwgXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwpKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXFxuK1xcdCAqIHNob3VsZCBhbHNvIGJlIGEgdGFnIGF0IHRoZSBlbmQsIHNvIHRoZSBvZmZzZXQgd29uJ3QgYmUgYW4gZXZlbiBwYWdlLlxcbitcXHQgKi9cXG4rXFx0cGFnZV9jb3VudCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHR0b3RhbCA9IHBhZ2VfY291bnQgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFx0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0KVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIExvYWQgdGhlIHNnIGxpc3Qgd2l0aCB0aGUgY3J5cHQgYnVmZmVyLiBJbmxpbmUgZGVjcnlwdCBiYWNrIGludG8gdGhlXFxuK1xcdCAqIHN0YWdpbmcgYnVmZmVyLiBBIGZ1dHVyZSBvcHRpbWl6YXRpb24gY291bGQgZGVjcnlwdCBkaXJlY3RseSBpbnRvXFxuK1xcdCAqIGxvd21lbSBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFxcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspXFxuK1xcdFxcdHNnX3NldF9idWYoXFx1MDAyNmRhdGEtXFx1MDAzZXNnWzEgKyBwZ19pZHhdLCBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogSXQncyBwb3NzaWJsZSB0aGlzIGlzIHRoZSBmaW5hbCBkZWNyeXB0LCBvciB0aGUgZmluYWwgZGVjcnlwdCBvZiB0aGVcXG4rXFx0ICogbWV0YSByZWdpb24sIGFuZCB0aGVyZSBhcmUgZmV3ZXIgdGhhbiBDSFVOS19TSVpFIHBhZ2VzLiBJZiB0aGlzIGlzXFxuK1xcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcXG4rXFx0ICogYnl0ZXMgb2YgYSBuZXcgcGFnZS4gQ29weSB0byB0aGUgdGFnIGlmIHNvLlxcbitcXHQgKi9cXG4rXFx0aWYgKHBhZ2VfY291bnQgXFx1MDAzYyBDSFVOS19TSVpFIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IC0gdG90YWwpID09IHNpemVvZihkYXRhLVxcdTAwM2VhdXRoX3RhZykpIHtcXG4rXFx0XFx0bWVtY3B5KGRhdGEtXFx1MDAzZWF1dGhfdGFnLCBkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLFxcbitcXHRcXHQgICAgICAgc2l6ZW9mKGRhdGEtXFx1MDAzZWF1dGhfdGFnKSk7XFxuK1xcdH0gZWxzZSBpZiAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0ICE9XFxuK1xcdFxcdCAgICgoQ0hVTktfU0laRSBcXHUwMDNjXFx1MDAzYyBQQUdFX1NISUZUKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHR9XFxuK1xcbitcXHRzZ19zZXRfYnVmKFxcdTAwMjZkYXRhLVxcdTAwM2VzZ1sxICsgcGdfaWR4XSwgXFx1MDAyNmRhdGEtXFx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXFx1MDAyNndhaXQpO1xcbitcXHRtZW1jcHkoXFx1MDAyNm5vbmNlWzBdLCBcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfbG93LCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcdG1lbWNweShcXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdyldLFxcbitcXHQgICAgICAgXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gsXFxuK1xcdCAgICAgICBzaXplb2Yobm9uY2UpIC0gc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdykpO1xcbitcXG4rXFx0ZGF0YS1cXHUwMDNlbm9uY2VfbG93ICs9IDE7XFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBkYXRhLVxcdTAwM2VzZywgZGF0YS1cXHUwMDNlc2csIHRvdGFsICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSwgbm9uY2UpO1xcbitcXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCBcXHUwMDI2d2FpdCk7XFxuK1xcdGlmIChyZXMpXFxuK1xcdFxcdHJldHVybiByZXM7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcXG4rXFxuK1xcdC8qIFB1c2ggdGhlIGRlY3J5cHRlZCBwYWdlcyBmdXJ0aGVyIGRvd24gdGhlIHN0YWNrLiAqL1xcbitcXHR0b3RhbCA9IDA7XFxuK1xcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFxcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspIHtcXG4rXFx0XFx0dm9pZCAqYnVmID0gZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XTtcXG4rXFxuK1xcdFxcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuK1xcdFxcdGlmIChyZXMgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmVzO1xcbitcXHRcXHRpZiAocmVzID09IDApXFxuK1xcdFxcdFxcdGJyZWFrO1xcbitcXG4rXFx0XFx0aWYgKCFkYXRhX29mKGRhdGEtXFx1MDAzZWhhbmRsZSkpXFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0XFx0V0FSTl9PTihyZXMgIT0gUEFHRV9TSVpFKTtcXG4rXFxuK1xcdFxcdC8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqL1xcbitcXHRcXHRtZW1jcHkoZGF0YV9vZihkYXRhLVxcdTAwM2VoYW5kbGUpLCBidWYsIFBBR0VfU0laRSk7XFxuK1xcdFxcdHRvdGFsICs9IFBBR0VfU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsID09IDApIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlbWV0YV9zaXplID0gc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuK1xcdFxcdGlmIChkYXRhLVxcdTAwM2V1c2VyX2tleV92YWxpZClcXG4rXFx0XFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID1cXG4rXFx0XFx0XFx0XFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cXHUwMDNlbWV0YV9zaXplKTtcXG4rXFx0fVxcbitcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgKz0gdG90YWw7XFxuK1xcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcXG4rXFx0aWYgKHJlcylcXG4rXFx0XFx0cmV0dXJuIHJlcztcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgdm9pZCAqKmJ1ZilcXG4re1xcbitcXHRzaXplX3QgdGFnX29mZjtcXG4rXFxuK1xcdC8qIFJlZmlsbCB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGVtcHR5LiAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfc2l6ZSA9PSAwIHx8XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwM2U9XFxuK1xcdCAgICAgKGRhdGEtXFx1MDAzZWNyeXB0X3NpemUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKSkpIHtcXG4rXFx0XFx0aW50IHJjO1xcbitcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCA9IDA7XFxuK1xcdFxcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XFxuK1xcdFxcdGlmIChyYyBcXHUwMDNjIDApXFxuK1xcdFxcdFxcdHJldHVybiByYztcXG4rXFx0XFx0aWYgKCFkYXRhLVxcdTAwM2VjcnlwdF9zaXplKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNjIGRhdGEtXFx1MDAzZWNyeXB0X3NpemUpIHtcXG4rXFx0XFx0c2l6ZV90IHBnX2lkeCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRcXHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xcbitcXHRcXHQqYnVmID0gZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbcGdfaWR4XSArIHBnX29mZjtcXG4rXFx0XFx0cmV0dXJuIFBBR0VfU0laRSAtIHBnX29mZjtcXG4rXFx0fVxcbitcXG4rXFx0LyogVXNlIG9mZnNldHMganVzdCBiZXlvbmQgdGhlIHNpemUgdG8gcmV0dXJuIHRoZSB0YWcuICovXFxuK1xcdHRhZ19vZmYgPSBkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgLSBkYXRhLVxcdTAwM2VjcnlwdF9zaXplO1xcbitcXHRpZiAodGFnX29mZiBcXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXFxuK1xcdFxcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xcbitcXG4rXFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcXG4rXFx0cmV0dXJuIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xcbit9XFxuK1xcbitzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICB2b2lkICoqYnVmKVxcbit7XFxuK1xcdHNpemVfdCBzaXplX2F2YWlsO1xcbitcXHRzaXplX3QgdGFnX29mZjtcXG4rXFxuK1xcdC8qIFJldHVybiBkYXRhIHBhZ2VzIGlmIHRoZSBvZmZzZXQgaXMgaW4gdGhhdCByZWdpb24uICovXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgXFx1MDAzYyAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkpIHtcXG4rXFx0XFx0c2l6ZV90IHBnX2lkeCA9IGRhdGEtXFx1MDAzZWNyeXB0X29mZnNldCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXHRcXHRzaXplX3QgcGdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xcbitcXG4rXFx0XFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XFxuK1xcdFxcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFVzZSBvZmZzZXRzIGp1c3QgYmV5b25kIHRoZSBzaXplIHRvIHJldHVybiB0aGUgdGFnLiAqL1xcbitcXHRcXHR0YWdfb2ZmID0gZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xcbitcXHRcXHRpZiAodGFnX29mZiBcXHUwMDNlIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpXFxuK1xcdFxcdFxcdHRhZ19vZmYgPSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFO1xcbitcXG4rXFx0XFx0KmJ1ZiA9IGRhdGEtXFx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcXG4rXFx0XFx0c2l6ZV9hdmFpbCA9IFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgLSB0YWdfb2ZmO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXFx1MDAzYyBkYXRhLVxcdTAwM2VjcnlwdF9tZXRhX3NpemUpIHtcXG4rXFx0XFx0dTY0IG1ldGFfYXZhaWwgPSBkYXRhLVxcdTAwM2VjcnlwdF9tZXRhX3NpemUgLSBkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWw7XFxuK1xcbitcXHRcXHRzaXplX2F2YWlsID0gbWluX3QodTY0LCBzaXplX2F2YWlsLCBtZXRhX2F2YWlsKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHNpemVfYXZhaWw7XFxuK31cXG4rXFxuK3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXFxuK1xcdFxcdFxcdFxcdGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxcbit7XFxuK1xcdHNpemVfdCBjb3B5X3NpemU7XFxuK1xcdHNpemVfdCBub3RfZG9uZTtcXG4rXFx0c2l6ZV90IHBnX29mZjtcXG4rXFx0dm9pZCAqc3JjO1xcbitcXHRzc2l6ZV90IHNyY19zaXplO1xcbitcXG4rXFx0aWYgKCFjb3VudClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRwZ19vZmYgPSAqb2ZmcCBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xcbitcXG4rXFx0c3JjX3NpemUgPSBzbmFwc2hvdF9yZWFkX25leHRfZW5jcnlwdGVkKGRhdGEsIFxcdTAwMjZzcmMpO1xcbitcXHRpZiAoc3JjX3NpemUgXFx1MDAzYz0gMClcXG4rXFx0XFx0cmV0dXJuIHNyY19zaXplO1xcbitcXG4rXFx0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgc3JjX3NpemUpO1xcbitcXHRub3RfZG9uZSA9IGNvcHlfdG9fdXNlcihidWYsIHNyYywgY29weV9zaXplKTtcXG4rXFx0Y29weV9zaXplIC09IG5vdF9kb25lO1xcbitcXHRpZiAoIWNvcHlfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgKz0gY29weV9zaXplO1xcbitcXHQqb2ZmcCArPSBjb3B5X3NpemU7XFxuK1xcdHNuYXBzaG90X3JlY29yZF9lbmNyeXB0ZWRfcmVhZChkYXRhLCBjb3B5X3NpemUpO1xcbitcXHRyZXR1cm4gY29weV9zaXplO1xcbit9XFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0IGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRzaXplX3QgY29weV9zaXplO1xcbitcXHRzaXplX3Qgbm90X2RvbmU7XFxuK1xcdHNpemVfdCBwZ19vZmY7XFxuK1xcdHZvaWQgKmRzdDtcXG4rXFx0c3NpemVfdCBkc3Rfc2l6ZTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0aWYgKCFjb3VudClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRwZ19vZmYgPSAqb2ZmcCBcXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcXG4rXFx0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xcbitcXG4rXFx0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcXHUwMDI2ZHN0KTtcXG4rXFx0aWYgKGRzdF9zaXplIFxcdTAwM2M9IDApXFxuK1xcdFxcdHJldHVybiBkc3Rfc2l6ZTtcXG4rXFxuK1xcdGNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIGRzdF9zaXplKTtcXG4rXFx0bm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTtcXG4rXFx0Y29weV9zaXplIC09IG5vdF9kb25lO1xcbitcXHRpZiAoIWNvcHlfc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgKz0gY29weV9zaXplO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgKz0gY29weV9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZVxcbitcXHQgKiBlbmNyeXB0ZWQgbWV0YWRhdGEgYW5kIG5lZWQgYSBrZXkgY2hhbmdlIGJlZm9yZSB1c2VyIGRhdGEgcGFnZXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlY3J5cHRfb2Zmc2V0IFxcdTAwM2U9XFxuK1xcdCAgICAoUEFHRV9TSVpFICogQ0hVTktfU0laRSkgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFIHx8XFxuK1xcdCAgICAoZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgZGF0YS1cXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSkpIHtcXG4rXFx0XFx0cmMgPSBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKGRhdGEpO1xcbitcXHRcXHRpZiAocmMgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gcmM7XFxuK1xcdH1cXG4rXFxuK1xcdCpvZmZwICs9IGNvcHlfc2l6ZTtcXG4rXFx0cmV0dXJuIGNvcHlfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfdG90YWwgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9sb3cgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2Vub25jZV9oaWdoID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlbWV0YV9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNldXNlcl9rZXlfdmFsaWQgPSBmYWxzZTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcdG1lbXNldChkYXRhLVxcdTAwM2VhdXRoX3RhZywgMCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWF1dGhfdGFnKSk7XFxuK31cXG4rXFxuK3ZvaWQgc25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VhZWFkX3JlcSkge1xcbitcXHRcXHRhZWFkX3JlcXVlc3RfZnJlZShkYXRhLVxcdTAwM2VhZWFkX3JlcSk7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWFlYWRfcmVxID0gTlVMTDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWFlYWRfdGZtKSB7XFxuK1xcdFxcdGNyeXB0b19mcmVlX2FlYWQoZGF0YS1cXHUwMDNlYWVhZF90Zm0pO1xcbitcXHRcXHRkYXRhLVxcdTAwM2VhZWFkX3RmbSA9IE5VTEw7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBDSFVOS19TSVpFOyBpKyspIHtcXG4rXFx0XFx0aWYgKGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldKSB7XFxuK1xcdFxcdFxcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLVxcdTAwM2VjcnlwdF9wYWdlc1tpXSk7XFxuK1xcdFxcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRtZW16ZXJvX2V4cGxpY2l0KGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9rZXkpKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChkYXRhLVxcdTAwM2V1c2VyX2tleSwgc2l6ZW9mKGRhdGEtXFx1MDAzZXVzZXJfa2V5KSk7XFxuK1xcdHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0aW50IGksIHJjO1xcbitcXG4rXFx0LyogVGhpcyBvbmx5IHdvcmtzIG9uY2UgcGVyIGhpYmVybmF0ZS4gKi9cXG4rXFx0aWYgKGRhdGEtXFx1MDAzZWFlYWRfdGZtKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdHNuYXBzaG90X3Jlc2V0X2VuY3J5cHRpb25fc3RhdGUoZGF0YSk7XFxuK1xcdG1lbXNldChkYXRhLVxcdTAwM2VjcnlwdF9wYWdlcywgMCwgc2l6ZW9mKGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzKSk7XFxuK1xcbitcXHQvKiBTZXQgdXAgdGhlIGVuY3J5cHRpb24gdHJhbnNmb3JtICovXFxuK1xcdGRhdGEtXFx1MDAzZWFlYWRfdGZtID0gY3J5cHRvX2FsbG9jX2FlYWQoXFxcImdjbShhZXMpXFxcIiwgMCwgMCk7XFxuK1xcdGlmIChJU19FUlIoZGF0YS1cXHUwMDNlYWVhZF90Zm0pKSB7XFxuK1xcdFxcdHJjID0gUFRSX0VSUihkYXRhLVxcdTAwM2VhZWFkX3RmbSk7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWFlYWRfdGZtID0gTlVMTDtcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbitcXHRyYyA9IC1FTk9NRU07XFxuK1xcdGRhdGEtXFx1MDAzZWFlYWRfcmVxID0gYWVhZF9yZXF1ZXN0X2FsbG9jKGRhdGEtXFx1MDAzZWFlYWRfdGZtLCBHRlBfS0VSTkVMKTtcXG4rXFx0aWYgKCFkYXRhLVxcdTAwM2VhZWFkX3JlcSlcXG4rXFx0XFx0Z290byBzZXR1cF9mYWlsO1xcbitcXG4rXFx0LyogQWxsb2NhdGUgdGhlIHN0YWdpbmcgYXJlYSAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQ0hVTktfU0laRTsgaSsrKSB7XFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XFxuK1xcdFxcdGlmICghZGF0YS1cXHUwMDNlY3J5cHRfcGFnZXNbaV0pXFxuK1xcdFxcdFxcdGdvdG8gc2V0dXBfZmFpbDtcXG4rXFx0fVxcbitcXG4rXFx0c2dfaW5pdF90YWJsZShkYXRhLVxcdTAwM2VzZywgQ0hVTktfU0laRSArIDIpO1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIGFzc29jaWF0ZWQgZGF0YSB3aWxsIGJlIHRoZSBvZmZzZXQgc28gdGhhdCBibG9ja3MgY2FuJ3QgYmVcXG4rXFx0ICogcmVhcnJhbmdlZC5cXG4rXFx0ICovXFxuK1xcdGFlYWRfcmVxdWVzdF9zZXRfYWQoZGF0YS1cXHUwMDNlYWVhZF9yZXEsIHNpemVvZihkYXRhLVxcdTAwM2VjcnlwdF90b3RhbCkpO1xcbitcXHRyYyA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKGRhdGEtXFx1MDAzZWFlYWRfdGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIHNldHVwX2ZhaWw7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK3NldHVwX2ZhaWw6XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4raW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcXG4rXFx0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XFxuK1xcdHU4IG5vbmNlW1VTV1NVU1BfS0VZX05PTkNFX1NJWkVdO1xcbitcXHRpbnQgcmM7XFxuK1xcbitcXHQvKiBEb24ndCBwdWxsIGEgcmFuZG9tIGtleSBmcm9tIGEgd29ybGQgdGhhdCBjYW4gYmUgcmVzZXQuICovXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VyZWFkeSlcXG4rXFx0XFx0cmV0dXJuIC1FUElQRTtcXG4rXFxuK1xcdHJjID0gc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oZGF0YSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXG4rXFx0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXFxuK1xcdGdldF9yYW5kb21fYnl0ZXMobm9uY2UsIHNpemVvZihub25jZSkpO1xcbitcXHRtZW1jcHkoXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2xvdywgXFx1MDAyNm5vbmNlWzBdLCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfbG93KSk7XFxuK1xcdG1lbWNweShcXHUwMDI2ZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCwgXFx1MDAyNm5vbmNlWzhdLCBzaXplb2YoZGF0YS1cXHUwMDNlbm9uY2VfaGlnaCkpO1xcbitcXG4rXFx0LyogQnVpbGQgYW5kIGluc3RhbGwgYSByYW5kb20gaW1hZ2UgZW5jcnlwdGlvbiBrZXkuICovXFxuK1xcdGdldF9yYW5kb21fYnl0ZXMoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdHJjID0gc25hcHNob3RfaW5zdGFsbF9pbWFnZV9rZXkoZGF0YSwgaW1hZ2Vfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRyYyA9IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGltYWdlX2tleSwgXFx1MDAyNndyYXBwZWQpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFxuK1xcdC8qIEhhbmQgdGhlIHdyYXBwZWQga2V5IGFuZCBjbGVhciBub25jZSBiYWNrIHRvIHVzZXIgbW9kZS4gKi9cXG4rXFx0cmMgPSBwdXRfdXNlcihzaXplb2Yod3JhcHBlZCksIFxcdTAwMjZrZXktXFx1MDAzZWJsb2JfbGVuKTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHdyYXBwZWQpIFxcdTAwM2VcXG4rXFx0XFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVxcdTAwM2VibG9iKSk7XFxuK1xcdGlmIChjb3B5X3RvX3VzZXIoXFx1MDAyNmtleS1cXHUwMDNlYmxvYiwgXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHtcXG4rXFx0XFx0cmMgPSAtRUZBVUxUO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjb3B5X3RvX3VzZXIoXFx1MDAyNmtleS1cXHUwMDNlbm9uY2UsIFxcdTAwMjZub25jZSwgc2l6ZW9mKG5vbmNlKSkpIHtcXG4rXFx0XFx0cmMgPSAtRUZBVUxUO1xcbitcXHRcXHRnb3RvIGZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZmFpbDpcXG4rXFx0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcXG4rXFx0bWVtemVyb19leHBsaWNpdChcXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcXG4rXFx0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcXG4rXFx0cmV0dXJuIHJjO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcXG4re1xcbitcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqYmxvYjtcXG4rXFx0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcXG4rXFx0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XFxuK1xcdGludCByYztcXG4rXFxuK1xcdC8qIEl0J3MgdG9vIGxhdGUgaWYgZGF0YSdzIGJlZW4gcHVzaGVkIGluLiAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlaGFuZGxlLmN1cilcXG4rXFx0XFx0cmV0dXJuIC1FUElQRTtcXG4rXFxuK1xcdHJjID0gc25hcHNob3Rfc2V0dXBfZW5jcnlwdGlvbl9jb21tb24oZGF0YSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0cmV0dXJuIHJjO1xcbitcXG4rXFx0LyogTG9hZCB0aGUga2V5IGZyb20gdXNlciBtb2RlLiAqL1xcbitcXHRibG9iID0gbWVtZHVwX3VzZXIoa2V5LCBzaXplb2YoKmJsb2IpKTtcXG4rXFx0aWYgKElTX0VSUihibG9iKSkge1xcbitcXHRcXHRyYyA9IFBUUl9FUlIoYmxvYik7XFxuK1xcdFxcdGdvdG8gY3J5cHRvX3NldHVwX2ZhaWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChibG9iLVxcdTAwM2VibG9iX2xlbiAhPSBzaXplb2Yod3JhcHBlZCkpIHtcXG4rXFx0XFx0cmMgPSAtRUlOVkFMO1xcbitcXHRcXHRnb3RvIG91dF9ibG9iO1xcbitcXHR9XFxuK1xcbitcXHRtZW1jcHkoXFx1MDAyNndyYXBwZWQsIGJsb2ItXFx1MDAzZWJsb2IsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdHJjID0gc25hcHNob3RfdW53cmFwX2ltYWdlX2tleShcXHUwMDI2d3JhcHBlZCwgaW1hZ2Vfa2V5KTtcXG4rXFx0aWYgKHJjKVxcbitcXHRcXHRnb3RvIG91dF9ibG9iO1xcbitcXG4rXFx0cmMgPSBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShkYXRhLCBpbWFnZV9rZXkpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0X2Jsb2I7XFxuK1xcbitcXHQvKiBMb2FkIHRoZSBzdGFydGluZyBub25jZS4gKi9cXG4rXFx0bWVtY3B5KFxcdTAwMjZkYXRhLVxcdTAwM2Vub25jZV9sb3csIFxcdTAwMjZibG9iLVxcdTAwM2Vub25jZVswXSwgc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2xvdykpO1xcbitcXHRtZW1jcHkoXFx1MDAyNmRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gsIFxcdTAwMjZibG9iLVxcdTAwM2Vub25jZVs4XSwgc2l6ZW9mKGRhdGEtXFx1MDAzZW5vbmNlX2hpZ2gpKTtcXG4rXFxuK291dF9ibG9iOlxcbitcXHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY3J5cHRvX3NldHVwX2ZhaWw6XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoXFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XFxuK1xcdG1lbXplcm9fZXhwbGljaXQoaW1hZ2Vfa2V5LCBzaXplb2YoaW1hZ2Vfa2V5KSk7XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcXG4re1xcbitcXHRsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGxvZmZfdCBjaHVua3MgPSAocGFnZXMgKyAoQ0hVTktfU0laRSAtIDEpKSAvIENIVU5LX1NJWkU7XFxuK1xcdC8qXFxuK1xcdCAqIFRoZSBlbmNyeXB0ZWQgc2l6ZSBpcyB0aGUgbm9ybWFsIHNpemUsIHBsdXMgYSBzdGl0Y2hlZCBpblxcbitcXHQgKiBhdXRoZW50aWNhdGlvbiB0YWcgZm9yIGV2ZXJ5IGNodW5rIG9mIHBhZ2VzLlxcbitcXHQgKi9cXG4rXFx0cmV0dXJuIHBsYWluX3NpemUgKyAoY2h1bmtzICogU05BUFNIT1RfQVVUSF9UQUdfU0laRSk7XFxuK31cXG4rXFxuK3N0YXRpYyBsb2ZmX3Qgc25hcHNob3RfZW5jcnlwdGVkX3NwbGl0X2J5dGVfY291bnQobG9mZl90IHJhd19zaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgIGxvZmZfdCBtZXRhX3BsYWluX3NpemUpXFxuK3tcXG4rXFx0aWYgKHJhd19zaXplIFxcdTAwM2M9IG1ldGFfcGxhaW5fc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KHJhd19zaXplKTtcXG4rXFxuK1xcdHJldHVybiBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3BsYWluX3NpemUpICtcXG4rXFx0XFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUgLSBtZXRhX3BsYWluX3NpemUpO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KVxcbit7XFxuK1xcdHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHVzZXJfa2V5ID0ge307XFxuK1xcdHVuc2lnbmVkIGludCBrZXlfbGVuO1xcbitcXHR1NjQgc2l6ZTtcXG4rXFx0aW50IHJjO1xcbitcXG4rXFx0aWYgKCFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZ1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtXFx1MDAzZXVzZXJfa2V5KSBcXHUwMDNjIHNpemVvZih1c2VyX2tleS5rZXkpKTtcXG4rXFx0cmMgPSAtRUlOVkFMO1xcbitcXHRpZiAodXNlcl9rZXkucmVzZXJ2ZWQpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcXHUwMDNlIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcXHUwMDNjIDgpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGRhdGEtXFx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXFx1MDAyNlxcdTAwMjYgIWRhdGEtXFx1MDAzZXJlYWR5KSB7XFxuK1xcdFxcdHJjID0gLUVOT0RBVEE7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIHNpemUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgZmVkIGluIGJlZm9yZVxcbitcXHQgKiB0aGUgdXNlciBkYXRhIGtleSBpcyBuZWVkZWQgYXQgcmVzdW1lIHRpbWUuXFxuK1xcdCAqL1xcbitcXHRpZiAoZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1dST05MWSBcXHUwMDI2XFx1MDAyNiAhZGF0YS1cXHUwMDNlbWV0YV9zaXplKSB7XFxuK1xcdFxcdGlmICh1c2VyX2tleS5tZXRhX3NpemUgXFx1MDAzYyBQQUdFX1NJWkUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdFxcdGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9IHVzZXJfa2V5Lm1ldGFfc2l6ZTtcXG4rXFx0XFx0c2l6ZSA9IGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxcbitcXHRcXHRcXHRcXHQgICAgICAgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCgpIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpO1xcbitcXHRcXHRzaXplID0gZGF0YS1cXHUwMDNlY3J5cHRfbWV0YV9zaXplO1xcbitcXHR9XFxuK1xcbitcXHRyYyA9IHB1dF91c2VyKHNpemUsIFxcdTAwMjZrZXktXFx1MDAzZW1ldGFfc2l6ZSk7XFxuK1xcdGlmIChyYylcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRrZXlfbGVuID0gdXNlcl9rZXkua2V5X2xlbjtcXG4rXFxuK1xcdC8qIERvbid0IGFsbG93IGl0IGlmIGl0J3MgdG9vIGxhdGUuICovXFxuK1xcdGlmICgoZGF0YS1cXHUwMDNlbWV0YV9zaXplIFxcdTAwMjZcXHUwMDI2IGRhdGEtXFx1MDAzZWNyeXB0X3RvdGFsIFxcdTAwM2UgZGF0YS1cXHUwMDNlbWV0YV9zaXplKSB8fFxcbitcXHQgICAgKGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgIGRhdGEtXFx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbCBcXHUwMDNlIGRhdGEtXFx1MDAzZWNyeXB0X21ldGFfc2l6ZSkpIHtcXG4rXFx0XFx0cmMgPSAtRUJVU1k7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRtZW1zZXQoZGF0YS1cXHUwMDNldXNlcl9rZXksIDAsIHNpemVvZihkYXRhLVxcdTAwM2V1c2VyX2tleSkpO1xcbitcXHRtZW1jcHkoZGF0YS1cXHUwMDNldXNlcl9rZXksIHVzZXJfa2V5LmtleSwga2V5X2xlbik7XFxuK1xcdGRhdGEtXFx1MDAzZXVzZXJfa2V5X3ZhbGlkID0gdHJ1ZTtcXG4rXFx0LyogSW5zdGFsbCB0aGUga2V5IGlmIHRoZSB1c2VyIGlzIGp1c3QgdW5kZXIgdGhlIHdpcmUuICovXFxuK1xcdHJjID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xcbitcXHRpZiAocmMpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0cmMgPSAwO1xcbitcXG4rb3V0OlxcbitcXHRtZW16ZXJvX2V4cGxpY2l0KFxcdTAwMjZ1c2VyX2tleSwgc2l6ZW9mKHVzZXJfa2V5KSk7XFxuK1xcdHJldHVybiByYztcXG4rfVxcbitcXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IGxvZmZfdCByYXdfc2l6ZSlcXG4re1xcbitcXHRsb2ZmX3QgbWV0YV9wbGFpbl9zaXplID0gZGF0YS1cXHUwMDNlbWV0YV9zaXplO1xcbitcXHRsb2ZmX3Qgc3BsaXRfc2l6ZTtcXG4rXFxuK1xcdGlmICghbWV0YV9wbGFpbl9zaXplKVxcbitcXHRcXHRtZXRhX3BsYWluX3NpemUgPSBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rXFxuK1xcdHNwbGl0X3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfc3BsaXRfYnl0ZV9jb3VudChyYXdfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0IG1ldGFfcGxhaW5fc2l6ZSk7XFxuK1xcdGlmICghZGF0YS1cXHUwMDNldXNlcl9rZXlfdmFsaWQpXFxuK1xcdFxcdHJldHVybiBtYXgoc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpLCBzcGxpdF9zaXplKTtcXG4rXFxuK1xcdHJldHVybiBzcGxpdF9zaXplO1xcbit9XFxuK1xcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdGludCByYztcXG4rXFxuK1xcdGlmIChkYXRhLVxcdTAwM2VjcnlwdF9vZmZzZXQgIT0gMCkge1xcbitcXHRcXHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XFxuK1xcdFxcdGlmIChyYylcXG4rXFx0XFx0XFx0cmV0dXJuIHJjO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXFxuaW5kZXggZDkzM2I1YjJjMDVkNC4uMDI0MDBhYzEyNWM1OCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xcbisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jXFxuQEAgLTIxNzcsNiArMjE3NywxMSBAQCB1bnNpZ25lZCBsb25nIHNuYXBzaG90X2dldF9pbWFnZV9zaXplKHZvaWQpXFxuIFxcdHJldHVybiBucl9jb3B5X3BhZ2VzICsgbnJfbWV0YV9wYWdlcyArIDE7XFxuIH1cXG4gXFxuK3Vuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X21ldGFfcGFnZV9jb3VudCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBucl9tZXRhX3BhZ2VzICsgMTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBpbml0X2hlYWRlcihzdHJ1Y3Qgc3dzdXNwX2luZm8gKmluZm8pXFxuIHtcXG4gXFx0bWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3dzdXNwX2luZm8pKTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3YXAuYyBiL2tlcm5lbC9wb3dlci9zd2FwLmNcXG5pbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9wb3dlci9zd2FwLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXFxuQEAgLTE2Niw2ICsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCBzd3N1c3BfZXh0ZW50c19jb250YWluX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQsXFxuK1xcdFxcdFxcdFxcdFxcdCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdHN0cnVjdCByYl9ub2RlICpub2RlID0gc3dzdXNwX2V4dGVudHMucmJfbm9kZTtcXG4rXFx0c3RydWN0IHN3c3VzcF9leHRlbnQgKmV4dDtcXG4rXFx0dW5zaWduZWQgbG9uZyBlbmQ7XFxuK1xcbitcXHRpZiAoIW5yX3BhZ2VzKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlbmQgPSBzd2FwX29mZnNldCArIG5yX3BhZ2VzIC0gMTtcXG4rXFx0aWYgKGVuZCBcXHUwMDNjIHN3YXBfb2Zmc2V0KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHR3aGlsZSAobm9kZSkge1xcbitcXHRcXHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XFxuK1xcdFxcdGlmIChzd2FwX29mZnNldCBcXHUwMDNjIGV4dC1cXHUwMDNlc3RhcnQpXFxuK1xcdFxcdFxcdG5vZGUgPSBub2RlLVxcdTAwM2VyYl9sZWZ0O1xcbitcXHRcXHRlbHNlIGlmIChzd2FwX29mZnNldCBcXHUwMDNlIGV4dC1cXHUwMDNlZW5kKVxcbitcXHRcXHRcXHRub2RlID0gbm9kZS1cXHUwMDNlcmJfcmlnaHQ7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0Z290byBmb3VuZDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rZm91bmQ6XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKHN3YXBfb2Zmc2V0IFxcdTAwM2MgZXh0LVxcdTAwM2VzdGFydClcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoZW5kIFxcdTAwM2M9IGV4dC1cXHUwMDNlZW5kKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0aWYgKGV4dC1cXHUwMDNlZW5kID09ICh1bnNpZ25lZCBsb25nKS0xKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRcXHRzd2FwX29mZnNldCA9IGV4dC1cXHUwMDNlZW5kICsgMTtcXG4rXFx0XFx0bm9kZSA9IHJiX25leHQoXFx1MDAyNmV4dC1cXHUwMDNlbm9kZSk7XFxuK1xcdFxcdGlmICghbm9kZSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0XFx0ZXh0ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHN3c3VzcF9leHRlbnQsIG5vZGUpO1xcbitcXHR9XFxuK31cXG4rXFxuK2Jvb2wgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkKGludCBzd2FwLCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0dTY0IGJsb2NrO1xcbitcXHR1NjQgZW5kO1xcbitcXHR1NjQgZW5kX2Jsb2NrO1xcbitcXG4rXFx0aWYgKHN3YXAgXFx1MDAzYyAwIHx8IHBvcyBcXHUwMDNjIDAgfHwgIWNvdW50KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRlbmQgPSAodTY0KXBvcyArIGNvdW50IC0gMTtcXG4rXFx0aWYgKGVuZCBcXHUwMDNjICh1NjQpcG9zKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRibG9jayA9ICh1NjQpcG9zIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQ7XFxuK1xcdGVuZF9ibG9jayA9IGVuZCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUO1xcbitcXG4rXFx0Zm9yICg7Oykge1xcbitcXHRcXHR1NjQgcmVtYWluaW5nX3BhZ2VzID0gZW5kX2Jsb2NrIC0gYmxvY2sgKyAxO1xcbitcXHRcXHRwZ29mZl90IHN3YXBfb2Zmc2V0O1xcbitcXHRcXHRwZ29mZl90IG1hcHBlZF9wYWdlcztcXG4rXFx0XFx0c2VjdG9yX3QgcGFnZV9ibG9jayA9IGJsb2NrO1xcbitcXHRcXHR1NjQgcGFnZXM7XFxuK1xcbitcXHRcXHRpZiAoIXJlbWFpbmluZ19wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdGlmIChzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChzd2FwLCBwYWdlX2Jsb2NrLCBcXHUwMDI2c3dhcF9vZmZzZXQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBcXHUwMDI2bWFwcGVkX3BhZ2VzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoIW1hcHBlZF9wYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRwYWdlcyA9IG1pbl90KHU2NCwgbWFwcGVkX3BhZ2VzLCByZW1haW5pbmdfcGFnZXMpO1xcbitcXHRcXHRpZiAoKHU2NCkodW5zaWduZWQgbG9uZylwYWdlcyAhPSBwYWdlcylcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRcXHRpZiAocGFnZXMgPT0gcmVtYWluaW5nX3BhZ2VzKVxcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0YmxvY2sgKz0gcGFnZXM7XFxuK1xcdH1cXG4rfVxcbitcXG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpXFxuK3tcXG4rXFx0dTY0IGltYWdlX3BhZ2VzID0gRElWX1JPVU5EX1VQX1VMTChpbWFnZV9ieXRlcywgUEFHRV9TSVpFKTtcXG4rXFx0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyArIDE7XFxuK1xcbitcXHRpZiAobWFwX3BhZ2VzIFxcdTAwM2UgVTY0X01BWCBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKVxcbitcXHRcXHRyZXR1cm4gVTY0X01BWDtcXG4rXFxuK1xcdHJldHVybiBtYXBfcGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4rfVxcbitcXG4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcClcXG4ge1xcbiBcXHR1bnNpZ25lZCBsb25nIG9mZnNldDtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmNcXG5pbmRleCBkMGZjZmJhN2FjMjM1Li41N2I4Y2U4M2E2MjZmIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmNcXG4rKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jXFxuQEAgLTIxLDU0ICsyMSwxODUgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NvbnNvbGUuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NwdS5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZnJlZXplci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbiBcXG4gI2luY2x1ZGUgXFxcInBvd2VyLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJ1c2VyLmhcXFwiXFxuIFxcbiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7XFxuLVxcbi1zdGF0aWMgc3RydWN0IHNuYXBzaG90X2RhdGEge1xcbi1cXHRzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlIGhhbmRsZTtcXG4tXFx0aW50IHN3YXA7XFxuLVxcdGludCBtb2RlO1xcbi1cXHRib29sIGZyb3plbjtcXG4tXFx0Ym9vbCByZWFkeTtcXG4tXFx0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xcbi1cXHRib29sIGZyZWVfYml0bWFwcztcXG4tXFx0ZGV2X3QgZGV2O1xcbi19IHNuYXBzaG90X3N0YXRlO1xcbitzdHJ1Y3Qgc25hcHNob3RfZGF0YSBzbmFwc2hvdF9zdGF0ZTtcXG4gXFxuIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpXFxuIHtcXG4gXFx0cmV0dXJuIGhpYmVybmF0aW9uX2F2YWlsYWJsZSgpIFxcdTAwMjZcXHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XFxuIH1cXG4gXFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK3N0YXRpYyBib29sIHNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCBkZXZfdCBkZXYpXFxuK3tcXG4rXFx0cmV0dXJuIGRhdGEtXFx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQgXFx1MDAyNlxcdTAwMjYgZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1JET05MWSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRkYXRhLVxcdTAwM2VyZWFkeSBcXHUwMDI2XFx1MDAyNiBkYXRhLVxcdTAwM2VkZXYgPT0gZGV2IFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdGRhdGEtXFx1MDAzZW93bmVyX3RnaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKTtcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHRsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rXFx0bG9mZl90IGhlYWRlcl9vZmZzZXQgPSBkYXRhLVxcdTAwM2Vzd2FwX2hlYWRlcl9vZmZzZXQ7XFxuK1xcdGxvZmZfdCBvZmZzZXQ7XFxuK1xcbitcXHRpZiAocG9zIFxcdTAwM2MgaGVhZGVyX29mZnNldClcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0b2Zmc2V0ID0gcG9zIC0gaGVhZGVyX29mZnNldDtcXG4rXFx0cmV0dXJuIG9mZnNldCBcXHUwMDNjIFBBR0VfU0laRSBcXHUwMDI2XFx1MDAyNiBjb3VudCBcXHUwMDNjPSBQQUdFX1NJWkUgLSBvZmZzZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyB1NjQgc25hcHNob3Rfc3dhcF93cml0ZV9idWRnZXQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0dTY0IGltYWdlX2J5dGVzID0gcm91bmRfdXAoZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCwgUEFHRV9TSVpFKTtcXG4rXFx0dTY0IG1hcF9ieXRlcyA9IHN3c3VzcF9zd2FwX21hcF9ieXRlcyhkYXRhLVxcdTAwM2VjcnlwdF9ieXRlc19yZWFkKTtcXG4rXFx0dTY0IGJ1ZGdldCA9IGltYWdlX2J5dGVzICsgbWFwX2J5dGVzO1xcbitcXG4rXFx0aWYgKGltYWdlX2J5dGVzIFxcdTAwM2MgZGF0YS1cXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCB8fCBidWRnZXQgXFx1MDAzYyBpbWFnZV9ieXRlcylcXG4rXFx0XFx0cmV0dXJuIFU2NF9NQVg7XFxuK1xcbitcXHRyZXR1cm4gYnVkZ2V0O1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK31cXG4rI2VuZGlmXFxuK1xcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZVxcbitoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpXFxuK3tcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcXHUwMDI2c25hcHNob3Rfc3RhdGU7XFxuK1xcdGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFx0Ym9vbCBpbWFnZV9yYW5nZV9hbGxvY2F0ZWQ7XFxuK1xcdHU2NCBzd2FwX2J1ZGdldDtcXG4rXFxuK1xcdGlmICghY291bnQgfHwgIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpXFxuK1xcdFxcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNnN5c3RlbV90cmFuc2l0aW9uX211dGV4KTtcXG4rXFxuK1xcdGlmICghc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoZGF0YSwgZGV2KSlcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcbitcXHRpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgPSBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoZGF0YS1cXHUwMDNlc3dhcCwgcG9zLCBjb3VudCk7XFxuK1xcbitcXHRzcGluX2xvY2soXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbitcXHRzd2FwX2J1ZGdldCA9IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KGRhdGEpO1xcbitcXHRpZiAoc25hcHNob3RfaGVhZGVyX3dyaXRlX3JhbmdlKGRhdGEsIHBvcywgY291bnQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXFx1MDAzYz0gUEFHRV9TSVpFIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBQQUdFX1NJWkUgLSBkYXRhLVxcdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgXFx1MDAzZT0gY291bnQpIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkICs9IGNvdW50O1xcbitcXHRcXHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUjtcXG4rXFx0fSBlbHNlIGlmIChpbWFnZV9yYW5nZV9hbGxvY2F0ZWQgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgc3dhcF9idWRnZXQgXFx1MDAzZT0gZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICBzd2FwX2J1ZGdldCAtIGRhdGEtXFx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgXFx1MDAzZT0gY291bnQpIHtcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCArPSBjb3VudDtcXG4rXFx0XFx0dHlwZSA9IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9JTUFHRTtcXG4rXFx0fVxcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcbitcXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcbitcXHRyZXR1cm4gdHlwZTtcXG4rXFxuK3VubG9jazpcXG4rXFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZzeXN0ZW1fdHJhbnNpdGlvbl9tdXRleCk7XFxuK1xcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcXG4rI2Vsc2VcXG4rXFx0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rdm9pZCBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kKGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHR5cGUsXFxuK1xcdFxcdFxcdFxcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pXFxuK3tcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEgPSBcXHUwMDI2c25hcHNob3Rfc3RhdGU7XFxuK1xcdHU2NCAqcmVzZXJ2ZWRfdG90YWw7XFxuK1xcdHNpemVfdCB1bnVzZWQ7XFxuK1xcbitcXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRpZiAoIXJlc2VydmVkKVxcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFxuK1xcdGlmICh0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIpXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkO1xcbitcXHRlbHNlIGlmICh3cml0dGVuIFxcdTAwM2M9IDApXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkO1xcbitcXHRlbHNlIGlmICh3cml0dGVuIFxcdTAwM2MgcmVzZXJ2ZWQpXFxuK1xcdFxcdHVudXNlZCA9IHJlc2VydmVkIC0gd3JpdHRlbjtcXG4rXFx0ZWxzZVxcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFxuK1xcdHJlc2VydmVkX3RvdGFsID0gdHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSID9cXG4rXFx0XFx0XFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA6IFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZkYXRhLVxcdTAwM2VjcnlwdF9sb2NrKTtcXG4rXFx0KnJlc2VydmVkX3RvdGFsIC09IG1pbl90KHU2NCwgKnJlc2VydmVkX3RvdGFsLCB1bnVzZWQpO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2ZGF0YS1cXHUwMDNlY3J5cHRfbG9jayk7XFxuK1xcbit1bmxvY2s6XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xcbisjZW5kaWZcXG4rfVxcbitcXG4rc3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcXG4re1xcbitcXHRkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkID0gc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pO1xcbitcXHRyZXR1cm4gZGF0YS1cXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZDtcXG4rfVxcbitcXG4gc3RhdGljIGludCBzbmFwc2hvdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxcbiB7XFxuIFxcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhO1xcbiBcXHR1bnNpZ25lZCBpbnQgc2xlZXBfZmxhZ3M7XFxuIFxcdGludCBlcnJvcjtcXG4gXFxuLVxcdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXFxuK1xcdGlmICghaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSgpKVxcbiBcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbiBcXG4gXFx0c2xlZXBfZmxhZ3MgPSBsb2NrX3N5c3RlbV9zbGVlcCgpO1xcbiBcXG4gXFx0aWYgKCFoaWJlcm5hdGVfYWNxdWlyZSgpKSB7XFxuIFxcdFxcdGVycm9yID0gLUVCVVNZO1xcbi1cXHRcXHRnb3RvIFVubG9jaztcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdH1cXG4gXFxuIFxcdGlmICgoZmlscC1cXHUwMDNlZl9mbGFncyBcXHUwMDI2IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7XFxuIFxcdFxcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XFxuIFxcdFxcdGVycm9yID0gLUVOT1NZUztcXG4tXFx0XFx0Z290byBVbmxvY2s7XFxuK1xcdFxcdGdvdG8gdW5sb2NrO1xcbiBcXHR9XFxuIFxcdG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApO1xcbiBcXHRkYXRhID0gXFx1MDAyNnNuYXBzaG90X3N0YXRlO1xcbiBcXHRmaWxwLVxcdTAwM2Vwcml2YXRlX2RhdGEgPSBkYXRhO1xcbiBcXHRtZW1zZXQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUpKTtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3Bpbl9sb2NrX2luaXQoXFx1MDAyNmRhdGEtXFx1MDAzZWNyeXB0X2xvY2spO1xcbitcXHRkYXRhLVxcdTAwM2VjcnlwdF9ieXRlc19yZWFkID0gMDtcXG4rXFx0ZGF0YS1cXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IDA7XFxuK1xcdGRhdGEtXFx1MDAzZW93bmVyX3RnaWQgPSBOVUxMO1xcbisjZW5kaWZcXG4gXFx0aWYgKChmaWxwLVxcdTAwM2VmX2ZsYWdzIFxcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkge1xcbiBcXHRcXHQvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovXFxuIFxcdFxcdGRhdGEtXFx1MDAzZXN3YXAgPSBwaW5faGliZXJuYXRpb25fc3dhcF90eXBlKHN3c3VzcF9yZXN1bWVfZGV2aWNlLCAwKTtcXG5AQCAtOTksOCArMjMwLDEzIEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0ZGF0YS1cXHUwMDNlcmVhZHkgPSBmYWxzZTtcXG4gXFx0ZGF0YS1cXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCA9IGZhbHNlO1xcbiBcXHRkYXRhLVxcdTAwM2VkZXYgPSAwO1xcbitcXHRkYXRhLVxcdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkID0gc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKTtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0aWYgKCFlcnJvcilcXG4rXFx0XFx0ZGF0YS1cXHUwMDNlb3duZXJfdGdpZCA9IGdldF90YXNrX3BpZChjdXJyZW50LCBQSURUWVBFX1RHSUQpO1xcbisjZW5kaWZcXG4gXFxuLSBVbmxvY2s6XFxuKyB1bmxvY2s6XFxuIFxcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xcbiBcXG4gXFx0cmV0dXJuIGVycm9yO1xcbkBAIC0xMTYsNiArMjUyLDEwIEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0c3dzdXNwX2ZyZWUoKTtcXG4gXFx0ZGF0YSA9IGZpbHAtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFx0ZGF0YS1cXHUwMDNlZGV2ID0gMDtcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0cHV0X3BpZChkYXRhLVxcdTAwM2Vvd25lcl90Z2lkKTtcXG4rXFx0ZGF0YS1cXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XFxuKyNlbmRpZlxcbiBcXHRmcmVlX2FsbF9zd2FwX3BhZ2VzKGRhdGEtXFx1MDAzZXN3YXApO1xcbiBcXHR1bnBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoZGF0YS1cXHUwMDNlc3dhcCk7XFxuIFxcdGlmIChkYXRhLVxcdTAwM2Vmcm96ZW4pIHtcXG5AQCAtMTI1LDYgKzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcXG4gXFx0fSBlbHNlIGlmIChkYXRhLVxcdTAwM2VmcmVlX2JpdG1hcHMpIHtcXG4gXFx0XFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xcbiBcXHR9XFxuK1xcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XFxuIFxcdHBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS1cXHUwMDNlbW9kZSA9PSBPX1JET05MWSA/XFxuIFxcdFxcdFxcdFBNX1BPU1RfSElCRVJOQVRJT04gOiBQTV9QT1NUX1JFU1RPUkUpO1xcbiBcXHRoaWJlcm5hdGVfcmVsZWFzZSgpO1xcbkBAIC0xNDcsMTIgKzI4OCwyMyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXHRkYXRhID0gZmlscC1cXHUwMDNlcHJpdmF0ZV9kYXRhO1xcbiBcXHRpZiAoIWRhdGEtXFx1MDAzZXJlYWR5KSB7XFxuIFxcdFxcdHJlcyA9IC1FTk9EQVRBO1xcbi1cXHRcXHRnb3RvIFVubG9jaztcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcXG4rXFx0XFx0cmVzID0gLUVQRVJNO1xcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFx0fVxcbitcXG4rXFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuIFxcdH1cXG4rXFxuIFxcdGlmICghcGdfb2ZmcCkgeyAvKiBvbiBwYWdlIGJvdW5kYXJ5PyAqL1xcbiBcXHRcXHRyZXMgPSBzbmFwc2hvdF9yZWFkX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuIFxcdFxcdGlmIChyZXMgXFx1MDAzYz0gMClcXG4tXFx0XFx0XFx0Z290byBVbmxvY2s7XFxuK1xcdFxcdFxcdGdvdG8gdW5sb2NrO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xcbiBcXHR9XFxuQEAgLTE2Miw3ICszMTQsNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXHRpZiAocmVzIFxcdTAwM2UgMClcXG4gXFx0XFx0Km9mZnAgKz0gcmVzO1xcbiBcXG4tIFVubG9jazpcXG4rIHVubG9jazpcXG4gXFx0dW5sb2NrX3N5c3RlbV9zbGVlcChzbGVlcF9mbGFncyk7XFxuIFxcbiBcXHRyZXR1cm4gcmVzO1xcbkBAIC0xODUsNiArMzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxcbiBcXG4gXFx0ZGF0YSA9IGZpbHAtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFxuK1xcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XFxuK1xcdFxcdHJlcyA9IC1FUEVSTTtcXG4rXFx0XFx0Z290byB1bmxvY2s7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcXG4rXFx0XFx0cmVzID0gc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKGRhdGEsIGJ1ZiwgY291bnQsIG9mZnApO1xcbitcXHRcXHRnb3RvIHVubG9jaztcXG4rXFx0fVxcbitcXG4gXFx0aWYgKCFwZ19vZmZwKSB7XFxuIFxcdFxcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSk7XFxuIFxcdFxcdGlmIChyZXMgXFx1MDAzYz0gMClcXG5AQCAtMjUyLDYgKzQxNSw5IEBAIHN0YXRpYyBpbnQgc25hcHNob3Rfc2V0X3N3YXBfYXJlYShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4gXFx0aWYgKGRhdGEtXFx1MDAzZXN3YXAgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gc3dkZXYgPyAtRU5PREVWIDogLUVJTlZBTDtcXG4gXFx0ZGF0YS1cXHUwMDNlZGV2ID0gc3dkZXY7XFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcdGRhdGEtXFx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQ7XFxuKyNlbmRpZlxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG5AQCAtMzE4LDYgKzQ4NCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG4gXFx0XFx0XFx0ZXJyb3IgPSAtRVBFUk07XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuK1xcdFxcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XFxuK1xcdFxcdFxcdGVycm9yID0gLUVQRVJNO1xcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbiBcXHRcXHRwbV9yZXN0b3JlX2dmcF9tYXNrKCk7XFxuIFxcdFxcdGVycm9yID0gaGliZXJuYXRpb25fc25hcHNob3QoZGF0YS1cXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCk7XFxuIFxcdFxcdGlmICghZXJyb3IpIHtcXG5AQCAtMzI4LDYgKzQ5OSwxNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRjYXNlIFNOQVBTSE9UX0FUT01JQ19SRVNUT1JFOlxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4rXFx0XFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcXG4rXFx0XFx0XFx0aWYgKGVycm9yKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0fVxcbitcXG4gXFx0XFx0ZXJyb3IgPSBzbmFwc2hvdF93cml0ZV9maW5hbGl6ZShcXHUwMDI2ZGF0YS1cXHUwMDNlaGFuZGxlKTtcXG4gXFx0XFx0aWYgKGVycm9yKVxcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMzQ2LDYgKzUyOCw3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHRzd3N1c3BfZnJlZSgpO1xcbiBcXHRcXHRtZW1zZXQoXFx1MDAyNmRhdGEtXFx1MDAzZWhhbmRsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUpKTtcXG4gXFx0XFx0ZGF0YS1cXHUwMDNlcmVhZHkgPSBmYWxzZTtcXG4rXFx0XFx0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogSXQgaXMgbmVjZXNzYXJ5IHRvIHRoYXcga2VybmVsIHRocmVhZHMgaGVyZSwgYmVjYXVzZVxcbiBcXHRcXHQgKiBTTkFQU0hPVF9DUkVBVEVfSU1BR0UgbWF5IGJlIGludm9rZWQgZGlyZWN0bHkgYWZ0ZXJcXG5AQCAtMzY4LDYgKzU1MSw4IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHR9XFxuIFxcdFxcdHNpemUgPSBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSgpO1xcbiBcXHRcXHRzaXplIFxcdTAwM2NcXHUwMDNjPSBQQUdFX1NISUZUO1xcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxcbitcXHRcXHRcXHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xcbiBcXHRcXHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbkBAIC0zOTcsNiArNTgyLDkgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cXHUwMDNlc3dhcCk7XFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcdFxcdHNuYXBzaG90X3Jlc2V0X3N3YXBfd3JpdGVfcmVzZXJ2YXRpb24oZGF0YSk7XFxuKyNlbmRpZlxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgU05BUFNIT1RfUzJSQU06XFxuQEAgLTQwNCw2ICs1OTIsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdFxcdGVycm9yID0gLUVQRVJNO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0LypcXG4gXFx0XFx0ICogVGFza3MgYXJlIGZyb3plbiBhbmQgdGhlIG5vdGlmaWVycyBoYXZlIGJlZW4gY2FsbGVkIHdpdGhcXG4gXFx0XFx0ICogUE1fSElCRVJOQVRJT05fUFJFUEFSRVxcbkBAIC00MTcsNiArNjEwLDExIEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxcbiBcXHRcXHRicmVhaztcXG4gXFxuIFxcdGNhc2UgU05BUFNIT1RfUE9XRVJfT0ZGOlxcbitcXHRcXHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xcbitcXHRcXHRcXHRlcnJvciA9IC1FUEVSTTtcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdH1cXG4gXFx0XFx0aWYgKGRhdGEtXFx1MDAzZXBsYXRmb3JtX3N1cHBvcnQpXFxuIFxcdFxcdFxcdGVycm9yID0gaGliZXJuYXRpb25fcGxhdGZvcm1fZW50ZXIoKTtcXG4gXFx0XFx0YnJlYWs7XFxuQEAgLTQyNSw2ICs2MjMsMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXFxuIFxcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X3N3YXBfYXJlYShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xcbiBcXHRcXHRicmVhaztcXG4gXFxuK1xcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XFxuK1xcdFxcdGlmIChkYXRhLVxcdTAwM2Vtb2RlID09IE9fUkRPTkxZKVxcbitcXHRcXHRcXHRlcnJvciA9IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xcbitcXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4rXFx0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XFxuK1xcdFxcdGVycm9yID0gc25hcHNob3Rfc2V0X3VzZXJfa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0ZXJyb3IgPSAtRU5PVFRZO1xcbiBcXG5AQCAtNDQ4LDYgKzY1Nyw4IEBAIHNuYXBzaG90X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIFxcdGNhc2UgU05BUFNIT1RfQUxMT0NfU1dBUF9QQUdFOlxcbiBcXHRjYXNlIFNOQVBTSE9UX0NSRUFURV9JTUFHRTpcXG4gXFx0Y2FzZSBTTkFQU0hPVF9TRVRfU1dBUF9BUkVBOlxcbitcXHRjYXNlIFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OOlxcbitcXHRjYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWTpcXG4gXFx0XFx0cmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCxcXG4gXFx0XFx0XFx0XFx0ICAgICAgKHVuc2lnbmVkIGxvbmcpIGNvbXBhdF9wdHIoYXJnKSk7XFxuIFxcdGRlZmF1bHQ6XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmggYi9rZXJuZWwvcG93ZXIvdXNlci5oXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi40ZGYyZjlhZTlhZGE0XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmhcXG5AQCAtMCwwICsxLDE1MSBAQFxcbisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyeXB0by5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2NhdHRlcmxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NwaW5sb2NrLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdXNwZW5kX2lvY3Rscy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjY3J5cHRvL2FlYWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2NyeXB0by9hZXMuaFxcdTAwM2VcXG4rXFxuK3N0cnVjdCBwaWQ7XFxuK1xcbisjZGVmaW5lIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUgQUVTX0tFWVNJWkVfMTI4XFxuKyNkZWZpbmUgU05BUFNIT1RfQVVUSF9UQUdfU0laRSAxNlxcbitcXG4rLyogRGVmaW5lIHRoZSBudW1iZXIgb2YgcGFnZXMgaW4gYSBzaW5nbGUgQUVBRCBlbmNyeXB0aW9uIGNodW5rLiAqL1xcbisjZGVmaW5lIENIVU5LX1NJWkUgMTZcXG4rXFxuK3N0cnVjdCBzbmFwc2hvdF9kYXRhIHtcXG4rXFx0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XFxuK1xcdGludCBzd2FwO1xcbitcXHRpbnQgbW9kZTtcXG4rXFx0Ym9vbCBmcm96ZW47XFxuK1xcdGJvb2wgcmVhZHk7XFxuK1xcdGJvb2wgcGxhdGZvcm1fc3VwcG9ydDtcXG4rXFx0Ym9vbCBmcmVlX2JpdG1hcHM7XFxuK1xcdGJvb2wgZW5jcnlwdGlvbl9yZXF1aXJlZDtcXG4rXFx0ZGV2X3QgZGV2O1xcbitcXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcXG4rXFx0c3RydWN0IGNyeXB0b19hZWFkICphZWFkX3RmbTtcXG4rXFx0c3RydWN0IGFlYWRfcmVxdWVzdCAqYWVhZF9yZXE7XFxuK1xcdHZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdO1xcbitcXHR1OCBhdXRoX3RhZ1tTTkFQU0hPVF9BVVRIX1RBR19TSVpFXTtcXG4rXFx0c3RydWN0IHNjYXR0ZXJsaXN0IHNnW0NIVU5LX1NJWkUgKyAyXTsgLyogQWRkIHJvb20gZm9yIEFEIGFuZCBhdXRoIHRhZy4gKi9cXG4rXFx0c2l6ZV90IGNyeXB0X29mZnNldDtcXG4rXFx0c2l6ZV90IGNyeXB0X3NpemU7XFxuK1xcdHU2NCBjcnlwdF90b3RhbDtcXG4rXFx0dTY0IGNyeXB0X3N0cmVhbV90b3RhbDtcXG4rXFx0dTY0IG5vbmNlX2xvdztcXG4rXFx0dTY0IG5vbmNlX2hpZ2g7XFxuK1xcdHU4IGVuY3J5cHRpb25fa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHR1OCB1c2VyX2tleVtVU1dTVVNQX1VTRVJfS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xcbitcXHRib29sIHVzZXJfa2V5X3ZhbGlkO1xcbitcXHR1NjQgbWV0YV9zaXplO1xcbitcXHR1NjQgY3J5cHRfbWV0YV9zaXplO1xcbitcXHQvKlxcbitcXHQgKiBQcm90ZWN0cyBjcnlwdF9ieXRlc19yZWFkIGFuZCB0aGUgcmVzZXJ2YXRpb24gY291bnRlcnMgYmVsb3cuXFxuK1xcdCAqIGNyeXB0X3N3YXBfcmVzZXJ2ZWQgY292ZXJzIGVuY3J5cHRlZCBzbmFwc2hvdCBieXRlcyBhbmQgdXNlcnNwYWNlXFxuK1xcdCAqIGdlbmVyYXRlZCBzd2FwLW1hcCBwYWdlcy5cXG4rXFx0ICovXFxuK1xcdHNwaW5sb2NrX3QgY3J5cHRfbG9jaztcXG4rXFx0dTY0IGNyeXB0X2J5dGVzX3JlYWQ7XFxuK1xcdHU2NCBjcnlwdF9zd2FwX3Jlc2VydmVkO1xcbitcXHR1NjQgY3J5cHRfaGVhZGVyX3Jlc2VydmVkO1xcbitcXHRsb2ZmX3Qgc3dhcF9oZWFkZXJfb2Zmc2V0O1xcbitcXHRzdHJ1Y3QgcGlkICpvd25lcl90Z2lkO1xcbisjZW5kaWZcXG4rXFxuK307XFxuK1xcbitleHRlcm4gc3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XFxuK1xcbisvKiBrZXJuZWwvcG93ZXIvc25hcGVuYy5jIHJvdXRpbmVzICovXFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7XFxuK1xcbitzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcXG4rXFx0XFx0XFx0XFx0IGxvZmZfdCAqb2ZmcCk7XFxuK1xcbit2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpO1xcbitpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XFxuK1xcbitpbnQgc25hcHNob3Rfc2V0X3VzZXJfa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcXG4rXFxuK2ludCBzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWQoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpO1xcbitcXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0IGxvZmZfdCByYXdfc2l6ZSk7XFxuK1xcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcXG4rXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXFxuK3tcXG4rXFx0cmV0dXJuIGRhdGEtXFx1MDAzZWFlYWRfdGZtO1xcbit9XFxuK1xcbisjZWxzZVxcbitcXG4rc3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3JlYWRfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBzc2l6ZV90IHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpIHt9XFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcXG4rXFx0XFx0XFx0XFx0XFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXFxuK3tcXG4rXFx0cmV0dXJuIC1FTk9UVFk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcXG4re1xcbitcXHRyZXR1cm4gLUVOT1RUWTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICAgbG9mZl90IHJhd19zaXplKVxcbit7XFxuK1xcdHJldHVybiByYXdfc2l6ZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHJldHVybiAtRU5PVFRZO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxcbit7XFxuK1xcdHJldHVybiBmYWxzZTtcXG4rfVxcbitcXG4rI2VuZGlmXFxuZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jXFxuaW5kZXggNzhiNDliMDY1OGFkZC4uMTFkZjBjNTU2ZjRlOSAxMDA2NDRcXG4tLS0gYS9tbS9zd2FwZmlsZS5jXFxuKysrIGIvbW0vc3dhcGZpbGUuY1xcbkBAIC0yMzY2LDYgKzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpXFxuIFxcdHJldHVybiBzZS1cXHUwMDNlc3RhcnRfYmxvY2sgKyAob2Zmc2V0IC0gc2UtXFx1MDAzZXN0YXJ0X3BhZ2UpO1xcbiB9XFxuIFxcbitpbnQgc3dhcGRldl9ibG9ja190b19leHRlbnQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQsXFxuK1xcdFxcdFxcdCAgICBwZ29mZl90ICpucl9wYWdlcylcXG4re1xcbitcXHRzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2kgPSBzd2FwX3R5cGVfdG9faW5mbyh0eXBlKTtcXG4rXFx0c3RydWN0IHN3YXBfZXh0ZW50ICpzZTtcXG4rXFx0c3RydWN0IHJiX25vZGUgKnJiO1xcbitcXG4rXFx0aWYgKCFzaSB8fCAhKHNpLVxcdTAwM2VmbGFncyBcXHUwMDI2IFNXUF9XUklURU9LKSlcXG4rXFx0XFx0cmV0dXJuIC1FTk9ERVY7XFxuK1xcbitcXHRmb3IgKHJiID0gcmJfZmlyc3QoXFx1MDAyNnNpLVxcdTAwM2Vzd2FwX2V4dGVudF9yb290KTsgcmI7IHJiID0gcmJfbmV4dChyYikpIHtcXG4rXFx0XFx0c2UgPSByYl9lbnRyeShyYiwgc3RydWN0IHN3YXBfZXh0ZW50LCByYl9ub2RlKTtcXG4rXFx0XFx0aWYgKGJsb2NrIFxcdTAwM2U9IHNlLVxcdTAwM2VzdGFydF9ibG9jayBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgYmxvY2sgLSBzZS1cXHUwMDNlc3RhcnRfYmxvY2sgXFx1MDAzYyBzZS1cXHUwMDNlbnJfcGFnZXMpIHtcXG4rXFx0XFx0XFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cXHUwMDNlc3RhcnRfYmxvY2s7XFxuK1xcbitcXHRcXHRcXHQqb2Zmc2V0ID0gc2UtXFx1MDAzZXN0YXJ0X3BhZ2UgKyBwYWdlO1xcbitcXHRcXHRcXHQqbnJfcGFnZXMgPSBzZS1cXHUwMDNlbnJfcGFnZXMgLSBwYWdlO1xcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gLUVOT0VOVDtcXG4rfVxcbitcXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxcbit7XFxuK1xcdHBnb2ZmX3QgbnJfcGFnZXM7XFxuK1xcbitcXHRyZXR1cm4gc3dhcGRldl9ibG9ja190b19leHRlbnQodHlwZSwgYmxvY2ssIG9mZnNldCwgXFx1MDAyNm5yX3BhZ2VzKTtcXG4rfVxcbitcXG4gLypcXG4gICogUmV0dXJuIGVpdGhlciB0aGUgdG90YWwgbnVtYmVyIG9mIHN3YXAgcGFnZXMgb2YgZ2l2ZW4gdHlwZSwgb3IgdGhlIG51bWJlclxcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNFQxMjoxMjo1OC4yMDI3MDk4NTJaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxODM0MzkzMjQ4NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFTkNSWVBURURfSElCRVJOQVRJT05cIixcbiAgICBcIkhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVlwiLFxuICAgIFwiSElCRVJOQVRJT05cIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzbmFwc2hvdF9zdG9yZV9lbmNyeXB0aW9uX3NlZWRcIixcbiAgICBcInNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9zZXRfdXNlcl9rZXlcIixcbiAgICBcInNuYXBzaG90X3JlYWRfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRcIixcbiAgICBcInNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZVwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luXCIsXG4gICAgXCJoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfZW5kXCIsXG4gICAgXCJzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWRcIixcbiAgICBcInN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBrZXJuZWwtYmFzZWQgZW5jcnlwdGlvbiBmb3IgdXNlcnNwYWNlIGhpYmVybmF0aW9uIHNuYXBzaG90cy4gSXQgYWRkcyBuZXcgaW9jdGxzIHRvIGAvZGV2L3NuYXBzaG90YCAoYFNOQVBTSE9UX0VOQUJMRV9FTkNSWVBUSU9OYCwgYFNOQVBTSE9UX1NFVF9VU0VSX0tFWWApLCBhIHN5c2ZzIGludGVyZmFjZSBgL3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkYCwgYW5kIG1vZGlmaWVzIHRoZSByZWFkL3dyaXRlIHBhdGhzIGZvciB0aGUgc25hcHNob3QgZGV2aWNlIHRvIHN1cHBvcnQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLiBJdCBhbHNvIGhvb2tzIGludG8gYmxvY2sgZGV2aWNlIHdyaXRlcyB0byB0cmFjayBzd2FwIGFsbG9jYXRpb25zLiBUaGVzZSBhcmUgcmVhY2hhYmxlIGNvcmUga2VybmVsIGNoYW5nZXMgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhMDNjMDIwZTdhMmMyZmZmMmVhMmI0ZDM4MDg3YzA4NGQ2NjQ1N2FhXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgNCAxMjoxMjo1NCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLXBvd2VyXG5pbmRleCBkMzhkYTA3NzkwNWE5Li41N2Y2MDYzZWY4OGM5IDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxuKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlclxuQEAgLTQ3MCwzICs0NzAsMTcgQEAgRGVzY3JpcHRpb246XG4gXG4gICAgICAgICAgICAgICAgIE1pbmltdW0gdmFsdWU6IDFcbiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogM1xuK1xuK1doYXQ6XHRcdC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZFxuK0RhdGU6XHRcdEp1bHkgMjAyNlxuK0NvbnRhY3Q6XHRsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmdcbitEZXNjcmlwdGlvbjpcbitcdFx0V3JpdGUtb25seSBmaWxlIHByZXNlbnQgd2hlbiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OPXkuXG4rXG4rXHRcdFRydXN0ZWQgZWFybHkgdXNlcnNwYWNlIHdyaXRlcyBhIDMyLWJ5dGUgc2VlZCwgZW5jb2RlZCBhc1xuK1x0XHQ2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzIHBsdXMgYW4gb3B0aW9uYWwgbmV3bGluZSwgYmVmb3JlXG4rXHRcdGVuYWJsaW5nIGVuY3J5cHRlZCB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLlxuK1xuK1x0XHRUaGUgZmlyc3Qgc3VjY2Vzc2Z1bCB3cml0ZSBsb2NrcyB0aGUgc2VlZCB1bnRpbCB0aGUgbmV4dCBib290LlxuK1x0XHRXcml0aW5nIHRoZSBzYW1lIHNlZWQgYWdhaW4gc3VjY2VlZHMuIFdyaXRpbmcgYSBkaWZmZXJlbnQgc2VlZFxuK1x0XHRmYWlscyB3aXRoIEVQRVJNLlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdCBiL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdFxuaW5kZXggMWNmNjJkODBhOWNhMS4uZGY4ZWNhOWU2ZTM2MyAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvdXNlcmxhbmQtc3dzdXNwLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci91c2VybGFuZC1zd3N1c3AucnN0XG5AQCAtMTE1LDYgKzExNSwyNiBAQCBTTkFQU0hPVF9TMlJBTVxuIFx0dG8gcmVzdW1lIHRoZSBzeXN0ZW0gZnJvbSBSQU0gaWYgdGhlcmUncyBlbm91Z2ggYmF0dGVyeSBwb3dlciBvciByZXN0b3JlXG4gXHRpdHMgc3RhdGUgb24gdGhlIGJhc2lzIG9mIHRoZSBzYXZlZCBzdXNwZW5kIGltYWdlIG90aGVyd2lzZSlcbiBcbitTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTlxuK1x0RW5hYmxlcyBlbmNyeXB0aW9uIG9mIHRoZSBoaWJlcm5hdGUgaW1hZ2Ugd2l0aGluIHRoZSBrZXJuZWwuIFRydXN0ZWRcbitcdGVhcmx5IHVzZXJzcGFjZSBtdXN0IHdyaXRlIHRoZSAzMi1ieXRlIHNuYXBzaG90IGVuY3J5cHRpb24gc2VlZCB0b1xuK1x0L3N5cy9wb3dlci9zbmFwc2hvdF9zZWVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgaW9jdGwuIFVwb24gc3VzcGVuZFxuK1x0KGllIHdoZW4gdGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciByZWFkaW5nKSwgdGhpcyBpb2N0bCByZXR1cm5zXG4rXHRhbiBvcGFxdWUgd3JhcHBlZCBrZXkgYmxvYiBhbmQgdGhlIHN0YXJ0aW5nIG5vbmNlLiBVcG9uIHJlc3VtZSAoaWUgd2hlblxuK1x0dGhlIHNuYXBzaG90IGRldmljZSB3YXMgb3BlbmVkIGZvciB3cml0aW5nKSwgdGhpcyBpb2N0bCByZWNlaXZlcyB0aGVcbitcdHNhbWUgYmxvYiBhbmQgbm9uY2UgZnJvbSB1c2VybW9kZSBhZnRlciB0aGUgc2FtZSBzZWVkIGhhcyBiZWVuIHdyaXR0ZW5cbitcdHRvIC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZC4gVGhlIHBsYWludGV4dCBpbWFnZSBrZXkgaXMgZ2VuZXJhdGVkIGFuZFxuK1x0dW53cmFwcGVkIGluc2lkZSB0aGUga2VybmVsLlxuK1xuK1NOQVBTSE9UX1NFVF9VU0VSX0tFWVxuK1x0TWl4ZXMgYWRkaXRpb25hbCB1c2VyIGtleSBtYXRlcmlhbCBpbnRvIHRoZSBkYXRhIHBvcnRpb24gb2YgYW4gZW5jcnlwdGVkXG4rXHRoaWJlcm5hdGUgaW1hZ2UuIFRoZSBpb2N0bCBhcmd1bWVudCBwb2ludHMgdG8gc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkuXG4rXHRrZXlfbGVuIG11c3QgYmUgYmV0d2VlbiA4IGFuZCBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgYnl0ZXMsIGFuZCByZXNlcnZlZFxuK1x0bXVzdCBiZSB6ZXJvLiBEdXJpbmcgaGliZXJuYXRpb24gdGhlIGtlcm5lbCB3cml0ZXMgbWV0YV9zaXplIHdpdGggdGhlXG4rXHRlbmNyeXB0ZWQgbWV0YWRhdGEgc2l6ZS4gRHVyaW5nIHJlc3VtZSwgdXNlcnNwYWNlIHBhc3NlcyB0aGUgc2F2ZWRcbitcdG1ldGFfc2l6ZSBiYWNrIHNvIHRoZSBrZXJuZWwgY2FuIHN3aXRjaCBrZXlzIGF0IHRoZSBtZXRhZGF0YSBib3VuZGFyeVxuK1x0YmVmb3JlIHRoZSBzbmFwc2hvdCBoZWFkZXIgaGFzIGJlZW4gZGVjcnlwdGVkLlxuK1xuIFRoZSBkZXZpY2UncyByZWFkKCkgb3BlcmF0aW9uIGNhbiBiZSB1c2VkIHRvIHRyYW5zZmVyIHRoZSBzbmFwc2hvdCBpbWFnZSBmcm9tXG4gdGhlIGtlcm5lbC4gIEl0IGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOlxuIFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2ZvcHMuYyBiL2Jsb2NrL2ZvcHMuY1xuaW5kZXggMTU3ODNhNjE4MGRlYy4uZWZlYjQ4NWU5MWU2YyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2ZvcHMuY1xuKysrIGIvYmxvY2svZm9wcy5jXG5AQCAtNzIzLDQzICs3MjMsNjUgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItXHUwMDNla2lfZmlscDtcbiBcdHN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBiZGV2X2ZpbGVfaW5vZGUoZmlsZSk7XG4gXHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGJkX2lub2RlKTtcbitcdGRldl90IGRldiA9IGJkX2lub2RlLVx1MDAzZWlfcmRldjtcbiBcdGJvb2wgYXRvbWljID0gaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgSU9DQl9BVE9NSUM7XG4gXHRsb2ZmX3Qgc2l6ZSA9IGJkZXZfbnJfYnl0ZXMoYmRldik7XG4rXHRlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSBoaWJlcm5hdGVfd3JpdGU7XG4rXHRzaXplX3QgaGliZXJuYXRlX2xlbiA9IDA7XG4gXHRzaXplX3Qgc2hvcnRlZCA9IDA7XG4rXHRzc2l6ZV90IGhpYmVybmF0ZV93cml0dGVuID0gMDtcbiBcdHNzaXplX3QgcmV0O1xuIFxuIFx0aWYgKGJkZXZfcmVhZF9vbmx5KGJkZXYpKVxuIFx0XHRyZXR1cm4gLUVQRVJNO1xuIFxuLVx0aWYgKElTX1NXQVBGSUxFKGJkX2lub2RlKSBcdTAwMjZcdTAwMjYgIWlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGJkX2lub2RlLVx1MDAzZWlfcmRldikpXG4tXHRcdHJldHVybiAtRVRYVEJTWTtcbitcdGlmIChJU19TV0FQRklMRShiZF9pbm9kZSkgXHUwMDI2XHUwMDI2ICFpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXYpKSB7XG4rXHRcdGlmICghaXNfc3luY19raW9jYihpb2NiKSB8fCAhaW9jYl9pc19kc3luYyhpb2NiKSB8fFxuK1x0XHQgICAgKGlvY2ItXHUwMDNla2lfZmxhZ3MgXHUwMDI2IElPQ0JfRElSRUNUKSlcbitcdFx0XHRyZXR1cm4gLUVUWFRCU1k7XG4gXG4tXHRpZiAoIWlvdl9pdGVyX2NvdW50KGZyb20pKVxuLVx0XHRyZXR1cm4gMDtcbitcdFx0aGliZXJuYXRlX2xlbiA9IGlvdl9pdGVyX2NvdW50KGZyb20pO1xuK1x0XHRoaWJlcm5hdGVfd3JpdGUgPSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2LCBpb2NiLVx1MDAzZWtpX3BvcywgaGliZXJuYXRlX2xlbik7XG4rXHRcdGlmIChoaWJlcm5hdGVfd3JpdGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUpXG4rXHRcdFx0cmV0dXJuIC1FVFhUQlNZO1xuK1x0fSBlbHNlIHtcbitcdFx0aGliZXJuYXRlX3dyaXRlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4rXHR9XG4gXG4tXHRpZiAoaW9jYi1cdTAwM2VraV9wb3MgXHUwMDNlPSBzaXplKVxuLVx0XHRyZXR1cm4gLUVOT1NQQztcbitcdGlmICghaW92X2l0ZXJfY291bnQoZnJvbSkpIHtcbitcdFx0cmV0ID0gMDtcbitcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0fVxuIFxuLVx0aWYgKChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiAoSU9DQl9OT1dBSVQgfCBJT0NCX0RJUkVDVCkpID09IElPQ0JfTk9XQUlUKVxuLVx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXHRpZiAoaW9jYi1cdTAwM2VraV9wb3MgXHUwMDNlPSBzaXplKSB7XG4rXHRcdHJldCA9IC1FTk9TUEM7XG4rXHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbitcdH1cbitcbitcdGlmICgoaW9jYi1cdTAwM2VraV9mbGFncyBcdTAwMjYgKElPQ0JfTk9XQUlUIHwgSU9DQl9ESVJFQ1QpKSA9PSBJT0NCX05PV0FJVCkge1xuK1x0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbitcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0fVxuIFxuIFx0aWYgKGF0b21pYykge1xuIFx0XHRyZXQgPSBnZW5lcmljX2F0b21pY193cml0ZV92YWxpZChpb2NiLCBmcm9tKTtcbiBcdFx0aWYgKHJldClcbi1cdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcdH1cbiBcbiBcdHNpemUgLT0gaW9jYi1cdTAwM2VraV9wb3M7XG4gXHRpZiAoaW92X2l0ZXJfY291bnQoZnJvbSkgXHUwMDNlIHNpemUpIHtcbi1cdFx0aWYgKGF0b21pYylcbi1cdFx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0aWYgKGF0b21pYykge1xuK1x0XHRcdHJldCA9IC1FSU5WQUw7XG4rXHRcdFx0Z290byBvdXRfaGliZXJuYXRlO1xuK1x0XHR9XG4gXHRcdHNob3J0ZWQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKSAtIHNpemU7XG4gXHRcdGlvdl9pdGVyX3RydW5jYXRlKGZyb20sIHNpemUpO1xuIFx0fVxuIFxuIFx0cmV0ID0gZmlsZV91cGRhdGVfdGltZShmaWxlKTtcbiBcdGlmIChyZXQpXG4tXHRcdHJldHVybiByZXQ7XG4rXHRcdGdvdG8gb3V0X2hpYmVybmF0ZTtcbiBcbiBcdGlmIChpb2NiLVx1MDAzZWtpX2ZsYWdzIFx1MDAyNiBJT0NCX0RJUkVDVCkge1xuIFx0XHRyZXQgPSBibGtkZXZfZGlyZWN0X3dyaXRlKGlvY2IsIGZyb20pO1xuQEAgLTc3Nyw5ICs3OTksMTYgQEAgc3RhdGljIHNzaXplX3QgYmxrZGV2X3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pXG4gXHRcdGlub2RlX3VubG9ja19zaGFyZWQoYmRfaW5vZGUpO1xuIFx0fVxuIFxuLVx0aWYgKHJldCBcdTAwM2UgMClcbitcdGlmIChyZXQgXHUwMDNlIDApIHtcbitcdFx0aGliZXJuYXRlX3dyaXR0ZW4gPSByZXQ7XG4gXHRcdHJldCA9IGdlbmVyaWNfd3JpdGVfc3luYyhpb2NiLCByZXQpO1xuK1x0fVxuIFx0aW92X2l0ZXJfcmVleHBhbmQoZnJvbSwgaW92X2l0ZXJfY291bnQoZnJvbSkgKyBzaG9ydGVkKTtcbitcbitvdXRfaGliZXJuYXRlOlxuK1x0aWYgKGhpYmVybmF0ZV9sZW4pXG4rXHRcdGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoaGliZXJuYXRlX3dyaXRlLCBoaWJlcm5hdGVfbGVuLFxuK1x0XHRcdFx0XHQgICAgIGhpYmVybmF0ZV93cml0dGVuKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbmluZGV4IGIwMjg3NmYxYWUzOGEuLjgzMDhhNjU4Mzc1NmMgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmhcbkBAIC00MjYsMTAgKzQyNiwzMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgcG1faGliZXJuYXRpb25fbW9kZV9pc19zdXNwZW5kKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9XG4gXG4gaW50IGFyY2hfcmVzdW1lX25vc210KHZvaWQpO1xuIFxuK2VudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlIHtcbitcdEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FLFxuK1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0lNQUdFLFxuK1x0SElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUixcbit9O1xuK1xuICNpZmRlZiBDT05GSUdfSElCRVJOQVRJT05fU05BUFNIT1RfREVWXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldik7XG4rZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVcbitoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW4oZGV2X3QgZGV2LCBsb2ZmX3QgcG9zLCBzaXplX3QgY291bnQpO1xuK3ZvaWQgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZChlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlLFxuK1x0XHRcdFx0ICBzaXplX3QgcmVzZXJ2ZWQsIHNzaXplX3Qgd3JpdHRlbik7XG4gI2Vsc2VcbiBzdGF0aWMgaW5saW5lIGludCBpc19oaWJlcm5hdGVfcmVzdW1lX2RldihkZXZfdCBkZXYpIHsgcmV0dXJuIDA7IH1cbitcbitzdGF0aWMgaW5saW5lIGVudW0gaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlXG4raGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2JlZ2luKGRldl90IGRldiwgbG9mZl90IHBvcywgc2l6ZV90IGNvdW50KVxuK3tcbitcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbitcdFx0XHRcdFx0XHRzaXplX3QgcmVzZXJ2ZWQsXG4rXHRcdFx0XHRcdFx0c3NpemVfdCB3cml0dGVuKVxuK3tcbit9XG4gI2VuZGlmXG4gXG4gLyogSGliZXJuYXRpb24gYW5kIHN1c3BlbmQgZXZlbnRzICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuaW5kZXggOGYwZjY4ZTI0NWJhYS4uYjM2Njg1ZDFmMzE0YiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaFxuQEAgLTQzOSw2ICs0MzksOSBAQCBleHRlcm4gaW50IGZpbmRfaGliZXJuYXRpb25fc3dhcF90eXBlKGRldl90IGRldmljZSwgc2VjdG9yX3Qgb2Zmc2V0KTtcbiBpbnQgZmluZF9maXJzdF9zd2FwKGRldl90ICpkZXZpY2UpO1xuIGV4dGVybiB1bnNpZ25lZCBpbnQgY291bnRfc3dhcF9wYWdlcyhpbnQsIGludCk7XG4gZXh0ZXJuIHNlY3Rvcl90IHN3YXBkZXZfYmxvY2soaW50LCBwZ29mZl90KTtcbitpbnQgc3dhcGRldl9ibG9ja190b19vZmZzZXQoaW50IHR5cGUsIHNlY3Rvcl90IGJsb2NrLCBwZ29mZl90ICpvZmZzZXQpO1xuK2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbitcdFx0XHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpO1xuIGV4dGVybiBpbnQgX19zd2FwX2NvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcbiBleHRlcm4gYm9vbCBzd2FwX2VudHJ5X3N3YXBwZWQoc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLCBzd3BfZW50cnlfdCBlbnRyeSk7XG4gZXh0ZXJuIGludCBzd3Bfc3dhcGNvdW50KHN3cF9lbnRyeV90IGVudHJ5KTtcbkBAIC01MzUsNiArNTM4LDE5IEBAIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9zd2FwX2V4dGVudChzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqc2lzLFxuIHtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbitcbitzdGF0aWMgaW5saW5lIGludCBzd2FwZGV2X2Jsb2NrX3RvX29mZnNldChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssXG4rXHRcdFx0XHRcdCAgcGdvZmZfdCAqb2Zmc2V0KVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssXG4rXHRcdFx0XHRcdCAgcGdvZmZfdCAqb2Zmc2V0LFxuK1x0XHRcdFx0XHQgIHBnb2ZmX3QgKm5yX3BhZ2VzKVxuK3tcbitcdHJldHVybiAtRUlOVkFMO1xuK31cbiAjZW5kaWYgLyogQ09ORklHX1NXQVAgKi9cbiAjaWZkZWYgQ09ORklHX01FTUNHXG4gc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zd2FwcGluZXNzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc3VzcGVuZF9pb2N0bHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5pbmRleCBiY2NlMDRlMjFjMGRjLi41ZTIzYmY5MzYyNzdlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3N1c3BlbmRfaW9jdGxzLmhcbisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zdXNwZW5kX2lvY3Rscy5oXG5AQCAtMTMsNiArMTMsMzEgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xuIFx0X191MzIgZGV2O1xuIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4gXG4rI2RlZmluZSBVU1dTVVNQX0tFWV9OT05DRV9TSVpFIDE2XG4rI2RlZmluZSBVU1dTVVNQX1VTRVJfS0VZX1NJWkUgMzJcbitcbisvKlxuKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyB0aGUgb3BhcXVlIHdyYXBwZWQgaGliZXJuYXRlIGltYWdlXG4rICogZW5jcnlwdGlvbiBrZXkgYW5kIHN0YXJ0aW5nIG5vbmNlIGluIGVpdGhlciBkaXJlY3Rpb24uXG4rICovXG4rc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2Ige1xuK1x0X191MzIgYmxvYl9sZW47XG4rXHRfX3U4IGJsb2JbNTEyXTtcbitcdF9fdTggbm9uY2VbVVNXU1VTUF9LRVlfTk9OQ0VfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4rXG4rLypcbisgKiBBbGxvdyB1c2VyIG1vZGUgdG8gZm9sZCBpbiBrZXkgbWF0ZXJpYWwgZm9yIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGhpYmVybmF0ZVxuKyAqIGltYWdlLlxuKyAqL1xuK3N0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IHtcbitcdC8qIEtlcm5lbCByZXR1cm5zIHRoZSBtZXRhZGF0YSBzaXplOyByZXN1bWUgcGFzc2VzIHRoZSBzYXZlZCB2YWx1ZSBpbi4gKi9cbitcdF9fdTY0IG1ldGFfc2l6ZTtcbitcdF9fdTMyIGtleV9sZW47XG4rXHRfX3UzMiByZXNlcnZlZDtcbitcdF9fdTgga2V5W1VTV1NVU1BfVVNFUl9LRVlfU0laRV0gX19rZXJuZWxfbm9uc3RyaW5nO1xuK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7XG4rXG4gI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFHSUNcdCczJ1xuICNkZWZpbmUgU05BUFNIT1RfRlJFRVpFXHRcdFx0X0lPKFNOQVBTSE9UX0lPQ19NQUdJQywgMSlcbiAjZGVmaW5lIFNOQVBTSE9UX1VORlJFRVpFXHRcdF9JTyhTTkFQU0hPVF9JT0NfTUFHSUMsIDIpXG5AQCAtMjksNiArNTQsMTAgQEAgc3RydWN0IHJlc3VtZV9zd2FwX2FyZWEge1xuICNkZWZpbmUgU05BUFNIT1RfUFJFRl9JTUFHRV9TSVpFXHRfSU8oU05BUFNIT1RfSU9DX01BR0lDLCAxOClcbiAjZGVmaW5lIFNOQVBTSE9UX0FWQUlMX1NXQVBfU0laRVx0X0lPUihTTkFQU0hPVF9JT0NfTUFHSUMsIDE5LCBfX2tlcm5lbF9sb2ZmX3QpXG4gI2RlZmluZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0VcdF9JT1IoU05BUFNIT1RfSU9DX01BR0lDLCAyMCwgX19rZXJuZWxfbG9mZl90KVxuLSNkZWZpbmUgU05BUFNIT1RfSU9DX01BWE5SXHQyMFxuKyNkZWZpbmUgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05cdF9JT1dSKFNOQVBTSE9UX0lPQ19NQUdJQywgMjEsIFxcXG4rXHRcdFx0XHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYilcbisjZGVmaW5lIFNOQVBTSE9UX1NFVF9VU0VSX0tFWVx0XHRfSU9XUihTTkFQU0hPVF9JT0NfTUFHSUMsIDIyLCBcXFxuK1x0XHRcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpXG4rI2RlZmluZSBTTkFQU0hPVF9JT0NfTUFYTlJcdDIyXG4gXG4gI2VuZGlmIC8qIF9MSU5VWF9TVVNQRU5EX0lPQ1RMU19IICovXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuaW5kZXggNTMwYzg5NzMxMWQ0NC4uYTliZWU3MTU3MWNmYSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnXG4rKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZ1xuQEAgLTExNSw2ICsxMTUsMjEgQEAgY29uZmlnIEhJQkVSTkFUSU9OX0RFRl9DT01QXG4gXHRoZWxwXG4gXHQgIERlZmF1bHQgY29tcHJlc3NvciB0byBiZSB1c2VkIGZvciBoaWJlcm5hdGlvbi5cbiBcbitjb25maWcgRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rXHRib29sIFwiRW5jcnlwdGlvbiBzdXBwb3J0IGZvciB1c2Vyc3BhY2Ugc25hcHNob3RzXCJcbitcdGRlcGVuZHMgb24gSElCRVJOQVRJT05fU05BUFNIT1RfREVWXG4rXHRzZWxlY3QgQ1JZUFRPX0FFU1xuK1x0c2VsZWN0IENSWVBUT19HQ01cbitcdHNlbGVjdCBDUllQVE9fTElCX1NIQTI1NlxuK1x0aGVscFxuK1x0ICBFbmFibGUgc3VwcG9ydCBmb3Iga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gb2YgaGliZXJuYXRpb24gc25hcHNob3RzXG4rXHQgIGNyZWF0ZWQgYnkgdXN3c3VzcCB0b29scy4gQSB0cnVzdGVkIGVhcmx5IHVzZXJzcGFjZSBjb21wb25lbnQgbXVzdFxuK1x0ICBwcm92aWRlIHRoZSBzbmFwc2hvdCBlbmNyeXB0aW9uIHNlZWQgYmVmb3JlIGVuYWJsaW5nIGVuY3J5cHRpb24uXG4rXG4rXHQgIFNheSBOIGlmIHVzZXJzcGFjZSBoYW5kbGVzIHRoZSBpbWFnZSBlbmNyeXB0aW9uLlxuK1xuK1x0ICBJZiBpbiBkb3VidCwgc2F5IE4uXG4rXG4gY29uZmlnIFBNX1NURF9QQVJUSVRJT05cbiBcdHN0cmluZyBcIkRlZmF1bHQgcmVzdW1lIHBhcnRpdGlvblwiXG4gXHRkZXBlbmRzIG9uIEhJQkVSTkFUSU9OXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL01ha2VmaWxlIGIva2VybmVsL3Bvd2VyL01ha2VmaWxlXG5pbmRleCA3NzNlMjc4OTQxMmI5Li4yZmQzMWIyYTI1MGY1IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlXG4rKysgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGVcbkBAIC0xNiw2ICsxNiw3IEBAIG9iai0kKENPTkZJR19TVVNQRU5EKVx0XHQrPSBzdXNwZW5kLm9cbiBvYmotJChDT05GSUdfUE1fVEVTVF9TVVNQRU5EKVx0Kz0gc3VzcGVuZF90ZXN0Lm9cbiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pXHQrPSBoaWJlcm5hdGUubyBzbmFwc2hvdC5vIHN3YXAub1xuIG9iai0kKENPTkZJR19ISUJFUk5BVElPTl9TTkFQU0hPVF9ERVYpICs9IHVzZXIub1xuK29iai0kKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pICs9IHNuYXBlbmMub1xuIG9iai0kKENPTkZJR19QTV9BVVRPU0xFRVApXHQrPSBhdXRvc2xlZXAub1xuIG9iai0kKENPTkZJR19QTV9XQUtFTE9DS1MpXHQrPSB3YWtlbG9jay5vXG4gXG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG5pbmRleCBkMjQ3OWM2OWQ3MWE0Li4wYjg2MjZiZGY4MWE4IDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jXG4rKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmNcbkBAIC0zNiw2ICszNiw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjdHJhY2UvZXZlbnRzL3Bvd2VyLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInBvd2VyLmhcIlxuKyNpbmNsdWRlIFwidXNlci5oXCJcbiBcbiBcbiBzdGF0aWMgaW50IG5vY29tcHJlc3M7XG5AQCAtMTEzLDYgKzExNCwxNCBAQCBib29sIGhpYmVybmF0aW9uX2F2YWlsYWJsZSh2b2lkKVxuIFx0XHQhc2VjcmV0bWVtX2FjdGl2ZSgpIFx1MDAyNlx1MDAyNiAhY3hsX21lbV9hY3RpdmUoKTtcbiB9XG4gXG4rYm9vbCBoaWJlcm5hdGlvbl9zbmFwc2hvdF9kZXZfYXZhaWxhYmxlKHZvaWQpXG4re1xuK1x0cmV0dXJuIG5vaGliZXJuYXRlID09IDAgXHUwMDI2XHUwMDI2XG4rXHRcdCghc2VjdXJpdHlfbG9ja2VkX2Rvd24oTE9DS0RPV05fSElCRVJOQVRJT04pIHx8XG4rXHRcdCBJU19FTkFCTEVEKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pKSBcdTAwMjZcdTAwMjZcbitcdFx0IXNlY3JldG1lbV9hY3RpdmUoKSBcdTAwMjZcdTAwMjYgIWN4bF9tZW1fYWN0aXZlKCk7XG4rfVxuK1xuIC8qKlxuICAqIGhpYmVybmF0aW9uX3NldF9vcHMgLSBTZXQgdGhlIGdsb2JhbCBoaWJlcm5hdGUgb3BlcmF0aW9ucy5cbiAgKiBAb3BzOiBIaWJlcm5hdGlvbiBvcGVyYXRpb25zIHRvIHVzZSBpbiBzdWJzZXF1ZW50IGhpYmVybmF0aW9uIHRyYW5zaXRpb25zLlxuQEAgLTEzNzYsMTIgKzEzODUsMzUgQEAgc3RhdGljIHNzaXplX3QgcmVzZXJ2ZWRfc2l6ZV9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbiBcbiBwb3dlcl9hdHRyKHJlc2VydmVkX3NpemUpO1xuIFxuKyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3Rfc2VlZF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaixcbitcdFx0XHRcdCAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0cixcbitcdFx0XHRcdCAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4pXG4re1xuK1x0aW50IHJldDtcbitcbitcdHJldCA9IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChidWYsIG4pO1xuK1x0cmV0dXJuIHJldCA/IHJldCA6IG47XG4rfVxuK1xuK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgc25hcHNob3Rfc2VlZF9hdHRyID0ge1xuK1x0LmF0dHJcdD0ge1xuK1x0XHQubmFtZSA9IFwic25hcHNob3Rfc2VlZFwiLFxuK1x0XHQubW9kZSA9IDAyMDAsXG4rXHR9LFxuK1x0LnN0b3JlXHQ9IHNuYXBzaG90X3NlZWRfc3RvcmUsXG4rfTtcbisjZW5kaWZcbitcbiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZ1tdID0ge1xuIFx0XHUwMDI2ZGlza19hdHRyLmF0dHIsXG4gXHRcdTAwMjZyZXN1bWVfb2Zmc2V0X2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc3VtZV9hdHRyLmF0dHIsXG4gXHRcdTAwMjZpbWFnZV9zaXplX2F0dHIuYXR0cixcbiBcdFx1MDAyNnJlc2VydmVkX3NpemVfYXR0ci5hdHRyLFxuKyNpZmRlZiBDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OXG4rXHRcdTAwMjZzbmFwc2hvdF9zZWVkX2F0dHIuYXR0cixcbisjZW5kaWZcbiBcdE5VTEwsXG4gfTtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvcG93ZXIuaCBiL2tlcm5lbC9wb3dlci9wb3dlci5oXG5pbmRleCA3NWI2Mzg0Mzg4NmVlLi4zOWVmMDRiZTI4M2RkIDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmhcbisrKyBiL2tlcm5lbC9wb3dlci9wb3dlci5oXG5AQCAtMTYwLDYgKzE2MCw3IEBAIHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUge1xuIFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgc25hcHNob3RfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSk7XG4gZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc25hcHNob3RfZ2V0X2ltYWdlX3NpemUodm9pZCk7XG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpO1xuIGV4dGVybiBpbnQgc25hcHNob3RfcmVhZF9uZXh0KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gZXh0ZXJuIGludCBzbmFwc2hvdF93cml0ZV9uZXh0KHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG4gaW50IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSk7XG5AQCAtMTY3LDggKzE2OCwxMSBAQCBleHRlcm4gaW50IHNuYXBzaG90X2ltYWdlX2xvYWRlZChzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpO1xuIFxuIGV4dGVybiBib29sIGhpYmVybmF0ZV9hY3F1aXJlKHZvaWQpO1xuIGV4dGVybiB2b2lkIGhpYmVybmF0ZV9yZWxlYXNlKHZvaWQpO1xuK2Jvb2wgaGliZXJuYXRpb25fc25hcHNob3RfZGV2X2F2YWlsYWJsZSh2b2lkKTtcbiBcbiBleHRlcm4gc2VjdG9yX3QgYWxsb2Nfc3dhcGRldl9ibG9jayhpbnQgc3dhcCk7XG4rYm9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudCk7XG4rdTY0IHN3c3VzcF9zd2FwX21hcF9ieXRlcyh1NjQgaW1hZ2VfYnl0ZXMpO1xuIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXApO1xuIGV4dGVybiBpbnQgc3dzdXNwX3N3YXBfaW5fdXNlKHZvaWQpO1xuIFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwZW5jLmMgYi9rZXJuZWwvcG93ZXIvc25hcGVuYy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uY2QyOTgwM2VjNmM1YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIva2VybmVsL3Bvd2VyL3NuYXBlbmMuY1xuQEAgLTAsMCArMSw5NDAgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLyogVGhpcyBmaWxlIHByb3ZpZGVzIGVuY3J5cHRpb24gc3VwcG9ydCBmb3Igc3lzdGVtIHNuYXBzaG90cy4gKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcnlwdG8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vZ2NtLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vc2hhMi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjY3J5cHRvL3V0aWxzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9oZXguaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L211dGV4LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yYW5kb20uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuK1xuKyNpbmNsdWRlIFwicG93ZXIuaFwiXG4rI2luY2x1ZGUgXCJ1c2VyLmhcIlxuK1xuKyNkZWZpbmUgU05BUFNIT1RfU0VFRF9TSVpFIFNIQTI1Nl9ESUdFU1RfU0laRVxuKyNkZWZpbmUgU05BUFNIT1RfS0VZX0JMT0JfVkVSU0lPTiAxXG4rXG4rc3RhdGljIGNvbnN0IHU4IHNuYXBzaG90X2tleV9ibG9iX21hZ2ljWzhdID0ge1xuK1x0J1MnLCAnVycsICdTJywgJ1UnLCAnUycsICdQJywgJ0snLCAnMScsXG4rfTtcbitcbitzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkge1xuK1x0dTggbWFnaWNbc2l6ZW9mKHNuYXBzaG90X2tleV9ibG9iX21hZ2ljKV07XG4rXHRfX2xlMzIgdmVyc2lvbjtcbitcdHU4IHdyYXBfbm9uY2VbR0NNX0FFU19JVl9TSVpFXSBfX25vbnN0cmluZztcbitcdHU4IGVuY3J5cHRlZF9rZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4rXHR1OCB0YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XG4rfSBfX3BhY2tlZDtcbitcbitzdGF0aWMgREVGSU5FX01VVEVYKHNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuK3N0YXRpYyB1OCBzbmFwc2hvdF9zZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4rc3RhdGljIGJvb2wgc25hcHNob3Rfc2VlZF92YWxpZDtcbitcbitpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KVxuK3tcbitcdHU4IHNlZWRbU05BUFNIT1RfU0VFRF9TSVpFXSBfX25vbnN0cmluZztcbitcdHNpemVfdCBsZW4gPSBjb3VudDtcbitcdGludCByZXQ7XG4rXG4rXHRpZiAobGVuIFx1MDAyNlx1MDAyNiBidWZbbGVuIC0gMV0gPT0gJ1xcbicpXG4rXHRcdGxlbi0tO1xuK1x0aWYgKGxlbiAhPSBTTkFQU0hPVF9TRUVEX1NJWkUgKiAyKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHJldCA9IGhleDJiaW4oc2VlZCwgYnVmLCBzaXplb2Yoc2VlZCkpO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHRpZiAoc25hcHNob3Rfc2VlZF92YWxpZCkge1xuK1x0XHRyZXQgPSBjcnlwdG9fbWVtbmVxKHNuYXBzaG90X3NlZWQsIHNlZWQsIHNpemVvZihzZWVkKSkgPyAtRVBFUk0gOiAwO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdG1lbWNweShzbmFwc2hvdF9zZWVkLCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0c25hcHNob3Rfc2VlZF92YWxpZCA9IHRydWU7XG4rXHRwcl9pbmZvKFwiUE06IGhpYmVybmF0ZTogc25hcHNob3QgZW5jcnlwdGlvbiBzZWVkIGxvY2tlZFxcblwiKTtcbitcbitvdXQ6XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KHNlZWQsIHNpemVvZihzZWVkKSk7XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZCh1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0pXG4re1xuK1x0Ym9vbCB2YWxpZDtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c25hcHNob3Rfc2VlZF9tdXRleCk7XG4rXHR2YWxpZCA9IHNuYXBzaG90X3NlZWRfdmFsaWQ7XG4rXHRpZiAodmFsaWQpXG4rXHRcdG1lbWNweShzZWVkLCBzbmFwc2hvdF9zZWVkLCBTTkFQU0hPVF9TRUVEX1NJWkUpO1xuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnNuYXBzaG90X3NlZWRfbXV0ZXgpO1xuK1xuK1x0cmV0dXJuIHZhbGlkO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X2Rlcml2ZV93cmFwcGluZ19rZXkodTgga2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxuK3tcbitcdHN0YXRpYyBjb25zdCBjaGFyIGxhYmVsW10gPSBcIkxpbnV4IGhpYmVybmF0ZSBzbmFwc2hvdCBrZXkgd3JhcCB2MVwiO1xuK1x0dTggZGlnZXN0W1NIQTI1Nl9ESUdFU1RfU0laRV07XG4rXHR1OCBzZWVkW1NOQVBTSE9UX1NFRURfU0laRV0gX19ub25zdHJpbmc7XG4rXHRzdHJ1Y3Qgc2hhMjU2X2N0eCBzaGEyNTZfY3R4O1xuK1xuK1x0aWYgKCFzbmFwc2hvdF9jb3B5X2VuY3J5cHRpb25fc2VlZChzZWVkKSlcbitcdFx0cmV0dXJuIC1FTk9LRVk7XG4rXG4rXHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbitcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgbGFiZWwsIHN0cmxlbihsYWJlbCkpO1xuK1x0c2hhMjU2X3VwZGF0ZShcdTAwMjZzaGEyNTZfY3R4LCBzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0c2hhMjU2X2ZpbmFsKFx1MDAyNnNoYTI1Nl9jdHgsIGRpZ2VzdCk7XG4rXG4rXHRtZW1jcHkoa2V5LCBkaWdlc3QsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0bWVtemVyb19leHBsaWNpdChzZWVkLCBzaXplb2Yoc2VlZCkpO1xuK1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X2NyeXB0X3dyYXBwZWRfa2V5KHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbitcdFx0XHRcdCAgICAgIHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcbitcdFx0XHRcdCAgICAgIGJvb2wgZW5jcnlwdClcbit7XG4rXHR1OCB3cmFwX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbitcdHU4IGJ1ZltTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRV0gX19ub25zdHJpbmc7XG4rXHRzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbTtcbitcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcTtcbitcdHN0cnVjdCBzY2F0dGVybGlzdCBzZztcbitcdERFQ0xBUkVfQ1JZUFRPX1dBSVQod2FpdCk7XG4rXHRpbnQgcmM7XG4rXG4rXHRyYyA9IHNuYXBzaG90X2Rlcml2ZV93cmFwcGluZ19rZXkod3JhcF9rZXkpO1xuK1x0aWYgKHJjKVxuK1x0XHRyZXR1cm4gcmM7XG4rXG4rXHR0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChcImdjbShhZXMpXCIsIDAsIDApO1xuK1x0aWYgKElTX0VSUih0Zm0pKSB7XG4rXHRcdHJjID0gUFRSX0VSUih0Zm0pO1xuK1x0XHRnb3RvIG91dF9rZXk7XG4rXHR9XG4rXG4rXHRyYyA9IGNyeXB0b19hZWFkX3NldGtleSh0Zm0sIHdyYXBfa2V5LCBzaXplb2Yod3JhcF9rZXkpKTtcbitcdGlmIChyYylcbitcdFx0Z290byBvdXRfdGZtO1xuK1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZSh0Zm0sIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dF90Zm07XG4rXG4rXHRyZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2ModGZtLCBHRlBfS0VSTkVMKTtcbitcdGlmICghcmVxKSB7XG4rXHRcdHJjID0gLUVOT01FTTtcbitcdFx0Z290byBvdXRfdGZtO1xuK1x0fVxuK1xuK1x0aWYgKGVuY3J5cHQpIHtcbitcdFx0Z2V0X3JhbmRvbV9ieXRlcyh3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UsIHNpemVvZih3cmFwcGVkLVx1MDAzZXdyYXBfbm9uY2UpKTtcbitcdFx0bWVtY3B5KGJ1ZiwgaW1hZ2Vfa2V5LCBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFKTtcbitcdH0gZWxzZSB7XG4rXHRcdG1lbWNweShidWYsIHdyYXBwZWQtXHUwMDNlZW5jcnlwdGVkX2tleSwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHRcdG1lbWNweShidWYgKyBTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFLCB3cmFwcGVkLVx1MDAzZXRhZyxcbitcdFx0ICAgICAgIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK1x0fVxuK1xuK1x0c2dfaW5pdF9vbmUoXHUwMDI2c2csIGJ1Ziwgc2l6ZW9mKGJ1ZikpO1xuK1x0YWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIGNyeXB0b19yZXFfZG9uZSwgXHUwMDI2d2FpdCk7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2FkKHJlcSwgMCk7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgXHUwMDI2c2csIFx1MDAyNnNnLFxuK1x0XHRcdCAgICAgICBlbmNyeXB0ID8gU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSA6XG4rXHRcdFx0XHRcdCBzaXplb2YoYnVmKSxcbitcdFx0XHQgICAgICAgd3JhcHBlZC1cdTAwM2V3cmFwX25vbmNlKTtcbitcbitcdHJjID0gY3J5cHRvX3dhaXRfcmVxKGVuY3J5cHQgPyBjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSkgOlxuK1x0XHRcdFx0ICAgICAgIGNyeXB0b19hZWFkX2RlY3J5cHQocmVxKSxcbitcdFx0XHQgICAgIFx1MDAyNndhaXQpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dF9yZXE7XG4rXG4rXHRpZiAoZW5jcnlwdCkge1xuK1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2VlbmNyeXB0ZWRfa2V5LCBidWYsIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0XHRtZW1jcHkod3JhcHBlZC1cdTAwM2V0YWcsIGJ1ZiArIFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUsXG4rXHRcdCAgICAgICBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdH0gZWxzZSB7XG4rXHRcdG1lbWNweShpbWFnZV9rZXksIGJ1ZiwgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHR9XG4rXG4rb3V0X3JlcTpcbitcdGFlYWRfcmVxdWVzdF9mcmVlKHJlcSk7XG4rb3V0X3RmbTpcbitcdGNyeXB0b19mcmVlX2FlYWQodGZtKTtcbitvdXRfa2V5OlxuK1x0bWVtemVyb19leHBsaWNpdChidWYsIHNpemVvZihidWYpKTtcbitcdG1lbXplcm9fZXhwbGljaXQod3JhcF9rZXksIHNpemVvZih3cmFwX2tleSkpO1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbitzdGF0aWMgaW50IHNuYXBzaG90X3dyYXBfaW1hZ2Vfa2V5KGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSxcbitcdFx0XHRcdCAgIHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZClcbit7XG4rXHR1OCBrZXlbU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRV0gX19ub25zdHJpbmc7XG4rXHRpbnQgcmM7XG4rXG4rXHRtZW1zZXQod3JhcHBlZCwgMCwgc2l6ZW9mKCp3cmFwcGVkKSk7XG4rXHRtZW1jcHkod3JhcHBlZC1cdTAwM2VtYWdpYywgc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMsIHNpemVvZih3cmFwcGVkLVx1MDAzZW1hZ2ljKSk7XG4rXHR3cmFwcGVkLVx1MDAzZXZlcnNpb24gPSBjcHVfdG9fbGUzMihTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKTtcbitcbitcdG1lbWNweShrZXksIGltYWdlX2tleSwgc2l6ZW9mKGtleSkpO1xuK1x0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleSh3cmFwcGVkLCBrZXksIHRydWUpO1xuK1x0bWVtemVyb19leHBsaWNpdChrZXksIHNpemVvZihrZXkpKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KGNvbnN0IHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSAqd3JhcHBlZCxcbitcdFx0XHRcdCAgICAgdTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdKVxuK3tcbitcdHN0cnVjdCBzbmFwc2hvdF93cmFwcGVkX2tleSB0bXA7XG4rXHRpbnQgcmM7XG4rXG4rXHRpZiAobWVtY21wKHdyYXBwZWQtXHUwMDNlbWFnaWMsIHNuYXBzaG90X2tleV9ibG9iX21hZ2ljLFxuK1x0XHQgICBzaXplb2Yoc25hcHNob3Rfa2V5X2Jsb2JfbWFnaWMpKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRpZiAobGUzMl90b19jcHUod3JhcHBlZC1cdTAwM2V2ZXJzaW9uKSAhPSBTTkFQU0hPVF9LRVlfQkxPQl9WRVJTSU9OKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdHRtcCA9ICp3cmFwcGVkO1xuK1x0cmMgPSBzbmFwc2hvdF9jcnlwdF93cmFwcGVkX2tleShcdTAwMjZ0bXAsIGltYWdlX2tleSwgZmFsc2UpO1xuK1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ0bXAsIHNpemVvZih0bXApKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF9pbnN0YWxsX2ltYWdlX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdCAgICAgIGNvbnN0IHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSlcbit7XG4rXHRpbnQgcmM7XG4rXG4rXHRtZW1jcHkoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSwgaW1hZ2Vfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0XHRcdHNpemVvZihkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5KSk7XG4rXHRpZiAocmMpXG4rXHRcdG1lbXplcm9fZXhwbGljaXQoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0XHRcdCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1xuK1x0cmV0dXJuIHJjO1xuK31cbitcbisvKiBEZXJpdmUgYSBrZXkgZnJvbSB0aGUga2VybmVsIGFuZCB1c2VyIGtleXMgZm9yIGRhdGEgZW5jcnlwdGlvbi4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X3VzZV91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHR1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXTtcbitcdHN0cnVjdCBzaGEyNTZfY3R4IHNoYTI1Nl9jdHg7XG4rXHRpbnQgcmM7XG4rXG4rXHQvKlxuK1x0ICogSGFzaCB0aGUga2VybmVsIGtleSBhbmQgdGhlIHVzZXIga2V5IHRvZ2V0aGVyLiBUaGlzIGZvbGRzIGluIHRoZSB1c2VyXG4rXHQgKiBrZXksIGJ1dCBub3QgaW4gYSB3YXkgdGhhdCBnaXZlcyB0aGUgdXNlciBtb2RlIHByZWRpY3RhYmxlIGNvbnRyb2xcbitcdCAqIG92ZXIgdGhlIGtleSBiaXRzLlxuK1x0ICovXG4rXHRzaGEyNTZfaW5pdChcdTAwMjZzaGEyNTZfY3R4KTtcbitcbitcdHNoYTI1Nl91cGRhdGUoXHUwMDI2c2hhMjU2X2N0eCwgZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSxcbitcdFx0ICAgICAgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSk7XG4rXHRzaGEyNTZfdXBkYXRlKFx1MDAyNnNoYTI1Nl9jdHgsIGRhdGEtXHUwMDNldXNlcl9rZXksIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSk7XG4rXHRzaGEyNTZfZmluYWwoXHUwMDI2c2hhMjU2X2N0eCwgZGlnZXN0KTtcbitcbitcdEJVSUxEX0JVR19PTihTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFIFx1MDAzZSBTSEEyNTZfRElHRVNUX1NJWkUpO1xuK1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRrZXkoZGF0YS1cdTAwM2VhZWFkX3RmbSxcbitcdFx0XHRcdGRpZ2VzdCxcbitcdFx0XHRcdFNOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkUpO1xuK1x0bWVtemVyb19leHBsaWNpdChkaWdlc3QsIHNpemVvZihkaWdlc3QpKTtcbitcbitcdHJldHVybiByYztcbit9XG4rXG4rLyogQ2hlY2sgdG8gc2VlIGlmIGl0J3MgdGltZSB0byBzd2l0Y2ggdG8gdGhlIHVzZXIga2V5LCBhbmQgZG8gaXQgaWYgc28uICovXG4rc3RhdGljIGludCBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlbWV0YV9zaXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gZGF0YS1cdTAwM2VtZXRhX3NpemUpIHtcbitcdFx0cmV0dXJuIHNuYXBzaG90X3VzZV91c2VyX2tleShkYXRhKTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgbG9mZl90IHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KGxvZmZfdCBwbGFpbl9zaXplKTtcbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9zZXRfbWV0YV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLCB1NjQgbWV0YV9zaXplKVxuK3tcbitcdGRhdGEtXHUwMDNlbWV0YV9zaXplID0gbWV0YV9zaXplO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChtZXRhX3NpemUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgIHNpemVfdCBjb3VudClcbit7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCArPSBjb3VudDtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rfVxuK1xuKy8qIEVuY3J5cHQgbW9yZSBkYXRhIGZyb20gdGhlIHNuYXBzaG90IGludG8gdGhlIHN0YWdpbmcgYXJlYS4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X2VuY3J5cHRfcmVmaWxsKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSA9IGRhdGEtXHUwMDNlYWVhZF9yZXE7XG4rXHR1OCBub25jZVtHQ01fQUVTX0lWX1NJWkVdO1xuK1x0REVDTEFSRV9DUllQVE9fV0FJVCh3YWl0KTtcbitcdHNpemVfdCB0b3RhbCA9IDA7XG4rXHRpbnQgcGdfaWR4O1xuK1x0aW50IHJlcztcbitcbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID09IDApIHtcbitcdFx0c25hcHNob3Rfc2V0X21ldGFfc2l6ZShkYXRhLFxuK1x0XHRcdFx0ICAgICAgIHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVCk7XG4rXHR9IGVsc2Uge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF9jaGVja191c2VyX2tleV9zd2l0Y2goZGF0YSk7XG4rXHRcdGlmIChyZXMpXG4rXHRcdFx0cmV0dXJuIHJlcztcbitcdH1cbitcbitcdC8qXG4rXHQgKiBUaGUgZmlyc3QgYnVmZmVyIGlzIHRoZSBhc3NvY2lhdGVkIGRhdGEsIHNldCB0byB0aGUgb2Zmc2V0IHRvIHByZXZlbnRcbitcdCAqIGF0dGFja3MgdGhhdCByZWFycmFuZ2UgY2h1bmtzLlxuK1x0ICovXG4rXHRzZ19zZXRfYnVmKFx1MDAyNmRhdGEtXHUwMDNlc2dbMF0sIFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfdG90YWwsIHNpemVvZihkYXRhLVx1MDAzZWNyeXB0X3RvdGFsKSk7XG4rXG4rXHQvKiBMb2FkIHRoZSBjcnlwdCBidWZmZXIgd2l0aCBzbmFwc2hvdCBwYWdlcy4gKi9cbitcdGZvciAocGdfaWR4ID0gMDsgcGdfaWR4IFx1MDAzYyBDSFVOS19TSVpFOyBwZ19pZHgrKykge1xuK1x0XHR2b2lkICpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF07XG4rXG4rXHRcdC8qIFN0b3AgYXQgdGhlIG1ldGEgcGFnZSBib3VuZGFyeSBiZWZvcmUgc3dpdGNoaW5nIGtleXMuICovXG4rXHRcdGlmIChkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkIFx1MDAyNlx1MDAyNiB0b3RhbCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICgoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArIHRvdGFsKSA9PSBkYXRhLVx1MDAzZW1ldGFfc2l6ZSkpXG4rXHRcdFx0YnJlYWs7XG4rXG4rXHRcdHJlcyA9IHNuYXBzaG90X3JlYWRfbmV4dChcdTAwMjZkYXRhLVx1MDAzZWhhbmRsZSk7XG4rXHRcdGlmIChyZXMgXHUwMDNjIDApXG4rXHRcdFx0cmV0dXJuIHJlcztcbitcdFx0aWYgKHJlcyA9PSAwKVxuK1x0XHRcdGJyZWFrO1xuK1xuK1x0XHRXQVJOX09OKHJlcyAhPSBQQUdFX1NJWkUpO1xuK1xuK1x0XHQvKlxuK1x0XHQgKiBDb3B5IHRoZSBwYWdlIGludG8gdGhlIHN0YWdpbmcgYXJlYS4gQSBmdXR1cmUgb3B0aW1pemF0aW9uXG4rXHRcdCAqIGNvdWxkIHBvdGVudGlhbGx5IHNraXAgdGhpcyBjb3B5IGZvciBsb3dtZW0gcGFnZXMuXG4rXHRcdCAqL1xuK1x0XHRtZW1jcHkoYnVmLCBkYXRhX29mKGRhdGEtXHUwMDNlaGFuZGxlKSwgUEFHRV9TSVpFKTtcbitcdFx0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBidWYsIFBBR0VfU0laRSk7XG4rXHRcdHRvdGFsICs9IFBBR0VfU0laRTtcbitcdH1cbitcbitcdGlmICghdG90YWwpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBcdTAwMjZkYXRhLVx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuK1x0LypcbitcdCAqIFVzZSBpbmNyZW1lbnRpbmcgbm9uY2VzIGZvciBlYWNoIGNodW5rLCBzaW5jZSBhIDY0IGJpdCB2YWx1ZSB3b24ndFxuK1x0ICogcm9sbCBpbnRvIHJlLXVzZSBmb3IgYW55IGdpdmVuIGhpYmVybmF0ZSBpbWFnZS5cbitcdCAqL1xuK1x0bWVtY3B5KFx1MDAyNm5vbmNlWzBdLCBcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4rXHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuK1x0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbitcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICs9IDE7XG4rXHQvKiBUb3RhbCBkb2VzIG5vdCBpbmNsdWRlIEFBRCBvciB0aGUgYXV0aCB0YWcuICovXG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cdTAwM2VzZywgZGF0YS1cdTAwM2VzZywgdG90YWwsIG5vbmNlKTtcbitcdHJlcyA9IGNyeXB0b193YWl0X3JlcShjcnlwdG9fYWVhZF9lbmNyeXB0KHJlcSksIFx1MDAyNndhaXQpO1xuK1x0aWYgKHJlcylcbitcdFx0cmV0dXJuIHJlcztcbitcbitcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IHRvdGFsO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArPSB0b3RhbDtcbitcdHJldHVybiAwO1xuK31cbitcbisvKiBEZWNyeXB0IGRhdGEgZnJvbSB0aGUgc3RhZ2luZyBhcmVhIGFuZCBwdXNoIGl0IHRvIHRoZSBzbmFwc2hvdC4gKi9cbitzdGF0aWMgaW50IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0c3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxID0gZGF0YS1cdTAwM2VhZWFkX3JlcTtcbitcdHU4IG5vbmNlW0dDTV9BRVNfSVZfU0laRV07XG4rXHRERUNMQVJFX0NSWVBUT19XQUlUKHdhaXQpO1xuK1x0aW50IHBhZ2VfY291bnQ7XG4rXHRzaXplX3QgdG90YWw7XG4rXHRpbnQgcGdfaWR4O1xuK1x0aW50IHJlcztcbitcbitcdC8qIFNldCB1cCB0aGUgYXNzb2NpYXRlZCBkYXRhLiAqL1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzBdLCBcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X3RvdGFsLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuK1xuK1x0LypcbitcdCAqIEdldCB0aGUgbnVtYmVyIG9mIGZ1bGwgcGFnZXMsIHdoaWNoIGNvdWxkIGJlIHNob3J0IGF0IHRoZSBlbmQuIFRoZXJlXG4rXHQgKiBzaG91bGQgYWxzbyBiZSBhIHRhZyBhdCB0aGUgZW5kLCBzbyB0aGUgb2Zmc2V0IHdvbid0IGJlIGFuIGV2ZW4gcGFnZS5cbitcdCAqL1xuK1x0cGFnZV9jb3VudCA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0dG90YWwgPSBwYWdlX2NvdW50IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuK1x0aWYgKHRvdGFsID09IDAgfHwgdG90YWwgPT0gZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0LypcbitcdCAqIExvYWQgdGhlIHNnIGxpc3Qgd2l0aCB0aGUgY3J5cHQgYnVmZmVyLiBJbmxpbmUgZGVjcnlwdCBiYWNrIGludG8gdGhlXG4rXHQgKiBzdGFnaW5nIGJ1ZmZlci4gQSBmdXR1cmUgb3B0aW1pemF0aW9uIGNvdWxkIGRlY3J5cHQgZGlyZWN0bHkgaW50b1xuK1x0ICogbG93bWVtIHBhZ2VzLlxuK1x0ICovXG4rXHRmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCBcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspXG4rXHRcdHNnX3NldF9idWYoXHUwMDI2ZGF0YS1cdTAwM2VzZ1sxICsgcGdfaWR4XSwgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLCBQQUdFX1NJWkUpO1xuK1xuK1x0LypcbitcdCAqIEl0J3MgcG9zc2libGUgdGhpcyBpcyB0aGUgZmluYWwgZGVjcnlwdCwgb3IgdGhlIGZpbmFsIGRlY3J5cHQgb2YgdGhlXG4rXHQgKiBtZXRhIHJlZ2lvbiwgYW5kIHRoZXJlIGFyZSBmZXdlciB0aGFuIENIVU5LX1NJWkUgcGFnZXMuIElmIHRoaXMgaXNcbitcdCAqIHRoZSBjYXNlIHdlIHdvdWxkIGhhdmUganVzdCB3cml0dGVuIHRoZSBhdXRoIHRhZyBpbnRvIHRoZSBmaXJzdCBmZXdcbitcdCAqIGJ5dGVzIG9mIGEgbmV3IHBhZ2UuIENvcHkgdG8gdGhlIHRhZyBpZiBzby5cbitcdCAqL1xuK1x0aWYgKHBhZ2VfY291bnQgXHUwMDNjIENIVU5LX1NJWkUgXHUwMDI2XHUwMDI2XG4rXHQgICAgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gdG90YWwpID09IHNpemVvZihkYXRhLVx1MDAzZWF1dGhfdGFnKSkge1xuK1x0XHRtZW1jcHkoZGF0YS1cdTAwM2VhdXRoX3RhZywgZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdLFxuK1x0XHQgICAgICAgc2l6ZW9mKGRhdGEtXHUwMDNlYXV0aF90YWcpKTtcbitcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgIT1cbitcdFx0ICAgKChDSFVOS19TSVpFIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpKSB7XG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0fVxuK1xuK1x0c2dfc2V0X2J1ZihcdTAwMjZkYXRhLVx1MDAzZXNnWzEgKyBwZ19pZHhdLCBcdTAwMjZkYXRhLVx1MDAzZWF1dGhfdGFnLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLCAwLCBjcnlwdG9fcmVxX2RvbmUsIFx1MDAyNndhaXQpO1xuK1x0bWVtY3B5KFx1MDAyNm5vbmNlWzBdLCBcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2bm9uY2Vbc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KV0sXG4rXHQgICAgICAgXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLFxuK1x0ICAgICAgIHNpemVvZihub25jZSkgLSBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9sb3cpKTtcbitcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ICs9IDE7XG4rXHRhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgZGF0YS1cdTAwM2VzZywgZGF0YS1cdTAwM2VzZywgdG90YWwgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFLCBub25jZSk7XG4rXHRyZXMgPSBjcnlwdG9fd2FpdF9yZXEoY3J5cHRvX2FlYWRfZGVjcnlwdChyZXEpLCBcdTAwMjZ3YWl0KTtcbitcdGlmIChyZXMpXG4rXHRcdHJldHVybiByZXM7XG4rXG4rXHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgPSAwO1xuK1xuK1x0LyogUHVzaCB0aGUgZGVjcnlwdGVkIHBhZ2VzIGZ1cnRoZXIgZG93biB0aGUgc3RhY2suICovXG4rXHR0b3RhbCA9IDA7XG4rXHRmb3IgKHBnX2lkeCA9IDA7IHBnX2lkeCBcdTAwM2MgcGFnZV9jb3VudDsgcGdfaWR4KyspIHtcbitcdFx0dm9pZCAqYnVmID0gZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1twZ19pZHhdO1xuK1xuK1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbitcdFx0aWYgKHJlcyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmVzO1xuK1x0XHRpZiAocmVzID09IDApXG4rXHRcdFx0YnJlYWs7XG4rXG4rXHRcdGlmICghZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSkpXG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRcdFdBUk5fT04ocmVzICE9IFBBR0VfU0laRSk7XG4rXG4rXHRcdC8qIENvcHkgdGhlIGRlY3J5cHRlZCBwYWdlIGludG8gdGhlIHNuYXBzaG90IGltYWdlLiAqL1xuK1x0XHRtZW1jcHkoZGF0YV9vZihkYXRhLVx1MDAzZWhhbmRsZSksIGJ1ZiwgUEFHRV9TSVpFKTtcbitcdFx0dG90YWwgKz0gUEFHRV9TSVpFO1xuK1x0fVxuK1xuK1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgPT0gMCkge1xuK1x0XHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IHNuYXBzaG90X2dldF9tZXRhX3BhZ2VfY291bnQoKSBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVDtcbitcdFx0aWYgKGRhdGEtXHUwMDNldXNlcl9rZXlfdmFsaWQpXG4rXHRcdFx0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPVxuK1x0XHRcdFx0c25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQoZGF0YS1cdTAwM2VtZXRhX3NpemUpO1xuK1x0fVxuK1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF90b3RhbCArPSB0b3RhbDtcbitcdHJlcyA9IHNuYXBzaG90X2NoZWNrX3VzZXJfa2V5X3N3aXRjaChkYXRhKTtcbitcdGlmIChyZXMpXG4rXHRcdHJldHVybiByZXM7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgIHZvaWQgKipidWYpXG4re1xuK1x0c2l6ZV90IHRhZ19vZmY7XG4rXG4rXHQvKiBSZWZpbGwgdGhlIGVuY3J5cHRlZCBidWZmZXIgaWYgaXQncyBlbXB0eS4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgPT0gMCB8fFxuK1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2U9XG4rXHQgICAgIChkYXRhLVx1MDAzZWNyeXB0X3NpemUgKyBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKSkpIHtcbitcdFx0aW50IHJjO1xuK1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3NpemUgPSAwO1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCA9IDA7XG4rXHRcdHJjID0gc25hcHNob3RfZW5jcnlwdF9yZWZpbGwoZGF0YSk7XG4rXHRcdGlmIChyYyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9zaXplKVxuK1x0XHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9zaXplKSB7XG4rXHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdFx0c2l6ZV90IHBnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4rXHRcdCpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XG4rXHRcdHJldHVybiBQQUdFX1NJWkUgLSBwZ19vZmY7XG4rXHR9XG4rXG4rXHQvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi9cbitcdHRhZ19vZmYgPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCAtIGRhdGEtXHUwMDNlY3J5cHRfc2l6ZTtcbitcdGlmICh0YWdfb2ZmIFx1MDAzZSBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKVxuK1x0XHR0YWdfb2ZmID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRTtcbitcbitcdCpidWYgPSBkYXRhLVx1MDAzZWF1dGhfdGFnICsgdGFnX29mZjtcbitcdHJldHVybiBTTkFQU0hPVF9BVVRIX1RBR19TSVpFIC0gdGFnX29mZjtcbit9XG4rXG4rc3RhdGljIHNzaXplX3Qgc25hcHNob3Rfd3JpdGVfbmV4dF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgICAgdm9pZCAqKmJ1Zilcbit7XG4rXHRzaXplX3Qgc2l6ZV9hdmFpbDtcbitcdHNpemVfdCB0YWdfb2ZmO1xuK1xuK1x0LyogUmV0dXJuIGRhdGEgcGFnZXMgaWYgdGhlIG9mZnNldCBpcyBpbiB0aGF0IHJlZ2lvbi4gKi9cbitcdGlmIChkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2MgKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpKSB7XG4rXHRcdHNpemVfdCBwZ19pZHggPSBkYXRhLVx1MDAzZWNyeXB0X29mZnNldCBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVDtcbitcdFx0c2l6ZV90IHBnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IFx1MDAyNiAoUEFHRV9TSVpFIC0gMSk7XG4rXG4rXHRcdCpidWYgPSBkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW3BnX2lkeF0gKyBwZ19vZmY7XG4rXHRcdHNpemVfYXZhaWwgPSBQQUdFX1NJWkUgLSBwZ19vZmY7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBVc2Ugb2Zmc2V0cyBqdXN0IGJleW9uZCB0aGUgc2l6ZSB0byByZXR1cm4gdGhlIHRhZy4gKi9cbitcdFx0dGFnX29mZiA9IGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0IC0gKFBBR0VfU0laRSAqIENIVU5LX1NJWkUpO1xuK1x0XHRpZiAodGFnX29mZiBcdTAwM2UgU05BUFNIT1RfQVVUSF9UQUdfU0laRSlcbitcdFx0XHR0YWdfb2ZmID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRTtcbitcbitcdFx0KmJ1ZiA9IGRhdGEtXHUwMDNlYXV0aF90YWcgKyB0YWdfb2ZmO1xuK1x0XHRzaXplX2F2YWlsID0gU05BUFNIT1RfQVVUSF9UQUdfU0laRSAtIHRhZ19vZmY7XG4rXHR9XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4rXHQgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXHUwMDNjIGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSB7XG4rXHRcdHU2NCBtZXRhX2F2YWlsID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgLSBkYXRhLVx1MDAzZWNyeXB0X3N0cmVhbV90b3RhbDtcbitcbitcdFx0c2l6ZV9hdmFpbCA9IG1pbl90KHU2NCwgc2l6ZV9hdmFpbCwgbWV0YV9hdmFpbCk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gc2l6ZV9hdmFpbDtcbit9XG4rXG4rc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZwKVxuK3tcbitcdHNpemVfdCBjb3B5X3NpemU7XG4rXHRzaXplX3Qgbm90X2RvbmU7XG4rXHRzaXplX3QgcGdfb2ZmO1xuK1x0dm9pZCAqc3JjO1xuK1x0c3NpemVfdCBzcmNfc2l6ZTtcbitcbitcdGlmICghY291bnQpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0cGdfb2ZmID0gKm9mZnAgXHUwMDI2IChQQUdFX1NJWkUgLSAxKTtcbitcdGNvdW50ID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFIC0gcGdfb2ZmKTtcbitcbitcdHNyY19zaXplID0gc25hcHNob3RfcmVhZF9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZzcmMpO1xuK1x0aWYgKHNyY19zaXplIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIHNyY19zaXplO1xuK1xuK1x0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgc3JjX3NpemUpO1xuK1x0bm90X2RvbmUgPSBjb3B5X3RvX3VzZXIoYnVmLCBzcmMsIGNvcHlfc2l6ZSk7XG4rXHRjb3B5X3NpemUgLT0gbm90X2RvbmU7XG4rXHRpZiAoIWNvcHlfc2l6ZSlcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXG4rXHRkYXRhLVx1MDAzZWNyeXB0X29mZnNldCArPSBjb3B5X3NpemU7XG4rXHQqb2ZmcCArPSBjb3B5X3NpemU7XG4rXHRzbmFwc2hvdF9yZWNvcmRfZW5jcnlwdGVkX3JlYWQoZGF0YSwgY29weV9zaXplKTtcbitcdHJldHVybiBjb3B5X3NpemU7XG4rfVxuK1xuK3NzaXplX3Qgc25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0IGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxcbitcdFx0XHRcdCBsb2ZmX3QgKm9mZnApXG4re1xuK1x0c2l6ZV90IGNvcHlfc2l6ZTtcbitcdHNpemVfdCBub3RfZG9uZTtcbitcdHNpemVfdCBwZ19vZmY7XG4rXHR2b2lkICpkc3Q7XG4rXHRzc2l6ZV90IGRzdF9zaXplO1xuK1x0aW50IHJjO1xuK1xuK1x0aWYgKCFjb3VudClcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRwZ19vZmYgPSAqb2ZmcCBcdTAwMjYgKFBBR0VfU0laRSAtIDEpO1xuK1x0Y291bnQgPSBtaW5fdChzaXplX3QsIGNvdW50LCBQQUdFX1NJWkUgLSBwZ19vZmYpO1xuK1xuK1x0ZHN0X3NpemUgPSBzbmFwc2hvdF93cml0ZV9uZXh0X2VuY3J5cHRlZChkYXRhLCBcdTAwMjZkc3QpO1xuK1x0aWYgKGRzdF9zaXplIFx1MDAzYz0gMClcbitcdFx0cmV0dXJuIGRzdF9zaXplO1xuK1xuK1x0Y29weV9zaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgZHN0X3NpemUpO1xuK1x0bm90X2RvbmUgPSBjb3B5X2Zyb21fdXNlcihkc3QsIGJ1ZiwgY29weV9zaXplKTtcbitcdGNvcHlfc2l6ZSAtPSBub3RfZG9uZTtcbitcdGlmICghY29weV9zaXplKVxuK1x0XHRyZXR1cm4gLUVGQVVMVDtcbitcbitcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICs9IGNvcHlfc2l6ZTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsICs9IGNvcHlfc2l6ZTtcbitcdC8qXG4rXHQgKiBEcmFpbiB0aGUgZW5jcnlwdGVkIGJ1ZmZlciBpZiBpdCdzIGZ1bGwsIG9yIGlmIHdlIGhpdCB0aGUgZW5kIG9mIHRoZVxuK1x0ICogZW5jcnlwdGVkIG1ldGFkYXRhIGFuZCBuZWVkIGEga2V5IGNoYW5nZSBiZWZvcmUgdXNlciBkYXRhIHBhZ2VzLlxuK1x0ICovXG4rXHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9vZmZzZXQgXHUwMDNlPVxuK1x0ICAgIChQQUdFX1NJWkUgKiBDSFVOS19TSVpFKSArIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgfHxcbitcdCAgICAoZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgXHUwMDI2XHUwMDI2XG4rXHQgICAgIGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID09IGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSkge1xuK1x0XHRyYyA9IHNuYXBzaG90X2RlY3J5cHRfZHJhaW4oZGF0YSk7XG4rXHRcdGlmIChyYyBcdTAwM2MgMClcbitcdFx0XHRyZXR1cm4gcmM7XG4rXHR9XG4rXG4rXHQqb2ZmcCArPSBjb3B5X3NpemU7XG4rXHRyZXR1cm4gY29weV9zaXplO1xuK31cbitcbitzdGF0aWMgdm9pZCBzbmFwc2hvdF9yZXNldF9lbmNyeXB0aW9uX3N0YXRlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X3RvdGFsID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3RyZWFtX3RvdGFsID0gMDtcbitcdGRhdGEtXHUwMDNlbm9uY2VfbG93ID0gMDtcbitcdGRhdGEtXHUwMDNlbm9uY2VfaGlnaCA9IDA7XG4rXHRkYXRhLVx1MDAzZW1ldGFfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSA9IDA7XG4rXHRkYXRhLVx1MDAzZXVzZXJfa2V5X3ZhbGlkID0gZmFsc2U7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCA9IDA7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9oZWFkZXJfcmVzZXJ2ZWQgPSAwO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdG1lbXNldChkYXRhLVx1MDAzZWF1dGhfdGFnLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VhdXRoX3RhZykpO1xuK31cbitcbit2b2lkIHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aW50IGk7XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VhZWFkX3JlcSkge1xuK1x0XHRhZWFkX3JlcXVlc3RfZnJlZShkYXRhLVx1MDAzZWFlYWRfcmVxKTtcbitcdFx0ZGF0YS1cdTAwM2VhZWFkX3JlcSA9IE5VTEw7XG4rXHR9XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2VhZWFkX3RmbSkge1xuK1x0XHRjcnlwdG9fZnJlZV9hZWFkKGRhdGEtXHUwMDNlYWVhZF90Zm0pO1xuK1x0XHRkYXRhLVx1MDAzZWFlYWRfdGZtID0gTlVMTDtcbitcdH1cbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkrKykge1xuK1x0XHRpZiAoZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1tpXSkge1xuK1x0XHRcdGZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldKTtcbitcdFx0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gTlVMTDtcbitcdFx0fVxuK1x0fVxuK1xuK1x0bWVtemVyb19leHBsaWNpdChkYXRhLVx1MDAzZWVuY3J5cHRpb25fa2V5LCBzaXplb2YoZGF0YS1cdTAwM2VlbmNyeXB0aW9uX2tleSkpO1xuK1x0bWVtemVyb19leHBsaWNpdChkYXRhLVx1MDAzZXVzZXJfa2V5LCBzaXplb2YoZGF0YS1cdTAwM2V1c2VyX2tleSkpO1xuK1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbit9XG4rXG4rc3RhdGljIGludCBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHRpbnQgaSwgcmM7XG4rXG4rXHQvKiBUaGlzIG9ubHkgd29ya3Mgb25jZSBwZXIgaGliZXJuYXRlLiAqL1xuK1x0aWYgKGRhdGEtXHUwMDNlYWVhZF90Zm0pXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0c25hcHNob3RfcmVzZXRfZW5jcnlwdGlvbl9zdGF0ZShkYXRhKTtcbitcdG1lbXNldChkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzLCAwLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF9wYWdlcykpO1xuK1xuK1x0LyogU2V0IHVwIHRoZSBlbmNyeXB0aW9uIHRyYW5zZm9ybSAqL1xuK1x0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IGNyeXB0b19hbGxvY19hZWFkKFwiZ2NtKGFlcylcIiwgMCwgMCk7XG4rXHRpZiAoSVNfRVJSKGRhdGEtXHUwMDNlYWVhZF90Zm0pKSB7XG4rXHRcdHJjID0gUFRSX0VSUihkYXRhLVx1MDAzZWFlYWRfdGZtKTtcbitcdFx0ZGF0YS1cdTAwM2VhZWFkX3RmbSA9IE5VTEw7XG4rXHRcdHJldHVybiByYztcbitcdH1cbitcbitcdHJjID0gLUVOT01FTTtcbitcdGRhdGEtXHUwMDNlYWVhZF9yZXEgPSBhZWFkX3JlcXVlc3RfYWxsb2MoZGF0YS1cdTAwM2VhZWFkX3RmbSwgR0ZQX0tFUk5FTCk7XG4rXHRpZiAoIWRhdGEtXHUwMDNlYWVhZF9yZXEpXG4rXHRcdGdvdG8gc2V0dXBfZmFpbDtcbitcbitcdC8qIEFsbG9jYXRlIHRoZSBzdGFnaW5nIGFyZWEgKi9cbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIENIVU5LX1NJWkU7IGkrKykge1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3BhZ2VzW2ldID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7XG4rXHRcdGlmICghZGF0YS1cdTAwM2VjcnlwdF9wYWdlc1tpXSlcbitcdFx0XHRnb3RvIHNldHVwX2ZhaWw7XG4rXHR9XG4rXG4rXHRzZ19pbml0X3RhYmxlKGRhdGEtXHUwMDNlc2csIENIVU5LX1NJWkUgKyAyKTtcbitcbitcdC8qXG4rXHQgKiBUaGUgYXNzb2NpYXRlZCBkYXRhIHdpbGwgYmUgdGhlIG9mZnNldCBzbyB0aGF0IGJsb2NrcyBjYW4ndCBiZVxuK1x0ICogcmVhcnJhbmdlZC5cbitcdCAqL1xuK1x0YWVhZF9yZXF1ZXN0X3NldF9hZChkYXRhLVx1MDAzZWFlYWRfcmVxLCBzaXplb2YoZGF0YS1cdTAwM2VjcnlwdF90b3RhbCkpO1xuK1x0cmMgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZShkYXRhLVx1MDAzZWFlYWRfdGZtLCBTTkFQU0hPVF9BVVRIX1RBR19TSVpFKTtcbitcdGlmIChyYylcbitcdFx0Z290byBzZXR1cF9mYWlsO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rc2V0dXBfZmFpbDpcbitcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4rXHRyZXR1cm4gcmM7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSlcbit7XG4rXHRzdHJ1Y3Qgc25hcHNob3Rfd3JhcHBlZF9rZXkgd3JhcHBlZCA9IHt9O1xuK1x0dTggaW1hZ2Vfa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nID0ge307XG4rXHR1OCBub25jZVtVU1dTVVNQX0tFWV9OT05DRV9TSVpFXTtcbitcdGludCByYztcbitcbitcdC8qIERvbid0IHB1bGwgYSByYW5kb20ga2V5IGZyb20gYSB3b3JsZCB0aGF0IGNhbiBiZSByZXNldC4gKi9cbitcdGlmIChkYXRhLVx1MDAzZXJlYWR5KVxuK1x0XHRyZXR1cm4gLUVQSVBFO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbitcdGlmIChyYylcbitcdFx0cmV0dXJuIHJjO1xuK1xuK1x0LyogQnVpbGQgYSByYW5kb20gc3RhcnRpbmcgbm9uY2UuICovXG4rXHRnZXRfcmFuZG9tX2J5dGVzKG5vbmNlLCBzaXplb2Yobm9uY2UpKTtcbitcdG1lbWNweShcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgXHUwMDI2bm9uY2VbMF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2xvdykpO1xuK1x0bWVtY3B5KFx1MDAyNmRhdGEtXHUwMDNlbm9uY2VfaGlnaCwgXHUwMDI2bm9uY2VbOF0sIHNpemVvZihkYXRhLVx1MDAzZW5vbmNlX2hpZ2gpKTtcbitcbitcdC8qIEJ1aWxkIGFuZCBpbnN0YWxsIGEgcmFuZG9tIGltYWdlIGVuY3J5cHRpb24ga2V5LiAqL1xuK1x0Z2V0X3JhbmRvbV9ieXRlcyhpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbitcdHJjID0gc25hcHNob3RfaW5zdGFsbF9pbWFnZV9rZXkoZGF0YSwgaW1hZ2Vfa2V5KTtcbitcdGlmIChyYylcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF93cmFwX2ltYWdlX2tleShpbWFnZV9rZXksIFx1MDAyNndyYXBwZWQpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIGZhaWw7XG4rXG4rXHQvKiBIYW5kIHRoZSB3cmFwcGVkIGtleSBhbmQgY2xlYXIgbm9uY2UgYmFjayB0byB1c2VyIG1vZGUuICovXG4rXHRyYyA9IHB1dF91c2VyKHNpemVvZih3cmFwcGVkKSwgXHUwMDI2a2V5LVx1MDAzZWJsb2JfbGVuKTtcbitcdGlmIChyYylcbitcdFx0Z290byBmYWlsO1xuK1xuK1x0QlVJTERfQlVHX09OKHNpemVvZih3cmFwcGVkKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2YoKChzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiAqKTApLVx1MDAzZWJsb2IpKTtcbitcdGlmIChjb3B5X3RvX3VzZXIoXHUwMDI2a2V5LVx1MDAzZWJsb2IsIFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSkpIHtcbitcdFx0cmMgPSAtRUZBVUxUO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXG4rXHRpZiAoY29weV90b191c2VyKFx1MDAyNmtleS1cdTAwM2Vub25jZSwgXHUwMDI2bm9uY2UsIHNpemVvZihub25jZSkpKSB7XG4rXHRcdHJjID0gLUVGQVVMVDtcbitcdFx0Z290byBmYWlsO1xuK1x0fVxuK1xuK1x0bWVtemVyb19leHBsaWNpdChpbWFnZV9rZXksIHNpemVvZihpbWFnZV9rZXkpKTtcbitcdG1lbXplcm9fZXhwbGljaXQoXHUwMDI2d3JhcHBlZCwgc2l6ZW9mKHdyYXBwZWQpKTtcbitcdHJldHVybiAwO1xuK1xuK2ZhaWw6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0bWVtemVyb19leHBsaWNpdChcdTAwMjZ3cmFwcGVkLCBzaXplb2Yod3JhcHBlZCkpO1xuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbitcdHJldHVybiByYztcbit9XG4rXG4raW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iIF9fdXNlciAqa2V5KVxuK3tcbitcdHN0cnVjdCB1c3dzdXNwX2tleV9ibG9iICpibG9iO1xuK1x0c3RydWN0IHNuYXBzaG90X3dyYXBwZWRfa2V5IHdyYXBwZWQgPSB7fTtcbitcdHU4IGltYWdlX2tleVtTTkFQU0hPVF9FTkNSWVBUSU9OX0tFWV9TSVpFXSBfX25vbnN0cmluZyA9IHt9O1xuK1x0aW50IHJjO1xuK1xuK1x0LyogSXQncyB0b28gbGF0ZSBpZiBkYXRhJ3MgYmVlbiBwdXNoZWQgaW4uICovXG4rXHRpZiAoZGF0YS1cdTAwM2VoYW5kbGUuY3VyKVxuK1x0XHRyZXR1cm4gLUVQSVBFO1xuK1xuK1x0cmMgPSBzbmFwc2hvdF9zZXR1cF9lbmNyeXB0aW9uX2NvbW1vbihkYXRhKTtcbitcdGlmIChyYylcbitcdFx0cmV0dXJuIHJjO1xuK1xuK1x0LyogTG9hZCB0aGUga2V5IGZyb20gdXNlciBtb2RlLiAqL1xuK1x0YmxvYiA9IG1lbWR1cF91c2VyKGtleSwgc2l6ZW9mKCpibG9iKSk7XG4rXHRpZiAoSVNfRVJSKGJsb2IpKSB7XG4rXHRcdHJjID0gUFRSX0VSUihibG9iKTtcbitcdFx0Z290byBjcnlwdG9fc2V0dXBfZmFpbDtcbitcdH1cbitcbitcdGlmIChibG9iLVx1MDAzZWJsb2JfbGVuICE9IHNpemVvZih3cmFwcGVkKSkge1xuK1x0XHRyYyA9IC1FSU5WQUw7XG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXHR9XG4rXG4rXHRtZW1jcHkoXHUwMDI2d3JhcHBlZCwgYmxvYi1cdTAwM2VibG9iLCBzaXplb2Yod3JhcHBlZCkpO1xuK1x0cmMgPSBzbmFwc2hvdF91bndyYXBfaW1hZ2Vfa2V5KFx1MDAyNndyYXBwZWQsIGltYWdlX2tleSk7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXG4rXHRyYyA9IHNuYXBzaG90X2luc3RhbGxfaW1hZ2Vfa2V5KGRhdGEsIGltYWdlX2tleSk7XG4rXHRpZiAocmMpXG4rXHRcdGdvdG8gb3V0X2Jsb2I7XG4rXG4rXHQvKiBMb2FkIHRoZSBzdGFydGluZyBub25jZS4gKi9cbitcdG1lbWNweShcdTAwMjZkYXRhLVx1MDAzZW5vbmNlX2xvdywgXHUwMDI2YmxvYi1cdTAwM2Vub25jZVswXSwgc2l6ZW9mKGRhdGEtXHUwMDNlbm9uY2VfbG93KSk7XG4rXHRtZW1jcHkoXHUwMDI2ZGF0YS1cdTAwM2Vub25jZV9oaWdoLCBcdTAwMjZibG9iLVx1MDAzZW5vbmNlWzhdLCBzaXplb2YoZGF0YS1cdTAwM2Vub25jZV9oaWdoKSk7XG4rXG4rb3V0X2Jsb2I6XG4rXHRrZnJlZV9zZW5zaXRpdmUoYmxvYik7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIGNyeXB0b19zZXR1cF9mYWlsO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY3J5cHRvX3NldHVwX2ZhaWw6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNndyYXBwZWQsIHNpemVvZih3cmFwcGVkKSk7XG4rXHRtZW16ZXJvX2V4cGxpY2l0KGltYWdlX2tleSwgc2l6ZW9mKGltYWdlX2tleSkpO1xuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rc3RhdGljIGxvZmZfdCBzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChsb2ZmX3QgcGxhaW5fc2l6ZSlcbit7XG4rXHRsb2ZmX3QgcGFnZXMgPSBwbGFpbl9zaXplIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuK1x0bG9mZl90IGNodW5rcyA9IChwYWdlcyArIChDSFVOS19TSVpFIC0gMSkpIC8gQ0hVTktfU0laRTtcbitcdC8qXG4rXHQgKiBUaGUgZW5jcnlwdGVkIHNpemUgaXMgdGhlIG5vcm1hbCBzaXplLCBwbHVzIGEgc3RpdGNoZWQgaW5cbitcdCAqIGF1dGhlbnRpY2F0aW9uIHRhZyBmb3IgZXZlcnkgY2h1bmsgb2YgcGFnZXMuXG4rXHQgKi9cbitcdHJldHVybiBwbGFpbl9zaXplICsgKGNodW5rcyAqIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUpO1xuK31cbitcbitzdGF0aWMgbG9mZl90IHNuYXBzaG90X2VuY3J5cHRlZF9zcGxpdF9ieXRlX2NvdW50KGxvZmZfdCByYXdfc2l6ZSxcbitcdFx0XHRcdFx0XHQgIGxvZmZfdCBtZXRhX3BsYWluX3NpemUpXG4re1xuK1x0aWYgKHJhd19zaXplIFx1MDAzYz0gbWV0YV9wbGFpbl9zaXplKVxuK1x0XHRyZXR1cm4gc25hcHNob3RfZW5jcnlwdGVkX2J5dGVfY291bnQocmF3X3NpemUpO1xuK1xuK1x0cmV0dXJuIHNuYXBzaG90X2VuY3J5cHRlZF9ieXRlX2NvdW50KG1ldGFfcGxhaW5fc2l6ZSkgK1xuK1x0XHRzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSAtIG1ldGFfcGxhaW5fc2l6ZSk7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9zZXRfdXNlcl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0ICBzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSBfX3VzZXIgKmtleSlcbit7XG4rXHRzdHJ1Y3QgdXN3c3VzcF91c2VyX2tleSB1c2VyX2tleSA9IHt9O1xuK1x0dW5zaWduZWQgaW50IGtleV9sZW47XG4rXHR1NjQgc2l6ZTtcbitcdGludCByYztcbitcbitcdGlmICghc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGlmIChjb3B5X2Zyb21fdXNlcihcdTAwMjZ1c2VyX2tleSwga2V5LCBzaXplb2Yoc3RydWN0IHVzd3N1c3BfdXNlcl9rZXkpKSlcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGRhdGEtXHUwMDNldXNlcl9rZXkpIFx1MDAzYyBzaXplb2YodXNlcl9rZXkua2V5KSk7XG4rXHRyYyA9IC1FSU5WQUw7XG4rXHRpZiAodXNlcl9rZXkucmVzZXJ2ZWQpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKHVzZXJfa2V5LmtleV9sZW4gXHUwMDNlIHNpemVvZihkYXRhLVx1MDAzZXVzZXJfa2V5KSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAodXNlcl9rZXkua2V5X2xlbiBcdTAwM2MgOClcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZIFx1MDAyNlx1MDAyNiAhZGF0YS1cdTAwM2VyZWFkeSkge1xuK1x0XHRyYyA9IC1FTk9EQVRBO1xuK1x0XHRnb3RvIG91dDtcbitcdH1cbitcbitcdC8qXG4rXHQgKiBSZXR1cm4gdGhlIG1ldGFkYXRhIHNpemUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgZmVkIGluIGJlZm9yZVxuK1x0ICogdGhlIHVzZXIgZGF0YSBrZXkgaXMgbmVlZGVkIGF0IHJlc3VtZSB0aW1lLlxuK1x0ICovXG4rXHRpZiAoZGF0YS1cdTAwM2Vtb2RlID09IE9fV1JPTkxZIFx1MDAyNlx1MDAyNiAhZGF0YS1cdTAwM2VtZXRhX3NpemUpIHtcbitcdFx0aWYgKHVzZXJfa2V5Lm1ldGFfc2l6ZSBcdTAwM2MgUEFHRV9TSVpFICsgU05BUFNIT1RfQVVUSF9UQUdfU0laRSlcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0ZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemUgPSB1c2VyX2tleS5tZXRhX3NpemU7XG4rXHRcdHNpemUgPSBkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZTtcbitcdH0gZWxzZSB7XG4rXHRcdHNuYXBzaG90X3NldF9tZXRhX3NpemUoZGF0YSxcbitcdFx0XHRcdCAgICAgICBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpO1xuK1x0XHRzaXplID0gZGF0YS1cdTAwM2VjcnlwdF9tZXRhX3NpemU7XG4rXHR9XG4rXG4rXHRyYyA9IHB1dF91c2VyKHNpemUsIFx1MDAyNmtleS1cdTAwM2VtZXRhX3NpemUpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGtleV9sZW4gPSB1c2VyX2tleS5rZXlfbGVuO1xuK1xuK1x0LyogRG9uJ3QgYWxsb3cgaXQgaWYgaXQncyB0b28gbGF0ZS4gKi9cbitcdGlmICgoZGF0YS1cdTAwM2VtZXRhX3NpemUgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlY3J5cHRfdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlbWV0YV9zaXplKSB8fFxuK1x0ICAgIChkYXRhLVx1MDAzZWNyeXB0X21ldGFfc2l6ZSBcdTAwMjZcdTAwMjZcbitcdCAgICAgZGF0YS1cdTAwM2VjcnlwdF9zdHJlYW1fdG90YWwgXHUwMDNlIGRhdGEtXHUwMDNlY3J5cHRfbWV0YV9zaXplKSkge1xuK1x0XHRyYyA9IC1FQlVTWTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRtZW1zZXQoZGF0YS1cdTAwM2V1c2VyX2tleSwgMCwgc2l6ZW9mKGRhdGEtXHUwMDNldXNlcl9rZXkpKTtcbitcdG1lbWNweShkYXRhLVx1MDAzZXVzZXJfa2V5LCB1c2VyX2tleS5rZXksIGtleV9sZW4pO1xuK1x0ZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZCA9IHRydWU7XG4rXHQvKiBJbnN0YWxsIHRoZSBrZXkgaWYgdGhlIHVzZXIgaXMganVzdCB1bmRlciB0aGUgd2lyZS4gKi9cbitcdHJjID0gc25hcHNob3RfY2hlY2tfdXNlcl9rZXlfc3dpdGNoKGRhdGEpO1xuK1x0aWYgKHJjKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHJjID0gMDtcbitcbitvdXQ6XG4rXHRtZW16ZXJvX2V4cGxpY2l0KFx1MDAyNnVzZXJfa2V5LCBzaXplb2YodXNlcl9rZXkpKTtcbitcdHJldHVybiByYztcbit9XG4rXG4rbG9mZl90IHNuYXBzaG90X2dldF9lbmNyeXB0ZWRfaW1hZ2Vfc2l6ZShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0IGxvZmZfdCByYXdfc2l6ZSlcbit7XG4rXHRsb2ZmX3QgbWV0YV9wbGFpbl9zaXplID0gZGF0YS1cdTAwM2VtZXRhX3NpemU7XG4rXHRsb2ZmX3Qgc3BsaXRfc2l6ZTtcbitcbitcdGlmICghbWV0YV9wbGFpbl9zaXplKVxuK1x0XHRtZXRhX3BsYWluX3NpemUgPSBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KCkgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rXG4rXHRzcGxpdF9zaXplID0gc25hcHNob3RfZW5jcnlwdGVkX3NwbGl0X2J5dGVfY291bnQocmF3X3NpemUsXG4rXHRcdFx0XHRcdFx0XHQgbWV0YV9wbGFpbl9zaXplKTtcbitcdGlmICghZGF0YS1cdTAwM2V1c2VyX2tleV92YWxpZClcbitcdFx0cmV0dXJuIG1heChzbmFwc2hvdF9lbmNyeXB0ZWRfYnl0ZV9jb3VudChyYXdfc2l6ZSksIHNwbGl0X3NpemUpO1xuK1xuK1x0cmV0dXJuIHNwbGl0X3NpemU7XG4rfVxuK1xuK2ludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0aW50IHJjO1xuK1xuK1x0aWYgKGRhdGEtXHUwMDNlY3J5cHRfb2Zmc2V0ICE9IDApIHtcbitcdFx0cmMgPSBzbmFwc2hvdF9kZWNyeXB0X2RyYWluKGRhdGEpO1xuK1x0XHRpZiAocmMpXG4rXHRcdFx0cmV0dXJuIHJjO1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmNcbmluZGV4IGQ5MzNiNWIyYzA1ZDQuLjAyNDAwYWMxMjVjNTggMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuY1xuKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmNcbkBAIC0yMTc3LDYgKzIxNzcsMTEgQEAgdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSh2b2lkKVxuIFx0cmV0dXJuIG5yX2NvcHlfcGFnZXMgKyBucl9tZXRhX3BhZ2VzICsgMTtcbiB9XG4gXG4rdW5zaWduZWQgbG9uZyBzbmFwc2hvdF9nZXRfbWV0YV9wYWdlX2NvdW50KHZvaWQpXG4re1xuK1x0cmV0dXJuIG5yX21ldGFfcGFnZXMgKyAxO1xuK31cbitcbiBzdGF0aWMgaW50IGluaXRfaGVhZGVyKHN0cnVjdCBzd3N1c3BfaW5mbyAqaW5mbylcbiB7XG4gXHRtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzd3N1c3BfaW5mbykpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zd2FwLmMgYi9rZXJuZWwvcG93ZXIvc3dhcC5jXG5pbmRleCBjNjI2ZTlkYzNjMWMxLi4zYmRkNThkNWI2MmNiIDEwMDY0NFxuLS0tIGEva2VybmVsL3Bvd2VyL3N3YXAuY1xuKysrIGIva2VybmVsL3Bvd2VyL3N3YXAuY1xuQEAgLTE2Niw2ICsxNjYsMTA0IEBAIHN0YXRpYyBpbnQgc3dzdXNwX2V4dGVudHNfaW5zZXJ0KHVuc2lnbmVkIGxvbmcgc3dhcF9vZmZzZXQpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rc3RhdGljIGJvb2wgc3dzdXNwX2V4dGVudHNfY29udGFpbl9yYW5nZSh1bnNpZ25lZCBsb25nIHN3YXBfb2Zmc2V0LFxuK1x0XHRcdFx0XHQgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbit7XG4rXHRzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHN3c3VzcF9leHRlbnRzLnJiX25vZGU7XG4rXHRzdHJ1Y3Qgc3dzdXNwX2V4dGVudCAqZXh0O1xuK1x0dW5zaWduZWQgbG9uZyBlbmQ7XG4rXG4rXHRpZiAoIW5yX3BhZ2VzKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRlbmQgPSBzd2FwX29mZnNldCArIG5yX3BhZ2VzIC0gMTtcbitcdGlmIChlbmQgXHUwMDNjIHN3YXBfb2Zmc2V0KVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHR3aGlsZSAobm9kZSkge1xuK1x0XHRleHQgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3Qgc3dzdXNwX2V4dGVudCwgbm9kZSk7XG4rXHRcdGlmIChzd2FwX29mZnNldCBcdTAwM2MgZXh0LVx1MDAzZXN0YXJ0KVxuK1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX2xlZnQ7XG4rXHRcdGVsc2UgaWYgKHN3YXBfb2Zmc2V0IFx1MDAzZSBleHQtXHUwMDNlZW5kKVxuK1x0XHRcdG5vZGUgPSBub2RlLVx1MDAzZXJiX3JpZ2h0O1xuK1x0XHRlbHNlXG4rXHRcdFx0Z290byBmb3VuZDtcbitcdH1cbitcbitcdHJldHVybiBmYWxzZTtcbitcbitmb3VuZDpcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHN3YXBfb2Zmc2V0IFx1MDAzYyBleHQtXHUwMDNlc3RhcnQpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoZW5kIFx1MDAzYz0gZXh0LVx1MDAzZWVuZClcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0aWYgKGV4dC1cdTAwM2VlbmQgPT0gKHVuc2lnbmVkIGxvbmcpLTEpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0XHRzd2FwX29mZnNldCA9IGV4dC1cdTAwM2VlbmQgKyAxO1xuK1x0XHRub2RlID0gcmJfbmV4dChcdTAwMjZleHQtXHUwMDNlbm9kZSk7XG4rXHRcdGlmICghbm9kZSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRcdGV4dCA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzd3N1c3BfZXh0ZW50LCBub2RlKTtcbitcdH1cbit9XG4rXG4rYm9vbCBzd3N1c3Bfc3dhcF9yYW5nZV9hbGxvY2F0ZWQoaW50IHN3YXAsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rXHR1NjQgYmxvY2s7XG4rXHR1NjQgZW5kO1xuK1x0dTY0IGVuZF9ibG9jaztcbitcbitcdGlmIChzd2FwIFx1MDAzYyAwIHx8IHBvcyBcdTAwM2MgMCB8fCAhY291bnQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGVuZCA9ICh1NjQpcG9zICsgY291bnQgLSAxO1xuK1x0aWYgKGVuZCBcdTAwM2MgKHU2NClwb3MpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGJsb2NrID0gKHU2NClwb3MgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXHRlbmRfYmxvY2sgPSBlbmQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4rXG4rXHRmb3IgKDs7KSB7XG4rXHRcdHU2NCByZW1haW5pbmdfcGFnZXMgPSBlbmRfYmxvY2sgLSBibG9jayArIDE7XG4rXHRcdHBnb2ZmX3Qgc3dhcF9vZmZzZXQ7XG4rXHRcdHBnb2ZmX3QgbWFwcGVkX3BhZ2VzO1xuK1x0XHRzZWN0b3JfdCBwYWdlX2Jsb2NrID0gYmxvY2s7XG4rXHRcdHU2NCBwYWdlcztcbitcbitcdFx0aWYgKCFyZW1haW5pbmdfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoKHU2NClwYWdlX2Jsb2NrICE9IGJsb2NrKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0aWYgKHN3YXBkZXZfYmxvY2tfdG9fZXh0ZW50KHN3YXAsIHBhZ2VfYmxvY2ssIFx1MDAyNnN3YXBfb2Zmc2V0LFxuK1x0XHRcdFx0XHQgICAgXHUwMDI2bWFwcGVkX3BhZ2VzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmICghbWFwcGVkX3BhZ2VzKVxuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0cGFnZXMgPSBtaW5fdCh1NjQsIG1hcHBlZF9wYWdlcywgcmVtYWluaW5nX3BhZ2VzKTtcbitcdFx0aWYgKCh1NjQpKHVuc2lnbmVkIGxvbmcpcGFnZXMgIT0gcGFnZXMpXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHRpZiAoIXN3c3VzcF9leHRlbnRzX2NvbnRhaW5fcmFuZ2Uoc3dhcF9vZmZzZXQsIHBhZ2VzKSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRcdGlmIChwYWdlcyA9PSByZW1haW5pbmdfcGFnZXMpXG4rXHRcdFx0cmV0dXJuIHRydWU7XG4rXHRcdGJsb2NrICs9IHBhZ2VzO1xuK1x0fVxuK31cbitcbit1NjQgc3dzdXNwX3N3YXBfbWFwX2J5dGVzKHU2NCBpbWFnZV9ieXRlcylcbit7XG4rXHR1NjQgaW1hZ2VfcGFnZXMgPSBESVZfUk9VTkRfVVBfVUxMKGltYWdlX2J5dGVzLCBQQUdFX1NJWkUpO1xuK1x0dTY0IG1hcF9wYWdlcyA9IGltYWdlX3BhZ2VzIC8gTUFQX1BBR0VfRU5UUklFUyArIDE7XG4rXG4rXHRpZiAobWFwX3BhZ2VzIFx1MDAzZSBVNjRfTUFYIFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUKVxuK1x0XHRyZXR1cm4gVTY0X01BWDtcbitcbitcdHJldHVybiBtYXBfcGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4rfVxuK1xuIHNlY3Rvcl90IGFsbG9jX3N3YXBkZXZfYmxvY2soaW50IHN3YXApXG4ge1xuIFx0dW5zaWduZWQgbG9uZyBvZmZzZXQ7XG5kaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3VzZXIuYyBiL2tlcm5lbC9wb3dlci91c2VyLmNcbmluZGV4IGQwZmNmYmE3YWMyMzUuLjU3YjhjZTgzYTYyNmYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvcG93ZXIvdXNlci5jXG4rKysgYi9rZXJuZWwvcG93ZXIvdXNlci5jXG5AQCAtMjEsNTQgKzIxLDE4NSBAQFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NvbnNvbGUuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2NwdS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnJlZXplci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9zaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlY3VyaXR5LmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiBcbiAjaW5jbHVkZSBcInBvd2VyLmhcIlxuKyNpbmNsdWRlIFwidXNlci5oXCJcbiBcbiBzdGF0aWMgYm9vbCBuZWVkX3dhaXQ7XG4tXG4tc3RhdGljIHN0cnVjdCBzbmFwc2hvdF9kYXRhIHtcbi1cdHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgaGFuZGxlO1xuLVx0aW50IHN3YXA7XG4tXHRpbnQgbW9kZTtcbi1cdGJvb2wgZnJvemVuO1xuLVx0Ym9vbCByZWFkeTtcbi1cdGJvb2wgcGxhdGZvcm1fc3VwcG9ydDtcbi1cdGJvb2wgZnJlZV9iaXRtYXBzO1xuLVx0ZGV2X3QgZGV2O1xuLX0gc25hcHNob3Rfc3RhdGU7XG4rc3RydWN0IHNuYXBzaG90X2RhdGEgc25hcHNob3Rfc3RhdGU7XG4gXG4gaW50IGlzX2hpYmVybmF0ZV9yZXN1bWVfZGV2KGRldl90IGRldilcbiB7XG4gXHRyZXR1cm4gaGliZXJuYXRpb25fYXZhaWxhYmxlKCkgXHUwMDI2XHUwMDI2IHNuYXBzaG90X3N0YXRlLmRldiA9PSBkZXY7XG4gfVxuIFxuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rc3RhdGljIGJvb2wgc25hcHNob3RfZW5jcnlwdGVkX291dHB1dF9hY3RpdmUoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsIGRldl90IGRldilcbit7XG4rXHRyZXR1cm4gZGF0YS1cdTAwM2VlbmNyeXB0aW9uX3JlcXVpcmVkIFx1MDAyNlx1MDAyNiBkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkgXHUwMDI2XHUwMDI2XG4rXHRcdGRhdGEtXHUwMDNlcmVhZHkgXHUwMDI2XHUwMDI2IGRhdGEtXHUwMDNlZGV2ID09IGRldiBcdTAwMjZcdTAwMjZcbitcdFx0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID09IHRhc2tfdGdpZChjdXJyZW50KSBcdTAwMjZcdTAwMjZcbitcdFx0c25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpO1xuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9oZWFkZXJfd3JpdGVfcmFuZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rXHRsb2ZmX3QgaGVhZGVyX29mZnNldCA9IGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0O1xuK1x0bG9mZl90IG9mZnNldDtcbitcbitcdGlmIChwb3MgXHUwMDNjIGhlYWRlcl9vZmZzZXQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdG9mZnNldCA9IHBvcyAtIGhlYWRlcl9vZmZzZXQ7XG4rXHRyZXR1cm4gb2Zmc2V0IFx1MDAzYyBQQUdFX1NJWkUgXHUwMDI2XHUwMDI2IGNvdW50IFx1MDAzYz0gUEFHRV9TSVpFIC0gb2Zmc2V0O1xuK31cbitcbitzdGF0aWMgdTY0IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHU2NCBpbWFnZV9ieXRlcyA9IHJvdW5kX3VwKGRhdGEtXHUwMDNlY3J5cHRfYnl0ZXNfcmVhZCwgUEFHRV9TSVpFKTtcbitcdHU2NCBtYXBfYnl0ZXMgPSBzd3N1c3Bfc3dhcF9tYXBfYnl0ZXMoZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkKTtcbitcdHU2NCBidWRnZXQgPSBpbWFnZV9ieXRlcyArIG1hcF9ieXRlcztcbitcbitcdGlmIChpbWFnZV9ieXRlcyBcdTAwM2MgZGF0YS1cdTAwM2VjcnlwdF9ieXRlc19yZWFkIHx8IGJ1ZGdldCBcdTAwM2MgaW1hZ2VfYnl0ZXMpXG4rXHRcdHJldHVybiBVNjRfTUFYO1xuK1xuK1x0cmV0dXJuIGJ1ZGdldDtcbit9XG4rXG4rc3RhdGljIHZvaWQgc25hcHNob3RfcmVzZXRfc3dhcF93cml0ZV9yZXNlcnZhdGlvbihzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSlcbit7XG4rXHRzcGluX2xvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcdGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCA9IDA7XG4rXHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK31cbisjZW5kaWZcbitcbitlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZVxuK2hpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpbihkZXZfdCBkZXYsIGxvZmZfdCBwb3MsIHNpemVfdCBjb3VudClcbit7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4rXHRlbnVtIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZSB0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkU7XG4rXHRib29sIGltYWdlX3JhbmdlX2FsbG9jYXRlZDtcbitcdHU2NCBzd2FwX2J1ZGdldDtcbitcbitcdGlmICghY291bnQgfHwgIXNuYXBzaG90X2VuY3J5cHRlZF9vdXRwdXRfYWN0aXZlKGRhdGEsIGRldikpXG4rXHRcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbitcbitcdG11dGV4X2xvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuK1xuK1x0aWYgKCFzbmFwc2hvdF9lbmNyeXB0ZWRfb3V0cHV0X2FjdGl2ZShkYXRhLCBkZXYpKVxuK1x0XHRnb3RvIHVubG9jaztcbitcbitcdGltYWdlX3JhbmdlX2FsbG9jYXRlZCA9IHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZChkYXRhLVx1MDAzZXN3YXAsIHBvcywgY291bnQpO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rXHRzd2FwX2J1ZGdldCA9IHNuYXBzaG90X3N3YXBfd3JpdGVfYnVkZ2V0KGRhdGEpO1xuK1x0aWYgKHNuYXBzaG90X2hlYWRlcl93cml0ZV9yYW5nZShkYXRhLCBwb3MsIGNvdW50KSBcdTAwMjZcdTAwMjZcbitcdCAgICBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2M9IFBBR0VfU0laRSBcdTAwMjZcdTAwMjZcbitcdCAgICBQQUdFX1NJWkUgLSBkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCBcdTAwM2U9IGNvdW50KSB7XG4rXHRcdGRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkICs9IGNvdW50O1xuK1x0XHR0eXBlID0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX0hFQURFUjtcbitcdH0gZWxzZSBpZiAoaW1hZ2VfcmFuZ2VfYWxsb2NhdGVkIFx1MDAyNlx1MDAyNlxuK1x0XHQgICBzd2FwX2J1ZGdldCBcdTAwM2U9IGRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgc3dhcF9idWRnZXQgLSBkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgXHUwMDNlPSBjb3VudCkge1xuK1x0XHRkYXRhLVx1MDAzZWNyeXB0X3N3YXBfcmVzZXJ2ZWQgKz0gY291bnQ7XG4rXHRcdHR5cGUgPSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSU1BR0U7XG4rXHR9XG4rXHRzcGluX3VubG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK1xuK1x0aWYgKHR5cGUgPT0gSElCRVJOQVRFX1NOQVBTSE9UX1dSSVRFX05PTkUpXG4rXHRcdGdvdG8gdW5sb2NrO1xuK1xuK1x0cmV0dXJuIHR5cGU7XG4rXG4rdW5sb2NrOlxuK1x0bXV0ZXhfdW5sb2NrKFx1MDAyNnN5c3RlbV90cmFuc2l0aW9uX211dGV4KTtcbitcdHJldHVybiBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORTtcbisjZWxzZVxuK1x0cmV0dXJuIEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9OT05FO1xuKyNlbmRpZlxuK31cbitcbit2b2lkIGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmQoZW51bSBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGUgdHlwZSxcbitcdFx0XHRcdCAgc2l6ZV90IHJlc2VydmVkLCBzc2l6ZV90IHdyaXR0ZW4pXG4re1xuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSA9IFx1MDAyNnNuYXBzaG90X3N0YXRlO1xuK1x0dTY0ICpyZXNlcnZlZF90b3RhbDtcbitcdHNpemVfdCB1bnVzZWQ7XG4rXG4rXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfTk9ORSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFyZXNlcnZlZClcbitcdFx0Z290byB1bmxvY2s7XG4rXG4rXHRpZiAodHlwZSA9PSBISUJFUk5BVEVfU05BUFNIT1RfV1JJVEVfSEVBREVSKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZDtcbitcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjPSAwKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZDtcbitcdGVsc2UgaWYgKHdyaXR0ZW4gXHUwMDNjIHJlc2VydmVkKVxuK1x0XHR1bnVzZWQgPSByZXNlcnZlZCAtIHdyaXR0ZW47XG4rXHRlbHNlXG4rXHRcdGdvdG8gdW5sb2NrO1xuK1xuK1x0cmVzZXJ2ZWRfdG90YWwgPSB0eXBlID09IEhJQkVSTkFURV9TTkFQU0hPVF9XUklURV9IRUFERVIgP1xuK1x0XHRcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2hlYWRlcl9yZXNlcnZlZCA6IFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfc3dhcF9yZXNlcnZlZDtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZkYXRhLVx1MDAzZWNyeXB0X2xvY2spO1xuK1x0KnJlc2VydmVkX3RvdGFsIC09IG1pbl90KHU2NCwgKnJlc2VydmVkX3RvdGFsLCB1bnVzZWQpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2ZGF0YS1cdTAwM2VjcnlwdF9sb2NrKTtcbitcbit1bmxvY2s6XG4rXHRtdXRleF91bmxvY2soXHUwMDI2c3lzdGVtX3RyYW5zaXRpb25fbXV0ZXgpO1xuKyNlbmRpZlxuK31cbitcbitzdGF0aWMgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNlY3VyaXR5X2xvY2tlZF9kb3duKExPQ0tET1dOX0hJQkVSTkFUSU9OKTtcbitcdHJldHVybiBkYXRhLVx1MDAzZWVuY3J5cHRpb25fcmVxdWlyZWQ7XG4rfVxuK1xuIHN0YXRpYyBpbnQgc25hcHNob3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiB7XG4gXHRzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YTtcbiBcdHVuc2lnbmVkIGludCBzbGVlcF9mbGFncztcbiBcdGludCBlcnJvcjtcbiBcbi1cdGlmICghaGliZXJuYXRpb25fYXZhaWxhYmxlKCkpXG4rXHRpZiAoIWhpYmVybmF0aW9uX3NuYXBzaG90X2Rldl9hdmFpbGFibGUoKSlcbiBcdFx0cmV0dXJuIC1FUEVSTTtcbiBcbiBcdHNsZWVwX2ZsYWdzID0gbG9ja19zeXN0ZW1fc2xlZXAoKTtcbiBcbiBcdGlmICghaGliZXJuYXRlX2FjcXVpcmUoKSkge1xuIFx0XHRlcnJvciA9IC1FQlVTWTtcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFxuIFx0aWYgKChmaWxwLVx1MDAzZWZfZmxhZ3MgXHUwMDI2IE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7XG4gXHRcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XG4gXHRcdGVycm9yID0gLUVOT1NZUztcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuIFx0fVxuIFx0bm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7XG4gXHRkYXRhID0gXHUwMDI2c25hcHNob3Rfc3RhdGU7XG4gXHRmaWxwLVx1MDAzZXByaXZhdGVfZGF0YSA9IGRhdGE7XG4gXHRtZW1zZXQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlKSk7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHNwaW5fbG9ja19pbml0KFx1MDAyNmRhdGEtXHUwMDNlY3J5cHRfbG9jayk7XG4rXHRkYXRhLVx1MDAzZWNyeXB0X2J5dGVzX3JlYWQgPSAwO1xuK1x0ZGF0YS1cdTAwM2VjcnlwdF9zd2FwX3Jlc2VydmVkID0gMDtcbitcdGRhdGEtXHUwMDNlY3J5cHRfaGVhZGVyX3Jlc2VydmVkID0gMDtcbitcdGRhdGEtXHUwMDNlc3dhcF9oZWFkZXJfb2Zmc2V0ID0gMDtcbitcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IE5VTEw7XG4rI2VuZGlmXG4gXHRpZiAoKGZpbHAtXHUwMDNlZl9mbGFncyBcdTAwMjYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkge1xuIFx0XHQvKiBIaWJlcm5hdGluZy4gIFRoZSBpbWFnZSBkZXZpY2Ugc2hvdWxkIGJlIGFjY2Vzc2libGUuICovXG4gXHRcdGRhdGEtXHUwMDNlc3dhcCA9IHBpbl9oaWJlcm5hdGlvbl9zd2FwX3R5cGUoc3dzdXNwX3Jlc3VtZV9kZXZpY2UsIDApO1xuQEAgLTk5LDggKzIzMCwxMyBAQCBzdGF0aWMgaW50IHNuYXBzaG90X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApXG4gXHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4gXHRkYXRhLVx1MDAzZXBsYXRmb3JtX3N1cHBvcnQgPSBmYWxzZTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbitcdGRhdGEtXHUwMDNlZW5jcnlwdGlvbl9yZXF1aXJlZCA9IHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSk7XG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdGlmICghZXJyb3IpXG4rXHRcdGRhdGEtXHUwMDNlb3duZXJfdGdpZCA9IGdldF90YXNrX3BpZChjdXJyZW50LCBQSURUWVBFX1RHSUQpO1xuKyNlbmRpZlxuIFxuLSBVbmxvY2s6XG4rIHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIGVycm9yO1xuQEAgLTExNiw2ICsyNTIsMTAgQEAgc3RhdGljIGludCBzbmFwc2hvdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKVxuIFx0c3dzdXNwX2ZyZWUoKTtcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcdGRhdGEtXHUwMDNlZGV2ID0gMDtcbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1x0cHV0X3BpZChkYXRhLVx1MDAzZW93bmVyX3RnaWQpO1xuK1x0ZGF0YS1cdTAwM2Vvd25lcl90Z2lkID0gTlVMTDtcbisjZW5kaWZcbiBcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cdTAwM2Vzd2FwKTtcbiBcdHVucGluX2hpYmVybmF0aW9uX3N3YXBfdHlwZShkYXRhLVx1MDAzZXN3YXApO1xuIFx0aWYgKGRhdGEtXHUwMDNlZnJvemVuKSB7XG5AQCAtMTI1LDYgKzI2NSw3IEBAIHN0YXRpYyBpbnQgc25hcHNob3RfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscClcbiBcdH0gZWxzZSBpZiAoZGF0YS1cdTAwM2VmcmVlX2JpdG1hcHMpIHtcbiBcdFx0ZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcygpO1xuIFx0fVxuK1x0c25hcHNob3RfdGVhcmRvd25fZW5jcnlwdGlvbihkYXRhKTtcbiBcdHBtX25vdGlmaWVyX2NhbGxfY2hhaW4oZGF0YS1cdTAwM2Vtb2RlID09IE9fUkRPTkxZID9cbiBcdFx0XHRQTV9QT1NUX0hJQkVSTkFUSU9OIDogUE1fUE9TVF9SRVNUT1JFKTtcbiBcdGhpYmVybmF0ZV9yZWxlYXNlKCk7XG5AQCAtMTQ3LDEyICsyODgsMjMgQEAgc3RhdGljIHNzaXplX3Qgc25hcHNob3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZixcbiBcdGRhdGEgPSBmaWxwLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcdGlmICghZGF0YS1cdTAwM2VyZWFkeSkge1xuIFx0XHRyZXMgPSAtRU5PREFUQTtcbi1cdFx0Z290byBVbmxvY2s7XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSAtRVBFUk07XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChkYXRhLCBidWYsIGNvdW50LCBvZmZwKTtcbitcdFx0Z290byB1bmxvY2s7XG4gXHR9XG4rXG4gXHRpZiAoIXBnX29mZnApIHsgLyogb24gcGFnZSBib3VuZGFyeT8gKi9cbiBcdFx0cmVzID0gc25hcHNob3RfcmVhZF9uZXh0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiBcdFx0aWYgKHJlcyBcdTAwM2M9IDApXG4tXHRcdFx0Z290byBVbmxvY2s7XG4rXHRcdFx0Z290byB1bmxvY2s7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXMgPSBQQUdFX1NJWkUgLSBwZ19vZmZwO1xuIFx0fVxuQEAgLTE2Miw3ICszMTQsNyBAQCBzdGF0aWMgc3NpemVfdCBzbmFwc2hvdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLFxuIFx0aWYgKHJlcyBcdTAwM2UgMClcbiBcdFx0Km9mZnAgKz0gcmVzO1xuIFxuLSBVbmxvY2s6XG4rIHVubG9jazpcbiBcdHVubG9ja19zeXN0ZW1fc2xlZXAoc2xlZXBfZmxhZ3MpO1xuIFxuIFx0cmV0dXJuIHJlcztcbkBAIC0xODUsNiArMzM3LDE3IEBAIHN0YXRpYyBzc2l6ZV90IHNuYXBzaG90X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuIFxuIFx0ZGF0YSA9IGZpbHAtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFxuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSAtRVBFUk07XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuK1x0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRyZXMgPSBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoZGF0YSwgYnVmLCBjb3VudCwgb2ZmcCk7XG4rXHRcdGdvdG8gdW5sb2NrO1xuK1x0fVxuK1xuIFx0aWYgKCFwZ19vZmZwKSB7XG4gXHRcdHJlcyA9IHNuYXBzaG90X3dyaXRlX25leHQoXHUwMDI2ZGF0YS1cdTAwM2VoYW5kbGUpO1xuIFx0XHRpZiAocmVzIFx1MDAzYz0gMClcbkBAIC0yNTIsNiArNDE1LDkgQEAgc3RhdGljIGludCBzbmFwc2hvdF9zZXRfc3dhcF9hcmVhKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuIFx0aWYgKGRhdGEtXHUwMDNlc3dhcCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIHN3ZGV2ID8gLUVOT0RFViA6IC1FSU5WQUw7XG4gXHRkYXRhLVx1MDAzZWRldiA9IHN3ZGV2O1xuKyNpZiBkZWZpbmVkKENPTkZJR19FTkNSWVBURURfSElCRVJOQVRJT04pXG4rXHRkYXRhLVx1MDAzZXN3YXBfaGVhZGVyX29mZnNldCA9IChsb2ZmX3Qpb2Zmc2V0IFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuKyNlbmRpZlxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuQEAgLTMxOCw2ICs0ODQsMTEgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4rXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbiBcdFx0cG1fcmVzdG9yZV9nZnBfbWFzaygpO1xuIFx0XHRlcnJvciA9IGhpYmVybmF0aW9uX3NuYXBzaG90KGRhdGEtXHUwMDNlcGxhdGZvcm1fc3VwcG9ydCk7XG4gXHRcdGlmICghZXJyb3IpIHtcbkBAIC0zMjgsNiArNDk5LDE3IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfQVRPTUlDX1JFU1RPUkU6XG4rXHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX3JlcXVpcmVkKGRhdGEpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgIXNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSkge1xuK1x0XHRcdGVycm9yID0gLUVQRVJNO1xuK1x0XHRcdGJyZWFrO1xuK1x0XHR9XG4rXHRcdGlmIChzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbitcdFx0XHRlcnJvciA9IHNuYXBzaG90X2ZpbmFsaXplX2RlY3J5cHRlZF9pbWFnZShkYXRhKTtcbitcdFx0XHRpZiAoZXJyb3IpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0fVxuK1xuIFx0XHRlcnJvciA9IHNuYXBzaG90X3dyaXRlX2ZpbmFsaXplKFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlKTtcbiBcdFx0aWYgKGVycm9yKVxuIFx0XHRcdGJyZWFrO1xuQEAgLTM0Niw2ICs1MjgsNyBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0c3dzdXNwX2ZyZWUoKTtcbiBcdFx0bWVtc2V0KFx1MDAyNmRhdGEtXHUwMDNlaGFuZGxlLCAwLCBzaXplb2Yoc3RydWN0IHNuYXBzaG90X2hhbmRsZSkpO1xuIFx0XHRkYXRhLVx1MDAzZXJlYWR5ID0gZmFsc2U7XG4rXHRcdHNuYXBzaG90X3RlYXJkb3duX2VuY3J5cHRpb24oZGF0YSk7XG4gXHRcdC8qXG4gXHRcdCAqIEl0IGlzIG5lY2Vzc2FyeSB0byB0aGF3IGtlcm5lbCB0aHJlYWRzIGhlcmUsIGJlY2F1c2VcbiBcdFx0ICogU05BUFNIT1RfQ1JFQVRFX0lNQUdFIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5IGFmdGVyXG5AQCAtMzY4LDYgKzU1MSw4IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHR9XG4gXHRcdHNpemUgPSBzbmFwc2hvdF9nZXRfaW1hZ2Vfc2l6ZSgpO1xuIFx0XHRzaXplIFx1MDAzY1x1MDAzYz0gUEFHRV9TSElGVDtcbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fZW5hYmxlZChkYXRhKSlcbitcdFx0XHRzaXplID0gc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKGRhdGEsIHNpemUpO1xuIFx0XHRlcnJvciA9IHB1dF91c2VyKHNpemUsIChsb2ZmX3QgX191c2VyICopYXJnKTtcbiBcdFx0YnJlYWs7XG4gXG5AQCAtMzk3LDYgKzU4Miw5IEBAIHN0YXRpYyBsb25nIHNuYXBzaG90X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLFxuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4gXHRcdGZyZWVfYWxsX3N3YXBfcGFnZXMoZGF0YS1cdTAwM2Vzd2FwKTtcbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1x0XHRzbmFwc2hvdF9yZXNldF9zd2FwX3dyaXRlX3Jlc2VydmF0aW9uKGRhdGEpO1xuKyNlbmRpZlxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU05BUFNIT1RfUzJSQU06XG5AQCAtNDA0LDYgKzU5MiwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0XHRlcnJvciA9IC1FUEVSTTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuK1x0XHRpZiAoc25hcHNob3RfZW5jcnlwdGlvbl9yZXF1aXJlZChkYXRhKSBcdTAwMjZcdTAwMjZcbitcdFx0ICAgICFzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoZGF0YSkpIHtcbitcdFx0XHRlcnJvciA9IC1FUEVSTTtcbitcdFx0XHRicmVhaztcbitcdFx0fVxuIFx0XHQvKlxuIFx0XHQgKiBUYXNrcyBhcmUgZnJvemVuIGFuZCB0aGUgbm90aWZpZXJzIGhhdmUgYmVlbiBjYWxsZWQgd2l0aFxuIFx0XHQgKiBQTV9ISUJFUk5BVElPTl9QUkVQQVJFXG5AQCAtNDE3LDYgKzYxMCwxMSBAQCBzdGF0aWMgbG9uZyBzbmFwc2hvdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCxcbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIFNOQVBTSE9UX1BPV0VSX09GRjpcbitcdFx0aWYgKHNuYXBzaG90X2VuY3J5cHRpb25fcmVxdWlyZWQoZGF0YSkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKGRhdGEpKSB7XG4rXHRcdFx0ZXJyb3IgPSAtRVBFUk07XG4rXHRcdFx0YnJlYWs7XG4rXHRcdH1cbiBcdFx0aWYgKGRhdGEtXHUwMDNlcGxhdGZvcm1fc3VwcG9ydClcbiBcdFx0XHRlcnJvciA9IGhpYmVybmF0aW9uX3BsYXRmb3JtX2VudGVyKCk7XG4gXHRcdGJyZWFrO1xuQEAgLTQyNSw2ICs2MjMsMTcgQEAgc3RhdGljIGxvbmcgc25hcHNob3RfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsXG4gXHRcdGVycm9yID0gc25hcHNob3Rfc2V0X3N3YXBfYXJlYShkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuIFx0XHRicmVhaztcbiBcbitcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4rXHRcdGlmIChkYXRhLVx1MDAzZW1vZGUgPT0gT19SRE9OTFkpXG4rXHRcdFx0ZXJyb3IgPSBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXkoZGF0YSwgKHZvaWQgX191c2VyICopYXJnKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGVycm9yID0gc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4rXHRcdGJyZWFrO1xuK1xuK1x0Y2FzZSBTTkFQU0hPVF9TRVRfVVNFUl9LRVk6XG4rXHRcdGVycm9yID0gc25hcHNob3Rfc2V0X3VzZXJfa2V5KGRhdGEsICh2b2lkIF9fdXNlciAqKWFyZyk7XG4rXHRcdGJyZWFrO1xuK1xuIFx0ZGVmYXVsdDpcbiBcdFx0ZXJyb3IgPSAtRU5PVFRZO1xuIFxuQEAgLTQ0OCw2ICs2NTcsOCBAQCBzbmFwc2hvdF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0Y2FzZSBTTkFQU0hPVF9BTExPQ19TV0FQX1BBR0U6XG4gXHRjYXNlIFNOQVBTSE9UX0NSRUFURV9JTUFHRTpcbiBcdGNhc2UgU05BUFNIT1RfU0VUX1NXQVBfQVJFQTpcbitcdGNhc2UgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT046XG4rXHRjYXNlIFNOQVBTSE9UX1NFVF9VU0VSX0tFWTpcbiBcdFx0cmV0dXJuIHNuYXBzaG90X2lvY3RsKGZpbGUsIGNtZCxcbiBcdFx0XHRcdCAgICAgICh1bnNpZ25lZCBsb25nKSBjb21wYXRfcHRyKGFyZykpO1xuIFx0ZGVmYXVsdDpcbmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvdXNlci5oIGIva2VybmVsL3Bvd2VyL3VzZXIuaFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjRkZjJmOWFlOWFkYTRcbi0tLSAvZGV2L251bGxcbisrKyBiL2tlcm5lbC9wb3dlci91c2VyLmhcbkBAIC0wLDAgKzEsMTUxIEBAXG4rLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9jcnlwdG8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjYXR0ZXJsaXN0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zcGlubG9jay5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3VzcGVuZF9pb2N0bHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2NyeXB0by9hZWFkLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NjcnlwdG8vYWVzLmhcdTAwM2VcbitcbitzdHJ1Y3QgcGlkO1xuK1xuKyNkZWZpbmUgU05BUFNIT1RfRU5DUllQVElPTl9LRVlfU0laRSBBRVNfS0VZU0laRV8xMjhcbisjZGVmaW5lIFNOQVBTSE9UX0FVVEhfVEFHX1NJWkUgMTZcbitcbisvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBwYWdlcyBpbiBhIHNpbmdsZSBBRUFEIGVuY3J5cHRpb24gY2h1bmsuICovXG4rI2RlZmluZSBDSFVOS19TSVpFIDE2XG4rXG4rc3RydWN0IHNuYXBzaG90X2RhdGEge1xuK1x0c3RydWN0IHNuYXBzaG90X2hhbmRsZSBoYW5kbGU7XG4rXHRpbnQgc3dhcDtcbitcdGludCBtb2RlO1xuK1x0Ym9vbCBmcm96ZW47XG4rXHRib29sIHJlYWR5O1xuK1x0Ym9vbCBwbGF0Zm9ybV9zdXBwb3J0O1xuK1x0Ym9vbCBmcmVlX2JpdG1hcHM7XG4rXHRib29sIGVuY3J5cHRpb25fcmVxdWlyZWQ7XG4rXHRkZXZfdCBkZXY7XG4rXG4rI2lmIGRlZmluZWQoQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTilcbitcdHN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZF90Zm07XG4rXHRzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICphZWFkX3JlcTtcbitcdHZvaWQgKmNyeXB0X3BhZ2VzW0NIVU5LX1NJWkVdO1xuK1x0dTggYXV0aF90YWdbU05BUFNIT1RfQVVUSF9UQUdfU0laRV07XG4rXHRzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQ0hVTktfU0laRSArIDJdOyAvKiBBZGQgcm9vbSBmb3IgQUQgYW5kIGF1dGggdGFnLiAqL1xuK1x0c2l6ZV90IGNyeXB0X29mZnNldDtcbitcdHNpemVfdCBjcnlwdF9zaXplO1xuK1x0dTY0IGNyeXB0X3RvdGFsO1xuK1x0dTY0IGNyeXB0X3N0cmVhbV90b3RhbDtcbitcdHU2NCBub25jZV9sb3c7XG4rXHR1NjQgbm9uY2VfaGlnaDtcbitcdHU4IGVuY3J5cHRpb25fa2V5W1NOQVBTSE9UX0VOQ1JZUFRJT05fS0VZX1NJWkVdIF9fbm9uc3RyaW5nO1xuK1x0dTggdXNlcl9rZXlbVVNXU1VTUF9VU0VSX0tFWV9TSVpFXSBfX25vbnN0cmluZztcbitcdGJvb2wgdXNlcl9rZXlfdmFsaWQ7XG4rXHR1NjQgbWV0YV9zaXplO1xuK1x0dTY0IGNyeXB0X21ldGFfc2l6ZTtcbitcdC8qXG4rXHQgKiBQcm90ZWN0cyBjcnlwdF9ieXRlc19yZWFkIGFuZCB0aGUgcmVzZXJ2YXRpb24gY291bnRlcnMgYmVsb3cuXG4rXHQgKiBjcnlwdF9zd2FwX3Jlc2VydmVkIGNvdmVycyBlbmNyeXB0ZWQgc25hcHNob3QgYnl0ZXMgYW5kIHVzZXJzcGFjZVxuK1x0ICogZ2VuZXJhdGVkIHN3YXAtbWFwIHBhZ2VzLlxuK1x0ICovXG4rXHRzcGlubG9ja190IGNyeXB0X2xvY2s7XG4rXHR1NjQgY3J5cHRfYnl0ZXNfcmVhZDtcbitcdHU2NCBjcnlwdF9zd2FwX3Jlc2VydmVkO1xuK1x0dTY0IGNyeXB0X2hlYWRlcl9yZXNlcnZlZDtcbitcdGxvZmZfdCBzd2FwX2hlYWRlcl9vZmZzZXQ7XG4rXHRzdHJ1Y3QgcGlkICpvd25lcl90Z2lkO1xuKyNlbmRpZlxuK1xuK307XG4rXG4rZXh0ZXJuIHN0cnVjdCBzbmFwc2hvdF9kYXRhIHNuYXBzaG90X3N0YXRlO1xuK1xuKy8qIGtlcm5lbC9wb3dlci9zbmFwZW5jLmMgcm91dGluZXMgKi9cbisjaWYgZGVmaW5lZChDT05GSUdfRU5DUllQVEVEX0hJQkVSTkFUSU9OKVxuK1xuK3NzaXplX3Qgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcCk7XG4rXG4rc3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHQgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuK1x0XHRcdFx0IGxvZmZfdCAqb2ZmcCk7XG4rXG4rdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcbitpbnQgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5KHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0c3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpO1xuK1xuK2ludCBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXkoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRzdHJ1Y3QgdXN3c3VzcF9rZXlfYmxvYiBfX3VzZXIgKmtleSk7XG4rXG4raW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHQgIHN0cnVjdCB1c3dzdXNwX3VzZXJfa2V5IF9fdXNlciAqa2V5KTtcbitcbitpbnQgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTtcbitcbitsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0XHQgbG9mZl90IHJhd19zaXplKTtcbitcbitpbnQgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKTtcbitcbitzdGF0aWMgaW5saW5lIGJvb2wgc25hcHNob3RfZW5jcnlwdGlvbl9lbmFibGVkKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKVxuK3tcbitcdHJldHVybiBkYXRhLVx1MDAzZWFlYWRfdGZtO1xuK31cbitcbisjZWxzZVxuK1xuK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZChzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LFxuK1x0XHRcdFx0XHQgICAgICBsb2ZmX3QgKm9mZnApXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEsXG4rXHRcdFx0XHRcdCAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLFxuK1x0XHRcdFx0XHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnApXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmFwc2hvdF90ZWFyZG93bl9lbmNyeXB0aW9uKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhKSB7fVxuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X2dldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0ICAgICAgc3RydWN0IHVzd3N1c3Bfa2V5X2Jsb2IgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3NldF91c2VyX2tleShzdHJ1Y3Qgc25hcHNob3RfZGF0YSAqZGF0YSxcbitcdFx0XHRcdFx0c3RydWN0IHVzd3N1c3BfdXNlcl9rZXkgX191c2VyICprZXkpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgaW50IHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZChjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudClcbit7XG4rXHRyZXR1cm4gLUVOT1RUWTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBsb2ZmX3Qgc25hcHNob3RfZ2V0X2VuY3J5cHRlZF9pbWFnZV9zaXplKHN0cnVjdCBzbmFwc2hvdF9kYXRhICpkYXRhLFxuK1x0XHRcdFx0XHRcdCAgICAgICBsb2ZmX3QgcmF3X3NpemUpXG4re1xuK1x0cmV0dXJuIHJhd19zaXplO1xuK31cbitcbitzdGF0aWMgaW5saW5lIGludCBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2Uoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0cmV0dXJuIC1FTk9UVFk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBzbmFwc2hvdF9lbmNyeXB0aW9uX2VuYWJsZWQoc3RydWN0IHNuYXBzaG90X2RhdGEgKmRhdGEpXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbisjZW5kaWZcbmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuY1xuaW5kZXggNzhiNDliMDY1OGFkZC4uMTFkZjBjNTU2ZjRlOSAxMDA2NDRcbi0tLSBhL21tL3N3YXBmaWxlLmNcbisrKyBiL21tL3N3YXBmaWxlLmNcbkBAIC0yMzY2LDYgKzIzNjYsMzggQEAgc2VjdG9yX3Qgc3dhcGRldl9ibG9jayhpbnQgdHlwZSwgcGdvZmZfdCBvZmZzZXQpXG4gXHRyZXR1cm4gc2UtXHUwMDNlc3RhcnRfYmxvY2sgKyAob2Zmc2V0IC0gc2UtXHUwMDNlc3RhcnRfcGFnZSk7XG4gfVxuIFxuK2ludCBzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudChpbnQgdHlwZSwgc2VjdG9yX3QgYmxvY2ssIHBnb2ZmX3QgKm9mZnNldCxcbitcdFx0XHQgICAgcGdvZmZfdCAqbnJfcGFnZXMpXG4re1xuK1x0c3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpID0gc3dhcF90eXBlX3RvX2luZm8odHlwZSk7XG4rXHRzdHJ1Y3Qgc3dhcF9leHRlbnQgKnNlO1xuK1x0c3RydWN0IHJiX25vZGUgKnJiO1xuK1xuK1x0aWYgKCFzaSB8fCAhKHNpLVx1MDAzZWZsYWdzIFx1MDAyNiBTV1BfV1JJVEVPSykpXG4rXHRcdHJldHVybiAtRU5PREVWO1xuK1xuK1x0Zm9yIChyYiA9IHJiX2ZpcnN0KFx1MDAyNnNpLVx1MDAzZXN3YXBfZXh0ZW50X3Jvb3QpOyByYjsgcmIgPSByYl9uZXh0KHJiKSkge1xuK1x0XHRzZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3Qgc3dhcF9leHRlbnQsIHJiX25vZGUpO1xuK1x0XHRpZiAoYmxvY2sgXHUwMDNlPSBzZS1cdTAwM2VzdGFydF9ibG9jayBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGJsb2NrIC0gc2UtXHUwMDNlc3RhcnRfYmxvY2sgXHUwMDNjIHNlLVx1MDAzZW5yX3BhZ2VzKSB7XG4rXHRcdFx0cGdvZmZfdCBwYWdlID0gYmxvY2sgLSBzZS1cdTAwM2VzdGFydF9ibG9jaztcbitcbitcdFx0XHQqb2Zmc2V0ID0gc2UtXHUwMDNlc3RhcnRfcGFnZSArIHBhZ2U7XG4rXHRcdFx0Km5yX3BhZ2VzID0gc2UtXHUwMDNlbnJfcGFnZXMgLSBwYWdlO1xuK1x0XHRcdHJldHVybiAwO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gLUVOT0VOVDtcbit9XG4rXG4raW50IHN3YXBkZXZfYmxvY2tfdG9fb2Zmc2V0KGludCB0eXBlLCBzZWN0b3JfdCBibG9jaywgcGdvZmZfdCAqb2Zmc2V0KVxuK3tcbitcdHBnb2ZmX3QgbnJfcGFnZXM7XG4rXG4rXHRyZXR1cm4gc3dhcGRldl9ibG9ja190b19leHRlbnQodHlwZSwgYmxvY2ssIG9mZnNldCwgXHUwMDI2bnJfcGFnZXMpO1xuK31cbitcbiAvKlxuICAqIFJldHVybiBlaXRoZXIgdGhlIHRvdGFsIG51bWJlciBvZiBzd2FwIHBhZ2VzIG9mIGdpdmVuIHR5cGUsIG9yIHRoZSBudW1iZXJcbiAgKiBvZiBmcmVlIHBhZ2VzIG9mIHRoYXQgdHlwZSAoZGVwZW5kaW5nIG9uIEBmcmVlKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTI6NTguMjAyNzEyODMyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTgxNDQ3MTQ2NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRW5jcnlwdGlvbiBmb3IgVXNlcnNwYWNlIEhpYmVybmF0aW9uIFNuYXBzaG90cyAtIEtleSBBcmVhcyBmb3IgSW52ZXN0aWdhdGlvbioqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgcGF0Y2ggc2VyaWVzIHRoYXQgaW50cm9kdWNlcyBlbmNyeXB0aW9uIHN1cHBvcnQgZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIE15IGluaXRpYWwgYXNzZXNzbWVudCBpcyB0aGF0IGl0J3MgYSBwcmV0dHkgc3Vic3RhbnRpYWwgY2hhbmdlIGFuZCBkZWZpbml0ZWx5IHdhcnJhbnRzIGEgZ29vZCBmdXp6aW5nIGNhbXBhaWduLiBJdCB0b3VjaGVzIHF1aXRlIGEgZmV3IGtleSBhcmVhcyBvZiB0aGUga2VybmVsLlxuXG5GaXJzdCwgdGhlIGNvcmUgb2YgaXQgaXMgdGhlIGVuY3J5cHRpb24gaXRzZWxmLiBJJ20gc2VlaW5nIGNoYW5nZXMgaW4gc2V2ZXJhbCBmaWxlczogYGJsb2NrL2ZvcHMuY2AsIHZhcmlvdXMgaGVhZGVyIGZpbGVzIChgc3VzcGVuZC5oYCwgYHN3YXAuaGAsIGBzdXNwZW5kX2lvY3Rscy5oYCksIHRoZSBrZXJuZWwgcG93ZXIgY29uZmlnIGZpbGVzIChgS2NvbmZpZ2AsIGBNYWtlZmlsZWAsIGBwb3dlci5oYCksIGFuZCBjcnVjaWFsbHksIGZpbGVzIGxpa2UgYGhpYmVybmF0ZS5jYCwgYHNuYXBlbmMuY2AsIGBzbmFwc2hvdC5jYCwgYHN3YXAuY2AsIGFuZCBgdXNlci5jYCB3aXRoaW4gdGhlIGBrZXJuZWwvcG93ZXJgIGRpcmVjdG9yeSwgYWxvbmcgd2l0aCBgbW0vc3dhcGZpbGUuY2AuXG5cblRoZSBnaXN0IG9mIGl0IGlzIGVuYWJsaW5nIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uLiBUaGV5J3ZlIGFkZGVkIHNvbWUgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGA6IGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAgYW5kIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgLiBUaGVyZSdzIGFsc28gYSBuZXcgc3lzZnMgZmlsZSwgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAuXG5cbkxldCdzIGJyZWFrIHRoaXMgZG93bi4gRnJvbSBhIGNvbmZpZ3VyYXRpb24gc3RhbmRwb2ludCwgdGhlIG5ldyBgQ09ORklHX0VOQ1JZUFRFRF9ISUJFUk5BVElPTmAgb3B0aW9uIGlzIHRoZSBrZXkgb25lLiBJdCBsb29rcyBsaWtlIGl0IGRlcGVuZHMgb24gYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmAsIHdoaWNoIGl0c2VsZiBpcyB0aGUgY29uZmlnIGZvciBgL2Rldi9zbmFwc2hvdGAuIE9mIGNvdXJzZSwgd2UnbGwgbmVlZCBgSElCRVJOQVRJT05gIGFzIHdlbGwuXG5cbk5vdywgbGV0J3MgemVybyBpbiBvbiB0aGUgaW50ZXJlc3RpbmcgZnVuY3Rpb25zLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBzbmFwc2hvdF9pb2N0bGAgaXMgZ29pbmcgdG8gaGFuZGxlIHRob3NlIG5ldyBpb2N0bHMuIGBrZXJuZWwvcG93ZXIvc25hcGVuYy5jYCBpcyBnb2luZyB0byBiZSB0aGUgaGVhcnQgb2YgdGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBsb2dpYy4gU3BlY2lmaWNhbGx5LCBJJ2xsIGJlIGxvb2tpbmcgYXQ6IGBzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlgLCBgc25hcHNob3Rfc2V0X2VuY3J5cHRpb25fa2V5YCwgYHNuYXBzaG90X3NldF91c2VyX2tleWAsIGBzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZGAsIGBzbmFwc2hvdF93cml0ZV9lbmNyeXB0ZWRgLCBgc25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkYCwgYW5kIGBzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VgLiBJbiBga2VybmVsL3Bvd2VyL3VzZXIuY2AsIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5gIGFuZCBgaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZGAgYXJlIGltcG9ydGFudCBmb3IgdW5kZXJzdGFuZGluZyB0aGUgc25hcHNob3Qgd3JpdGUgcHJvY2Vzcy4gVGhlbiwgb3ZlciBpbiBgbW0vc3dhcGZpbGUuY2AsIHRoZSBgc3dhcGRldl9ibG9ja190b19leHRlbnRgIGFuZCBgc3dhcGRldl9ibG9ja190b19vZmZzZXRgIGZ1bmN0aW9ucyBoYXZlIGJlY29tZSByZWxldmFudCBiZWNhdXNlIG9mIHRoZSBzd2FwIGFsbG9jYXRpb24gdHJhY2tpbmcuIEFuZCwgYGtlcm5lbC9wb3dlci9zd2FwLmNgIGhhcyBgc3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkYCBhbmQgYHN3c3VzcF9zd2FwX21hcF9ieXRlc2AuXG5cblNvLCBmcm9tIGEgZnV6emluZyBwZXJzcGVjdGl2ZSwgdGhlIHBsYW4gaXMgdG8gZm9jdXMgb24gdGhlc2UgZnVuY3Rpb25zOlxuXG4qICAgYHNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZGBcbiogICBgc25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5YFxuKiAgIGBzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXlgXG4qICAgYHNuYXBzaG90X3NldF91c2VyX2tleWBcbiogICBgc25hcHNob3RfcmVhZF9lbmNyeXB0ZWRgXG4qICAgYHNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZGBcbiogICBgc25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlYFxuKiAgIGBoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5gXG4qICAgYGhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRgXG4qICAgYHN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZGBcbiogICBgc3dhcGRldl9ibG9ja190b19leHRlbnRgXG5cbkFuZCB0aGUga2V5IGNvbmZpZ3MgdG8gZW5hYmxlIGFyZTpcblxuKiAgIGBFTkNSWVBURURfSElCRVJOQVRJT05gXG4qICAgYEhJQkVSTkFUSU9OX1NOQVBTSE9UX0RFVmBcbiogICBgSElCRVJOQVRJT05gXG5cblRoaXMgbG9va3MgbGlrZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQgZm9yIGEgdGhvcm91Z2ggZnV6emluZyBjYW1wYWlnbi4gV2UgYXJlIGFpbWluZyB0byB1bmNvdmVyIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIHJlYWQvd3JpdGUgcGF0aHMsIGtleSBtYW5hZ2VtZW50LCBhbmQgc3dhcCBhbGxvY2F0aW9uIGR1cmluZyB0aGUgaGliZXJuYXRpb24gcHJvY2Vzcy4gR2l2ZW4gdGhlIG51bWJlciBvZiBjaGFuZ2VzIGFuZCB0aGUgY29yZSBzeXN0ZW0gZnVuY3Rpb25hbGl0eSBpbnZvbHZlZCwgSSdtIGV4cGVjdGluZyBzb21lIGludGVyZXN0aW5nIGZpbmRpbmdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNDgxMSwiT3V0cHV0VG9rZW5zIjoyNjMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTE2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDRUMTI6MTM6MTYuMzQ3NDMxNDUyWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTkyMDU5NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVOQ1JZUFRFRF9ISUJFUk5BVElPTlwiLFxuICAgIFwiSElCRVJOQVRJT05fU05BUFNIT1RfREVWXCIsXG4gICAgXCJISUJFUk5BVElPTlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNuYXBzaG90X3N0b3JlX2VuY3J5cHRpb25fc2VlZFwiLFxuICAgIFwic25hcHNob3RfZ2V0X2VuY3J5cHRpb25fa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9zZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF91c2VyX2tleVwiLFxuICAgIFwic25hcHNob3RfcmVhZF9lbmNyeXB0ZWRcIixcbiAgICBcInNuYXBzaG90X3dyaXRlX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3RfZmluYWxpemVfZGVjcnlwdGVkX2ltYWdlXCIsXG4gICAgXCJoaWJlcm5hdGVfc25hcHNob3Rfd3JpdGVfYmVnaW5cIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9lbmRcIixcbiAgICBcInN3c3VzcF9zd2FwX3JhbmdlX2FsbG9jYXRlZFwiLFxuICAgIFwic3dhcGRldl9ibG9ja190b19leHRlbnRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGtlcm5lbC1iYXNlZCBlbmNyeXB0aW9uIGZvciB1c2Vyc3BhY2UgaGliZXJuYXRpb24gc25hcHNob3RzLiBJdCBhZGRzIG5ldyBpb2N0bHMgdG8gYC9kZXYvc25hcHNob3RgIChgU05BUFNIT1RfRU5BQkxFX0VOQ1JZUFRJT05gLCBgU05BUFNIT1RfU0VUX1VTRVJfS0VZYCksIGEgc3lzZnMgaW50ZXJmYWNlIGAvc3lzL3Bvd2VyL3NuYXBzaG90X3NlZWRgLCBhbmQgbW9kaWZpZXMgdGhlIHJlYWQvd3JpdGUgcGF0aHMgZm9yIHRoZSBzbmFwc2hvdCBkZXZpY2UgdG8gc3VwcG9ydCBlbmNyeXB0aW9uL2RlY3J5cHRpb24uIEl0IGFsc28gaG9va3MgaW50byBibG9jayBkZXZpY2Ugd3JpdGVzIHRvIHRyYWNrIHN3YXAgYWxsb2NhdGlvbnMuIFRoZXNlIGFyZSByZWFjaGFibGUgY29yZSBrZXJuZWwgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRU5DUllQVEVEX0hJQkVSTkFUSU9OXCIsXG4gICAgXCJISUJFUk5BVElPTl9TTkFQU0hPVF9ERVZcIixcbiAgICBcIkhJQkVSTkFUSU9OXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic25hcHNob3Rfc3RvcmVfZW5jcnlwdGlvbl9zZWVkXCIsXG4gICAgXCJzbmFwc2hvdF9nZXRfZW5jcnlwdGlvbl9rZXlcIixcbiAgICBcInNuYXBzaG90X3NldF9lbmNyeXB0aW9uX2tleVwiLFxuICAgIFwic25hcHNob3Rfc2V0X3VzZXJfa2V5XCIsXG4gICAgXCJzbmFwc2hvdF9yZWFkX2VuY3J5cHRlZFwiLFxuICAgIFwic25hcHNob3Rfd3JpdGVfZW5jcnlwdGVkXCIsXG4gICAgXCJzbmFwc2hvdF9maW5hbGl6ZV9kZWNyeXB0ZWRfaW1hZ2VcIixcbiAgICBcImhpYmVybmF0ZV9zbmFwc2hvdF93cml0ZV9iZWdpblwiLFxuICAgIFwiaGliZXJuYXRlX3NuYXBzaG90X3dyaXRlX2VuZFwiLFxuICAgIFwic3dzdXNwX3N3YXBfcmFuZ2VfYWxsb2NhdGVkXCIsXG4gICAgXCJzd2FwZGV2X2Jsb2NrX3RvX2V4dGVudFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMga2VybmVsLWJhc2VkIGVuY3J5cHRpb24gZm9yIHVzZXJzcGFjZSBoaWJlcm5hdGlvbiBzbmFwc2hvdHMuIEl0IGFkZHMgbmV3IGlvY3RscyB0byBgL2Rldi9zbmFwc2hvdGAgKGBTTkFQU0hPVF9FTkFCTEVfRU5DUllQVElPTmAsIGBTTkFQU0hPVF9TRVRfVVNFUl9LRVlgKSwgYSBzeXNmcyBpbnRlcmZhY2UgYC9zeXMvcG93ZXIvc25hcHNob3Rfc2VlZGAsIGFuZCBtb2RpZmllcyB0aGUgcmVhZC93cml0ZSBwYXRocyBmb3IgdGhlIHNuYXBzaG90IGRldmljZSB0byBzdXBwb3J0IGVuY3J5cHRpb24vZGVjcnlwdGlvbi4gSXQgYWxzbyBob29rcyBpbnRvIGJsb2NrIGRldmljZSB3cml0ZXMgdG8gdHJhY2sgc3dhcCBhbGxvY2F0aW9ucy4gVGhlc2UgYXJlIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBjaGFuZ2VzIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[1] Phase: Succeeded StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 12:13:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 12:13:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2] Phase: Succeeded StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 12:13:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-04 12:13:28 +0000 UTC FinishedAt: 2026-08-04 12:13:37 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3402964194/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-04 12:13:49 +0000 UTC FinishedAt: 2026-08-04 12:34:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-04 12:13:49 +0000 UTC FinishedAt: 2026-08-04 12:34:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f81e07f6-340d-4c7d-bb1d-7c83c7838ae1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3402964194/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "d705ea86-da79-4e5b-98fd-72b139b5cd54", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-3661657248/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-04 12:13:49 +0000 UTC FinishedAt: 2026-08-04 12:33:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f81e07f6-340d-4c7d-bb1d-7c83c7838ae1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3402964194/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "d705ea86-da79-4e5b-98fd-72b139b5cd54", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-3661657248/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-04 12:34:18 +0000 UTC FinishedAt: 2026-08-04 12:34:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-04 12:34:18 +0000 UTC FinishedAt: 2026-08-04 12:34:18 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-04 12:34:18 +0000 UTC FinishedAt: 2026-08-04 12:34:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-04 12:34:18 +0000 UTC FinishedAt: 2026-08-04 12:34:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3149429309/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-04 12:34:28 +0000 UTC FinishedAt: 2026-08-04 12:36:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-04 12:34:28 +0000 UTC FinishedAt: 2026-08-04 12:36:26 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d705ea86-da79-4e5b-98fd-72b139b5cd54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-3661657248/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-04 12:36:36 +0000 UTC FinishedAt: 2026-08-04 12:36:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-04 12:36:36 +0000 UTC FinishedAt: 2026-08-04 12:36:36 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-04 12:36:36 +0000 UTC FinishedAt: 2026-08-04 12:52:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-04 12:36:36 +0000 UTC FinishedAt: 2026-08-04 12:52:33 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f81e07f6-340d-4c7d-bb1d-7c83c7838ae1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3149429309/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "5fe5ddaa-7c04-4f14-86c8-25f7e33ab69e", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-277289369/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-04 12:36:36 +0000 UTC FinishedAt: 2026-08-04 12:52:23 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*f81e07f6-340d-4c7d-bb1d-7c83c7838ae1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3149429309/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "5fe5ddaa-7c04-4f14-86c8-25f7e33ab69e", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-277289369/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-04 12:52:33 +0000 UTC FinishedAt: 2026-08-04 12:52:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-04 12:52:33 +0000 UTC FinishedAt: 2026-08-04 12:52:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-04 12:52:33 +0000 UTC FinishedAt: 2026-08-04 12:54:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-04 12:52:33 +0000 UTC FinishedAt: 2026-08-04 12:54:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5fe5ddaa-7c04-4f14-86c8-25f7e33ab69e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-277289369/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*d705ea86-da79-4e5b-98fd-72b139b5cd54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5fe5ddaa-7c04-4f14-86c8-25f7e33ab69e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-3661657248/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-277289369/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 12:54:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 12:54:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3540029378/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 12:54:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 12:54:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-04 12:54:37 +0000 UTC FinishedAt: 2026-08-04 12:54:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-04 12:54:48 +0000 UTC FinishedAt: 2026-08-04 15:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowxpj42[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["snapshot_store_encryption_seed","snapshot_get_encryption_key","snapshot_set_encryption_key","snapshot_set_user_key","snapshot_read_encrypted","snapshot_write_encrypted","snapshot_finalize_decrypted_image","hibernate_snapshot_write_begin","hibernate_snapshot_write_end","swsusp_swap_range_allocated","swapdev_block_to_extent"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"fabfaaa8090a83cbc97836cc70d47c69fa9e8c61","config_name":"upstream-apparmor-kasan.config","enable_configs":["ENCRYPTED_HIBERNATION","HIBERNATION_SNAPSHOT_DEV","HIBERNATION"],"series_id":"9920218f-c6aa-426c-9b8f-6b119b2d2bd2","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-04 12:54:48 +0000 UTC FinishedAt: 2026-08-04 15:59:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*d705ea86-da79-4e5b-98fd-72b139b5cd54,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5fe5ddaa-7c04-4f14-86c8-25f7e33ab69e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-3661657248/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-build-action-277289369/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowxpj42/series-workflowxpj42-convert-artifact-3540029378/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}