submission 31121
KernelBot user 266 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 1 lines, June 9 Researcher Reciprocity License v1.0.
mla_opt_sub.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mla-decode-31121?include=source"interfacepython
Compatibility
measured onAMD Instinct MI300X
declared hardwareAMD Instinct MI300X
architecturesgfx942
dtypesbf16
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:f91ca699d25b142c1de7bb6012472b261f3be2676021d6a5d155cc614d1459e3
license declaredunknown
license concludedunknown
imported2026-08-15
Kernel source
mla_opt_sub.py1 lines
ZnJvbSBwaXAuX2ludGVybmFsIGltcG9ydCBtYWluIGFzIHBpcF9tYWluCnBpcF9tYWluKFsiaW5zdGFsbCIsInRpbGVsYW5nLXJvY20iXSkKCmltcG9ydCBtYXRoCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaCBpbXBvcnQgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0aWxlbGFuZwpmcm9tIHRpbGVsYW5nLmF1dG90dW5lciBpbXBvcnQgKgppbXBvcnQgdGlsZWxhbmcubGFuZ3VhZ2UgYXMgVApmcm9tIHRvcmNoLnByb2ZpbGVyIGltcG9ydCBwcm9maWxlLCByZWNvcmRfZnVuY3Rpb24sIFByb2ZpbGVyQWN0aXZpdHkKaW1wb3J0IHRpbWUKCnRpbGVsYW5nLmNhY2hlLmNsZWFyX2NhY2hlKCkKIyB0aWxlbGFuZy5kaXNhYmxlX2NhY2hlKCkKCkJBU0VfQ09ORklHUyA9IHsKICAgIDEyODogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDEsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDUxMjogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDEwMjQ6IHsnYmxvY2tfTic6IDE2LCAnYmxvY2tfSCc6IDY0LCAnbnVtX3NwbGl0JzogMSwgJ251bV9zdGFnZXMnOiAwLCAnZW5hYmxlX3Jhc3Rlcml6YXRpb24nOiBGYWxzZX0sCiAgICAyMDQ4OiB7J2Jsb2NrX04nOiAxNiwgJ2Jsb2NrX0gnOiA2NCwgJ251bV9zcGxpdCc6IDEsICdudW1fc3RhZ2VzJzogMCwgJ2VuYWJsZV9yYXN0ZXJpemF0aW9uJzogRmFsc2V9LAogICAgNDA5NjogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDYxNDQ6IHsnYmxvY2tfTic6IDE2LCAnYmxvY2tfSCc6IDY0LCAnbnVtX3NwbGl0JzogMiwgJ251bV9zdGFnZXMnOiAwLCAnZW5hYmxlX3Jhc3Rlcml6YXRpb24nOiBGYWxzZX0KfQoKUFJFRklMTF9DT05GSUdTID0gQkFTRV9DT05GSUdTLmNvcHkoKQpjb25maWdfNDA5NiA9IEJBU0VfQ09ORklHU1s0MDk2XQpmb3IgaSBpbiByYW5nZSg0MDk3LCA0MTk3KTogICMgNDA5N+WIsDQxOTYKICAgIFBSRUZJTExfQ09ORklHU1tpXSA9IGNvbmZpZ180MDk2CgoKZGVmIGdldF9vcHRpbWFsX2tlcm5lbChiYXRjaCwgaGVhZHMsIGt2X2hlYWRfbnVtLCBzZXFsZW5fa3YsIGRpbSwgcGVfZGltKToKICAgIHVzZV9hdXRvdHVuZSA9IHNlcWxlbl9rdiA+IDYxNDQKICAgIGlmIHVzZV9hdXRvdHVuZToKICAgICAgICBwcmludChmIltBVVRPIFRVTkVdIFVzaW5nIGF1dG90dW5lIGZvciBzZXFsZW5fa3Y9e3NlcWxlbl9rdn0iKQogICAgICAgIAogICAgICAgICMg5L2/55SoIGF1dG90dW5lIOeJiOacrOeahCBrZXJuZWwKICAgICAgICBrZXJuZWwgPSBmbGFzaG1sYV9kZWNvZGVfYXV0b3R1bmUoCiAgICAgICAgICAgIGJhdGNoLAogICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAga3ZfaGVhZF9udW0sCiAgICAgICAgICAgIHNlcWxlbl9rdisxLAogICAgICAgICAgICBkaW0sCiAgICAgICAgICAgIHBlX2RpbQogICAgICAgICkKICAgICAgICBiZXN0X2NvbmZpZyA9IGtlcm5lbC5jb25maWcKICAgICAgICBwcmludChmIltBVVRPIFRVTkVdIEJlc3QgY29uZmlnOiB7YmVzdF9jb25maWd9IikKICAgICAgICByZXR1cm4ga2VybmVsLCBiZXN0X2NvbmZpZwogICAgZWxzZToKICAgICAgICBwcmludChmIltOTyBBVVRPIFRVTkVdIFVzaW5nIG5vIGF1dG90dW5lIGZvciBzZXFsZW5fa3Y9e3NlcWxlbl9rdn0iKQogICAgICAgIGlmIHNlcWxlbl9rdiBpbiBQUkVGSUxMX0NPTkZJR1M6CiAgICAgICAgICAgIGJlc3RfY29uZmlnID0gUFJFRklMTF9DT05GSUdTW3NlcWxlbl9rdl0KICAgICAgICAgICAga2VybmVsID0gZmxhc2htbGFfZGVjb2RlX25vX3R1bmluZygKICAgICAgICAgICAgICAgIGJhdGNoLAogICAgICAgICAgICAgICAgaGVhZHMsCiAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgIHNlcWxlbl9rdisxLAogICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgcGVfZGltLAogICAgICAgICAgICAgICAgKipiZXN0X2NvbmZpZwogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBrZXJuZWwsIGJlc3RfY29uZmlnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCgpAdGlsZWxhbmcuaml0KG91dF9pZHg9WzZdKQpkZWYgZmxhc2htbGFfZGVjb2RlX25vX3R1bmluZyhiYXRjaCwKICAgICAgICAgICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgICAgICBzZXFsZW5fa3YsCiAgICAgICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgICAgIHBlX2RpbSwKICAgICAgICAgICAgICAgICAgICBibG9ja19OLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX0gsCiAgICAgICAgICAgICAgICAgICAgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgICAgIHRocmVhZHM9MjU2LAogICAgICAgICAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICAgICAgICAgICAgICBlbmFibGVfcmFzdGVyaXphdGlvbj1UcnVlKToKICAgICMgc2NhbGUgPSAoMS4wIC8gKGRpbSArIHBlX2RpbSkpKiowLjUgKiAxLjQ0MjY5NTA0ICAjIGxvZzIoZSkKICAgIHNjYWxlID0gKDEuMCAvICgxMjggKyA2NCkpKiowLjUgKiAxLjQ0MjY5NTA0CiAgICAjIGR0eXBlID0gImZsb2F0MTYiCiAgICBkdHlwZSA9ICJiZmxvYXQxNiIKICAgIGFjY3VtX2R0eXBlID0gImZsb2F0IgogICAga3ZfZ3JvdXBfbnVtID0gaGVhZHMgLy8ga3ZfaGVhZF9udW0KICAgIFZBTElEX0JMT0NLX0ggPSBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKQogICAgYXNzZXJ0IGt2X2hlYWRfbnVtID09IDEsICJrdl9oZWFkX251bSBtdXN0IGJlIDEiCiAgICBrX3BhY2sgPSAxCiAgICB2ZWNfc2l6ZSA9IDQgKiBrX3BhY2sKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG4oCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChiYXRjaCwgaGVhZHMgLy8gbWluKGJsb2NrX0gsIGt2X2dyb3VwX251bSksIHRocmVhZHM9dGhyZWFkcykgYXMgKGJ4LCBieSk6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCgogICAgICAgICAgICBULmNvcHkoUVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfbG9jYWwpCiAgICAgICAgICAgIFQuY29weShRX3BlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9wZV9sb2NhbCkKICAgICAgICAgICAgVC5maWxsKGFjY19vLCAwKQogICAgICAgICAgICBULmZpbGwobG9nc3VtLCAwKQogICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQoKICAgICAgICAgICAgbG9vcF9yYW5nZSA9IFQuY2VpbGRpdihzZXFsZW5fa3YsIGJsb2NrX04pCiAgICAgICAgICAgIGZvciBrIGluIFQuUGlwZWxpbmVkKGxvb3BfcmFuZ2UsIG51bV9zdGFnZXM9bnVtX3N0YWdlcyk6CiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtWX3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPXZlY19zaXplKQogICAgICAgICAgICAgICAgVC5jb3B5KEtfcGVbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgIyBULmNvcHkoYWNjX3MsIFNfc2hhcmVkKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0W2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbCgKICAgICAgICAgICAgICAgIGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5LCBieik6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KChzZXFsZW5fa3YgLy8gbnVtX3NwbGl0KSwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIGt2X3N0YXJ0ID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyBrICogYmxvY2tfTgogICAgICAgICAgICAgICAga3ZfZW5kID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyAoayArIDEpICogYmxvY2tfTgogICAgICAgICAgICAgICAgVC5jb3B5KEtWW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwga3Zfc3RhcnQ6a3ZfZW5kLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoYmxvY2tfSCk6CiAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBULmxvZzIobG9nc3VtW2ldKSArIHNjb3Jlc19tYXhbaV0gKiBzY2FsZQogICAgICAgICAgICBULmNvcHkobG9nc3VtLCBnbHNlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCBiel0pCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0X3BhcnRpYWxbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6LCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGNvbWJpbmUoCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChoZWFkcywgYmF0Y2gsIHRocmVhZHM9MTI4KSBhcyAoYnksIGJ6KToKICAgICAgICAgICAgcG9fbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgb19hY2N1bV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXQgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9tYXhfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjYWxlX2xvY2FsID0gVC5hbGxvY19sb2NhbChbMV0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgVC5hbm5vdGF0ZV9sYXlvdXQoewogICAgICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbDogVC5GcmFnbWVudChsc2VfbG9nc3VtX2xvY2FsLnNoYXBlLCBmb3J3YXJkX3RocmVhZF9mbj1sYW1iZGEgaTogaSksCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBULmNsZWFyKGxzZV9sb2dzdW1fbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIob19hY2N1bV9sb2NhbCkKICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IFQubWF4KGxzZV9tYXhfbG9jYWxbMF0sIGdsc2VbYnosIGJ5LCBrXSkKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobnVtX3NwbGl0LCBudW1fc3RhZ2VzPTEpOgogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdICs9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbWF4X2xvY2FsWzBdKQogICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdID0gVC5sb2cyKGxzZV9sb2dzdW1fbG9jYWxbMF0pICsgbHNlX21heF9sb2NhbFswXQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIHBvX2xvY2FsW2ldID0gT3V0cHV0X3BhcnRpYWxbYnosIGJ5LCBrLCBpXQogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBzY2FsZV9sb2NhbFswXSA9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbG9nc3VtX2xvY2FsWzBdKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIG9fYWNjdW1fbG9jYWxbaV0gKz0gcG9fbG9jYWxbaV0gKiBzY2FsZV9sb2NhbFswXQogICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICBPdXRwdXRbYnosIGJ5LCBpXSA9IG9fYWNjdW1fbG9jYWxbaV0KCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuX3NwbGl0KFEsIFFfcGUsIEtWLCBLX3BlLCBnbHNlLCBPdXRwdXRfcGFydGlhbCkKICAgICAgICBjb21iaW5lKGdsc2UsIE91dHB1dF9wYXJ0aWFsLCBPdXRwdXQpCgogICAgQFQucHJpbV9mdW5jCiAgICBkZWYgbWFpbl9ub19zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgZmxhc2hfYXR0bihRLCBRX3BlLCBLViwgS19wZSwgT3V0cHV0KQoKICAgIGlmIG51bV9zcGxpdCA+IDE6CiAgICAgICAgcmV0dXJuIG1haW5fc3BsaXQKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1haW5fbm9fc3BsaXQKCgpkZWYgZ2V0X2NvbmZpZ3MoKToKICAgIGltcG9ydCBpdGVydG9vbHMKICAgIGJsb2NrX04gPSBbMTYsIDMyLCA2NCwgMTI4XQogICAgYmxvY2tfSCA9IFsxNiwgMzIsIDY0LCAxMjhdCiAgICBudW1fc3BsaXQgPSBbMSwgMiwgNCwgOCwgMTZdCiAgICBudW1fc3RhZ2VzID0gWzAsIDFdCiAgICBlbmFibGVfcmFzdGVyaXphdGlvbiA9IFtGYWxzZSwgVHJ1ZV0KICAgIAogICAgIyBibG9ja19OID0gWzMyXQogICAgIyBibG9ja19IID0gWzY0XQogICAgIyBudW1fc3BsaXQgPSBbNF0KICAgICMgbnVtX3N0YWdlcyA9IFswXQogICAgIyBlbmFibGVfcmFzdGVyaXphdGlvbiA9IFtGYWxzZV0KCiAgICBfY29uZmlncyA9IGxpc3QoaXRlcnRvb2xzLnByb2R1Y3QoYmxvY2tfTiwgYmxvY2tfSCwgbnVtX3NwbGl0LCBudW1fc3RhZ2VzLCBlbmFibGVfcmFzdGVyaXphdGlvbikpCiAgICAKICAgIHJldHVybiBbewogICAgICAgICJibG9ja19OIjogY1swXSwKICAgICAgICAiYmxvY2tfSCI6IGNbMV0sCiAgICAgICAgIm51bV9zcGxpdCI6IGNbMl0sCiAgICAgICAgIm51bV9zdGFnZXMiOiBjWzNdLAogICAgICAgICJlbmFibGVfcmFzdGVyaXphdGlvbiI6IGNbNF0sCiAgICB9IGZvciBjIGluIF9jb25maWdzXQoKQHRpbGVsYW5nLmF1dG90dW5lKGNvbmZpZ3M9Z2V0X2NvbmZpZ3MoKSwgY2FjaGVfaW5wdXRfdGVuc29ycz1GYWxzZSkKQHRpbGVsYW5nLmppdChvdXRfaWR4PVs2XSkKZGVmIGZsYXNobWxhX2RlY29kZV9hdXRvdHVuZShiYXRjaCwKICAgICAgICAgICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgICAgICBzZXFsZW5fa3YsCiAgICAgICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgICAgIHBlX2RpbSwKICAgICAgICAgICAgICAgICAgICBibG9ja19OLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX0gsCiAgICAgICAgICAgICAgICAgICAgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgICAgIHRocmVhZHM9MjU2LAogICAgICAgICAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICAgICAgICAgICAgICBlbmFibGVfcmFzdGVyaXphdGlvbj1UcnVlKToKICAgICMgc2NhbGUgPSAoMS4wIC8gKGRpbSArIHBlX2RpbSkpKiowLjUgKiAxLjQ0MjY5NTA0ICAjIGxvZzIoZSkKICAgIHNjYWxlID0gKDEuMCAvICgxMjggKyA2NCkpKiowLjUgKiAxLjQ0MjY5NTA0CiAgICAjIGR0eXBlID0gImZsb2F0MTYiCiAgICBkdHlwZSA9ICJiZmxvYXQxNiIKICAgIGFjY3VtX2R0eXBlID0gImZsb2F0IgogICAga3ZfZ3JvdXBfbnVtID0gaGVhZHMgLy8ga3ZfaGVhZF9udW0KICAgIFZBTElEX0JMT0NLX0ggPSBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKQogICAgYXNzZXJ0IGt2X2hlYWRfbnVtID09IDEsICJrdl9oZWFkX251bSBtdXN0IGJlIDEiCiAgICBrX3BhY2sgPSAxCiAgICB2ZWNfc2l6ZSA9IDQgKiBrX3BhY2sKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG4oCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChiYXRjaCwgaGVhZHMgLy8gbWluKGJsb2NrX0gsIGt2X2dyb3VwX251bSksIHRocmVhZHM9dGhyZWFkcykgYXMgKGJ4LCBieSk6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCgogICAgICAgICAgICBULmNvcHkoUVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfbG9jYWwpCiAgICAgICAgICAgIFQuY29weShRX3BlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9wZV9sb2NhbCkKICAgICAgICAgICAgVC5maWxsKGFjY19vLCAwKQogICAgICAgICAgICBULmZpbGwobG9nc3VtLCAwKQogICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQoKICAgICAgICAgICAgbG9vcF9yYW5nZSA9IFQuY2VpbGRpdihzZXFsZW5fa3YsIGJsb2NrX04pCiAgICAgICAgICAgIGZvciBrIGluIFQuUGlwZWxpbmVkKGxvb3BfcmFuZ2UsIG51bV9zdGFnZXM9bnVtX3N0YWdlcyk6CiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtWX3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPXZlY19zaXplKQogICAgICAgICAgICAgICAgVC5jb3B5KEtfcGVbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgIyBULmNvcHkoYWNjX3MsIFNfc2hhcmVkKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0W2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbCgKICAgICAgICAgICAgICAgIGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5LCBieik6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KChzZXFsZW5fa3YgLy8gbnVtX3NwbGl0KSwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIGt2X3N0YXJ0ID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyBrICogYmxvY2tfTgogICAgICAgICAgICAgICAga3ZfZW5kID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyAoayArIDEpICogYmxvY2tfTgogICAgICAgICAgICAgICAgVC5jb3B5KEtWW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwga3Zfc3RhcnQ6a3ZfZW5kLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoYmxvY2tfSCk6CiAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBULmxvZzIobG9nc3VtW2ldKSArIHNjb3Jlc19tYXhbaV0gKiBzY2FsZQogICAgICAgICAgICBULmNvcHkobG9nc3VtLCBnbHNlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCBiel0pCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0X3BhcnRpYWxbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6LCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGNvbWJpbmUoCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChoZWFkcywgYmF0Y2gsIHRocmVhZHM9MTI4KSBhcyAoYnksIGJ6KToKICAgICAgICAgICAgcG9fbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgb19hY2N1bV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXQgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9tYXhfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjYWxlX2xvY2FsID0gVC5hbGxvY19sb2NhbChbMV0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgVC5hbm5vdGF0ZV9sYXlvdXQoewogICAgICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbDogVC5GcmFnbWVudChsc2VfbG9nc3VtX2xvY2FsLnNoYXBlLCBmb3J3YXJkX3RocmVhZF9mbj1sYW1iZGEgaTogaSksCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBULmNsZWFyKGxzZV9sb2dzdW1fbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIob19hY2N1bV9sb2NhbCkKICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IFQubWF4KGxzZV9tYXhfbG9jYWxbMF0sIGdsc2VbYnosIGJ5LCBrXSkKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobnVtX3NwbGl0LCBudW1fc3RhZ2VzPTEpOgogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdICs9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbWF4X2xvY2FsWzBdKQogICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdID0gVC5sb2cyKGxzZV9sb2dzdW1fbG9jYWxbMF0pICsgbHNlX21heF9sb2NhbFswXQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIHBvX2xvY2FsW2ldID0gT3V0cHV0X3BhcnRpYWxbYnosIGJ5LCBrLCBpXQogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBzY2FsZV9sb2NhbFswXSA9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbG9nc3VtX2xvY2FsWzBdKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIG9fYWNjdW1fbG9jYWxbaV0gKz0gcG9fbG9jYWxbaV0gKiBzY2FsZV9sb2NhbFswXQogICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICBPdXRwdXRbYnosIGJ5LCBpXSA9IG9fYWNjdW1fbG9jYWxbaV0KCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuX3NwbGl0KFEsIFFfcGUsIEtWLCBLX3BlLCBnbHNlLCBPdXRwdXRfcGFydGlhbCkKICAgICAgICBjb21iaW5lKGdsc2UsIE91dHB1dF9wYXJ0aWFsLCBPdXRwdXQpCgogICAgQFQucHJpbV9mdW5jCiAgICBkZWYgbWFpbl9ub19zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgZmxhc2hfYXR0bihRLCBRX3BlLCBLViwgS19wZSwgT3V0cHV0KQoKICAgIGlmIG51bV9zcGxpdCA+IDE6CiAgICAgICAgcmV0dXJuIG1haW5fc3BsaXQKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1haW5fbm9fc3BsaXQKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHRoZXRhID0gdGhldGEudG8oImN1ZGEiKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgoKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnLCBtbGFfdGxfa2VybmVsOiB0aWxlbGFuZy5KSVRLZXJuZWwsIGtlcm5lbF9iZXN0X2NvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgZGV2aWNlID0gImN1ZGEiCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT1kZXZpY2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPWRldmljZSkKCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9ZGV2aWNlKQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9ZGV2aWNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53byA9IG5uLkxpbmVhcihzZWxmLnZfaGVhZF9kaW0gKiBzZWxmLm5faGVhZHMsIHNlbGYuZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSwgZGV2aWNlPWRldmljZSkKICAgICAgICBzZWxmLmVwcyA9IDFlLTYKICAgICAgICBzZWxmLm1sYV90bF9rZXJuZWwgPSBtbGFfdGxfa2VybmVsCiAgICAgICAgc2VsZi5rZXJuZWxfYmVzdF9jb25maWcgPSBrZXJuZWxfYmVzdF9jb25maWcKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIyBzZXFfbGVuID0gMSBhbHdheXMgaGVyZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhID0gc2VsZi5LVl9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKSAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgIHFfbm9wZV9hbmRfcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKS50cmFuc3Bvc2UoMSwgMikKICAgICAgICBxLCBxX3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIHFfcGUgPSBzZWxmLnFfcm9wZShxX3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQoKICAgICAgICBrdiwga19wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGtfcGUgPSBrX3BlWzosIE5vbmUsIDosIDpdCiAgICAgICAga19wZSA9IHNlbGYua19yb3BlKGtfcGUpCgogICAgICAgIEtWX3Byb2pfdXAgPSBzZWxmLktWX3Byb2pfdXAud2VpZ2h0LnZpZXcoc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi5rdl9sb3JhX3JhbmspCiAgICAgICAgcV9hYnNvcmIgPSBLVl9wcm9qX3VwWzosIDpzZWxmLm5vcGVfaGVhZF9kaW0sIDpdCiAgICAgICAgb3V0X2Fic29yYiA9IEtWX3Byb2pfdXBbOiwgc2VsZi5ub3BlX2hlYWRfZGltOiwgOl0KICAgICAgICBxID0gdG9yY2gubWF0bXVsKHEsIHFfYWJzb3JiKQogICAgICAgIAogICAgICAgIG51bV9zcGxpdHMgPSBzZWxmLmtlcm5lbF9iZXN0X2NvbmZpZ1snbnVtX3NwbGl0J10KICAgICAgICBnbHNlID0gdG9yY2guemVyb3MoKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgbnVtX3NwbGl0cyksIGR0eXBlPXRvcmNoLmZsb2F0LCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgb3V0cHV0X3BhcnRpYWwgPSB0b3JjaC56ZXJvcygoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBudW1fc3BsaXRzLCBzZWxmLmt2X2xvcmFfcmFuayksIGR0eXBlPXRvcmNoLmZsb2F0LCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgCiAgICAgICAgcV90bCA9IHEudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rKQogICAgICAgIHFfcGVfdGwgPSBxX3BlLnZpZXcoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAga3ZfdGwgPSBrdi52aWV3KGJhdGNoX3NpemUsIGt2X2xlbiwgMSwgc2VsZi5rdl9sb3JhX3JhbmspLmNvbnRpZ3VvdXMoKQogICAgICAgIGtfcGVfdGwgPSBrX3BlLnRyYW5zcG9zZSgxLCAyKQoKICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLnplcm9zKChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT14LmRldmljZSkKICAgICAgICBpZiBrdl9sZW4gPCAxMzA6CiAgICAgICAgICAgIHNvZnRtYXhfc2NhbGUgPSAxIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICAgICAgYXR0bl93ZWlnaHRzID0gKHRvcmNoLm1hdG11bChxX3BlLCBrX3BlLm1UKSArIHRvcmNoLm1hdG11bChxLCBrdi51bnNxdWVlemUoLTMpLm1UKSkgKiBzb2Z0bWF4X3NjYWxlCiAgICAgICAgICAgIGF0dG5fd2VpZ2h0c19zb2Z0bWF4ID0gbm4uZnVuY3Rpb25hbC5zb2Z0bWF4KGF0dG5fd2VpZ2h0cywgZGltPS0xLCBkdHlwZT10b3JjaC5mbG9hdDMyKS50byhxLmR0eXBlKQogICAgICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLmVpbnN1bSgnYmhxbCwgYmxjIC0+IGJocWMnLCBhdHRuX3dlaWdodHNfc29mdG1heCwga3YpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRsX2F0dG5fb3V0ID0gc2VsZi5tbGFfdGxfa2VybmVsKAogICAgICAgICAgICAgICAgcV90bCwgICAgICAgICAKICAgICAgICAgICAgICAgIHFfcGVfdGwsICAgICAKICAgICAgICAgICAgICAgIGt2X3RsLCAKICAgICAgICAgICAgICAgIGtfcGVfdGwsICAgICAKICAgICAgICAgICAgICAgIGdsc2UsCiAgICAgICAgICAgICAgICBvdXRwdXRfcGFydGlhbCwKICAgICAgICAgICAgKQoKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnZpZXcoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLmt2X2xvcmFfcmFuaykKICAgICAgICBvdXRfYWJzb3JiID0gb3V0X2Fic29yYi50cmFuc3Bvc2UoLTIsIC0xKS5jb250aWd1b3VzKCkKICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLm1hdG11bCh0bF9hdHRuX291dCwgb3V0X2Fic29yYikKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnRyYW5zcG9zZSgxLCAyKS5jb250aWd1b3VzKCkKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgMSwgc2VsZi5uX2hlYWRzICogc2VsZi52X2hlYWRfZGltKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICB0bF9hdHRuX291dCA9IHNlbGYud28odGxfYXR0bl9vdXQpCiAgICAgICAgcmV0dXJuIHRsX2F0dG5fb3V0LCBrdl9jYWNoZS5nZXRfZGF0YSgpIAoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgbWxhX3RsX2tlcm5lbCwga2VybmVsX2Jlc3RfY29uZmlnID0gZ2V0X29wdGltYWxfa2VybmVsKAogICAgICAgIGJhdGNoPWNvbmZpZy5iYXRjaF9zaXplLAogICAgICAgIGhlYWRzPWNvbmZpZy5uX2hlYWRzLAogICAgICAgIGt2X2hlYWRfbnVtPTEsCiAgICAgICAgc2VxbGVuX2t2PWt2X2NhY2hlLnNlcV9sZW4sCiAgICAgICAgZGltPWNvbmZpZy5rdl9sb3JhX3JhbmssCiAgICAgICAgcGVfZGltPWNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICApCiAgICBtb2RlbCA9IE1MQShjb25maWcsIG1sYV90bF9rZXJuZWwsIGtlcm5lbF9iZXN0X2NvbmZpZykKICAgIG1vZGVsLlFfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlSource code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 31106.
- ZnJvbSBwaXAuX2ludGVybmFsIGltcG9ydCBtYWluIGFzIHBpcF9tYWluCnBpcF9tYWluKFsiaW5zdGFsbCIsInRpbGVsYW5nLXJvY20iXSkKCmltcG9ydCBtYXRoCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaCBpbXBvcnQgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0aWxlbGFuZwpmcm9tIHRpbGVsYW5nLmF1dG90dW5lciBpbXBvcnQgKgppbXBvcnQgdGlsZWxhbmcubGFuZ3VhZ2UgYXMgVAoKdGlsZWxhbmcuY2FjaGUuY2xlYXJfY2FjaGUoKQojIHRpbGVsYW5nLmRpc2FibGVfY2FjaGUoKQoKQkFTRV9DT05GSUdTID0gewogICAgMTI4OiB7J2Jsb2NrX04nOiAxNiwgJ2Jsb2NrX0gnOiA2NCwgJ251bV9zcGxpdCc6IDEsICdudW1fc3RhZ2VzJzogMSwgJ2VuYWJsZV9yYXN0ZXJpemF0aW9uJzogRmFsc2V9LAogICAgNTEyOiB7J2Jsb2NrX04nOiAxNiwgJ2Jsb2NrX0gnOiA2NCwgJ251bV9zcGxpdCc6IDEsICdudW1fc3RhZ2VzJzogMCwgJ2VuYWJsZV9yYXN0ZXJpemF0aW9uJzogRmFsc2V9LAogICAgMTAyNDogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDIwNDg6IHsnYmxvY2tfTic6IDE2LCAnYmxvY2tfSCc6IDY0LCAnbnVtX3NwbGl0JzogMSwgJ251bV9zdGFnZXMnOiAwLCAnZW5hYmxlX3Jhc3Rlcml6YXRpb24nOiBGYWxzZX0sCiAgICA0MDk2OiB7J2Jsb2NrX04nOiAxNiwgJ2Jsb2NrX0gnOiA2NCwgJ251bV9zcGxpdCc6IDEsICdudW1fc3RhZ2VzJzogMCwgJ2VuYWJsZV9yYXN0ZXJpemF0aW9uJzogRmFsc2V9LAogICAgNjE0NDogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAyLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfQp9CgpQUkVGSUxMX0NPTkZJR1MgPSBCQVNFX0NPTkZJR1MuY29weSgpCmNvbmZpZ180MDk2ID0gQkFTRV9DT05GSUdTWzQwOTZdCmZvciBpIGluIHJhbmdlKDQwOTcsIDQxOTcpOiAgIyA0MDk35YiwNDE5NgogICAgUFJFRklMTF9DT05GSUdTW2ldID0gY29uZmlnXzQwOTYKCgpkZWYgZ2V0X29wdGltYWxfa2VybmVsKGJhdGNoLCBoZWFkcywga3ZfaGVhZF9udW0sIHNlcWxlbl9rdiwgZGltLCBwZV9kaW0pOgogICAgdXNlX2F1dG90dW5lID0gc2VxbGVuX2t2ID4gNjE0NAogICAgaWYgdXNlX2F1dG90dW5lOgogICAgICAgIHByaW50KGYiW0FVVE8gVFVORV0gVXNpbmcgYXV0b3R1bmUgZm9yIHNlcWxlbl9rdj17c2VxbGVuX2t2fSIpCiAgICAgICAgCiAgICAgICAgIyDkvb/nlKggYXV0b3R1bmUg54mI5pys55qEIGtlcm5lbAogICAgICAgIGtlcm5lbCA9IGZsYXNobWxhX2RlY29kZV9hdXRvdHVuZSgKICAgICAgICAgICAgYmF0Y2gsCiAgICAgICAgICAgIGhlYWRzLAogICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgc2VxbGVuX2t2KzEsCiAgICAgICAgICAgIGRpbSwKICAgICAgICAgICAgcGVfZGltCiAgICAgICAgKQogICAgICAgIGJlc3RfY29uZmlnID0ga2VybmVsLmNvbmZpZwogICAgICAgIHByaW50KGYiW0FVVE8gVFVORV0gQmVzdCBjb25maWc6IHtiZXN0X2NvbmZpZ30iKQogICAgICAgIHJldHVybiBrZXJuZWwsIGJlc3RfY29uZmlnCiAgICBlbHNlOgogICAgICAgIHByaW50KGYiW05PIEFVVE8gVFVORV0gVXNpbmcgbm8gYXV0b3R1bmUgZm9yIHNlcWxlbl9rdj17c2VxbGVuX2t2fSIpCiAgICAgICAgaWYgc2VxbGVuX2t2IGluIFBSRUZJTExfQ09ORklHUzoKICAgICAgICAgICAgYmVzdF9jb25maWcgPSBQUkVGSUxMX0NPTkZJR1Nbc2VxbGVuX2t2XQogICAgICAgICAgICBrZXJuZWwgPSBmbGFzaG1sYV9kZWNvZGVfbm9fdHVuaW5nKAogICAgICAgICAgICAgICAgYmF0Y2gsCiAgICAgICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAgICAgIGt2X2hlYWRfbnVtLAogICAgICAgICAgICAgICAgc2VxbGVuX2t2KzEsCiAgICAgICAgICAgICAgICBkaW0sCiAgICAgICAgICAgICAgICBwZV9kaW0sCiAgICAgICAgICAgICAgICAqKmJlc3RfY29uZmlnCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGtlcm5lbCwgYmVzdF9jb25maWcKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKCkB0aWxlbGFuZy5qaXQob3V0X2lkeD1bNl0pCmRlZiBmbGFzaG1sYV9kZWNvZGVfbm9fdHVuaW5nKGJhdGNoLAogICAgICAgICAgICAgICAgICAgIGhlYWRzLAogICAgICAgICAgICAgICAgICAgIGt2X2hlYWRfbnVtLAogICAgICAgICAgICAgICAgICAgIHNlcWxlbl9rdiwKICAgICAgICAgICAgICAgICAgICBkaW0sCiAgICAgICAgICAgICAgICAgICAgcGVfZGltLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX04sCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfSCwKICAgICAgICAgICAgICAgICAgICBudW1fc3BsaXQsCiAgICAgICAgICAgICAgICAgICAgdGhyZWFkcz0yNTYsCiAgICAgICAgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgICAgICAgICAgICAgIGVuYWJsZV9yYXN0ZXJpemF0aW9uPVRydWUpOgogICAgIyBzY2FsZSA9ICgxLjAgLyAoZGltICsgcGVfZGltKSkqKjAuNSAqIDEuNDQyNjk1MDQgICMgbG9nMihlKQogICAgc2NhbGUgPSAoMS4wIC8gKDEyOCArIDY0KSkqKjAuNSAqIDEuNDQyNjk1MDQKICAgICMgZHR5cGUgPSAiZmxvYXQxNiIKICAgIGR0eXBlID0gImJmbG9hdDE2IgogICAgYWNjdW1fZHR5cGUgPSAiZmxvYXQiCiAgICBrdl9ncm91cF9udW0gPSBoZWFkcyAvLyBrdl9oZWFkX251bQogICAgVkFMSURfQkxPQ0tfSCA9IG1pbihibG9ja19ILCBrdl9ncm91cF9udW0pCiAgICBhc3NlcnQga3ZfaGVhZF9udW0gPT0gMSwgImt2X2hlYWRfbnVtIG11c3QgYmUgMSIKICAgIGtfcGFjayA9IDEKICAgIHZlY19zaXplID0gNCAqIGtfcGFjawoKICAgIEBULm1hY3JvCiAgICBkZWYgZmxhc2hfYXR0bigKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5KToKICAgICAgICAgICAgUV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGR0eXBlKQogICAgICAgICAgICBRX3BlX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtWX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKFtibG9ja19OLCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgS19wZV9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIGFjY19zID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBhY2Nfc19jYXN0ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGR0eXBlKQogICAgICAgICAgICBhY2NfbyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4X3ByZXYgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zY2FsZSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbG9nc3VtID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgY3VyX2t2X2hlYWQgPSBieSAvLyAoa3ZfZ3JvdXBfbnVtIC8vIGJsb2NrX0gpCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTAsIGVuYWJsZT1lbmFibGVfcmFzdGVyaXphdGlvbikKCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KHNlcWxlbl9rdiwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIFQuY29weShLVltieCwgayAqIGJsb2NrX046KGsgKyAxKSAqIGJsb2NrX04sIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwgayAqIGJsb2NrX046KGsgKyAxKSAqIGJsb2NrX04sIGN1cl9rdl9oZWFkLCA6XSwgS19wZV9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY2xlYXIoYWNjX3MpCiAgICAgICAgICAgICAgICBULmdlbW0oUV9sb2NhbCwgS1Zfc2hhcmVkLCBhY2NfcywgdHJhbnNwb3NlX0I9VHJ1ZSwgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuZ2VtbSgKICAgICAgICAgICAgICAgICAgICBRX3BlX2xvY2FsLAogICAgICAgICAgICAgICAgICAgIEtfcGVfc2hhcmVkLAogICAgICAgICAgICAgICAgICAgIGFjY19zLAogICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV9CPVRydWUsCiAgICAgICAgICAgICAgICAgICAgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuY29weShzY29yZXNfbWF4LCBzY29yZXNfbWF4X3ByZXYpCiAgICAgICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQogICAgICAgICAgICAgICAgVC5yZWR1Y2VfbWF4KGFjY19zLCBzY29yZXNfbWF4LCBkaW09MSwgY2xlYXI9RmFsc2UpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIHNjb3Jlc19zY2FsZVtpXSA9IFQuZXhwMihzY29yZXNfbWF4X3ByZXZbaV0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgYmxvY2tfTik6CiAgICAgICAgICAgICAgICAgICAgYWNjX3NbaSwgal0gPSBULmV4cDIoYWNjX3NbaSwgal0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX3N1bShhY2Nfcywgc2NvcmVzX3N1bSwgZGltPTEpCiAgICAgICAgICAgICAgICAjIFQuY29weShhY2NfcywgU19zaGFyZWQpCiAgICAgICAgICAgICAgICBULmNvcHkoYWNjX3MsIGFjY19zX2Nhc3QpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IGxvZ3N1bVtpXSAqIHNjb3Jlc19zY2FsZVtpXSArIHNjb3Jlc19zdW1baV0KICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgZGltKToKICAgICAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAqPSBzY29yZXNfc2NhbGVbaV0KICAgICAgICAgICAgICAgIFQuZ2VtbShhY2Nfc19jYXN0LCBLVl9zaGFyZWQsIGFjY19vLCBwb2xpY3k9VC5HZW1tV2FycFBvbGljeS5GdWxsUm93KQogICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAvPSBsb2dzdW1baV0KICAgICAgICAgICAgVC5jb3B5KGFjY19vLCBPdXRwdXRbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdKQoKICAgIEBULm1hY3JvCiAgICBkZWYgZmxhc2hfYXR0bl9zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKAogICAgICAgICAgICAgICAgYmF0Y2gsIGhlYWRzIC8vIG1pbihibG9ja19ILCBrdl9ncm91cF9udW0pLCBudW1fc3BsaXQsCiAgICAgICAgICAgICAgICB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnksIGJ6KToKICAgICAgICAgICAgUV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGR0eXBlKQogICAgICAgICAgICBRX3BlX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtWX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKFtibG9ja19OLCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgS19wZV9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIGFjY19zID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBhY2Nfc19jYXN0ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGR0eXBlKQogICAgICAgICAgICBhY2NfbyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4X3ByZXYgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zY2FsZSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbG9nc3VtID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgY3VyX2t2X2hlYWQgPSBieSAvLyAoa3ZfZ3JvdXBfbnVtIC8vIGJsb2NrX0gpCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTAsIGVuYWJsZT1lbmFibGVfcmFzdGVyaXphdGlvbikKICAgICAgICAgICAgVC5jb3B5KFFbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX2xvY2FsKQogICAgICAgICAgICBULmNvcHkoUV9wZVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfcGVfbG9jYWwpCiAgICAgICAgICAgIFQuZmlsbChhY2NfbywgMCkKICAgICAgICAgICAgVC5maWxsKGxvZ3N1bSwgMCkKICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKCiAgICAgICAgICAgIGxvb3BfcmFuZ2UgPSBULmNlaWxkaXYoKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpLCBibG9ja19OKQogICAgICAgICAgICBmb3IgayBpbiBULlBpcGVsaW5lZChsb29wX3JhbmdlLCBudW1fc3RhZ2VzPW51bV9zdGFnZXMpOgogICAgICAgICAgICAgICAga3Zfc3RhcnQgPSAoc2VxbGVuX2t2IC8vIG51bV9zcGxpdCkgKiBieiArIGsgKiBibG9ja19OCiAgICAgICAgICAgICAgICBrdl9lbmQgPSAoc2VxbGVuX2t2IC8vIG51bV9zcGxpdCkgKiBieiArIChrICsgMSkgKiBibG9ja19OCiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGt2X3N0YXJ0Omt2X2VuZCwgY3VyX2t2X2hlYWQsIDpdLCBLVl9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY29weShLX3BlW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS19wZV9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY2xlYXIoYWNjX3MpCiAgICAgICAgICAgICAgICBULmdlbW0oUV9sb2NhbCwgS1Zfc2hhcmVkLCBhY2NfcywgdHJhbnNwb3NlX0I9VHJ1ZSwgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuZ2VtbSgKICAgICAgICAgICAgICAgICAgICBRX3BlX2xvY2FsLAogICAgICAgICAgICAgICAgICAgIEtfcGVfc2hhcmVkLAogICAgICAgICAgICAgICAgICAgIGFjY19zLAogICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV9CPVRydWUsCiAgICAgICAgICAgICAgICAgICAgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuY29weShzY29yZXNfbWF4LCBzY29yZXNfbWF4X3ByZXYpCiAgICAgICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQogICAgICAgICAgICAgICAgVC5yZWR1Y2VfbWF4KGFjY19zLCBzY29yZXNfbWF4LCBkaW09MSwgY2xlYXI9RmFsc2UpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIHNjb3Jlc19zY2FsZVtpXSA9IFQuZXhwMihzY29yZXNfbWF4X3ByZXZbaV0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgYmxvY2tfTik6CiAgICAgICAgICAgICAgICAgICAgYWNjX3NbaSwgal0gPSBULmV4cDIoYWNjX3NbaSwgal0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX3N1bShhY2Nfcywgc2NvcmVzX3N1bSwgZGltPTEpCiAgICAgICAgICAgICAgICBULmNvcHkoYWNjX3MsIGFjY19zX2Nhc3QpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IGxvZ3N1bVtpXSAqIHNjb3Jlc19zY2FsZVtpXSArIHNjb3Jlc19zdW1baV0KICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgZGltKToKICAgICAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAqPSBzY29yZXNfc2NhbGVbaV0KICAgICAgICAgICAgICAgIFQuZ2VtbShhY2Nfc19jYXN0LCBLVl9zaGFyZWQsIGFjY19vLCBwb2xpY3k9VC5HZW1tV2FycFBvbGljeS5GdWxsUm93KQogICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAvPSBsb2dzdW1baV0KICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IFQubG9nMihsb2dzdW1baV0pICsgc2NvcmVzX21heFtpXSAqIHNjYWxlCiAgICAgICAgICAgIFQuY29weShsb2dzdW0sIGdsc2VbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6XSkKICAgICAgICAgICAgVC5jb3B5KGFjY19vLCBPdXRwdXRfcGFydGlhbFtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgYnosIDpdKQoKICAgIEBULm1hY3JvCiAgICBkZWYgY29tYmluZSgKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKGhlYWRzLCBiYXRjaCwgdGhyZWFkcz0xMjgpIGFzIChieSwgYnopOgogICAgICAgICAgICBwb19sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBvX2FjY3VtX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbZGltXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2NhbF9zcGxpdCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbHNlX21heF9sb2NhbCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NhbGVfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCgogICAgICAgICAgICBULmFubm90YXRlX2xheW91dCh7CiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsOiBULkZyYWdtZW50KGxzZV9sb2dzdW1fbG9jYWwuc2hhcGUsIGZvcndhcmRfdGhyZWFkX2ZuPWxhbWJkYSBpOiBpKSwKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIFQuY2xlYXIobHNlX2xvZ3N1bV9sb2NhbCkKICAgICAgICAgICAgVC5jbGVhcihvX2FjY3VtX2xvY2FsKQogICAgICAgICAgICBsc2VfbWF4X2xvY2FsWzBdID0gLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGZvciBrIGluIFQuc2VyaWFsKG51bV9zcGxpdCk6CiAgICAgICAgICAgICAgICBsc2VfbWF4X2xvY2FsWzBdID0gVC5tYXgobHNlX21heF9sb2NhbFswXSwgZ2xzZVtieiwgYnksIGtdKQogICAgICAgICAgICBmb3IgayBpbiBULlBpcGVsaW5lZChudW1fc3BsaXQsIG51bV9zdGFnZXM9MSk6CiAgICAgICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXRbMF0gPSBnbHNlW2J6LCBieSwga10KICAgICAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWxbMF0gKz0gVC5leHAyKGxzZV9sb2NhbF9zcGxpdFswXSAtIGxzZV9tYXhfbG9jYWxbMF0pCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWxbMF0gPSBULmxvZzIobHNlX2xvZ3N1bV9sb2NhbFswXSkgKyBsc2VfbWF4X2xvY2FsWzBdCiAgICAgICAgICAgIGZvciBrIGluIFQuc2VyaWFsKG51bV9zcGxpdCk6CiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICAgICAgcG9fbG9jYWxbaV0gPSBPdXRwdXRfcGFydGlhbFtieiwgYnksIGssIGldCiAgICAgICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXRbMF0gPSBnbHNlW2J6LCBieSwga10KICAgICAgICAgICAgICAgIHNjYWxlX2xvY2FsWzBdID0gVC5leHAyKGxzZV9sb2NhbF9zcGxpdFswXSAtIGxzZV9sb2dzdW1fbG9jYWxbMF0pCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICAgICAgb19hY2N1bV9sb2NhbFtpXSArPSBwb19sb2NhbFtpXSAqIHNjYWxlX2xvY2FsWzBdCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoZGltKToKICAgICAgICAgICAgICAgIE91dHB1dFtieiwgYnksIGldID0gb19hY2N1bV9sb2NhbFtpXQoKICAgIEBULnByaW1fZnVuYwogICAgZGVmIG1haW5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0OiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICApOgogICAgICAgIGZsYXNoX2F0dG5fc3BsaXQoUSwgUV9wZSwgS1YsIEtfcGUsIGdsc2UsIE91dHB1dF9wYXJ0aWFsKQogICAgICAgIGNvbWJpbmUoZ2xzZSwgT3V0cHV0X3BhcnRpYWwsIE91dHB1dCkKCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX25vX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuKFEsIFFfcGUsIEtWLCBLX3BlLCBPdXRwdXQpCgogICAgaWYgbnVtX3NwbGl0ID4gMToKICAgICAgICByZXR1cm4gbWFpbl9zcGxpdAogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFpbl9ub19zcGxpdAoKCmRlZiBnZXRfY29uZmlncygpOgogICAgaW1wb3J0IGl0ZXJ0b29scwogICAgYmxvY2tfTiA9IFsxNiwgMzIsIDY0LCAxMjhdCiAgICBibG9ja19IID0gWzE2LCAzMiwgNjQsIDEyOF0KICAgIG51bV9zcGxpdCA9IFsxLCAyLCA0LCA4LCAxNl0KICAgIG51bV9zdGFnZXMgPSBbMCwgMV0KICAgIGVuYWJsZV9yYXN0ZXJpemF0aW9uID0gW0ZhbHNlLCBUcnVlXQoKICAgIF9jb25maWdzID0gbGlzdChpdGVydG9vbHMucHJvZHVjdChibG9ja19OLCBibG9ja19ILCBudW1fc3BsaXQsIG51bV9zdGFnZXMsIGVuYWJsZV9yYXN0ZXJpemF0aW9uKSkKICAgIAogICAgcmV0dXJuIFt7CiAgICAgICAgImJsb2NrX04iOiBjWzBdLAogICAgICAgICJibG9ja19IIjogY1sxXSwKICAgICAgICAibnVtX3NwbGl0IjogY1syXSwKICAgICAgICAibnVtX3N0YWdlcyI6IGNbM10sCiAgICAgICAgImVuYWJsZV9yYXN0ZXJpemF0aW9uIjogY1s0XSwKICAgIH0gZm9yIGMgaW4gX2NvbmZpZ3NdCgpAdGlsZWxhbmcuYXV0b3R1bmUoY29uZmlncz1nZXRfY29uZmlncygpLCBjYWNoZV9pbnB1dF90ZW5zb3JzPUZhbHNlKQpAdGlsZWxhbmcuaml0KG91dF9pZHg9WzZdKQpkZWYgZmxhc2htbGFfZGVjb2RlX2F1dG90dW5lKGJhdGNoLAogICAgICAgICAgICAgICAgICAgIGhlYWRzLAogICAgICAgICAgICAgICAgICAgIGt2X2hlYWRfbnVtLAogICAgICAgICAgICAgICAgICAgIHNlcWxlbl9rdiwKICAgICAgICAgICAgICAgICAgICBkaW0sCiAgICAgICAgICAgICAgICAgICAgcGVfZGltLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX04sCiAgICAgICAgICAgICAgICAgICAgYmxvY2tfSCwKICAgICAgICAgICAgICAgICAgICBudW1fc3BsaXQsCiAgICAgICAgICAgICAgICAgICAgdGhyZWFkcz0yNTYsCiAgICAgICAgICAgICAgICAgICAgbnVtX3N0YWdlcz0yLAogICAgICAgICAgICAgICAgICAgIGVuYWJsZV9yYXN0ZXJpemF0aW9uPVRydWUpOgogICAgIyBzY2FsZSA9ICgxLjAgLyAoZGltICsgcGVfZGltKSkqKjAuNSAqIDEuNDQyNjk1MDQgICMgbG9nMihlKQogICAgc2NhbGUgPSAoMS4wIC8gKDEyOCArIDY0KSkqKjAuNSAqIDEuNDQyNjk1MDQKICAgICMgZHR5cGUgPSAiZmxvYXQxNiIKICAgIGR0eXBlID0gImJmbG9hdDE2IgogICAgYWNjdW1fZHR5cGUgPSAiZmxvYXQiCiAgICBrdl9ncm91cF9udW0gPSBoZWFkcyAvLyBrdl9oZWFkX251bQogICAgVkFMSURfQkxPQ0tfSCA9IG1pbihibG9ja19ILCBrdl9ncm91cF9udW0pCiAgICBhc3NlcnQga3ZfaGVhZF9udW0gPT0gMSwgImt2X2hlYWRfbnVtIG11c3QgYmUgMSIKICAgIGtfcGFjayA9IDEKICAgIHZlY19zaXplID0gNCAqIGtfcGFjawoKICAgIEBULm1hY3JvCiAgICBkZWYgZmxhc2hfYXR0bigKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5KToKICAgICAgICAgICAgUV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGR0eXBlKQogICAgICAgICAgICBRX3BlX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtWX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKFtibG9ja19OLCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgS19wZV9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIGFjY19zID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBhY2Nfc19jYXN0ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGR0eXBlKQogICAgICAgICAgICBhY2NfbyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4X3ByZXYgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zY2FsZSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbG9nc3VtID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgY3VyX2t2X2hlYWQgPSBieSAvLyAoa3ZfZ3JvdXBfbnVtIC8vIGJsb2NrX0gpCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTAsIGVuYWJsZT1lbmFibGVfcmFzdGVyaXphdGlvbikKCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KHNlcWxlbl9rdiwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIFQuY29weShLVltieCwgayAqIGJsb2NrX046KGsgKyAxKSAqIGJsb2NrX04sIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwgayAqIGJsb2NrX046KGsgKyAxKSAqIGJsb2NrX04sIGN1cl9rdl9oZWFkLCA6XSwgS19wZV9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY2xlYXIoYWNjX3MpCiAgICAgICAgICAgICAgICBULmdlbW0oUV9sb2NhbCwgS1Zfc2hhcmVkLCBhY2NfcywgdHJhbnNwb3NlX0I9VHJ1ZSwgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuZ2VtbSgKICAgICAgICAgICAgICAgICAgICBRX3BlX2xvY2FsLAogICAgICAgICAgICAgICAgICAgIEtfcGVfc2hhcmVkLAogICAgICAgICAgICAgICAgICAgIGFjY19zLAogICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV9CPVRydWUsCiAgICAgICAgICAgICAgICAgICAgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuY29weShzY29yZXNfbWF4LCBzY29yZXNfbWF4X3ByZXYpCiAgICAgICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQogICAgICAgICAgICAgICAgVC5yZWR1Y2VfbWF4KGFjY19zLCBzY29yZXNfbWF4LCBkaW09MSwgY2xlYXI9RmFsc2UpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIHNjb3Jlc19zY2FsZVtpXSA9IFQuZXhwMihzY29yZXNfbWF4X3ByZXZbaV0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgYmxvY2tfTik6CiAgICAgICAgICAgICAgICAgICAgYWNjX3NbaSwgal0gPSBULmV4cDIoYWNjX3NbaSwgal0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX3N1bShhY2Nfcywgc2NvcmVzX3N1bSwgZGltPTEpCiAgICAgICAgICAgICAgICAjIFQuY29weShhY2NfcywgU19zaGFyZWQpCiAgICAgICAgICAgICAgICBULmNvcHkoYWNjX3MsIGFjY19zX2Nhc3QpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IGxvZ3N1bVtpXSAqIHNjb3Jlc19zY2FsZVtpXSArIHNjb3Jlc19zdW1baV0KICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgZGltKToKICAgICAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAqPSBzY29yZXNfc2NhbGVbaV0KICAgICAgICAgICAgICAgIFQuZ2VtbShhY2Nfc19jYXN0LCBLVl9zaGFyZWQsIGFjY19vLCBwb2xpY3k9VC5HZW1tV2FycFBvbGljeS5GdWxsUm93KQogICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAvPSBsb2dzdW1baV0KICAgICAgICAgICAgVC5jb3B5KGFjY19vLCBPdXRwdXRbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdKQoKICAgIEBULm1hY3JvCiAgICBkZWYgZmxhc2hfYXR0bl9zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKAogICAgICAgICAgICAgICAgYmF0Y2gsIGhlYWRzIC8vIG1pbihibG9ja19ILCBrdl9ncm91cF9udW0pLCBudW1fc3BsaXQsCiAgICAgICAgICAgICAgICB0aHJlYWRzPXRocmVhZHMpIGFzIChieCwgYnksIGJ6KToKICAgICAgICAgICAgUV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGR0eXBlKQogICAgICAgICAgICBRX3BlX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtWX3NoYXJlZCA9IFQuYWxsb2Nfc2hhcmVkKFtibG9ja19OLCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgS19wZV9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgcGVfZGltXSwgZHR5cGUpCiAgICAgICAgICAgIGFjY19zID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBhY2Nfc19jYXN0ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSCwgYmxvY2tfTl0sIGR0eXBlKQogICAgICAgICAgICBhY2NfbyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGRpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfbWF4X3ByZXYgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zY2FsZSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbG9nc3VtID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgY3VyX2t2X2hlYWQgPSBieSAvLyAoa3ZfZ3JvdXBfbnVtIC8vIGJsb2NrX0gpCiAgICAgICAgICAgIFQudXNlX3N3aXp6bGUoMTAsIGVuYWJsZT1lbmFibGVfcmFzdGVyaXphdGlvbikKICAgICAgICAgICAgVC5jb3B5KFFbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX2xvY2FsKQogICAgICAgICAgICBULmNvcHkoUV9wZVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfcGVfbG9jYWwpCiAgICAgICAgICAgIFQuZmlsbChhY2NfbywgMCkKICAgICAgICAgICAgVC5maWxsKGxvZ3N1bSwgMCkKICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKCiAgICAgICAgICAgIGxvb3BfcmFuZ2UgPSBULmNlaWxkaXYoKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpLCBibG9ja19OKQogICAgICAgICAgICBmb3IgayBpbiBULlBpcGVsaW5lZChsb29wX3JhbmdlLCBudW1fc3RhZ2VzPW51bV9zdGFnZXMpOgogICAgICAgICAgICAgICAga3Zfc3RhcnQgPSAoc2VxbGVuX2t2IC8vIG51bV9zcGxpdCkgKiBieiArIGsgKiBibG9ja19OCiAgICAgICAgICAgICAgICBrdl9lbmQgPSAoc2VxbGVuX2t2IC8vIG51bV9zcGxpdCkgKiBieiArIChrICsgMSkgKiBibG9ja19OCiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGt2X3N0YXJ0Omt2X2VuZCwgY3VyX2t2X2hlYWQsIDpdLCBLVl9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY29weShLX3BlW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS19wZV9zaGFyZWQsIGNvYWxlc2NlZF93aWR0aD12ZWNfc2l6ZSkKICAgICAgICAgICAgICAgIFQuY2xlYXIoYWNjX3MpCiAgICAgICAgICAgICAgICBULmdlbW0oUV9sb2NhbCwgS1Zfc2hhcmVkLCBhY2NfcywgdHJhbnNwb3NlX0I9VHJ1ZSwgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuZ2VtbSgKICAgICAgICAgICAgICAgICAgICBRX3BlX2xvY2FsLAogICAgICAgICAgICAgICAgICAgIEtfcGVfc2hhcmVkLAogICAgICAgICAgICAgICAgICAgIGFjY19zLAogICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZV9CPVRydWUsCiAgICAgICAgICAgICAgICAgICAgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgICAgIFQuY29weShzY29yZXNfbWF4LCBzY29yZXNfbWF4X3ByZXYpCiAgICAgICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQogICAgICAgICAgICAgICAgVC5yZWR1Y2VfbWF4KGFjY19zLCBzY29yZXNfbWF4LCBkaW09MSwgY2xlYXI9RmFsc2UpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIHNjb3Jlc19zY2FsZVtpXSA9IFQuZXhwMihzY29yZXNfbWF4X3ByZXZbaV0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgYmxvY2tfTik6CiAgICAgICAgICAgICAgICAgICAgYWNjX3NbaSwgal0gPSBULmV4cDIoYWNjX3NbaSwgal0gKiBzY2FsZSAtIHNjb3Jlc19tYXhbaV0gKiBzY2FsZSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX3N1bShhY2Nfcywgc2NvcmVzX3N1bSwgZGltPTEpCiAgICAgICAgICAgICAgICBULmNvcHkoYWNjX3MsIGFjY19zX2Nhc3QpCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGJsb2NrX0gpOgogICAgICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IGxvZ3N1bVtpXSAqIHNjb3Jlc19zY2FsZVtpXSArIHNjb3Jlc19zdW1baV0KICAgICAgICAgICAgICAgIGZvciBpLCBqIGluIFQuUGFyYWxsZWwoYmxvY2tfSCwgZGltKToKICAgICAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAqPSBzY29yZXNfc2NhbGVbaV0KICAgICAgICAgICAgICAgIFQuZ2VtbShhY2Nfc19jYXN0LCBLVl9zaGFyZWQsIGFjY19vLCBwb2xpY3k9VC5HZW1tV2FycFBvbGljeS5GdWxsUm93KQogICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICBhY2Nfb1tpLCBqXSAvPSBsb2dzdW1baV0KICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgIGxvZ3N1bVtpXSA9IFQubG9nMihsb2dzdW1baV0pICsgc2NvcmVzX21heFtpXSAqIHNjYWxlCiAgICAgICAgICAgIFQuY29weShsb2dzdW0sIGdsc2VbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6XSkKICAgICAgICAgICAgVC5jb3B5KGFjY19vLCBPdXRwdXRfcGFydGlhbFtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgYnosIDpdKQoKICAgIEBULm1hY3JvCiAgICBkZWYgY29tYmluZSgKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICB3aXRoIFQuS2VybmVsKGhlYWRzLCBiYXRjaCwgdGhyZWFkcz0xMjgpIGFzIChieSwgYnopOgogICAgICAgICAgICBwb19sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBvX2FjY3VtX2xvY2FsID0gVC5hbGxvY19mcmFnbWVudChbZGltXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2NhbF9zcGxpdCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgbHNlX21heF9sb2NhbCA9IFQuYWxsb2NfbG9jYWwoWzFdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NhbGVfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCgogICAgICAgICAgICBULmFubm90YXRlX2xheW91dCh7CiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsOiBULkZyYWdtZW50KGxzZV9sb2dzdW1fbG9jYWwuc2hhcGUsIGZvcndhcmRfdGhyZWFkX2ZuPWxhbWJkYSBpOiBpKSwKICAgICAgICAgICAgfSkKCiAgICAgICAgICAgIFQuY2xlYXIobHNlX2xvZ3N1bV9sb2NhbCkKICAgICAgICAgICAgVC5jbGVhcihvX2FjY3VtX2xvY2FsKQogICAgICAgICAgICBsc2VfbWF4X2xvY2FsWzBdID0gLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGZvciBrIGluIFQuc2VyaWFsKG51bV9zcGxpdCk6CiAgICAgICAgICAgICAgICBsc2VfbWF4X2xvY2FsWzBdID0gVC5tYXgobHNlX21heF9sb2NhbFswXSwgZ2xzZVtieiwgYnksIGtdKQogICAgICAgICAgICBmb3IgayBpbiBULlBpcGVsaW5lZChudW1fc3BsaXQsIG51bV9zdGFnZXM9MSk6CiAgICAgICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXRbMF0gPSBnbHNlW2J6LCBieSwga10KICAgICAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWxbMF0gKz0gVC5leHAyKGxzZV9sb2NhbF9zcGxpdFswXSAtIGxzZV9tYXhfbG9jYWxbMF0pCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWxbMF0gPSBULmxvZzIobHNlX2xvZ3N1bV9sb2NhbFswXSkgKyBsc2VfbWF4X2xvY2FsWzBdCiAgICAgICAgICAgIGZvciBrIGluIFQuc2VyaWFsKG51bV9zcGxpdCk6CiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICAgICAgcG9fbG9jYWxbaV0gPSBPdXRwdXRfcGFydGlhbFtieiwgYnksIGssIGldCiAgICAgICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXRbMF0gPSBnbHNlW2J6LCBieSwga10KICAgICAgICAgICAgICAgIHNjYWxlX2xvY2FsWzBdID0gVC5leHAyKGxzZV9sb2NhbF9zcGxpdFswXSAtIGxzZV9sb2dzdW1fbG9jYWxbMF0pCiAgICAgICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICAgICAgb19hY2N1bV9sb2NhbFtpXSArPSBwb19sb2NhbFtpXSAqIHNjYWxlX2xvY2FsWzBdCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoZGltKToKICAgICAgICAgICAgICAgIE91dHB1dFtieiwgYnksIGldID0gb19hY2N1bV9sb2NhbFtpXQoKICAgIEBULnByaW1fZnVuYwogICAgZGVmIG1haW5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0OiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICApOgogICAgICAgIGZsYXNoX2F0dG5fc3BsaXQoUSwgUV9wZSwgS1YsIEtfcGUsIGdsc2UsIE91dHB1dF9wYXJ0aWFsKQogICAgICAgIGNvbWJpbmUoZ2xzZSwgT3V0cHV0X3BhcnRpYWwsIE91dHB1dCkKCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX25vX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuKFEsIFFfcGUsIEtWLCBLX3BlLCBPdXRwdXQpCgogICAgaWYgbnVtX3NwbGl0ID4gMToKICAgICAgICByZXR1cm4gbWFpbl9zcGxpdAogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFpbl9ub19zcGxpdAoKY2xhc3MgUm9QRShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRfbW9kZWw6IGludCk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kX21vZGVsID0gZF9tb2RlbAogICAgICAgIHRoZXRhID0gMTAwMDAgKiogKC10b3JjaC5hcmFuZ2UoMCwgZF9tb2RlbC8vMixkdHlwZT10b3JjaC5iZmxvYXQxNikgLyAoZF9tb2RlbC8vMikpCiAgICAgICAgdGhldGEgPSB0aGV0YS50bygiY3VkYSIpCiAgICAgICAgc2VsZi5yZWdpc3Rlcl9idWZmZXIoInRoZXRhIiwgdGhldGEpCgogICAgZGVmIHJvdGF0ZV9oYWxmKHNlbGYsIHg6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHgxLCB4MiA9IHguY2h1bmsoMiwgZGltPS0xKQogICAgICAgIHJldHVybiB0b3JjaC5jYXQoKC14MiwgeDEpLCBkaW09LTEpCgogICAgZGVmIGZvcndhcmQoc2VsZiwgeDogdG9yY2guVGVuc29yLCBzdGFydF9wb3M6IGludCA9IDApIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBzZXFfbGVuID0geC5zaXplKC0yKQogICAgICAgIGRfbW9kZWwgPSB4LnNpemUoLTEpCiAgICAgICAgYXNzZXJ0IGRfbW9kZWwgPT0gc2VsZi5kX21vZGVsCiAgICAgICAgc2VxX2lkeCA9IHRvcmNoLmFyYW5nZShzdGFydF9wb3MsIHN0YXJ0X3BvcyArIHNlcV9sZW4sIGRldmljZT14LmRldmljZSkKICAgICAgICBpZHhfdGhldGEgPSB0b3JjaC5laW5zdW0oJ3MsZC0+c2QnLCBzZXFfaWR4LCBzZWxmLnRoZXRhKQogICAgICAgIGlkeF90aGV0YTIgPSB0b3JjaC5jYXQoW2lkeF90aGV0YSwgaWR4X3RoZXRhXSwgZGltPS0xKQogICAgICAgIGNvcyA9IGlkeF90aGV0YTIuY29zKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgc2luID0gaWR4X3RoZXRhMi5zaW4oKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICByZXR1cm4geCAqIGNvcyArIHNlbGYucm90YXRlX2hhbGYoeCkgKiBzaW4KCgpjbGFzcyBLVkNhY2hlKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwga3ZfY2FjaGVfc2hhcGU6IHR1cGxlKSAtPiBOb25lOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCdkYXRhJywgdG9yY2guemVyb3Moa3ZfY2FjaGVfc2hhcGUsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9J2N1ZGEnKSkKICAgICAgICBzZWxmLnNlcV9sZW4gPSAwCiAgICAgICAgc2VsZi56ZXJvKCkKCiAgICBkZWYgemVybyhzZWxmKSAtPiBOb25lOgogICAgICAgIHNlbGYuZGF0YS56ZXJvXygpCiAgICAKICAgIGRlZiBnZXRfZGF0YShzZWxmKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGNfa3Y6IHRvcmNoLlRlbnNvcikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIGFzc2VydCBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSkgPD0gc2VsZi5kYXRhLnNpemUoMSksICJLViBDYWNoZSBFeGNlZWRlZCIKCiAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhLnRvKGNfa3YuZHR5cGUpCiAgICAgICAgc2VsZi5kYXRhWwogICAgICAgICAgICA6LCBzZWxmLnNlcV9sZW4gOiBzZWxmLnNlcV9sZW4gKyBjX2t2LnNpemUoMSksIDoKICAgICAgICBdID0gY19rdgogICAgICAgIHNlbGYuc2VxX2xlbiArPSBjX2t2LnNpemUoMSkKCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVs6LCA6c2VsZi5zZXFfbGVuXSwgc2VsZi5zZXFfbGVuCgpAZGF0YWNsYXNzCmNsYXNzIENvbmZpZzoKICAgIGJhdGNoX3NpemU6IGludAogICAgZGltOiBpbnQKICAgIG5faGVhZHM6IGludAogICAgcV9sb3JhX3Jhbms6IGludCAKICAgIGt2X2xvcmFfcmFuazogaW50CiAgICBxa19ub3BlX2hlYWRfZGltOiBpbnQKICAgIHFrX3JvcGVfaGVhZF9kaW06IGludAogICAgdl9oZWFkX2RpbTogaW50CiAgICBzZXFfbGVuOiBpbnQKICAgIG1heF9zZXFfbGVuOiBpbnQKICAgIGt2X2NhY2hlX3NoYXBlOiB0dXBsZQogICAgUV9wcm9qX2Rvd25fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIFFfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBLVl9wcm9qX3VwX3dlaWdodDogdG9yY2guVGVuc29yCiAgICB3b193ZWlnaHQ6IHRvcmNoLlRlbnNvcgoKY2xhc3MgTUxBKG5uLk1vZHVsZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnOiBDb25maWcsIG1sYV90bF9rZXJuZWw6IHRpbGVsYW5nLkpJVEtlcm5lbCwga2VybmVsX2Jlc3RfY29uZmlnKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmRpbSA9IGNvbmZpZy5kaW0KICAgICAgICBzZWxmLm5faGVhZHMgPSBjb25maWcubl9oZWFkcwogICAgICAgIHNlbGYucV9sb3JhX3JhbmsgPSBjb25maWcucV9sb3JhX3JhbmsKICAgICAgICBzZWxmLmt2X2xvcmFfcmFuayA9IGNvbmZpZy5rdl9sb3JhX3JhbmsKICAgICAgICBzZWxmLm5vcGVfaGVhZF9kaW0gPSBjb25maWcucWtfbm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYucm9wZV9oZWFkX2RpbSA9IGNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICAgICAgc2VsZi52X2hlYWRfZGltID0gY29uZmlnLnZfaGVhZF9kaW0KICAgICAgICBkZXZpY2UgPSAiY3VkYSIKICAgICAgICBzZWxmLlFfcHJval9kb3duID0gbm4uTGluZWFyKHNlbGYuZGltLCBzZWxmLnFfbG9yYV9yYW5rLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPWRldmljZSkKICAgICAgICBzZWxmLktWX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5rdl9sb3JhX3JhbmsgKyBzZWxmLnJvcGVfaGVhZF9kaW0sIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9ZGV2aWNlKQoKICAgICAgICBzZWxmLlFfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLnFfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT1kZXZpY2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX3VwID0gbm4uTGluZWFyKHNlbGYua3ZfbG9yYV9yYW5rLCAoc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi52X2hlYWRfZGltKSAqIHNlbGYubl9oZWFkcywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT1kZXZpY2UpCgogICAgICAgICMgUm9QRSBvbiBoYWxmIGVtYmVkZGluZ3MKICAgICAgICBzZWxmLnFfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQogICAgICAgIHNlbGYua19yb3BlID0gUm9QRShzZWxmLnJvcGVfaGVhZF9kaW0pCgogICAgICAgICMgT3V0cHV0IHByb2plY3Rpb24KICAgICAgICBzZWxmLndvID0gbm4uTGluZWFyKHNlbGYudl9oZWFkX2RpbSAqIHNlbGYubl9oZWFkcywgc2VsZi5kaW0sIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBiaWFzPUZhbHNlLCBkZXZpY2U9ZGV2aWNlKQogICAgICAgIHNlbGYuZXBzID0gMWUtNgogICAgICAgIHNlbGYubWxhX3RsX2tlcm5lbCA9IG1sYV90bF9rZXJuZWwKICAgICAgICBzZWxmLmtlcm5lbF9iZXN0X2NvbmZpZyA9IGtlcm5lbF9iZXN0X2NvbmZpZwogICAKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwga3ZfY2FjaGU6IEtWQ2FjaGUpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICAjIHNlcV9sZW4gPSAxIGFsd2F5cyBoZXJlCiAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgbW9kZWxfZGltID0geC5zaXplKCkKCiAgICAgICAgcV9sb3JhID0gc2VsZi5RX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEgPSBzZWxmLktWX3Byb2pfZG93bih4KQogICAgICAgIGt2X2xvcmEsIGt2X2xlbiA9IGt2X2NhY2hlKGt2X2xvcmEpIAogICAgICAgIHF1ZXJ5X3BvcyA9IGt2X2xlbiAtIDEKCiAgICAgICAgcV9ub3BlX2FuZF9wZSA9IHNlbGYuUV9wcm9qX3VwKHFfbG9yYSkudmlldygKICAgICAgICAgICAgYmF0Y2hfc2l6ZSwgc2VxX2xlbiwgc2VsZi5uX2hlYWRzLCBzZWxmLm5vcGVfaGVhZF9kaW0gKyBzZWxmLnJvcGVfaGVhZF9kaW0pLnRyYW5zcG9zZSgxLCAyKQogICAgICAgIHEsIHFfcGUgPSB0b3JjaC5zcGxpdChxX25vcGVfYW5kX3BlLCBbc2VsZi5ub3BlX2hlYWRfZGltLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAgcV9wZSA9IHNlbGYucV9yb3BlKHFfcGUsIHN0YXJ0X3Bvcz1xdWVyeV9wb3MpCgogICAgICAgIGt2LCBrX3BlID0gdG9yY2guc3BsaXQoa3ZfbG9yYSwgW3NlbGYua3ZfbG9yYV9yYW5rLCBzZWxmLnJvcGVfaGVhZF9kaW1dLCBkaW09LTEpCiAgICAgICAga19wZSA9IGtfcGVbOiwgTm9uZSwgOiwgOl0KICAgICAgICBrX3BlID0gc2VsZi5rX3JvcGUoa19wZSkKCiAgICAgICAgS1ZfcHJval91cCA9IHNlbGYuS1ZfcHJval91cC53ZWlnaHQudmlldyhzZWxmLm5faGVhZHMsIC0xLCBzZWxmLmt2X2xvcmFfcmFuaykKICAgICAgICBxX2Fic29yYiA9IEtWX3Byb2pfdXBbOiwgOnNlbGYubm9wZV9oZWFkX2RpbSwgOl0KICAgICAgICBvdXRfYWJzb3JiID0gS1ZfcHJval91cFs6LCBzZWxmLm5vcGVfaGVhZF9kaW06LCA6XQogICAgICAgIHEgPSB0b3JjaC5tYXRtdWwocSwgcV9hYnNvcmIpCiAgICAgICAgCiAgICAgICAgbnVtX3NwbGl0cyA9IHNlbGYua2VybmVsX2Jlc3RfY29uZmlnWydudW1fc3BsaXQnXQogICAgICAgIGdsc2UgPSB0b3JjaC56ZXJvcygoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBudW1fc3BsaXRzKSwgZHR5cGU9dG9yY2guZmxvYXQsIGRldmljZT14LmRldmljZSkKICAgICAgICBvdXRwdXRfcGFydGlhbCA9IHRvcmNoLnplcm9zKChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIG51bV9zcGxpdHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwgZHR5cGU9dG9yY2guZmxvYXQsIGRldmljZT14LmRldmljZSkKICAgICAgICAKICAgICAgICBxX3RsID0gcS52aWV3KGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VsZi5rdl9sb3JhX3JhbmspCiAgICAgICAgcV9wZV90bCA9IHFfcGUudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBrdl90bCA9IGt2LnZpZXcoYmF0Y2hfc2l6ZSwga3ZfbGVuLCAxLCBzZWxmLmt2X2xvcmFfcmFuaykuY29udGlndW91cygpCiAgICAgICAga19wZV90bCA9IGtfcGUudHJhbnNwb3NlKDEsIDIpCgogICAgICAgIHRsX2F0dG5fb3V0ID0gdG9yY2guemVyb3MoKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgc2VsZi5rdl9sb3JhX3JhbmspLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPXguZGV2aWNlKQogICAgICAgIGlmIGt2X2xlbiA8IDEzMDoKICAgICAgICAgICAgc29mdG1heF9zY2FsZSA9IDEgLyBtYXRoLnNxcnQoc2VsZi5yb3BlX2hlYWRfZGltICsgc2VsZi5ub3BlX2hlYWRfZGltKQogICAgICAgICAgICBhdHRuX3dlaWdodHMgPSAodG9yY2gubWF0bXVsKHFfcGUsIGtfcGUubVQpICsgdG9yY2gubWF0bXVsKHEsIGt2LnVuc3F1ZWV6ZSgtMykubVQpKSAqIHNvZnRtYXhfc2NhbGUKICAgICAgICAgICAgYXR0bl93ZWlnaHRzX3NvZnRtYXggPSBubi5mdW5jdGlvbmFsLnNvZnRtYXgoYXR0bl93ZWlnaHRzLCBkaW09LTEsIGR0eXBlPXRvcmNoLmZsb2F0MzIpLnRvKHEuZHR5cGUpCiAgICAgICAgICAgIHRsX2F0dG5fb3V0ID0gdG9yY2guZWluc3VtKCdiaHFsLCBibGMgLT4gYmhxYycsIGF0dG5fd2VpZ2h0c19zb2Z0bWF4LCBrdikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGxfYXR0bl9vdXQgPSBzZWxmLm1sYV90bF9rZXJuZWwoCiAgICAgICAgICAgICAgICBxX3RsLCAgICAgICAgIAogICAgICAgICAgICAgICAgcV9wZV90bCwgICAgIAogICAgICAgICAgICAgICAga3ZfdGwsIAogICAgICAgICAgICAgICAga19wZV90bCwgICAgIAogICAgICAgICAgICAgICAgZ2xzZSwKICAgICAgICAgICAgICAgIG91dHB1dF9wYXJ0aWFsLAogICAgICAgICAgICApCgogICAgICAgIHRsX2F0dG5fb3V0ID0gdGxfYXR0bl9vdXQudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIDEsIHNlbGYua3ZfbG9yYV9yYW5rKQogICAgICAgIG91dF9hYnNvcmIgPSBvdXRfYWJzb3JiLnRyYW5zcG9zZSgtMiwgLTEpLmNvbnRpZ3VvdXMoKQoKICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLm1hdG11bCh0bF9hdHRuX291dCwgb3V0X2Fic29yYikKICAgIAogICAgICAgIHRsX2F0dG5fb3V0ID0gdGxfYXR0bl9vdXQudHJhbnNwb3NlKDEsIDIpLmNvbnRpZ3VvdXMoKQogICAgICAgIHRsX2F0dG5fb3V0ID0gdGxfYXR0bl9vdXQucmVzaGFwZShiYXRjaF9zaXplLCAxLCBzZWxmLm5faGVhZHMgKiBzZWxmLnZfaGVhZF9kaW0pCiAgICAgICAgdGxfYXR0bl9vdXQgPSBzZWxmLndvKHRsX2F0dG5fb3V0KQogICAgICAgIHJldHVybiB0bF9hdHRuX291dCwga3ZfY2FjaGUuZ2V0X2RhdGEoKSAKCmRlZiBjdXN0b21fa2VybmVsKGRhdGE6IGlucHV0X3QpIC0+IG91dHB1dF90OgogICAgY29uZmlnLCB4LCBrdl9jYWNoZSA9IGRhdGEKICAgIG1sYV90bF9rZXJuZWwsIGtlcm5lbF9iZXN0X2NvbmZpZyA9IGdldF9vcHRpbWFsX2tlcm5lbCgKICAgICAgICBiYXRjaD1jb25maWcuYmF0Y2hfc2l6ZSwKICAgICAgICBoZWFkcz1jb25maWcubl9oZWFkcywKICAgICAgICBrdl9oZWFkX251bT0xLAogICAgICAgIHNlcWxlbl9rdj1rdl9jYWNoZS5zZXFfbGVuLAogICAgICAgIGRpbT1jb25maWcua3ZfbG9yYV9yYW5rLAogICAgICAgIHBlX2RpbT1jb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgKQogICAgbW9kZWwgPSBNTEEoY29uZmlnLCBtbGFfdGxfa2VybmVsLCBrZXJuZWxfYmVzdF9jb25maWcpCiAgICBtb2RlbC5RX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval9kb3duX3dlaWdodCkKICAgIG1vZGVsLlFfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLlFfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX2Rvd24ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy5LVl9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuS1ZfcHJval91cC53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfdXBfd2VpZ2h0KQogICAgbW9kZWwud28ud2VpZ2h0ID0gbm4uUGFyYW1ldGVyKGNvbmZpZy53b193ZWlnaHQpCiAgICBvdXRwdXQsIGt2X2NhY2hlID0gbW9kZWwoeCwga3ZfY2FjaGUpCiAgICByZXR1cm4gb3V0cHV0LCBrdl9jYWNoZQ==No newline at end of file+ ZnJvbSBwaXAuX2ludGVybmFsIGltcG9ydCBtYWluIGFzIHBpcF9tYWluCnBpcF9tYWluKFsiaW5zdGFsbCIsInRpbGVsYW5nLXJvY20iXSkKCmltcG9ydCBtYXRoCmZyb20gZGF0YWNsYXNzZXMgaW1wb3J0IGRhdGFjbGFzcwppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaCBpbXBvcnQgbm4KaW1wb3J0IHRvcmNoLm5uLmZ1bmN0aW9uYWwgYXMgRgpmcm9tIHRhc2sgaW1wb3J0IGlucHV0X3QsIG91dHB1dF90CmltcG9ydCB0aWxlbGFuZwpmcm9tIHRpbGVsYW5nLmF1dG90dW5lciBpbXBvcnQgKgppbXBvcnQgdGlsZWxhbmcubGFuZ3VhZ2UgYXMgVApmcm9tIHRvcmNoLnByb2ZpbGVyIGltcG9ydCBwcm9maWxlLCByZWNvcmRfZnVuY3Rpb24sIFByb2ZpbGVyQWN0aXZpdHkKaW1wb3J0IHRpbWUKCnRpbGVsYW5nLmNhY2hlLmNsZWFyX2NhY2hlKCkKIyB0aWxlbGFuZy5kaXNhYmxlX2NhY2hlKCkKCkJBU0VfQ09ORklHUyA9IHsKICAgIDEyODogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDEsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDUxMjogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDEwMjQ6IHsnYmxvY2tfTic6IDE2LCAnYmxvY2tfSCc6IDY0LCAnbnVtX3NwbGl0JzogMSwgJ251bV9zdGFnZXMnOiAwLCAnZW5hYmxlX3Jhc3Rlcml6YXRpb24nOiBGYWxzZX0sCiAgICAyMDQ4OiB7J2Jsb2NrX04nOiAxNiwgJ2Jsb2NrX0gnOiA2NCwgJ251bV9zcGxpdCc6IDEsICdudW1fc3RhZ2VzJzogMCwgJ2VuYWJsZV9yYXN0ZXJpemF0aW9uJzogRmFsc2V9LAogICAgNDA5NjogeydibG9ja19OJzogMTYsICdibG9ja19IJzogNjQsICdudW1fc3BsaXQnOiAxLCAnbnVtX3N0YWdlcyc6IDAsICdlbmFibGVfcmFzdGVyaXphdGlvbic6IEZhbHNlfSwKICAgIDYxNDQ6IHsnYmxvY2tfTic6IDE2LCAnYmxvY2tfSCc6IDY0LCAnbnVtX3NwbGl0JzogMiwgJ251bV9zdGFnZXMnOiAwLCAnZW5hYmxlX3Jhc3Rlcml6YXRpb24nOiBGYWxzZX0KfQoKUFJFRklMTF9DT05GSUdTID0gQkFTRV9DT05GSUdTLmNvcHkoKQpjb25maWdfNDA5NiA9IEJBU0VfQ09ORklHU1s0MDk2XQpmb3IgaSBpbiByYW5nZSg0MDk3LCA0MTk3KTogICMgNDA5N+WIsDQxOTYKICAgIFBSRUZJTExfQ09ORklHU1tpXSA9IGNvbmZpZ180MDk2CgoKZGVmIGdldF9vcHRpbWFsX2tlcm5lbChiYXRjaCwgaGVhZHMsIGt2X2hlYWRfbnVtLCBzZXFsZW5fa3YsIGRpbSwgcGVfZGltKToKICAgIHVzZV9hdXRvdHVuZSA9IHNlcWxlbl9rdiA+IDYxNDQKICAgIGlmIHVzZV9hdXRvdHVuZToKICAgICAgICBwcmludChmIltBVVRPIFRVTkVdIFVzaW5nIGF1dG90dW5lIGZvciBzZXFsZW5fa3Y9e3NlcWxlbl9rdn0iKQogICAgICAgIAogICAgICAgICMg5L2/55SoIGF1dG90dW5lIOeJiOacrOeahCBrZXJuZWwKICAgICAgICBrZXJuZWwgPSBmbGFzaG1sYV9kZWNvZGVfYXV0b3R1bmUoCiAgICAgICAgICAgIGJhdGNoLAogICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAga3ZfaGVhZF9udW0sCiAgICAgICAgICAgIHNlcWxlbl9rdisxLAogICAgICAgICAgICBkaW0sCiAgICAgICAgICAgIHBlX2RpbQogICAgICAgICkKICAgICAgICBiZXN0X2NvbmZpZyA9IGtlcm5lbC5jb25maWcKICAgICAgICBwcmludChmIltBVVRPIFRVTkVdIEJlc3QgY29uZmlnOiB7YmVzdF9jb25maWd9IikKICAgICAgICByZXR1cm4ga2VybmVsLCBiZXN0X2NvbmZpZwogICAgZWxzZToKICAgICAgICBwcmludChmIltOTyBBVVRPIFRVTkVdIFVzaW5nIG5vIGF1dG90dW5lIGZvciBzZXFsZW5fa3Y9e3NlcWxlbl9rdn0iKQogICAgICAgIGlmIHNlcWxlbl9rdiBpbiBQUkVGSUxMX0NPTkZJR1M6CiAgICAgICAgICAgIGJlc3RfY29uZmlnID0gUFJFRklMTF9DT05GSUdTW3NlcWxlbl9rdl0KICAgICAgICAgICAga2VybmVsID0gZmxhc2htbGFfZGVjb2RlX25vX3R1bmluZygKICAgICAgICAgICAgICAgIGJhdGNoLAogICAgICAgICAgICAgICAgaGVhZHMsCiAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgIHNlcWxlbl9rdisxLAogICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgcGVfZGltLAogICAgICAgICAgICAgICAgKipiZXN0X2NvbmZpZwogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBrZXJuZWwsIGJlc3RfY29uZmlnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCgpAdGlsZWxhbmcuaml0KG91dF9pZHg9WzZdKQpkZWYgZmxhc2htbGFfZGVjb2RlX25vX3R1bmluZyhiYXRjaCwKICAgICAgICAgICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgICAgICBzZXFsZW5fa3YsCiAgICAgICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgICAgIHBlX2RpbSwKICAgICAgICAgICAgICAgICAgICBibG9ja19OLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX0gsCiAgICAgICAgICAgICAgICAgICAgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgICAgIHRocmVhZHM9MjU2LAogICAgICAgICAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICAgICAgICAgICAgICBlbmFibGVfcmFzdGVyaXphdGlvbj1UcnVlKToKICAgICMgc2NhbGUgPSAoMS4wIC8gKGRpbSArIHBlX2RpbSkpKiowLjUgKiAxLjQ0MjY5NTA0ICAjIGxvZzIoZSkKICAgIHNjYWxlID0gKDEuMCAvICgxMjggKyA2NCkpKiowLjUgKiAxLjQ0MjY5NTA0CiAgICAjIGR0eXBlID0gImZsb2F0MTYiCiAgICBkdHlwZSA9ICJiZmxvYXQxNiIKICAgIGFjY3VtX2R0eXBlID0gImZsb2F0IgogICAga3ZfZ3JvdXBfbnVtID0gaGVhZHMgLy8ga3ZfaGVhZF9udW0KICAgIFZBTElEX0JMT0NLX0ggPSBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKQogICAgYXNzZXJ0IGt2X2hlYWRfbnVtID09IDEsICJrdl9oZWFkX251bSBtdXN0IGJlIDEiCiAgICBrX3BhY2sgPSAxCiAgICB2ZWNfc2l6ZSA9IDQgKiBrX3BhY2sKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG4oCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChiYXRjaCwgaGVhZHMgLy8gbWluKGJsb2NrX0gsIGt2X2dyb3VwX251bSksIHRocmVhZHM9dGhyZWFkcykgYXMgKGJ4LCBieSk6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCgogICAgICAgICAgICBULmNvcHkoUVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfbG9jYWwpCiAgICAgICAgICAgIFQuY29weShRX3BlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9wZV9sb2NhbCkKICAgICAgICAgICAgVC5maWxsKGFjY19vLCAwKQogICAgICAgICAgICBULmZpbGwobG9nc3VtLCAwKQogICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQoKICAgICAgICAgICAgbG9vcF9yYW5nZSA9IFQuY2VpbGRpdihzZXFsZW5fa3YsIGJsb2NrX04pCiAgICAgICAgICAgIGZvciBrIGluIFQuUGlwZWxpbmVkKGxvb3BfcmFuZ2UsIG51bV9zdGFnZXM9bnVtX3N0YWdlcyk6CiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtWX3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPXZlY19zaXplKQogICAgICAgICAgICAgICAgVC5jb3B5KEtfcGVbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgIyBULmNvcHkoYWNjX3MsIFNfc2hhcmVkKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0W2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbCgKICAgICAgICAgICAgICAgIGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5LCBieik6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KChzZXFsZW5fa3YgLy8gbnVtX3NwbGl0KSwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIGt2X3N0YXJ0ID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyBrICogYmxvY2tfTgogICAgICAgICAgICAgICAga3ZfZW5kID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyAoayArIDEpICogYmxvY2tfTgogICAgICAgICAgICAgICAgVC5jb3B5KEtWW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwga3Zfc3RhcnQ6a3ZfZW5kLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoYmxvY2tfSCk6CiAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBULmxvZzIobG9nc3VtW2ldKSArIHNjb3Jlc19tYXhbaV0gKiBzY2FsZQogICAgICAgICAgICBULmNvcHkobG9nc3VtLCBnbHNlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCBiel0pCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0X3BhcnRpYWxbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6LCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGNvbWJpbmUoCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChoZWFkcywgYmF0Y2gsIHRocmVhZHM9MTI4KSBhcyAoYnksIGJ6KToKICAgICAgICAgICAgcG9fbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgb19hY2N1bV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXQgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9tYXhfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjYWxlX2xvY2FsID0gVC5hbGxvY19sb2NhbChbMV0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgVC5hbm5vdGF0ZV9sYXlvdXQoewogICAgICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbDogVC5GcmFnbWVudChsc2VfbG9nc3VtX2xvY2FsLnNoYXBlLCBmb3J3YXJkX3RocmVhZF9mbj1sYW1iZGEgaTogaSksCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBULmNsZWFyKGxzZV9sb2dzdW1fbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIob19hY2N1bV9sb2NhbCkKICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IFQubWF4KGxzZV9tYXhfbG9jYWxbMF0sIGdsc2VbYnosIGJ5LCBrXSkKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobnVtX3NwbGl0LCBudW1fc3RhZ2VzPTEpOgogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdICs9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbWF4X2xvY2FsWzBdKQogICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdID0gVC5sb2cyKGxzZV9sb2dzdW1fbG9jYWxbMF0pICsgbHNlX21heF9sb2NhbFswXQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIHBvX2xvY2FsW2ldID0gT3V0cHV0X3BhcnRpYWxbYnosIGJ5LCBrLCBpXQogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBzY2FsZV9sb2NhbFswXSA9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbG9nc3VtX2xvY2FsWzBdKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIG9fYWNjdW1fbG9jYWxbaV0gKz0gcG9fbG9jYWxbaV0gKiBzY2FsZV9sb2NhbFswXQogICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICBPdXRwdXRbYnosIGJ5LCBpXSA9IG9fYWNjdW1fbG9jYWxbaV0KCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuX3NwbGl0KFEsIFFfcGUsIEtWLCBLX3BlLCBnbHNlLCBPdXRwdXRfcGFydGlhbCkKICAgICAgICBjb21iaW5lKGdsc2UsIE91dHB1dF9wYXJ0aWFsLCBPdXRwdXQpCgogICAgQFQucHJpbV9mdW5jCiAgICBkZWYgbWFpbl9ub19zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgZmxhc2hfYXR0bihRLCBRX3BlLCBLViwgS19wZSwgT3V0cHV0KQoKICAgIGlmIG51bV9zcGxpdCA+IDE6CiAgICAgICAgcmV0dXJuIG1haW5fc3BsaXQKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1haW5fbm9fc3BsaXQKCgpkZWYgZ2V0X2NvbmZpZ3MoKToKICAgIGltcG9ydCBpdGVydG9vbHMKICAgIGJsb2NrX04gPSBbMTYsIDMyLCA2NCwgMTI4XQogICAgYmxvY2tfSCA9IFsxNiwgMzIsIDY0LCAxMjhdCiAgICBudW1fc3BsaXQgPSBbMSwgMiwgNCwgOCwgMTZdCiAgICBudW1fc3RhZ2VzID0gWzAsIDFdCiAgICBlbmFibGVfcmFzdGVyaXphdGlvbiA9IFtGYWxzZSwgVHJ1ZV0KICAgIAogICAgIyBibG9ja19OID0gWzMyXQogICAgIyBibG9ja19IID0gWzY0XQogICAgIyBudW1fc3BsaXQgPSBbNF0KICAgICMgbnVtX3N0YWdlcyA9IFswXQogICAgIyBlbmFibGVfcmFzdGVyaXphdGlvbiA9IFtGYWxzZV0KCiAgICBfY29uZmlncyA9IGxpc3QoaXRlcnRvb2xzLnByb2R1Y3QoYmxvY2tfTiwgYmxvY2tfSCwgbnVtX3NwbGl0LCBudW1fc3RhZ2VzLCBlbmFibGVfcmFzdGVyaXphdGlvbikpCiAgICAKICAgIHJldHVybiBbewogICAgICAgICJibG9ja19OIjogY1swXSwKICAgICAgICAiYmxvY2tfSCI6IGNbMV0sCiAgICAgICAgIm51bV9zcGxpdCI6IGNbMl0sCiAgICAgICAgIm51bV9zdGFnZXMiOiBjWzNdLAogICAgICAgICJlbmFibGVfcmFzdGVyaXphdGlvbiI6IGNbNF0sCiAgICB9IGZvciBjIGluIF9jb25maWdzXQoKQHRpbGVsYW5nLmF1dG90dW5lKGNvbmZpZ3M9Z2V0X2NvbmZpZ3MoKSwgY2FjaGVfaW5wdXRfdGVuc29ycz1GYWxzZSkKQHRpbGVsYW5nLmppdChvdXRfaWR4PVs2XSkKZGVmIGZsYXNobWxhX2RlY29kZV9hdXRvdHVuZShiYXRjaCwKICAgICAgICAgICAgICAgICAgICBoZWFkcywKICAgICAgICAgICAgICAgICAgICBrdl9oZWFkX251bSwKICAgICAgICAgICAgICAgICAgICBzZXFsZW5fa3YsCiAgICAgICAgICAgICAgICAgICAgZGltLAogICAgICAgICAgICAgICAgICAgIHBlX2RpbSwKICAgICAgICAgICAgICAgICAgICBibG9ja19OLAogICAgICAgICAgICAgICAgICAgIGJsb2NrX0gsCiAgICAgICAgICAgICAgICAgICAgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgICAgIHRocmVhZHM9MjU2LAogICAgICAgICAgICAgICAgICAgIG51bV9zdGFnZXM9MiwKICAgICAgICAgICAgICAgICAgICBlbmFibGVfcmFzdGVyaXphdGlvbj1UcnVlKToKICAgICMgc2NhbGUgPSAoMS4wIC8gKGRpbSArIHBlX2RpbSkpKiowLjUgKiAxLjQ0MjY5NTA0ICAjIGxvZzIoZSkKICAgIHNjYWxlID0gKDEuMCAvICgxMjggKyA2NCkpKiowLjUgKiAxLjQ0MjY5NTA0CiAgICAjIGR0eXBlID0gImZsb2F0MTYiCiAgICBkdHlwZSA9ICJiZmxvYXQxNiIKICAgIGFjY3VtX2R0eXBlID0gImZsb2F0IgogICAga3ZfZ3JvdXBfbnVtID0gaGVhZHMgLy8ga3ZfaGVhZF9udW0KICAgIFZBTElEX0JMT0NLX0ggPSBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKQogICAgYXNzZXJ0IGt2X2hlYWRfbnVtID09IDEsICJrdl9oZWFkX251bSBtdXN0IGJlIDEiCiAgICBrX3BhY2sgPSAxCiAgICB2ZWNfc2l6ZSA9IDQgKiBrX3BhY2sKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG4oCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChiYXRjaCwgaGVhZHMgLy8gbWluKGJsb2NrX0gsIGt2X2dyb3VwX251bSksIHRocmVhZHM9dGhyZWFkcykgYXMgKGJ4LCBieSk6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCgogICAgICAgICAgICBULmNvcHkoUVtieCwgYnkgKiBWQUxJRF9CTE9DS19IOihieSArIDEpICogVkFMSURfQkxPQ0tfSCwgOl0sIFFfbG9jYWwpCiAgICAgICAgICAgIFQuY29weShRX3BlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9wZV9sb2NhbCkKICAgICAgICAgICAgVC5maWxsKGFjY19vLCAwKQogICAgICAgICAgICBULmZpbGwobG9nc3VtLCAwKQogICAgICAgICAgICBULmZpbGwoc2NvcmVzX21heCwgLVQuaW5maW5pdHkoYWNjdW1fZHR5cGUpKQoKICAgICAgICAgICAgbG9vcF9yYW5nZSA9IFQuY2VpbGRpdihzZXFsZW5fa3YsIGJsb2NrX04pCiAgICAgICAgICAgIGZvciBrIGluIFQuUGlwZWxpbmVkKGxvb3BfcmFuZ2UsIG51bV9zdGFnZXM9bnVtX3N0YWdlcyk6CiAgICAgICAgICAgICAgICBULmNvcHkoS1ZbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtWX3NoYXJlZCwgY29hbGVzY2VkX3dpZHRoPXZlY19zaXplKQogICAgICAgICAgICAgICAgVC5jb3B5KEtfcGVbYngsIGsgKiBibG9ja19OOihrICsgMSkgKiBibG9ja19OLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgIyBULmNvcHkoYWNjX3MsIFNfc2hhcmVkKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0W2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGZsYXNoX2F0dG5fc3BsaXQoCiAgICAgICAgICAgIFE6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgUV9wZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLVjogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtfcGU6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgcGVfZGltXSwgZHR5cGUpLAogICAgICAgICAgICBnbHNlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXRdLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dF9wYXJ0aWFsOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBudW1fc3BsaXQsIGRpbV0sIGFjY3VtX2R0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbCgKICAgICAgICAgICAgICAgIGJhdGNoLCBoZWFkcyAvLyBtaW4oYmxvY2tfSCwga3ZfZ3JvdXBfbnVtKSwgbnVtX3NwbGl0LAogICAgICAgICAgICAgICAgdGhyZWFkcz10aHJlYWRzKSBhcyAoYngsIGJ5LCBieik6CiAgICAgICAgICAgIFFfbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBkdHlwZSkKICAgICAgICAgICAgUV9wZV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBLVl9zaGFyZWQgPSBULmFsbG9jX3NoYXJlZChbYmxvY2tfTiwgZGltXSwgZHR5cGUpCiAgICAgICAgICAgIEtfcGVfc2hhcmVkID0gVC5hbGxvY19zaGFyZWQoW2Jsb2NrX04sIHBlX2RpbV0sIGR0eXBlKQogICAgICAgICAgICBhY2NfcyA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgYWNjX3NfY2FzdCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0gsIGJsb2NrX05dLCBkdHlwZSkKICAgICAgICAgICAgYWNjX28gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19ILCBkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heCA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgc2NvcmVzX21heF9wcmV2ID0gVC5hbGxvY19mcmFnbWVudChbYmxvY2tfSF0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBzY29yZXNfc2NhbGUgPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjb3Jlc19zdW0gPSBULmFsbG9jX2ZyYWdtZW50KFtibG9ja19IXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxvZ3N1bSA9IFQuYWxsb2NfZnJhZ21lbnQoW2Jsb2NrX0hdLCBhY2N1bV9kdHlwZSkKCiAgICAgICAgICAgIGN1cl9rdl9oZWFkID0gYnkgLy8gKGt2X2dyb3VwX251bSAvLyBibG9ja19IKQogICAgICAgICAgICBULnVzZV9zd2l6emxlKDEwLCBlbmFibGU9ZW5hYmxlX3Jhc3Rlcml6YXRpb24pCiAgICAgICAgICAgIFQuY29weShRW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCA6XSwgUV9sb2NhbCkKICAgICAgICAgICAgVC5jb3B5KFFfcGVbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIDpdLCBRX3BlX2xvY2FsKQogICAgICAgICAgICBULmZpbGwoYWNjX28sIDApCiAgICAgICAgICAgIFQuZmlsbChsb2dzdW0sIDApCiAgICAgICAgICAgIFQuZmlsbChzY29yZXNfbWF4LCAtVC5pbmZpbml0eShhY2N1bV9kdHlwZSkpCgogICAgICAgICAgICBsb29wX3JhbmdlID0gVC5jZWlsZGl2KChzZXFsZW5fa3YgLy8gbnVtX3NwbGl0KSwgYmxvY2tfTikKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobG9vcF9yYW5nZSwgbnVtX3N0YWdlcz1udW1fc3RhZ2VzKToKICAgICAgICAgICAgICAgIGt2X3N0YXJ0ID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyBrICogYmxvY2tfTgogICAgICAgICAgICAgICAga3ZfZW5kID0gKHNlcWxlbl9rdiAvLyBudW1fc3BsaXQpICogYnogKyAoayArIDEpICogYmxvY2tfTgogICAgICAgICAgICAgICAgVC5jb3B5KEtWW2J4LCBrdl9zdGFydDprdl9lbmQsIGN1cl9rdl9oZWFkLCA6XSwgS1Zfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNvcHkoS19wZVtieCwga3Zfc3RhcnQ6a3ZfZW5kLCBjdXJfa3ZfaGVhZCwgOl0sIEtfcGVfc2hhcmVkLCBjb2FsZXNjZWRfd2lkdGg9dmVjX3NpemUpCiAgICAgICAgICAgICAgICBULmNsZWFyKGFjY19zKQogICAgICAgICAgICAgICAgVC5nZW1tKFFfbG9jYWwsIEtWX3NoYXJlZCwgYWNjX3MsIHRyYW5zcG9zZV9CPVRydWUsIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmdlbW0oCiAgICAgICAgICAgICAgICAgICAgUV9wZV9sb2NhbCwKICAgICAgICAgICAgICAgICAgICBLX3BlX3NoYXJlZCwKICAgICAgICAgICAgICAgICAgICBhY2NfcywKICAgICAgICAgICAgICAgICAgICB0cmFuc3Bvc2VfQj1UcnVlLAogICAgICAgICAgICAgICAgICAgIHBvbGljeT1ULkdlbW1XYXJwUG9saWN5LkZ1bGxSb3cpCiAgICAgICAgICAgICAgICBULmNvcHkoc2NvcmVzX21heCwgc2NvcmVzX21heF9wcmV2KQogICAgICAgICAgICAgICAgVC5maWxsKHNjb3Jlc19tYXgsIC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKSkKICAgICAgICAgICAgICAgIFQucmVkdWNlX21heChhY2Nfcywgc2NvcmVzX21heCwgZGltPTEsIGNsZWFyPUZhbHNlKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBzY29yZXNfc2NhbGVbaV0gPSBULmV4cDIoc2NvcmVzX21heF9wcmV2W2ldICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGJsb2NrX04pOgogICAgICAgICAgICAgICAgICAgIGFjY19zW2ksIGpdID0gVC5leHAyKGFjY19zW2ksIGpdICogc2NhbGUgLSBzY29yZXNfbWF4W2ldICogc2NhbGUpCiAgICAgICAgICAgICAgICBULnJlZHVjZV9zdW0oYWNjX3MsIHNjb3Jlc19zdW0sIGRpbT0xKQogICAgICAgICAgICAgICAgVC5jb3B5KGFjY19zLCBhY2Nfc19jYXN0KQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChibG9ja19IKToKICAgICAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBsb2dzdW1baV0gKiBzY29yZXNfc2NhbGVbaV0gKyBzY29yZXNfc3VtW2ldCiAgICAgICAgICAgICAgICBmb3IgaSwgaiBpbiBULlBhcmFsbGVsKGJsb2NrX0gsIGRpbSk6CiAgICAgICAgICAgICAgICAgICAgYWNjX29baSwgal0gKj0gc2NvcmVzX3NjYWxlW2ldCiAgICAgICAgICAgICAgICBULmdlbW0oYWNjX3NfY2FzdCwgS1Zfc2hhcmVkLCBhY2NfbywgcG9saWN5PVQuR2VtbVdhcnBQb2xpY3kuRnVsbFJvdykKICAgICAgICAgICAgZm9yIGksIGogaW4gVC5QYXJhbGxlbChibG9ja19ILCBkaW0pOgogICAgICAgICAgICAgICAgYWNjX29baSwgal0gLz0gbG9nc3VtW2ldCiAgICAgICAgICAgIGZvciBpIGluIFQuUGFyYWxsZWwoYmxvY2tfSCk6CiAgICAgICAgICAgICAgICBsb2dzdW1baV0gPSBULmxvZzIobG9nc3VtW2ldKSArIHNjb3Jlc19tYXhbaV0gKiBzY2FsZQogICAgICAgICAgICBULmNvcHkobG9nc3VtLCBnbHNlW2J4LCBieSAqIFZBTElEX0JMT0NLX0g6KGJ5ICsgMSkgKiBWQUxJRF9CTE9DS19ILCBiel0pCiAgICAgICAgICAgIFQuY29weShhY2NfbywgT3V0cHV0X3BhcnRpYWxbYngsIGJ5ICogVkFMSURfQkxPQ0tfSDooYnkgKyAxKSAqIFZBTElEX0JMT0NLX0gsIGJ6LCA6XSkKCiAgICBAVC5tYWNybwogICAgZGVmIGNvbWJpbmUoCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgd2l0aCBULktlcm5lbChoZWFkcywgYmF0Y2gsIHRocmVhZHM9MTI4KSBhcyAoYnksIGJ6KToKICAgICAgICAgICAgcG9fbG9jYWwgPSBULmFsbG9jX2ZyYWdtZW50KFtkaW1dLCBhY2N1bV9kdHlwZSkKICAgICAgICAgICAgb19hY2N1bV9sb2NhbCA9IFQuYWxsb2NfZnJhZ21lbnQoW2RpbV0sIGFjY3VtX2R0eXBlKQogICAgICAgICAgICBsc2VfbG9jYWxfc3BsaXQgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9sb2dzdW1fbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIGxzZV9tYXhfbG9jYWwgPSBULmFsbG9jX2xvY2FsKFsxXSwgYWNjdW1fZHR5cGUpCiAgICAgICAgICAgIHNjYWxlX2xvY2FsID0gVC5hbGxvY19sb2NhbChbMV0sIGFjY3VtX2R0eXBlKQoKICAgICAgICAgICAgVC5hbm5vdGF0ZV9sYXlvdXQoewogICAgICAgICAgICAgICAgbHNlX2xvZ3N1bV9sb2NhbDogVC5GcmFnbWVudChsc2VfbG9nc3VtX2xvY2FsLnNoYXBlLCBmb3J3YXJkX3RocmVhZF9mbj1sYW1iZGEgaTogaSksCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBULmNsZWFyKGxzZV9sb2dzdW1fbG9jYWwpCiAgICAgICAgICAgIFQuY2xlYXIob19hY2N1bV9sb2NhbCkKICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IC1ULmluZmluaXR5KGFjY3VtX2R0eXBlKQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgbHNlX21heF9sb2NhbFswXSA9IFQubWF4KGxzZV9tYXhfbG9jYWxbMF0sIGdsc2VbYnosIGJ5LCBrXSkKICAgICAgICAgICAgZm9yIGsgaW4gVC5QaXBlbGluZWQobnVtX3NwbGl0LCBudW1fc3RhZ2VzPTEpOgogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdICs9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbWF4X2xvY2FsWzBdKQogICAgICAgICAgICBsc2VfbG9nc3VtX2xvY2FsWzBdID0gVC5sb2cyKGxzZV9sb2dzdW1fbG9jYWxbMF0pICsgbHNlX21heF9sb2NhbFswXQogICAgICAgICAgICBmb3IgayBpbiBULnNlcmlhbChudW1fc3BsaXQpOgogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIHBvX2xvY2FsW2ldID0gT3V0cHV0X3BhcnRpYWxbYnosIGJ5LCBrLCBpXQogICAgICAgICAgICAgICAgbHNlX2xvY2FsX3NwbGl0WzBdID0gZ2xzZVtieiwgYnksIGtdCiAgICAgICAgICAgICAgICBzY2FsZV9sb2NhbFswXSA9IFQuZXhwMihsc2VfbG9jYWxfc3BsaXRbMF0gLSBsc2VfbG9nc3VtX2xvY2FsWzBdKQogICAgICAgICAgICAgICAgZm9yIGkgaW4gVC5QYXJhbGxlbChkaW0pOgogICAgICAgICAgICAgICAgICAgIG9fYWNjdW1fbG9jYWxbaV0gKz0gcG9fbG9jYWxbaV0gKiBzY2FsZV9sb2NhbFswXQogICAgICAgICAgICBmb3IgaSBpbiBULlBhcmFsbGVsKGRpbSk6CiAgICAgICAgICAgICAgICBPdXRwdXRbYnosIGJ5LCBpXSA9IG9fYWNjdW1fbG9jYWxbaV0KCiAgICBAVC5wcmltX2Z1bmMKICAgIGRlZiBtYWluX3NwbGl0KAogICAgICAgICAgICBROiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBkaW1dLCBkdHlwZSksCiAgICAgICAgICAgIFFfcGU6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS1Y6IFQuVGVuc29yKFtiYXRjaCwgc2VxbGVuX2t2LCBrdl9oZWFkX251bSwgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBLX3BlOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIHBlX2RpbV0sIGR0eXBlKSwKICAgICAgICAgICAgZ2xzZTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0XSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXRfcGFydGlhbDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgbnVtX3NwbGl0LCBkaW1dLCBhY2N1bV9kdHlwZSksCiAgICAgICAgICAgIE91dHB1dDogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgKToKICAgICAgICBmbGFzaF9hdHRuX3NwbGl0KFEsIFFfcGUsIEtWLCBLX3BlLCBnbHNlLCBPdXRwdXRfcGFydGlhbCkKICAgICAgICBjb21iaW5lKGdsc2UsIE91dHB1dF9wYXJ0aWFsLCBPdXRwdXQpCgogICAgQFQucHJpbV9mdW5jCiAgICBkZWYgbWFpbl9ub19zcGxpdCgKICAgICAgICAgICAgUTogVC5UZW5zb3IoW2JhdGNoLCBoZWFkcywgZGltXSwgZHR5cGUpLAogICAgICAgICAgICBRX3BlOiBULlRlbnNvcihbYmF0Y2gsIGhlYWRzLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIEtWOiBULlRlbnNvcihbYmF0Y2gsIHNlcWxlbl9rdiwga3ZfaGVhZF9udW0sIGRpbV0sIGR0eXBlKSwKICAgICAgICAgICAgS19wZTogVC5UZW5zb3IoW2JhdGNoLCBzZXFsZW5fa3YsIGt2X2hlYWRfbnVtLCBwZV9kaW1dLCBkdHlwZSksCiAgICAgICAgICAgIGdsc2U6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdF0sIGFjY3VtX2R0eXBlKSwKICAgICAgICAgICAgT3V0cHV0X3BhcnRpYWw6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIG51bV9zcGxpdCwgZGltXSwgYWNjdW1fZHR5cGUpLAogICAgICAgICAgICBPdXRwdXQ6IFQuVGVuc29yKFtiYXRjaCwgaGVhZHMsIGRpbV0sIGR0eXBlKSwKICAgICk6CiAgICAgICAgZmxhc2hfYXR0bihRLCBRX3BlLCBLViwgS19wZSwgT3V0cHV0KQoKICAgIGlmIG51bV9zcGxpdCA+IDE6CiAgICAgICAgcmV0dXJuIG1haW5fc3BsaXQKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1haW5fbm9fc3BsaXQKCmNsYXNzIFJvUEUobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkX21vZGVsOiBpbnQpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuZF9tb2RlbCA9IGRfbW9kZWwKICAgICAgICB0aGV0YSA9IDEwMDAwICoqICgtdG9yY2guYXJhbmdlKDAsIGRfbW9kZWwvLzIsZHR5cGU9dG9yY2guYmZsb2F0MTYpIC8gKGRfbW9kZWwvLzIpKQogICAgICAgIHRoZXRhID0gdGhldGEudG8oImN1ZGEiKQogICAgICAgIHNlbGYucmVnaXN0ZXJfYnVmZmVyKCJ0aGV0YSIsIHRoZXRhKQoKICAgIGRlZiByb3RhdGVfaGFsZihzZWxmLCB4OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICB4MSwgeDIgPSB4LmNodW5rKDIsIGRpbT0tMSkKICAgICAgICByZXR1cm4gdG9yY2guY2F0KCgteDIsIHgxKSwgZGltPS0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIHg6IHRvcmNoLlRlbnNvciwgc3RhcnRfcG9zOiBpbnQgPSAwKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgc2VxX2xlbiA9IHguc2l6ZSgtMikKICAgICAgICBkX21vZGVsID0geC5zaXplKC0xKQogICAgICAgIGFzc2VydCBkX21vZGVsID09IHNlbGYuZF9tb2RlbAogICAgICAgIHNlcV9pZHggPSB0b3JjaC5hcmFuZ2Uoc3RhcnRfcG9zLCBzdGFydF9wb3MgKyBzZXFfbGVuLCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgaWR4X3RoZXRhID0gdG9yY2guZWluc3VtKCdzLGQtPnNkJywgc2VxX2lkeCwgc2VsZi50aGV0YSkKICAgICAgICBpZHhfdGhldGEyID0gdG9yY2guY2F0KFtpZHhfdGhldGEsIGlkeF90aGV0YV0sIGRpbT0tMSkKICAgICAgICBjb3MgPSBpZHhfdGhldGEyLmNvcygpLnRvKHRvcmNoLmJmbG9hdDE2KQogICAgICAgIHNpbiA9IGlkeF90aGV0YTIuc2luKCkudG8odG9yY2guYmZsb2F0MTYpCiAgICAgICAgcmV0dXJuIHggKiBjb3MgKyBzZWxmLnJvdGF0ZV9oYWxmKHgpICogc2luCgoKY2xhc3MgS1ZDYWNoZShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGt2X2NhY2hlX3NoYXBlOiB0dXBsZSkgLT4gTm9uZToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnJlZ2lzdGVyX2J1ZmZlcignZGF0YScsIHRvcmNoLnplcm9zKGt2X2NhY2hlX3NoYXBlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPSdjdWRhJykpCiAgICAgICAgc2VsZi5zZXFfbGVuID0gMAogICAgICAgIHNlbGYuemVybygpCgogICAgZGVmIHplcm8oc2VsZikgLT4gTm9uZToKICAgICAgICBzZWxmLmRhdGEuemVyb18oKQogICAgCiAgICBkZWYgZ2V0X2RhdGEoc2VsZikgLT4gdG9yY2guVGVuc29yOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEKCiAgICBkZWYgZm9yd2FyZChzZWxmLCBjX2t2OiB0b3JjaC5UZW5zb3IpIC0+IHRvcmNoLlRlbnNvcjoKICAgICAgICBhc3NlcnQgc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpIDw9IHNlbGYuZGF0YS5zaXplKDEpLCAiS1YgQ2FjaGUgRXhjZWVkZWQiCgogICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YS50byhjX2t2LmR0eXBlKQogICAgICAgIHNlbGYuZGF0YVsKICAgICAgICAgICAgOiwgc2VsZi5zZXFfbGVuIDogc2VsZi5zZXFfbGVuICsgY19rdi5zaXplKDEpLCA6CiAgICAgICAgXSA9IGNfa3YKICAgICAgICBzZWxmLnNlcV9sZW4gKz0gY19rdi5zaXplKDEpCgogICAgICAgIHJldHVybiBzZWxmLmRhdGFbOiwgOnNlbGYuc2VxX2xlbl0sIHNlbGYuc2VxX2xlbgoKQGRhdGFjbGFzcwpjbGFzcyBDb25maWc6CiAgICBiYXRjaF9zaXplOiBpbnQKICAgIGRpbTogaW50CiAgICBuX2hlYWRzOiBpbnQKICAgIHFfbG9yYV9yYW5rOiBpbnQgCiAgICBrdl9sb3JhX3Jhbms6IGludAogICAgcWtfbm9wZV9oZWFkX2RpbTogaW50CiAgICBxa19yb3BlX2hlYWRfZGltOiBpbnQKICAgIHZfaGVhZF9kaW06IGludAogICAgc2VxX2xlbjogaW50CiAgICBtYXhfc2VxX2xlbjogaW50CiAgICBrdl9jYWNoZV9zaGFwZTogdHVwbGUKICAgIFFfcHJval9kb3duX3dlaWdodDogdG9yY2guVGVuc29yCiAgICBRX3Byb2pfdXBfd2VpZ2h0OiB0b3JjaC5UZW5zb3IKICAgIEtWX3Byb2pfZG93bl93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgS1ZfcHJval91cF93ZWlnaHQ6IHRvcmNoLlRlbnNvcgogICAgd29fd2VpZ2h0OiB0b3JjaC5UZW5zb3IKCmNsYXNzIE1MQShubi5Nb2R1bGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZzogQ29uZmlnLCBtbGFfdGxfa2VybmVsOiB0aWxlbGFuZy5KSVRLZXJuZWwsIGtlcm5lbF9iZXN0X2NvbmZpZyk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5kaW0gPSBjb25maWcuZGltCiAgICAgICAgc2VsZi5uX2hlYWRzID0gY29uZmlnLm5faGVhZHMKICAgICAgICBzZWxmLnFfbG9yYV9yYW5rID0gY29uZmlnLnFfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5rdl9sb3JhX3JhbmsgPSBjb25maWcua3ZfbG9yYV9yYW5rCiAgICAgICAgc2VsZi5ub3BlX2hlYWRfZGltID0gY29uZmlnLnFrX25vcGVfaGVhZF9kaW0KICAgICAgICBzZWxmLnJvcGVfaGVhZF9kaW0gPSBjb25maWcucWtfcm9wZV9oZWFkX2RpbQogICAgICAgIHNlbGYudl9oZWFkX2RpbSA9IGNvbmZpZy52X2hlYWRfZGltCiAgICAgICAgZGV2aWNlID0gImN1ZGEiCiAgICAgICAgc2VsZi5RX3Byb2pfZG93biA9IG5uLkxpbmVhcihzZWxmLmRpbSwgc2VsZi5xX2xvcmFfcmFuaywgYmlhcz1GYWxzZSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT1kZXZpY2UpCiAgICAgICAgc2VsZi5LVl9wcm9qX2Rvd24gPSBubi5MaW5lYXIoc2VsZi5kaW0sIHNlbGYua3ZfbG9yYV9yYW5rICsgc2VsZi5yb3BlX2hlYWRfZGltLCBiaWFzPUZhbHNlLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgZGV2aWNlPWRldmljZSkKCiAgICAgICAgc2VsZi5RX3Byb2pfdXAgPSBubi5MaW5lYXIoc2VsZi5xX2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYucm9wZV9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9ZGV2aWNlKQogICAgICAgIHNlbGYuS1ZfcHJval91cCA9IG5uLkxpbmVhcihzZWxmLmt2X2xvcmFfcmFuaywgKHNlbGYubm9wZV9oZWFkX2RpbSArIHNlbGYudl9oZWFkX2RpbSkgKiBzZWxmLm5faGVhZHMsIGJpYXM9RmFsc2UsIGR0eXBlPXRvcmNoLmJmbG9hdDE2LCBkZXZpY2U9ZGV2aWNlKQoKICAgICAgICAjIFJvUEUgb24gaGFsZiBlbWJlZGRpbmdzCiAgICAgICAgc2VsZi5xX3JvcGUgPSBSb1BFKHNlbGYucm9wZV9oZWFkX2RpbSkKICAgICAgICBzZWxmLmtfcm9wZSA9IFJvUEUoc2VsZi5yb3BlX2hlYWRfZGltKQoKICAgICAgICAjIE91dHB1dCBwcm9qZWN0aW9uCiAgICAgICAgc2VsZi53byA9IG5uLkxpbmVhcihzZWxmLnZfaGVhZF9kaW0gKiBzZWxmLm5faGVhZHMsIHNlbGYuZGltLCBkdHlwZT10b3JjaC5iZmxvYXQxNiwgYmlhcz1GYWxzZSwgZGV2aWNlPWRldmljZSkKICAgICAgICBzZWxmLmVwcyA9IDFlLTYKICAgICAgICBzZWxmLm1sYV90bF9rZXJuZWwgPSBtbGFfdGxfa2VybmVsCiAgICAgICAgc2VsZi5rZXJuZWxfYmVzdF9jb25maWcgPSBrZXJuZWxfYmVzdF9jb25maWcKICAgCiAgICBkZWYgZm9yd2FyZChzZWxmLCB4OiB0b3JjaC5UZW5zb3IsIGt2X2NhY2hlOiBLVkNhY2hlKSAtPiB0b3JjaC5UZW5zb3I6CiAgICAgICAgIyBzZXFfbGVuID0gMSBhbHdheXMgaGVyZQogICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIG1vZGVsX2RpbSA9IHguc2l6ZSgpCgogICAgICAgIHFfbG9yYSA9IHNlbGYuUV9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhID0gc2VsZi5LVl9wcm9qX2Rvd24oeCkKICAgICAgICBrdl9sb3JhLCBrdl9sZW4gPSBrdl9jYWNoZShrdl9sb3JhKSAKICAgICAgICBxdWVyeV9wb3MgPSBrdl9sZW4gLSAxCgogICAgICAgIHFfbm9wZV9hbmRfcGUgPSBzZWxmLlFfcHJval91cChxX2xvcmEpLnZpZXcoCiAgICAgICAgICAgIGJhdGNoX3NpemUsIHNlcV9sZW4sIHNlbGYubl9oZWFkcywgc2VsZi5ub3BlX2hlYWRfZGltICsgc2VsZi5yb3BlX2hlYWRfZGltKS50cmFuc3Bvc2UoMSwgMikKICAgICAgICBxLCBxX3BlID0gdG9yY2guc3BsaXQocV9ub3BlX2FuZF9wZSwgW3NlbGYubm9wZV9oZWFkX2RpbSwgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIHFfcGUgPSBzZWxmLnFfcm9wZShxX3BlLCBzdGFydF9wb3M9cXVlcnlfcG9zKQoKICAgICAgICBrdiwga19wZSA9IHRvcmNoLnNwbGl0KGt2X2xvcmEsIFtzZWxmLmt2X2xvcmFfcmFuaywgc2VsZi5yb3BlX2hlYWRfZGltXSwgZGltPS0xKQogICAgICAgIGtfcGUgPSBrX3BlWzosIE5vbmUsIDosIDpdCiAgICAgICAga19wZSA9IHNlbGYua19yb3BlKGtfcGUpCgogICAgICAgIEtWX3Byb2pfdXAgPSBzZWxmLktWX3Byb2pfdXAud2VpZ2h0LnZpZXcoc2VsZi5uX2hlYWRzLCAtMSwgc2VsZi5rdl9sb3JhX3JhbmspCiAgICAgICAgcV9hYnNvcmIgPSBLVl9wcm9qX3VwWzosIDpzZWxmLm5vcGVfaGVhZF9kaW0sIDpdCiAgICAgICAgb3V0X2Fic29yYiA9IEtWX3Byb2pfdXBbOiwgc2VsZi5ub3BlX2hlYWRfZGltOiwgOl0KICAgICAgICBxID0gdG9yY2gubWF0bXVsKHEsIHFfYWJzb3JiKQogICAgICAgIAogICAgICAgIG51bV9zcGxpdHMgPSBzZWxmLmtlcm5lbF9iZXN0X2NvbmZpZ1snbnVtX3NwbGl0J10KICAgICAgICBnbHNlID0gdG9yY2guemVyb3MoKGJhdGNoX3NpemUsIHNlbGYubl9oZWFkcywgbnVtX3NwbGl0cyksIGR0eXBlPXRvcmNoLmZsb2F0LCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgb3V0cHV0X3BhcnRpYWwgPSB0b3JjaC56ZXJvcygoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBudW1fc3BsaXRzLCBzZWxmLmt2X2xvcmFfcmFuayksIGR0eXBlPXRvcmNoLmZsb2F0LCBkZXZpY2U9eC5kZXZpY2UpCiAgICAgICAgCiAgICAgICAgcV90bCA9IHEudmlldyhiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rKQogICAgICAgIHFfcGVfdGwgPSBxX3BlLnZpZXcoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCBzZWxmLnJvcGVfaGVhZF9kaW0pCiAgICAgICAga3ZfdGwgPSBrdi52aWV3KGJhdGNoX3NpemUsIGt2X2xlbiwgMSwgc2VsZi5rdl9sb3JhX3JhbmspLmNvbnRpZ3VvdXMoKQogICAgICAgIGtfcGVfdGwgPSBrX3BlLnRyYW5zcG9zZSgxLCAyKQoKICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLnplcm9zKChiYXRjaF9zaXplLCBzZWxmLm5faGVhZHMsIHNlbGYua3ZfbG9yYV9yYW5rKSwgZHR5cGU9dG9yY2guYmZsb2F0MTYsIGRldmljZT14LmRldmljZSkKICAgICAgICBpZiBrdl9sZW4gPCAxMzA6CiAgICAgICAgICAgIHNvZnRtYXhfc2NhbGUgPSAxIC8gbWF0aC5zcXJ0KHNlbGYucm9wZV9oZWFkX2RpbSArIHNlbGYubm9wZV9oZWFkX2RpbSkKICAgICAgICAgICAgYXR0bl93ZWlnaHRzID0gKHRvcmNoLm1hdG11bChxX3BlLCBrX3BlLm1UKSArIHRvcmNoLm1hdG11bChxLCBrdi51bnNxdWVlemUoLTMpLm1UKSkgKiBzb2Z0bWF4X3NjYWxlCiAgICAgICAgICAgIGF0dG5fd2VpZ2h0c19zb2Z0bWF4ID0gbm4uZnVuY3Rpb25hbC5zb2Z0bWF4KGF0dG5fd2VpZ2h0cywgZGltPS0xLCBkdHlwZT10b3JjaC5mbG9hdDMyKS50byhxLmR0eXBlKQogICAgICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLmVpbnN1bSgnYmhxbCwgYmxjIC0+IGJocWMnLCBhdHRuX3dlaWdodHNfc29mdG1heCwga3YpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRsX2F0dG5fb3V0ID0gc2VsZi5tbGFfdGxfa2VybmVsKAogICAgICAgICAgICAgICAgcV90bCwgICAgICAgICAKICAgICAgICAgICAgICAgIHFfcGVfdGwsICAgICAKICAgICAgICAgICAgICAgIGt2X3RsLCAKICAgICAgICAgICAgICAgIGtfcGVfdGwsICAgICAKICAgICAgICAgICAgICAgIGdsc2UsCiAgICAgICAgICAgICAgICBvdXRwdXRfcGFydGlhbCwKICAgICAgICAgICAgKQoKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnZpZXcoYmF0Y2hfc2l6ZSwgc2VsZi5uX2hlYWRzLCAxLCBzZWxmLmt2X2xvcmFfcmFuaykKICAgICAgICBvdXRfYWJzb3JiID0gb3V0X2Fic29yYi50cmFuc3Bvc2UoLTIsIC0xKS5jb250aWd1b3VzKCkKICAgICAgICB0bF9hdHRuX291dCA9IHRvcmNoLm1hdG11bCh0bF9hdHRuX291dCwgb3V0X2Fic29yYikKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnRyYW5zcG9zZSgxLCAyKS5jb250aWd1b3VzKCkKICAgICAgICB0bF9hdHRuX291dCA9IHRsX2F0dG5fb3V0LnJlc2hhcGUoYmF0Y2hfc2l6ZSwgMSwgc2VsZi5uX2hlYWRzICogc2VsZi52X2hlYWRfZGltKS50byh0b3JjaC5iZmxvYXQxNikKICAgICAgICB0bF9hdHRuX291dCA9IHNlbGYud28odGxfYXR0bl9vdXQpCiAgICAgICAgcmV0dXJuIHRsX2F0dG5fb3V0LCBrdl9jYWNoZS5nZXRfZGF0YSgpIAoKZGVmIGN1c3RvbV9rZXJuZWwoZGF0YTogaW5wdXRfdCkgLT4gb3V0cHV0X3Q6CiAgICBjb25maWcsIHgsIGt2X2NhY2hlID0gZGF0YQogICAgbWxhX3RsX2tlcm5lbCwga2VybmVsX2Jlc3RfY29uZmlnID0gZ2V0X29wdGltYWxfa2VybmVsKAogICAgICAgIGJhdGNoPWNvbmZpZy5iYXRjaF9zaXplLAogICAgICAgIGhlYWRzPWNvbmZpZy5uX2hlYWRzLAogICAgICAgIGt2X2hlYWRfbnVtPTEsCiAgICAgICAgc2VxbGVuX2t2PWt2X2NhY2hlLnNlcV9sZW4sCiAgICAgICAgZGltPWNvbmZpZy5rdl9sb3JhX3JhbmssCiAgICAgICAgcGVfZGltPWNvbmZpZy5xa19yb3BlX2hlYWRfZGltCiAgICApCiAgICBtb2RlbCA9IE1MQShjb25maWcsIG1sYV90bF9rZXJuZWwsIGtlcm5lbF9iZXN0X2NvbmZpZykKICAgIG1vZGVsLlFfcHJval9kb3duLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX2Rvd25fd2VpZ2h0KQogICAgbW9kZWwuUV9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuUV9wcm9qX3VwX3dlaWdodCkKICAgIG1vZGVsLktWX3Byb2pfZG93bi53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLktWX3Byb2pfZG93bl93ZWlnaHQpCiAgICBtb2RlbC5LVl9wcm9qX3VwLndlaWdodCA9IG5uLlBhcmFtZXRlcihjb25maWcuS1ZfcHJval91cF93ZWlnaHQpCiAgICBtb2RlbC53by53ZWlnaHQgPSBubi5QYXJhbWV0ZXIoY29uZmlnLndvX3dlaWdodCkKICAgIG91dHB1dCwga3ZfY2FjaGUgPSBtb2RlbCh4LCBrdl9jYWNoZSkKICAgIHJldHVybiBvdXRwdXQsIGt2X2NhY2hlNo newline at end of file
Best evidence level for this revision: reported
JSON