Name: series-workflowk66js Phase: Failed StartedAt: 2026-08-01 11:10:14 +0000 UTC FinishedAt: 2026-08-01 11:30:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowk66js[0] Phase: Succeeded StartedAt: 2026-08-01 11:10:14 +0000 UTC FinishedAt: 2026-08-01 11:30:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflowk66js[0].run-triage Phase: Succeeded StartedAt: 2026-08-01 11:10:14 +0000 UTC FinishedAt: 2026-08-01 11:30:40 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAxIDExOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0IHNjcmlwdHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUga2VybmVsLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmUgY29kZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6Mjk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAxNzg1NGIxZDE3NzAzNDJhNDkyNmU2ODRlNDRmOGRhOTRhZjkwN2I2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMSAxMToyOTo1OCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbmluZGV4IDIwNzBlODkwZTA2NGUuLmYzOTMzY2YzZTZiZTYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZ1xuQEAgLTQsOCAmIzQzOzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9blxuIENPTkZJR19JTkVUX1BTUD15XG4gQ09ORklHX0lQVjY9eVxuIENPTkZJR19NQUNTRUM9bVxuJiM0MztDT05GSUdfTkVUX0FDVF9TS0JFRElUPW1cbiBDT05GSUdfTkVUX0NMU19BQ1Q9eVxuIENPTkZJR19ORVRfQ0xTX0JQRj15XG4mIzQzO0NPTkZJR19ORVRfQ0xTX0ZMT1dFUj1tXG4mIzQzO0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cbiBDT05GSUdfTkVUQ09OU09MRT1tXG4gQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQz15XG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weVxuaW5kZXggZTRhY2YzZDgzMzNmZC4uYjFjNmY2Y2VmN2RkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbkBAIC0xMTQsMTAgJiM0MzsxMTQsMTEgQEAgY2xhc3MgTmV0RHJ2RXBFbnYoTmV0RHJ2RW52QmFzZSk6XG4gICAgIG5zaW1fdjRfcGZ4ID0gXCYjMzQ7MTkyLjAuMi5cJiMzNDtcbiAgICAgbnNpbV92Nl9wZnggPSBcJiMzNDsyMDAxOmRiODo6XCYjMzQ7XG4gXG4tICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOlxuJiM0MzsgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XG4gICAgICAgICBzdXBlcigpLl9faW5pdF9fKHNyY19wYXRoKVxuIFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXG4mIzQzOyAgICAgICAgc2VsZi5fcXVldWVfY291bnQgPSBxdWV1ZV9jb3VudFxuIFxuICAgICAgICAgIyBUaGluZ3Mgd2UgdHJ5IHRvIGRlc3Ryb3lcbiAgICAgICAgIHNlbGYucmVtb3RlID0gTm9uZVxuQEAgLTE3Myw5ICYjNDM7MTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxuICAgICAgICAgc2VsZi5fcmVxdWlyZWRfY21kID0ge31cbiBcbiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKTpcbiYjNDM7ICAgICAgICBuc2ltX2t3YXJncyA9IHt9XG4mIzQzOyAgICAgICAgaWYgc2VsZi5fcXVldWVfY291bnQ6XG4mIzQzOyAgICAgICAgICAgIG5zaW1fa3dhcmdzW1wmIzM0O3F1ZXVlX2NvdW50XCYjMzQ7XSA9IHNlbGYuX3F1ZXVlX2NvdW50XG4mIzQzO1xuICAgICAgICAgc2VsZi5fbmV0bnMgPSBOZXROUygpXG4tICAgICAgICBzZWxmLl9ucyA9IE5ldGRldlNpbURldigpXG4tICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zKVxuJiM0MzsgICAgICAgIHNlbGYuX25zID0gTmV0ZGV2U2ltRGV2KCoqbnNpbV9rd2FyZ3MpXG4mIzQzOyAgICAgICAgc2VsZi5fbnNfcGVlciA9IE5ldGRldlNpbURldihucz1zZWxmLl9uZXRucywgKipuc2ltX2t3YXJncylcbiBcbiAgICAgICAgIHdpdGggb3BlbihcJiMzNDsvcHJvYy9zZWxmL25zL25ldFwmIzM0OykgYXMgbnNmZDAsIFxcXG4gICAgICAgICAgICAgIG9wZW4oXCYjMzQ7L3Zhci9ydW4vbmV0bnMvXCYjMzQ7ICYjNDM7IHNlbGYuX25ldG5zLm5hbWUpIGFzIG5zZmQxOlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuQEAgLTUsMTAgJiM0Mzs1LDI1IEBAXG4gVGVzdCBjaGFubmVsIGFuZCByaW5nIHNpemUgY29uZmlndXJhdGlvbiB2aWEgZXRodG9vbCAoLUwgLyAtRykuXG4gXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4gXG4mIzQzO2ltcG9ydCBzb2NrZXRcbiYjNDM7aW1wb3J0IHN0cnVjdFxuJiM0MztpbXBvcnQgdGltZVxuJiM0MztcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9ydW4sIGtzZnRfZXhpdCwga3NmdF9wclxuIGZyb20gbGliLnB5IGltcG9ydCBrc2Z0X2VxXG4mIzQzO2Zyb20gbGliLnB5IGltcG9ydCBLc2Z0U2tpcEV4LCBLc2Z0WGZhaWxFeFxuIGZyb20gbGliLnB5IGltcG9ydCBOZXREcnZFcEVudiwgRXRodG9vbEZhbWlseSwgR2VuZXJhdGVUcmFmZmljXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXG4mIzQzO2Zyb20gbGliLnB5IGltcG9ydCBjbWQsIGRlZmVyLCByYW5kX3BvcnQsIHRjLCBObEVycm9yXG4mIzQzO1xuJiM0MzsjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXG4mIzQzO1NPX1RYVElNRSA9IGdldGF0dHIoc29ja2V0LCBcJiMzNDtTT19UWFRJTUVcJiMzNDssIDYxKVxuJiM0MztcbiYjNDM7IyBOb3QgYWx3YXlzIGV4cG9ydGVkIGJ5IHRoZSBzb2NrZXQgbW9kdWxlOyBhc20tZ2VuZXJpYyB2YWx1ZSAoeDg2L0FSTS9NSVBTKS5cbiYjNDM7U09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgXCYjMzQ7U09fU05EQlVGRk9SQ0VcJiMzNDssIDMyKVxuJiM0MztcbiYjNDM7IyBUWCByaW5nIHNpemUgdGhlIHRlc3Qgc2hyaW5rcyB0byBzbyB0aGUgcmluZyBmaWxscyBxdWlja2x5LlxuJiM0MztNSU5fVFhfUklORyA9IDMyXG4mIzQzO01BWF9UWF9SSU5HID0gMTAyNFxuIFxuIFxuIGRlZiBjaGFubmVscyhjZmcpIC1cdTAwM2UgTm9uZTpcbkBAIC0xNTEsMTQgJiM0MzsxNjYsMjQ4IEBAIGRlZiByaW5ncGFyYW0oY2ZnKSAtXHUwMDNlIE5vbmU6XG4gICAgICAgICBHZW5lcmF0ZVRyYWZmaWMoY2ZnKS53YWl0X3BrdHNfYW5kX3N0b3AoMTAwMDApXG4gXG4gXG4mIzQzO2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7V3JpdGUgdmFsIHRvIGEgZmlsZS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHdpdGggb3BlbihwYXRoLCBcJiMzNDt3XCYjMzQ7LCBlbmNvZGluZz1cJiMzNDt1dGYtOFwmIzM0OykgYXMgZnA6XG4mIzQzOyAgICAgICAgZnAud3JpdGUoc3RyKHZhbCkpXG4mIzQzO1xuJiM0MztcbiYjNDM7ZGVmIF93cml0ZV9zeXNmcyhwYXRoLCB2YWwpOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7V3JpdGUgdmFsIHRvIGEgc3lzZnMgZmlsZSwgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSBvbiBleGl0LlwmIzM0O1wmIzM0O1wmIzM0O1xuJiM0MzsgICAgd2l0aCBvcGVuKHBhdGgsIFwmIzM0O3JcJiMzNDssIGVuY29kaW5nPVwmIzM0O3V0Zi04XCYjMzQ7KSBhcyBmcDpcbiYjNDM7ICAgICAgICBvcmlnX3ZhbCA9IGZwLnJlYWQoKS5zdHJpcCgpXG4mIzQzOyAgICBpZiBzdHIodmFsKSA9PSBvcmlnX3ZhbDpcbiYjNDM7ICAgICAgICByZXR1cm5cbiYjNDM7ICAgIF93cml0ZV9maWxlKHBhdGgsIHZhbClcbiYjNDM7ICAgIGRlZmVyKF93cml0ZV9maWxlLCBwYXRoLCBvcmlnX3ZhbClcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCBxdWV1ZSk6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtSZXR1cm4gdGhlIHFkaXNjIGJhY2tsb2cgKGJ5dGVzKSBmb3IgdGhlIGdpdmVuIFRYIHF1ZXVlJiMzOTtzIGxlYWYuXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICB0YXJnZXRfcGFyZW50ID0gZlwmIzM0O3ttcV9oYW5kbGV9e3F1ZXVlICYjNDM7IDE6eH1cJiMzNDtcbiYjNDM7ICAgIGZvciBxIGluIHRjKGZcJiMzNDstcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cJiMzNDssIGpzb249VHJ1ZSk6XG4mIzQzOyAgICAgICAgaWYgcS5nZXQoXCYjMzQ7cGFyZW50XCYjMzQ7LCBcJiMzNDtcJiMzNDspID09IHRhcmdldF9wYXJlbnQ6XG4mIzQzOyAgICAgICAgICAgIHJldHVybiBxLmdldChcJiMzNDtiYWNrbG9nXCYjMzQ7KSBvciAwXG4mIzQzOyAgICByZXR1cm4gMFxuJiM0MztcbiYjNDM7XG4mIzQzO2RlZiBfc2V0dXBfZnFfcWRpc2MoY2ZnLCBwb3J0LCB0YXJnZXRfcXVldWUsIG90aGVyX3F1ZXVlLCBmbG93X2xpbWl0KTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1B1dCBhbiBmcSBxZGlzYyBvbiB0YXJnZXRfcXVldWUmIzM5O3MgbGVhZiBhbmQgcmV0dXJuIHRoZSBtcSBoYW5kbGUgaW4gdXNlLlxuJiM0MztcbiYjNDM7ICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSYjMzk7cyBleGlzdGluZyBUWC9SWCBxZGlzYyBwb2xpY3kuIE9uIGEgcmVhbFxuJiM0MzsgICAgTklDIHRoZSByb290IG1xIGFscmVhZHkgaGFzIGFuIGFkZHJlc3NhYmxlIGhhbmRsZSwgc28gd2UgbGVhdmUgdGhlIHJvb3RcbiYjNDM7ICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHNcbiYjNDM7ICAgIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXG4mIzQzO1xuJiM0MzsgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJiMzOTtzIHBlci1mbG93IHBhY2tldCBsaW1pdCAoZGVmYXVsdCAxMDApIHNvIGEgc2luZ2xlXG4mIzQzOyAgICBmbG93IGNhbiBiYWNrIHVwIG1vcmUgcGFja2V0cyB0aGFuIHRoZSBUeCByaW5nIGhvbGRzIGFuZCB0aHVzIG92ZXJmbG93IGl0LlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBxZGlzY3MgPSB0YyhmXCYjMzQ7cWRpc2Mgc2hvdyBkZXYge2NmZy5pZm5hbWV9XCYjMzQ7LCBqc29uPVRydWUpXG4mIzQzOyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoXCYjMzQ7cm9vdFwmIzM0OykpLCBOb25lKVxuJiM0MztcbiYjNDM7ICAgIGlmIHJvb3QgYW5kIHJvb3RbXCYjMzQ7a2luZFwmIzM0O10gPT0gXCYjMzQ7bXFcJiMzNDsgYW5kIHJvb3RbXCYjMzQ7aGFuZGxlXCYjMzQ7XSAhPSBcJiMzNDswOlwmIzM0OzpcbiYjNDM7ICAgICAgICAjIEFkZHJlc3NhYmxlIG1xIChwcmV2aW91c2x5LWNvbmZpZ3VyZWQpOiB0b3VjaCBvbmx5IHRoZSB0YXJnZXQgcXVldWUmIzM5O3NcbiYjNDM7ICAgICAgICAjIGxlYWYgYW5kIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXG4mIzQzOyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFtcJiMzNDtoYW5kbGVcJiMzNDtdXG4mIzQzOyAgICAgICAgcGFyZW50ID0gZlwmIzM0O3ttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSAmIzQzOyAxOnh9XCYjMzQ7XG4mIzQzOyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFwmIzM0O3BhcmVudFwmIzM0OykgPT0gcGFyZW50KSwgTm9uZSlcbiYjNDM7ICAgICAgICBvcmlnX2tpbmQgPSBvcmlnW1wmIzM0O2tpbmRcJiMzNDtdIGlmIG9yaWcgZWxzZSBcXFxuJiM0MzsgICAgICAgICAgICBjbWQoXCYjMzQ7c3lzY3RsIC1uIG5ldC5jb3JlLmRlZmF1bHRfcWRpc2NcJiMzNDspLnN0ZG91dC5zdHJpcCgpXG4mIzQzOyAgICAgICAgZGVmZXIodGMsIGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IHtvcmlnX2tpbmR9XCYjMzQ7KVxuJiM0MzsgICAgZWxpZiByb290IGlzIE5vbmUgb3Igcm9vdFtcJiMzNDtraW5kXCYjMzQ7XSBpbiAoXCYjMzQ7bXFcJiMzNDssIFwmIzM0O25vcXVldWVcJiMzNDspOlxuJiM0MzsgICAgICAgICMgVGhlIGF1dG8tYXR0YWNoZWQgcm9vdCBtcSBoYXMgaGFuZGxlIDA6IG9uIGFueSBkZXZpY2UgKHJlYWwgb3Igc2ltKSxcbiYjNDM7ICAgICAgICAjIHdoaWNoIHRoZSBrZXJuZWwgcmVqZWN0cyBhcyBhIHFkaXNjIHBhcmVudC4gQSAwOiBoYW5kbGUgbWVhbnMgdGhlIG1xXG4mIzQzOyAgICAgICAgIyBpcyB0aGUgdW50b3VjaGVkIGtlcm5lbCBkZWZhdWx0IC0gbm8gY3VzdG9tIGNoaWxkIHFkaXNjcyBjYW4gaGFuZyBvZmZcbiYjNDM7ICAgICAgICAjIGFuIHVuYWRkcmVzc2FibGUgcGFyZW50IC0gc28gaW5zdGFsbGluZyBhIHJlYWwgaGFuZGxlIGFuZCByZXN0b3JpbmdcbiYjNDM7ICAgICAgICAjIHRoZSBkZWZhdWx0IG1xIG9uIGV4aXQgcHJlc2VydmVzIHRoZSBkZXZpY2UmIzM5O3MgZWZmZWN0aXZlIHBvbGljeS5cbiYjNDM7ICAgICAgICBtcV9oYW5kbGUgPSBcJiMzNDsxOlwmIzM0O1xuJiM0MzsgICAgICAgIHRjKGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBoYW5kbGUge21xX2hhbmRsZX0gbXFcJiMzNDspXG4mIzQzOyAgICAgICAgZGVmZXIodGMsIGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBtcVwmIzM0OylcbiYjNDM7ICAgICAgICBwYXJlbnQgPSBmXCYjMzQ7e21xX2hhbmRsZX17dGFyZ2V0X3F1ZXVlICYjNDM7IDE6eH1cJiMzNDtcbiYjNDM7ICAgIGVsc2U6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChmXCYjMzQ7cm9vdCBxZGlzYyAmIzM5O3tyb290WyYjMzk7a2luZCYjMzk7XX0mIzM5OyBpcyBub3QgbXE7IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgXCYjMzQ7cmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3lcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgdHJ5OlxuJiM0MzsgICAgICAgIHRjKGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IGZxIFwmIzM0O1xuJiM0MzsgICAgICAgICAgIGZcJiMzNDtmbG93X2xpbWl0IHtmbG93X2xpbWl0fSBsaW1pdCB7Zmxvd19saW1pdCAqIDJ9XCYjMzQ7KVxuJiM0MzsgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcbiYjNDM7ICAgICAgICAgICAgZlwmIzM0O2ZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cJiMzNDspIGZyb20gZXhjXG4mIzQzO1xuJiM0MzsgICAgcWRpc2NfaiA9IHRjKGZcJiMzNDtxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cJiMzNDssIGpzb249VHJ1ZSlcbiYjNDM7ICAgIGhhc19jbHNhY3QgPSBhbnkocVsmIzM5O2tpbmQmIzM5O10gPT0gJiMzOTtjbHNhY3QmIzM5OyBmb3IgcSBpbiBxZGlzY19qKVxuJiM0MzsgICAgaWYgbm90IGhhc19jbHNhY3Q6XG4mIzQzOyAgICAgICAgdGMoZlwmIzM0O3FkaXNjIGFkZCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFwmIzM0OylcbiYjNDM7ICAgICAgICBkZWZlcih0YywgZlwmIzM0O3FkaXNjIGRlbCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFwmIzM0OylcbiYjNDM7XG4mIzQzOyAgICBwcm90byA9IFwmIzM0O2lwdjZcJiMzNDsgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgXCYjMzQ7aXBcJiMzNDtcbiYjNDM7ICAgIHRyeTpcbiYjNDM7ICAgICAgICB0YyhmXCYjMzQ7ZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcm90b2NvbCB7cHJvdG99IFwmIzM0O1xuJiM0MzsgICAgICAgICAgIGZcJiMzNDtwcmVmIDEgZmxvd2VyIGlwX3Byb3RvIHVkcCBkc3RfcG9ydCB7cG9ydH0gXCYjMzQ7XG4mIzQzOyAgICAgICAgICAgZlwmIzM0O2FjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge3RhcmdldF9xdWV1ZX1cJiMzNDspXG4mIzQzOyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFwmIzM0O3RjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlXCYjMzQ7KSBmcm9tIGV4Y1xuJiM0MzsgICAgZGVmZXIodGMsIGZcJiMzNDtmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMVwmIzM0OylcbiYjNDM7XG4mIzQzOyAgICB0YyhmXCYjMzQ7ZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSBcJiMzNDtcbiYjNDM7ICAgICAgIGZcJiMzNDttYXRjaGFsbCBhY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHtvdGhlcl9xdWV1ZX1cJiMzNDspXG4mIzQzOyAgICBkZWZlcih0YywgZlwmIzM0O2ZpbHRlciBkZWwgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJlZiAxMDFcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgcmV0dXJuIG1xX2hhbmRsZVxuJiM0MztcbiYjNDM7XG4mIzQzO2RlZiBfY3JlYXRlX3NvdHh0aW1lX3NvY2tldChjZmcsIHNuZGJ1Zik6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtDcmVhdGUgYSBVRFAgc29ja2V0IHdpdGggU09fVFhUSU1FIGVuYWJsZWQsIGJvdW5kIHRvIHRoZSB0ZXN0IGRldmljZS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSBcJiMzNDs2XCYjMzQ7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSlcbiYjNDM7ICAgIHRyeTpcbiYjNDM7ICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIFNPX1RYVElNRSwgc3RydWN0LnBhY2soXCYjMzQ7SWlcJiMzNDssIDEsIDApKVxuJiM0MzsgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOlxuJiM0MzsgICAgICAgIHNvY2suY2xvc2UoKVxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7U09fVFhUSU1FIG5vdCBzdXBwb3J0ZWRcJiMzNDspIGZyb20gZXhjXG4mIzQzOyAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19CSU5EVE9ERVZJQ0UsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgY2ZnLmlmbmFtZS5lbmNvZGUoKSlcbiYjNDM7ICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc29cbiYjNDM7ICAgICMgc2l6ZSB0aGUgc2VuZCBidWZmZXIgdG8gaG9sZCB0aGUgd2hvbGUgYnVyc3QuIFNPX1NOREJVRkZPUkNFIGJ5cGFzc2VzXG4mIzQzOyAgICAjIG5ldC5jb3JlLndtZW1fbWF4ICh0aGUgdGVzdCBydW5zIGFzIHJvb3QpLlxuJiM0MzsgICAgdHJ5OlxuJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgU09fU05EQlVGRk9SQ0UsIHNuZGJ1ZilcbiYjNDM7ICAgIGV4Y2VwdCBPU0Vycm9yOlxuJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKVxuJiM0MzsgICAgcmV0dXJuIHNvY2tcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX3NlbmRfc290eHRpbWVfYnVyc3QoY2ZnLCBzb2NrLCBwb3J0LCBjb3VudCwgZGVsYXlfbnMsIHBrdF9zaXplKTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1NlbmQgY291bnQgVURQIHBhY2tldHMgc2NoZWR1bGVkIGRlbGF5X25zIGFoZWFkIHVzaW5nIFNPX1RYVElNRS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHBheWxvYWQgPSBiJiMzOTtcXHgwMCYjMzk7ICogcGt0X3NpemVcbiYjNDM7ICAgIHR4dGltZV9ucyA9IHRpbWUuY2xvY2tfZ2V0dGltZV9ucyh0aW1lLkNMT0NLX01PTk9UT05JQykgJiM0MzsgZGVsYXlfbnNcbiYjNDM7XG4mIzQzOyAgICBhbmNkYXRhID0gWyhzb2NrZXQuU09MX1NPQ0tFVCwgU09fVFhUSU1FLCBzdHJ1Y3QucGFjayhcJiMzNDtRXCYjMzQ7LCB0eHRpbWVfbnMpKV1cbiYjNDM7ICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcbiYjNDM7ICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCwgMCwgMClcbiYjNDM7ICAgIGVsc2U6XG4mIzQzOyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXG4mIzQzOyAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6XG4mIzQzOyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdClcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxuJiM0MztcbiYjNDM7ICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCxcbiYjNDM7ICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXG4mIzQzOyAgICAoZS5nLiBibnh0IG5lZWRzIGEgbGFyZ2UgcmluZyBmb3Igc29mdHdhcmUgVURQIHNlZ21lbnRhdGlvbiksIHNvIHJhaXNlXG4mIzQzOyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBzaXplID0gTUlOX1RYX1JJTkdcbiYjNDM7ICAgIHdoaWxlIHNpemUgXHUwMDNjPSBNQVhfVFhfUklORzpcbiYjNDM7ICAgICAgICB0cnk6XG4mIzQzOyAgICAgICAgICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7JiMzOTt0eCYjMzk7OiBzaXplfSlcbiYjNDM7ICAgICAgICAgICAgcmV0dXJuIHNpemVcbiYjNDM7ICAgICAgICBleGNlcHQgTmxFcnJvcjpcbiYjNDM7ICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyXG4mIzQzOyAgICAgICAgICAgIGNvbnRpbnVlXG4mIzQzOyAgICByYWlzZSBLc2Z0U2tpcEV4KFwmIzM0O2RyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcJiMzNDspXG4mIzQzO1xuJiM0MztcbiYjNDM7ZGVmIHJlY29uZmlnX3R4X3N0YWxsKGNmZykgLVx1MDAzZSBOb25lOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7VGVzdCB0aGF0IHFkaXNjIGJhY2tsb2cgZHJhaW5zIGFmdGVyIHJpbmcgcmVjb25maWd1cmF0aW9uLlwmIzM0O1wmIzM0O1wmIzM0O1xuJiM0MzsgICAgdGFyZ2V0X3F1ZXVlID0gMVxuJiM0MzsgICAgb3RoZXJfcXVldWUgPSAwXG4mIzQzO1xuJiM0MzsgICAgZWhkciA9IHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fVxuJiM0MzsgICAgY2hhbnMgPSBjZmcuZXRoLmNoYW5uZWxzX2dldChlaGRyKVxuJiM0MztcbiYjNDM7ICAgIGlmIFwmIzM0O2NvbWJpbmVkLW1heFwmIzM0OyBub3QgaW4gY2hhbnM6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcJiMzNDtkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb21iaW5lZCBjaGFubmVsc1wmIzM0OylcbiYjNDM7ICAgIGlmIGNoYW5zLmdldChcJiMzNDtjb21iaW5lZC1tYXhcJiMzNDssIDApIFx1MDAzYyAyOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7ZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMiYjNDM7IGNvbWJpbmVkIGNoYW5uZWxzXCYjMzQ7KVxuJiM0MzsgICAgaWYgY2hhbnNbXCYjMzQ7Y29tYmluZWQtY291bnRcJiMzNDtdIFx1MDAzYyAyOlxuJiM0MzsgICAgICAgIGRlZmVyKGNmZy5ldGguY2hhbm5lbHNfc2V0LFxuJiM0MzsgICAgICAgICAgICAgIGVoZHIgfCB7XCYjMzQ7Y29tYmluZWQtY291bnRcJiMzNDs6IGNoYW5zW1wmIzM0O2NvbWJpbmVkLWNvdW50XCYjMzQ7XX0pXG4mIzQzOyAgICAgICAgY2ZnLmV0aC5jaGFubmVsc19zZXQoZWhkciB8IHtcJiMzNDtjb21iaW5lZC1jb3VudFwmIzM0OzogMn0pXG4mIzQzO1xuJiM0MzsgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxuJiM0MzsgICAgaWYgJiMzOTtyeCYjMzk7IG5vdCBpbiByaW5ncyBvciAmIzM5O3R4JiMzOTsgbm90IGluIHJpbmdzOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7ZGV2aWNlIGRvZXMgbm90IGV4cG9zZSByeC90eCByaW5nIHBhcmFtc1wmIzM0OylcbiYjNDM7ICAgIHR4X2N1ciA9IHJpbmdzWyYjMzk7dHgmIzM5O11cbiYjNDM7ICAgIGlmIHR4X2N1ciBcdTAwM2M9IE1JTl9UWF9SSU5HOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7dHggcmluZyBzaXplIGFscmVhZHkgYXQgbWluaW11bVwmIzM0OylcbiYjNDM7ICAgIGRlZmVyKGNmZy5ldGgucmluZ3Nfc2V0LCBlaGRyIHwgeyYjMzk7dHgmIzM5OzogdHhfY3VyfSlcbiYjNDM7XG4mIzQzOyAgICAjIFVzZSB0aGUgc21hbGxlc3QgVHggcmluZyB0aGUgZHJpdmVyIGFjY2VwdHMgKDMyLCBncm93aW5nIHRvIDEwMjQpLlxuJiM0MzsgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXG4mIzQzO1xuJiM0MzsgICAgIyBTbG93IGNvbXBsZXRpb25zIHNvIHRoZSByaW5nIHN0YXlzIGZ1bGwgYWZ0ZXIgRlEgcmVsZWFzZXMgcGFja2V0c1xuJiM0MzsgICAgbmFwaV9kZWZlciA9IGZcJiMzNDsvc3lzL2NsYXNzL25ldC97Y2ZnLmlmbmFtZX0vbmFwaV9kZWZlcl9oYXJkX2lycXNcJiMzNDtcbiYjNDM7ICAgIGdyb190aW1lb3V0ID0gZlwmIzM0Oy9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dFwmIzM0O1xuJiM0MzsgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDEwMClcbiYjNDM7ICAgIF93cml0ZV9zeXNmcyhncm9fdGltZW91dCwgMTAwMDAwMDAwMClcbiYjNDM7XG4mIzQzOyAgICBwb3J0ID0gcmFuZF9wb3J0KClcbiYjNDM7ICAgICMgQSBzaW5nbGUgZmxvdyBtdXN0IG92ZXJmbG93IHRoZSByaW5nLCBzbyBzZW5kIHR3aWNlIHRoZSByaW5nIGRlcHRoIGFuZFxuJiM0MzsgICAgIyBsZXQgZnEgaG9sZCB0aGF0IG1hbnkgcGFja2V0cyBmb3IgdGhlIGZsb3cuXG4mIzQzOyAgICBwa3RfY291bnQgPSB0eF9yaW5nICogMlxuJiM0MzsgICAgbXFfaGFuZGxlID0gX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSxcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3JpbmcgKiAyKVxuJiM0MztcbiYjNDM7ICAgICMgU2l6ZSBlYWNoIHBhY2tldCB0byBvbmUgTVRVIChsZXNzIEwzL0w0IGhlYWRlcnMgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbikuXG4mIzQzOyAgICBwa3Rfc2l6ZSA9IGNmZy5kZXZbJiMzOTttdHUmIzM5O10gLSAoNDggaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgMjgpXG4mIzQzO1xuJiM0MzsgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc29cbiYjNDM7ICAgICMgYnVkZ2V0IHRoZSBzZW5kIGJ1ZmZlciBmb3IgdGhlIHdob2xlIGluLWZsaWdodCBidXJzdC5cbiYjNDM7ICAgIHNvY2sgPSBfY3JlYXRlX3NvdHh0aW1lX3NvY2tldChjZmcsIHBrdF9jb3VudCAqIHBrdF9zaXplICogMilcbiYjNDM7ICAgIGRlZmVyKHNvY2suY2xvc2UpXG4mIzQzO1xuJiM0MzsgICAgZm9yIGRlbGF5X21zIGluIFsxMDAsIDIwMCwgNTAwXTpcbiYjNDM7ICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCxcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyAqIDFfMDAwXzAwMCwgcGt0X3NpemUpXG4mIzQzOyAgICAgICAga3NmdF9wcihmXCYjMzQ7U2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoJiM0Mzt7ZGVsYXlfbXN9bXMpXCYjMzQ7KVxuJiM0MzsgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICYjNDM7IDAuMylcbiYjNDM7XG4mIzQzOyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKVxuJiM0MzsgICAgICAgIGlmIGJhY2tsb2c6XG4mIzQzOyAgICAgICAgICAgIGJyZWFrXG4mIzQzOyAgICBlbHNlOlxuJiM0MzsgICAgICAgICMgQSBkZXZpY2UgdGhhdCBjb21wbGV0ZXMgVHggc3luY2hyb25vdXNseSAoZS5nLiBhIHNvZnR3YXJlL3ZpcnR1YWxcbiYjNDM7ICAgICAgICAjIGRyaXZlciBsaWtlIG5ldGRldnNpbSkgbmV2ZXIga2VlcHMgdGhlIHJpbmcgZnVsbCBsb25nIGVub3VnaCBmb3IgYVxuJiM0MzsgICAgICAgICMgYmFja2xvZyB0byBmb3JtLCBzbyB0aGUgd2FrZS12cy1zdGFydCBiZWhhdmlvciBjYW4mIzM5O3QgYmUgZXhlcmNpc2VkLlxuJiM0MzsgICAgICAgICMgVHJlYXQgdGhhdCBhcyBhbiBleHBlY3RlZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgaGFyZCBmYWlsdXJlLlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KFwmIzM0O2NvdWxkIG5vdCBidWlsZCBxZGlzYyBiYWNrbG9nXCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIGtzZnRfcHIoZlwmIzM0O0JhY2tsb2cgYmVmb3JlIHJlY29uZmlnOiB7YmFja2xvZ30gYnl0ZXNcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgIyBUcmlnZ2VyIHJpbmcgcmVjb25maWcg4oCUIGRyaXZlciBzaG91bGQgY2FsbCB3YWtlLCBub3QganVzdCBzdGFydC5cbiYjNDM7ICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHNcbiYjNDM7ICAgICMgKHNldHRpbmcgdGhlIGN1cnJlbnQgc2l6ZSBpcyBhIG5vLW9wIHRoZSBkcml2ZXIgc2hvcnQtY2lyY3VpdHMpLlxuJiM0MzsgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsmIzM5O3R4JiMzOTs6IHR4X2N1cn0pXG4mIzQzO1xuJiM0MzsgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxuJiM0MzsgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDApXG4mIzQzOyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApXG4mIzQzO1xuJiM0MzsgICAgIyBQb2xsIGZvciBiYWNrbG9nIHRvIGRyYWluXG4mIzQzOyAgICBmb3IgXyBpbiByYW5nZSgxMDApOlxuJiM0MzsgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcbiYjNDM7ICAgICAgICBpZiBub3QgYmFja2xvZzpcbiYjNDM7ICAgICAgICAgICAgYnJlYWtcbiYjNDM7ICAgICAgICB0aW1lLnNsZWVwKDAuMSlcbiYjNDM7XG4mIzQzOyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csXG4mIzQzOyAgICAgICAgICAgIGNvbW1lbnQ9ZlwmIzM0O3FkaXNjIGJhY2tsb2cgc3R1Y2sgb24gcXVldWUge3RhcmdldF9xdWV1ZX0gXCYjMzQ7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgZlwmIzM0O2FmdGVyIHJpbmcgcmVjb25maWdcJiMzNDspXG4mIzQzO1xuJiM0MztcbiBkZWYgbWFpbigpIC1cdTAwM2UgTm9uZTpcbiAgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7IEtzZnQgYm9pbGVyIHBsYXRlIG1haW4gXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4gXG4tICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18pIGFzIGNmZzpcbiYjNDM7ICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzpcbiAgICAgICAgIGNmZy5ldGggPSBFdGh0b29sRmFtaWx5KClcbiBcbiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscyxcbi0gICAgICAgICAgICAgICAgICByaW5ncGFyYW1dLFxuJiM0MzsgICAgICAgICAgICAgICAgICByaW5ncGFyYW0sXG4mIzQzOyAgICAgICAgICAgICAgICAgIHJlY29uZmlnX3R4X3N0YWxsXSxcbiAgICAgICAgICAgICAgICAgIGFyZ3M9KGNmZywgKSlcbiAgICAga3NmdF9leGl0KClcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wMSAxMTozMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3Qgc2NyaXB0cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBrZXJuZWwsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZSBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDE3ODU0YjFkMTc3MDM0MmE0OTI2ZTY4NGU0NGY4ZGE5NGFmOTA3YjYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxIDExOjI5OjU4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnCmluZGV4IDIwNzBlODkwZTA2NGUuLmYzOTMzY2YzZTZiZTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWcKQEAgLTQsOCAmIzQzOzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9bgogQ09ORklHX0lORVRfUFNQPXkKIENPTkZJR19JUFY2PXkKIENPTkZJR19NQUNTRUM9bQomIzQzO0NPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9DTFNfQUNUPXkKIENPTkZJR19ORVRfQ0xTX0JQRj15CiYjNDM7Q09ORklHX05FVF9DTFNfRkxPV0VSPW0KJiM0MztDT05GSUdfTkVUX0NMU19NQVRDSEFMTD1tCiBDT05GSUdfTkVUQ09OU09MRT1tCiBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDPXkKIENPTkZJR19ORVRDT05TT0xFX0VYVEVOREVEX0xPRz15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weQppbmRleCBlNGFjZjNkODMzM2ZkLi5iMWM2ZjZjZWY3ZGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHkKQEAgLTExNCwxMCAmIzQzOzExNCwxMSBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKToKICAgICBuc2ltX3Y0X3BmeCA9ICYjMzQ7MTkyLjAuMi4mIzM0OwogICAgIG5zaW1fdjZfcGZ4ID0gJiMzNDsyMDAxOmRiODo6JiMzNDsKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOgomIzQzOyAgICBkZWYgX19pbml0X18oc2VsZiwgc3JjX3BhdGgsIG5zaW1fdGVzdD1Ob25lLCBxdWV1ZV9jb3VudD1Ob25lKToKICAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhzcmNfcGF0aCkKIAogICAgICAgICBzZWxmLl9zdGF0c19zZXR0bGVfdGltZSA9IE5vbmUKJiM0MzsgICAgICAgIHNlbGYuX3F1ZXVlX2NvdW50ID0gcXVldWVfY291bnQKIAogICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveQogICAgICAgICBzZWxmLnJlbW90ZSA9IE5vbmUKQEAgLTE3Myw5ICYjNDM7MTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOgogICAgICAgICBzZWxmLl9yZXF1aXJlZF9jbWQgPSB7fQogCiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKToKJiM0MzsgICAgICAgIG5zaW1fa3dhcmdzID0ge30KJiM0MzsgICAgICAgIGlmIHNlbGYuX3F1ZXVlX2NvdW50OgomIzQzOyAgICAgICAgICAgIG5zaW1fa3dhcmdzWyYjMzQ7cXVldWVfY291bnQmIzM0O10gPSBzZWxmLl9xdWV1ZV9jb3VudAomIzQzOwogICAgICAgICBzZWxmLl9uZXRucyA9IE5ldE5TKCkKLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKQotICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zKQomIzQzOyAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKipuc2ltX2t3YXJncykKJiM0MzsgICAgICAgIHNlbGYuX25zX3BlZXIgPSBOZXRkZXZTaW1EZXYobnM9c2VsZi5fbmV0bnMsICoqbnNpbV9rd2FyZ3MpCiAKICAgICAgICAgd2l0aCBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9ucy9uZXQmIzM0OykgYXMgbnNmZDAsIFwKICAgICAgICAgICAgICBvcGVuKCYjMzQ7L3Zhci9ydW4vbmV0bnMvJiMzNDsgJiM0Mzsgc2VsZi5fbmV0bnMubmFtZSkgYXMgbnNmZDE6CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weQppbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkKQEAgLTUsMTAgJiM0Mzs1LDI1IEBACiBUZXN0IGNoYW5uZWwgYW5kIHJpbmcgc2l6ZSBjb25maWd1cmF0aW9uIHZpYSBldGh0b29sICgtTCAvIC1HKS4KICYjMzQ7JiMzNDsmIzM0OwogCiYjNDM7aW1wb3J0IHNvY2tldAomIzQzO2ltcG9ydCBzdHJ1Y3QKJiM0MztpbXBvcnQgdGltZQomIzQzOwogZnJvbSBsaWIucHkgaW1wb3J0IGtzZnRfcnVuLCBrc2Z0X2V4aXQsIGtzZnRfcHIKIGZyb20gbGliLnB5IGltcG9ydCBrc2Z0X2VxCiYjNDM7ZnJvbSBsaWIucHkgaW1wb3J0IEtzZnRTa2lwRXgsIEtzZnRYZmFpbEV4CiBmcm9tIGxpYi5weSBpbXBvcnQgTmV0RHJ2RXBFbnYsIEV0aHRvb2xGYW1pbHksIEdlbmVyYXRlVHJhZmZpYwotZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yCiYjNDM7ZnJvbSBsaWIucHkgaW1wb3J0IGNtZCwgZGVmZXIsIHJhbmRfcG9ydCwgdGMsIE5sRXJyb3IKJiM0MzsKJiM0MzsjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTCiYjNDM7U09fVFhUSU1FID0gZ2V0YXR0cihzb2NrZXQsICYjMzQ7U09fVFhUSU1FJiMzNDssIDYxKQomIzQzOwomIzQzOyMgTm90IGFsd2F5cyBleHBvcnRlZCBieSB0aGUgc29ja2V0IG1vZHVsZTsgYXNtLWdlbmVyaWMgdmFsdWUgKHg4Ni9BUk0vTUlQUykuCiYjNDM7U09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgJiMzNDtTT19TTkRCVUZGT1JDRSYjMzQ7LCAzMikKJiM0MzsKJiM0MzsjIFRYIHJpbmcgc2l6ZSB0aGUgdGVzdCBzaHJpbmtzIHRvIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHkuCiYjNDM7TUlOX1RYX1JJTkcgPSAzMgomIzQzO01BWF9UWF9SSU5HID0gMTAyNAogCiAKIGRlZiBjaGFubmVscyhjZmcpIC0mZ3Q7IE5vbmU6CkBAIC0xNTEsMTQgJiM0MzsxNjYsMjQ4IEBAIGRlZiByaW5ncGFyYW0oY2ZnKSAtJmd0OyBOb25lOgogICAgICAgICBHZW5lcmF0ZVRyYWZmaWMoY2ZnKS53YWl0X3BrdHNfYW5kX3N0b3AoMTAwMDApCiAKIAomIzQzO2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtXcml0ZSB2YWwgdG8gYSBmaWxlLiYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICB3aXRoIG9wZW4ocGF0aCwgJiMzNDt3JiMzNDssIGVuY29kaW5nPSYjMzQ7dXRmLTgmIzM0OykgYXMgZnA6CiYjNDM7ICAgICAgICBmcC53cml0ZShzdHIodmFsKSkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX3dyaXRlX3N5c2ZzKHBhdGgsIHZhbCk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1dyaXRlIHZhbCB0byBhIHN5c2ZzIGZpbGUsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb24gZXhpdC4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgd2l0aCBvcGVuKHBhdGgsICYjMzQ7ciYjMzQ7LCBlbmNvZGluZz0mIzM0O3V0Zi04JiMzNDspIGFzIGZwOgomIzQzOyAgICAgICAgb3JpZ192YWwgPSBmcC5yZWFkKCkuc3RyaXAoKQomIzQzOyAgICBpZiBzdHIodmFsKSA9PSBvcmlnX3ZhbDoKJiM0MzsgICAgICAgIHJldHVybgomIzQzOyAgICBfd3JpdGVfZmlsZShwYXRoLCB2YWwpCiYjNDM7ICAgIGRlZmVyKF93cml0ZV9maWxlLCBwYXRoLCBvcmlnX3ZhbCkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCBxdWV1ZSk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1JldHVybiB0aGUgcWRpc2MgYmFja2xvZyAoYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gVFggcXVldWUmIzM5O3MgbGVhZi4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgdGFyZ2V0X3BhcmVudCA9IGYmIzM0O3ttcV9oYW5kbGV9e3F1ZXVlICYjNDM7IDE6eH0mIzM0OwomIzQzOyAgICBmb3IgcSBpbiB0YyhmJiMzNDstcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX0mIzM0OywganNvbj1UcnVlKToKJiM0MzsgICAgICAgIGlmIHEuZ2V0KCYjMzQ7cGFyZW50JiMzNDssICYjMzQ7JiMzNDspID09IHRhcmdldF9wYXJlbnQ6CiYjNDM7ICAgICAgICAgICAgcmV0dXJuIHEuZ2V0KCYjMzQ7YmFja2xvZyYjMzQ7KSBvciAwCiYjNDM7ICAgIHJldHVybiAwCiYjNDM7CiYjNDM7CiYjNDM7ZGVmIF9zZXR1cF9mcV9xZGlzYyhjZmcsIHBvcnQsIHRhcmdldF9xdWV1ZSwgb3RoZXJfcXVldWUsIGZsb3dfbGltaXQpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtQdXQgYW4gZnEgcWRpc2Mgb24gdGFyZ2V0X3F1ZXVlJiMzOTtzIGxlYWYgYW5kIHJldHVybiB0aGUgbXEgaGFuZGxlIGluIHVzZS4KJiM0MzsKJiM0MzsgICAgV2UgbXVzdCBub3QgZGlzdHVyYiB0aGUgZGV2aWNlJiMzOTtzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsCiYjNDM7ICAgIE5JQyB0aGUgcm9vdCBtcSBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzYWJsZSBoYW5kbGUsIHNvIHdlIGxlYXZlIHRoZSByb290CiYjNDM7ICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHMKJiM0MzsgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy4KJiM0MzsKJiM0MzsgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJiMzOTtzIHBlci1mbG93IHBhY2tldCBsaW1pdCAoZGVmYXVsdCAxMDApIHNvIGEgc2luZ2xlCiYjNDM7ICAgIGZsb3cgY2FuIGJhY2sgdXAgbW9yZSBwYWNrZXRzIHRoYW4gdGhlIFR4IHJpbmcgaG9sZHMgYW5kIHRodXMgb3ZlcmZsb3cgaXQuCiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICBxZGlzY3MgPSB0YyhmJiMzNDtxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX0mIzM0OywganNvbj1UcnVlKQomIzQzOyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoJiMzNDtyb290JiMzNDspKSwgTm9uZSkKJiM0MzsKJiM0MzsgICAgaWYgcm9vdCBhbmQgcm9vdFsmIzM0O2tpbmQmIzM0O10gPT0gJiMzNDttcSYjMzQ7IGFuZCByb290WyYjMzQ7aGFuZGxlJiMzNDtdICE9ICYjMzQ7MDomIzM0OzoKJiM0MzsgICAgICAgICMgQWRkcmVzc2FibGUgbXEgKHByZXZpb3VzbHktY29uZmlndXJlZCk6IHRvdWNoIG9ubHkgdGhlIHRhcmdldCBxdWV1ZSYjMzk7cwomIzQzOyAgICAgICAgIyBsZWFmIGFuZCByZXN0b3JlIGl0cyBvcmlnaW5hbCBxZGlzYyBhZnRlcndhcmRzLgomIzQzOyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFsmIzM0O2hhbmRsZSYjMzQ7XQomIzQzOyAgICAgICAgcGFyZW50ID0gZiYjMzQ7e21xX2hhbmRsZX17dGFyZ2V0X3F1ZXVlICYjNDM7IDE6eH0mIzM0OwomIzQzOyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KCYjMzQ7cGFyZW50JiMzNDspID09IHBhcmVudCksIE5vbmUpCiYjNDM7ICAgICAgICBvcmlnX2tpbmQgPSBvcmlnWyYjMzQ7a2luZCYjMzQ7XSBpZiBvcmlnIGVsc2UgXAomIzQzOyAgICAgICAgICAgIGNtZCgmIzM0O3N5c2N0bCAtbiBuZXQuY29yZS5kZWZhdWx0X3FkaXNjJiMzNDspLnN0ZG91dC5zdHJpcCgpCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHBhcmVudCB7cGFyZW50fSB7b3JpZ19raW5kfSYjMzQ7KQomIzQzOyAgICBlbGlmIHJvb3QgaXMgTm9uZSBvciByb290WyYjMzQ7a2luZCYjMzQ7XSBpbiAoJiMzNDttcSYjMzQ7LCAmIzM0O25vcXVldWUmIzM0Oyk6CiYjNDM7ICAgICAgICAjIFRoZSBhdXRvLWF0dGFjaGVkIHJvb3QgbXEgaGFzIGhhbmRsZSAwOiBvbiBhbnkgZGV2aWNlIChyZWFsIG9yIHNpbSksCiYjNDM7ICAgICAgICAjIHdoaWNoIHRoZSBrZXJuZWwgcmVqZWN0cyBhcyBhIHFkaXNjIHBhcmVudC4gQSAwOiBoYW5kbGUgbWVhbnMgdGhlIG1xCiYjNDM7ICAgICAgICAjIGlzIHRoZSB1bnRvdWNoZWQga2VybmVsIGRlZmF1bHQgLSBubyBjdXN0b20gY2hpbGQgcWRpc2NzIGNhbiBoYW5nIG9mZgomIzQzOyAgICAgICAgIyBhbiB1bmFkZHJlc3NhYmxlIHBhcmVudCAtIHNvIGluc3RhbGxpbmcgYSByZWFsIGhhbmRsZSBhbmQgcmVzdG9yaW5nCiYjNDM7ICAgICAgICAjIHRoZSBkZWZhdWx0IG1xIG9uIGV4aXQgcHJlc2VydmVzIHRoZSBkZXZpY2UmIzM5O3MgZWZmZWN0aXZlIHBvbGljeS4KJiM0MzsgICAgICAgIG1xX2hhbmRsZSA9ICYjMzQ7MTomIzM0OwomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgaGFuZGxlIHttcV9oYW5kbGV9IG1xJiMzNDspCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgbXEmIzM0OykKJiM0MzsgICAgICAgIHBhcmVudCA9IGYmIzM0O3ttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSAmIzQzOyAxOnh9JiMzNDsKJiM0MzsgICAgZWxzZToKJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoZiYjMzQ7cm9vdCBxZGlzYyAmIzM5O3tyb290WyYjMzk7a2luZCYjMzk7XX0mIzM5OyBpcyBub3QgbXE7ICYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzQ7cmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3kmIzM0OykKJiM0MzsKJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHBhcmVudCB7cGFyZW50fSBmcSAmIzM0OwomIzQzOyAgICAgICAgICAgZiYjMzQ7Zmxvd19saW1pdCB7Zmxvd19saW1pdH0gbGltaXQge2Zsb3dfbGltaXQgKiAyfSYjMzQ7KQomIzQzOyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoCiYjNDM7ICAgICAgICAgICAgZiYjMzQ7ZnEgbm90IGF2YWlsYWJsZSAoQ09ORklHX05FVF9TQ0hfRlEpOiB7ZXhjfSYjMzQ7KSBmcm9tIGV4YwomIzQzOwomIzQzOyAgICBxZGlzY19qID0gdGMoZiYjMzQ7cWRpc2Mgc2hvdyBkZXYge2NmZy5pZm5hbWV9JiMzNDssIGpzb249VHJ1ZSkKJiM0MzsgICAgaGFzX2Nsc2FjdCA9IGFueShxWyYjMzk7a2luZCYjMzk7XSA9PSAmIzM5O2Nsc2FjdCYjMzk7IGZvciBxIGluIHFkaXNjX2opCiYjNDM7ICAgIGlmIG5vdCBoYXNfY2xzYWN0OgomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0JiMzNDspCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0JiMzNDspCiYjNDM7CiYjNDM7ICAgIHByb3RvID0gJiMzNDtpcHY2JiMzNDsgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgJiMzNDtpcCYjMzQ7CiYjNDM7ICAgIHRyeToKJiM0MzsgICAgICAgIHRjKGYmIzM0O2ZpbHRlciBhZGQgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJvdG9jb2wge3Byb3RvfSAmIzM0OwomIzQzOyAgICAgICAgICAgZiYjMzQ7cHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9ICYjMzQ7CiYjNDM7ICAgICAgICAgICBmJiMzNDthY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHt0YXJnZXRfcXVldWV9JiMzNDspCiYjNDM7ICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O3RjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlJiMzNDspIGZyb20gZXhjCiYjNDM7ICAgIGRlZmVyKHRjLCBmJiMzNDtmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMSYjMzQ7KQomIzQzOwomIzQzOyAgICB0YyhmJiMzNDtmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxICYjMzQ7CiYjNDM7ICAgICAgIGYmIzM0O21hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfSYjMzQ7KQomIzQzOyAgICBkZWZlcih0YywgZiYjMzQ7ZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSYjMzQ7KQomIzQzOwomIzQzOyAgICByZXR1cm4gbXFfaGFuZGxlCiYjNDM7CiYjNDM7CiYjNDM7ZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKToKJiM0MzsgICAgJiMzNDsmIzM0OyYjMzQ7Q3JlYXRlIGEgVURQIHNvY2tldCB3aXRoIFNPX1RYVElNRSBlbmFibGVkLCBib3VuZCB0byB0aGUgdGVzdCBkZXZpY2UuJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSAmIzM0OzYmIzM0OwomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKCYjMzQ7SWkmIzM0OywgMSwgMCkpCiYjNDM7ICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKJiM0MzsgICAgICAgIHNvY2suY2xvc2UoKQomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O1NPX1RYVElNRSBub3Qgc3VwcG9ydGVkJiMzNDspIGZyb20gZXhjCiYjNDM7ICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSwKJiM0MzsgICAgICAgICAgICAgICAgICAgIGNmZy5pZm5hbWUuZW5jb2RlKCkpCiYjNDM7ICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc28KJiM0MzsgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXMKJiM0MzsgICAgIyBuZXQuY29yZS53bWVtX21heCAodGhlIHRlc3QgcnVucyBhcyByb290KS4KJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKQomIzQzOyAgICBleGNlcHQgT1NFcnJvcjoKJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKQomIzQzOyAgICByZXR1cm4gc29jawomIzQzOwomIzQzOwomIzQzO2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtTZW5kIGNvdW50IFVEUCBwYWNrZXRzIHNjaGVkdWxlZCBkZWxheV9ucyBhaGVhZCB1c2luZyBTT19UWFRJTUUuJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIHBheWxvYWQgPSBiJiMzOTtceDAwJiMzOTsgKiBwa3Rfc2l6ZQomIzQzOyAgICB0eHRpbWVfbnMgPSB0aW1lLmNsb2NrX2dldHRpbWVfbnModGltZS5DTE9DS19NT05PVE9OSUMpICYjNDM7IGRlbGF5X25zCiYjNDM7CiYjNDM7ICAgIGFuY2RhdGEgPSBbKHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKCYjMzQ7USYjMzQ7LCB0eHRpbWVfbnMpKV0KJiM0MzsgICAgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2OgomIzQzOyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQsIDAsIDApCiYjNDM7ICAgIGVsc2U6CiYjNDM7ICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCkKJiM0MzsgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgomIzQzOyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdCkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1NldCB0aGUgVHggcmluZyB0byB0aGUgc21hbGxlc3Qgc2l6ZSB0aGUgZHJpdmVyIGFjY2VwdHMuCiYjNDM7CiYjNDM7ICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCwKJiM0MzsgICAgMTI4LCAyNTYsIC4uLikgdXAgdG8gMTAyNC4gU29tZSBkcml2ZXJzIGVuZm9yY2UgYSBtaW5pbXVtIHdlbGwgYWJvdmUgMzIKJiM0MzsgICAgKGUuZy4gYm54dCBuZWVkcyBhIGxhcmdlIHJpbmcgZm9yIHNvZnR3YXJlIFVEUCBzZWdtZW50YXRpb24pLCBzbyByYWlzZQomIzQzOyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgc2l6ZSA9IE1JTl9UWF9SSU5HCiYjNDM7ICAgIHdoaWxlIHNpemUgJmx0Oz0gTUFYX1RYX1JJTkc6CiYjNDM7ICAgICAgICB0cnk6CiYjNDM7ICAgICAgICAgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsmIzM5O3R4JiMzOTs6IHNpemV9KQomIzQzOyAgICAgICAgICAgIHJldHVybiBzaXplCiYjNDM7ICAgICAgICBleGNlcHQgTmxFcnJvcjoKJiM0MzsgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDIKJiM0MzsgICAgICAgICAgICBjb250aW51ZQomIzQzOyAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7ZHJpdmVyIHJlamVjdHMgYWxsIHR4IHJpbmcgc2l6ZXMgdXAgdG8gMTAyNCYjMzQ7KQomIzQzOwomIzQzOwomIzQzO2RlZiByZWNvbmZpZ190eF9zdGFsbChjZmcpIC0mZ3Q7IE5vbmU6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1Rlc3QgdGhhdCBxZGlzYyBiYWNrbG9nIGRyYWlucyBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgdGFyZ2V0X3F1ZXVlID0gMQomIzQzOyAgICBvdGhlcl9xdWV1ZSA9IDAKJiM0MzsKJiM0MzsgICAgZWhkciA9IHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fQomIzQzOyAgICBjaGFucyA9IGNmZy5ldGguY2hhbm5lbHNfZ2V0KGVoZHIpCiYjNDM7CiYjNDM7ICAgIGlmICYjMzQ7Y29tYmluZWQtbWF4JiMzNDsgbm90IGluIGNoYW5zOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O2RldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNvbWJpbmVkIGNoYW5uZWxzJiMzNDspCiYjNDM7ICAgIGlmIGNoYW5zLmdldCgmIzM0O2NvbWJpbmVkLW1heCYjMzQ7LCAwKSAmbHQ7IDI6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7ZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMiYjNDM7IGNvbWJpbmVkIGNoYW5uZWxzJiMzNDspCiYjNDM7ICAgIGlmIGNoYW5zWyYjMzQ7Y29tYmluZWQtY291bnQmIzM0O10gJmx0OyAyOgomIzQzOyAgICAgICAgZGVmZXIoY2ZnLmV0aC5jaGFubmVsc19zZXQsCiYjNDM7ICAgICAgICAgICAgICBlaGRyIHwgeyYjMzQ7Y29tYmluZWQtY291bnQmIzM0OzogY2hhbnNbJiMzNDtjb21iaW5lZC1jb3VudCYjMzQ7XX0pCiYjNDM7ICAgICAgICBjZmcuZXRoLmNoYW5uZWxzX3NldChlaGRyIHwgeyYjMzQ7Y29tYmluZWQtY291bnQmIzM0OzogMn0pCiYjNDM7CiYjNDM7ICAgIHJpbmdzID0gY2ZnLmV0aC5yaW5nc19nZXQoZWhkcikKJiM0MzsgICAgaWYgJiMzOTtyeCYjMzk7IG5vdCBpbiByaW5ncyBvciAmIzM5O3R4JiMzOTsgbm90IGluIHJpbmdzOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O2RldmljZSBkb2VzIG5vdCBleHBvc2UgcngvdHggcmluZyBwYXJhbXMmIzM0OykKJiM0MzsgICAgdHhfY3VyID0gcmluZ3NbJiMzOTt0eCYjMzk7XQomIzQzOyAgICBpZiB0eF9jdXIgJmx0Oz0gTUlOX1RYX1JJTkc6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7dHggcmluZyBzaXplIGFscmVhZHkgYXQgbWluaW11bSYjMzQ7KQomIzQzOyAgICBkZWZlcihjZmcuZXRoLnJpbmdzX3NldCwgZWhkciB8IHsmIzM5O3R4JiMzOTs6IHR4X2N1cn0pCiYjNDM7CiYjNDM7ICAgICMgVXNlIHRoZSBzbWFsbGVzdCBUeCByaW5nIHRoZSBkcml2ZXIgYWNjZXB0cyAoMzIsIGdyb3dpbmcgdG8gMTAyNCkuCiYjNDM7ICAgIHR4X3JpbmcgPSBfc2V0X3NtYWxsX3R4X3JpbmcoY2ZnLCBlaGRyKQomIzQzOwomIzQzOyAgICAjIFNsb3cgY29tcGxldGlvbnMgc28gdGhlIHJpbmcgc3RheXMgZnVsbCBhZnRlciBGUSByZWxlYXNlcyBwYWNrZXRzCiYjNDM7ICAgIG5hcGlfZGVmZXIgPSBmJiMzNDsvc3lzL2NsYXNzL25ldC97Y2ZnLmlmbmFtZX0vbmFwaV9kZWZlcl9oYXJkX2lycXMmIzM0OwomIzQzOyAgICBncm9fdGltZW91dCA9IGYmIzM0Oy9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dCYjMzQ7CiYjNDM7ICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAxMDApCiYjNDM7ICAgIF93cml0ZV9zeXNmcyhncm9fdGltZW91dCwgMTAwMDAwMDAwMCkKJiM0MzsKJiM0MzsgICAgcG9ydCA9IHJhbmRfcG9ydCgpCiYjNDM7ICAgICMgQSBzaW5nbGUgZmxvdyBtdXN0IG92ZXJmbG93IHRoZSByaW5nLCBzbyBzZW5kIHR3aWNlIHRoZSByaW5nIGRlcHRoIGFuZAomIzQzOyAgICAjIGxldCBmcSBob2xkIHRoYXQgbWFueSBwYWNrZXRzIGZvciB0aGUgZmxvdy4KJiM0MzsgICAgcGt0X2NvdW50ID0gdHhfcmluZyAqIDIKJiM0MzsgICAgbXFfaGFuZGxlID0gX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfcmluZyAqIDIpCiYjNDM7CiYjNDM7ICAgICMgU2l6ZSBlYWNoIHBhY2tldCB0byBvbmUgTVRVIChsZXNzIEwzL0w0IGhlYWRlcnMgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbikuCiYjNDM7ICAgIHBrdF9zaXplID0gY2ZnLmRldlsmIzM5O210dSYjMzk7XSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOCkKJiM0MzsKJiM0MzsgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc28KJiM0MzsgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LgomIzQzOyAgICBzb2NrID0gX2NyZWF0ZV9zb3R4dGltZV9zb2NrZXQoY2ZnLCBwa3RfY291bnQgKiBwa3Rfc2l6ZSAqIDIpCiYjNDM7ICAgIGRlZmVyKHNvY2suY2xvc2UpCiYjNDM7CiYjNDM7ICAgIGZvciBkZWxheV9tcyBpbiBbMTAwLCAyMDAsIDUwMF06CiYjNDM7ICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCwKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSkKJiM0MzsgICAgICAgIGtzZnRfcHIoZiYjMzQ7U2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoJiM0Mzt7ZGVsYXlfbXN9bXMpJiMzNDspCiYjNDM7ICAgICAgICB0aW1lLnNsZWVwKGRlbGF5X21zIC8gMTAwMCAmIzQzOyAwLjMpCiYjNDM7CiYjNDM7ICAgICAgICBiYWNrbG9nID0gX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCB0YXJnZXRfcXVldWUpCiYjNDM7ICAgICAgICBpZiBiYWNrbG9nOgomIzQzOyAgICAgICAgICAgIGJyZWFrCiYjNDM7ICAgIGVsc2U6CiYjNDM7ICAgICAgICAjIEEgZGV2aWNlIHRoYXQgY29tcGxldGVzIFR4IHN5bmNocm9ub3VzbHkgKGUuZy4gYSBzb2Z0d2FyZS92aXJ0dWFsCiYjNDM7ICAgICAgICAjIGRyaXZlciBsaWtlIG5ldGRldnNpbSkgbmV2ZXIga2VlcHMgdGhlIHJpbmcgZnVsbCBsb25nIGVub3VnaCBmb3IgYQomIzQzOyAgICAgICAgIyBiYWNrbG9nIHRvIGZvcm0sIHNvIHRoZSB3YWtlLXZzLXN0YXJ0IGJlaGF2aW9yIGNhbiYjMzk7dCBiZSBleGVyY2lzZWQuCiYjNDM7ICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS4KJiM0MzsgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KCYjMzQ7Y291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2cmIzM0OykKJiM0MzsKJiM0MzsgICAga3NmdF9wcihmJiMzNDtCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzJiMzNDspCiYjNDM7CiYjNDM7ICAgICMgVHJpZ2dlciByaW5nIHJlY29uZmlnIOKAlCBkcml2ZXIgc2hvdWxkIGNhbGwgd2FrZSwgbm90IGp1c3Qgc3RhcnQuCiYjNDM7ICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHMKJiM0MzsgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuCiYjNDM7ICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7JiMzOTt0eCYjMzk7OiB0eF9jdXJ9KQomIzQzOwomIzQzOyAgICAjIExldCBjb21wbGV0aW9ucyBwcm9jZWVkIG5vcm1hbGx5CiYjNDM7ICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAwKQomIzQzOyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApCiYjNDM7CiYjNDM7ICAgICMgUG9sbCBmb3IgYmFja2xvZyB0byBkcmFpbgomIzQzOyAgICBmb3IgXyBpbiByYW5nZSgxMDApOgomIzQzOyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKQomIzQzOyAgICAgICAgaWYgbm90IGJhY2tsb2c6CiYjNDM7ICAgICAgICAgICAgYnJlYWsKJiM0MzsgICAgICAgIHRpbWUuc2xlZXAoMC4xKQomIzQzOwomIzQzOyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csCiYjNDM7ICAgICAgICAgICAgY29tbWVudD1mJiMzNDtxZGlzYyBiYWNrbG9nIHN0dWNrIG9uIHF1ZXVlIHt0YXJnZXRfcXVldWV9ICYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgICAgICBmJiMzNDthZnRlciByaW5nIHJlY29uZmlnJiMzNDspCiYjNDM7CiYjNDM7CiBkZWYgbWFpbigpIC0mZ3Q7IE5vbmU6CiAgICAgJiMzNDsmIzM0OyYjMzQ7IEtzZnQgYm9pbGVyIHBsYXRlIG1haW4gJiMzNDsmIzM0OyYjMzQ7CiAKLSAgICB3aXRoIE5ldERydkVwRW52KF9fZmlsZV9fKSBhcyBjZmc6CiYjNDM7ICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzoKICAgICAgICAgY2ZnLmV0aCA9IEV0aHRvb2xGYW1pbHkoKQogCiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscywKLSAgICAgICAgICAgICAgICAgIHJpbmdwYXJhbV0sCiYjNDM7ICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtLAomIzQzOyAgICAgICAgICAgICAgICAgIHJlY29uZmlnX3R4X3N0YWxsXSwKICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKQogICAgIGtzZnRfZXhpdCgpCiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjU1NQoJCQkJCQkJb3V0cHV0OiA3MQoJCQkJCQkJdGhvdWdodHM6IDU5MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIEV2YWx1YXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtBaCwgaXQmIzM5O3MgbWVzc2luZyB3aXRoIGEgc2VsZnRlc3QsIHNwZWNpZmljYWxseSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWAmIzM0Oy4gSSBzZWUgaXQmIzM5O3MgYWRkaW5nIGEgbmV3IHRlc3QgZnVuY3Rpb24sIGByZWNvbmZpZ190eF9zdGFsbGAsIHRvIGNoZWNrIHFkaXNjIGJhY2tsb2cgZHJhaW5hZ2UgYWZ0ZXIgcmluZyByZWNvbmZpZ3VyYXRpb24uIEl0IGFsc28gdG91Y2hlcyBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlgLiBJJiMzOTttIHN0YXJ0aW5nIHRvIGFzc2VzcyBpZiB0aGlzIG5lZWRzIHRvIGJlIGZ1enplZC4KCldhaXQgYSBzZWNvbmQuLi4gaXQmIzM5O3MgKm9ubHkqIG1vZGlmeWluZyBmaWxlcyB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIE5vIGNvcmUga2VybmVsIGxvZ2ljLCBubyBkcml2ZXJzLCBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBpcyBiZWluZyB0b3VjaGVkLiBUaGUgcHJvbXB0IHNwZWNpZmljYWxseSBzYXlzICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucy4uLiBtb2RpZmljYXRpb25zIHRvLi4uIGNvZGUgY29tbWVudHMuLi4mIzM0Oy4gU2VsZnRlc3RzLCBieSB0aGVpciBuYXR1cmUsIGFyZSB1c2VyLXNwYWNlIHRlc3RzLCBub3QgY29yZSBrZXJuZWwgY29tcG9uZW50cy4gU28sIG5vLCB0aGlzIGRvZXMgbm90IGxvb2sgbGlrZSBpdCBuZWVkcyB0byBiZSBmdXp6ZWQuCgpJIG5lZWQgdG8gY29uZmlybSB0aGF0IG15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBjb3JyZWN0LiBMZXQmIzM5O3MgbWFrZSBzdXJlIEkmIzM5O20gbm90IG1pc3NpbmcgYW55dGhpbmcuIEdvaW5nIGJhY2sgYW5kIHJlLWV4YW1pbmluZyB0aGUgcGF0Y2gsIEkgY2FuIHNlZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB0aGUgZm9sbG93aW5nIGZpbGVzOiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlgLCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlgLiBBbGwgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuCgpPa2F5LCBubywgSSYjMzk7bSBjb25maWRlbnQuIFRoaXMgcGF0Y2ggb25seSBkZWFscyB3aXRoIHVzZXJzcGFjZSB0ZXN0IHNjcmlwdHMgYW5kIGNvbmZpZ3VyYXRpb24uIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZiB0aGF0IHJlcXVpcmUgZnV6emluZy4KClRoZXJlZm9yZSwgSSYjMzk7bSBnb2luZyB0byByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6Mjk6NTkuNzc5MDc3MzM0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODc1ODc0NTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3Qgc2NyaXB0cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBrZXJuZWwsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZSBjb2RlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6Mjk6NTkuNzc5MDg3NjE0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTA3NjU2NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAxNzg1NGIxZDE3NzAzNDJhNDkyNmU2ODRlNDRmOGRhOTRhZjkwN2I2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDEgMTE6Mjk6NTggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXFxuaW5kZXggMjA3MGU4OTBlMDY0ZS4uZjM5MzNjZjNlNmJlNiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcXG5AQCAtNCw4ICs0LDExIEBAIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTPW5cXG4gQ09ORklHX0lORVRfUFNQPXlcXG4gQ09ORklHX0lQVjY9eVxcbiBDT05GSUdfTUFDU0VDPW1cXG4rQ09ORklHX05FVF9BQ1RfU0tCRURJVD1tXFxuIENPTkZJR19ORVRfQ0xTX0FDVD15XFxuIENPTkZJR19ORVRfQ0xTX0JQRj15XFxuK0NPTkZJR19ORVRfQ0xTX0ZMT1dFUj1tXFxuK0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cXG4gQ09ORklHX05FVENPTlNPTEU9bVxcbiBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDPXlcXG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcXG5pbmRleCBlNGFjZjNkODMzM2ZkLi5iMWM2ZjZjZWY3ZGQyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5XFxuQEAgLTExNCwxMCArMTE0LDExIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxcbiAgICAgbnNpbV92NF9wZnggPSBcXFwiMTkyLjAuMi5cXFwiXFxuICAgICBuc2ltX3Y2X3BmeCA9IFxcXCIyMDAxOmRiODo6XFxcIlxcbiBcXG4tICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOlxcbisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XFxuICAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhzcmNfcGF0aClcXG4gXFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXFxuKyAgICAgICAgc2VsZi5fcXVldWVfY291bnQgPSBxdWV1ZV9jb3VudFxcbiBcXG4gICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveVxcbiAgICAgICAgIHNlbGYucmVtb3RlID0gTm9uZVxcbkBAIC0xNzMsOSArMTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxcbiAgICAgICAgIHNlbGYuX3JlcXVpcmVkX2NtZCA9IHt9XFxuIFxcbiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKTpcXG4rICAgICAgICBuc2ltX2t3YXJncyA9IHt9XFxuKyAgICAgICAgaWYgc2VsZi5fcXVldWVfY291bnQ6XFxuKyAgICAgICAgICAgIG5zaW1fa3dhcmdzW1xcXCJxdWV1ZV9jb3VudFxcXCJdID0gc2VsZi5fcXVldWVfY291bnRcXG4rXFxuICAgICAgICAgc2VsZi5fbmV0bnMgPSBOZXROUygpXFxuLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKVxcbi0gICAgICAgIHNlbGYuX25zX3BlZXIgPSBOZXRkZXZTaW1EZXYobnM9c2VsZi5fbmV0bnMpXFxuKyAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKipuc2ltX2t3YXJncylcXG4rICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zLCAqKm5zaW1fa3dhcmdzKVxcbiBcXG4gICAgICAgICB3aXRoIG9wZW4oXFxcIi9wcm9jL3NlbGYvbnMvbmV0XFxcIikgYXMgbnNmZDAsIFxcXFxcXG4gICAgICAgICAgICAgIG9wZW4oXFxcIi92YXIvcnVuL25ldG5zL1xcXCIgKyBzZWxmLl9uZXRucy5uYW1lKSBhcyBuc2ZkMTpcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlcXG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XFxuQEAgLTUsMTAgKzUsMjUgQEBcXG4gVGVzdCBjaGFubmVsIGFuZCByaW5nIHNpemUgY29uZmlndXJhdGlvbiB2aWEgZXRodG9vbCAoLUwgLyAtRykuXFxuIFxcXCJcXFwiXFxcIlxcbiBcXG4raW1wb3J0IHNvY2tldFxcbitpbXBvcnQgc3RydWN0XFxuK2ltcG9ydCB0aW1lXFxuK1xcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9ydW4sIGtzZnRfZXhpdCwga3NmdF9wclxcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9lcVxcbitmcm9tIGxpYi5weSBpbXBvcnQgS3NmdFNraXBFeCwgS3NmdFhmYWlsRXhcXG4gZnJvbSBsaWIucHkgaW1wb3J0IE5ldERydkVwRW52LCBFdGh0b29sRmFtaWx5LCBHZW5lcmF0ZVRyYWZmaWNcXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXFxuK2Zyb20gbGliLnB5IGltcG9ydCBjbWQsIGRlZmVyLCByYW5kX3BvcnQsIHRjLCBObEVycm9yXFxuK1xcbisjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXFxuK1NPX1RYVElNRSA9IGdldGF0dHIoc29ja2V0LCBcXFwiU09fVFhUSU1FXFxcIiwgNjEpXFxuK1xcbisjIE5vdCBhbHdheXMgZXhwb3J0ZWQgYnkgdGhlIHNvY2tldCBtb2R1bGU7IGFzbS1nZW5lcmljIHZhbHVlICh4ODYvQVJNL01JUFMpLlxcbitTT19TTkRCVUZGT1JDRSA9IGdldGF0dHIoc29ja2V0LCBcXFwiU09fU05EQlVGRk9SQ0VcXFwiLCAzMilcXG4rXFxuKyMgVFggcmluZyBzaXplIHRoZSB0ZXN0IHNocmlua3MgdG8gc28gdGhlIHJpbmcgZmlsbHMgcXVpY2tseS5cXG4rTUlOX1RYX1JJTkcgPSAzMlxcbitNQVhfVFhfUklORyA9IDEwMjRcXG4gXFxuIFxcbiBkZWYgY2hhbm5lbHMoY2ZnKSAtXFx1MDAzZSBOb25lOlxcbkBAIC0xNTEsMTQgKzE2NiwyNDggQEAgZGVmIHJpbmdwYXJhbShjZmcpIC1cXHUwMDNlIE5vbmU6XFxuICAgICAgICAgR2VuZXJhdGVUcmFmZmljKGNmZykud2FpdF9wa3RzX2FuZF9zdG9wKDEwMDAwKVxcbiBcXG4gXFxuK2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOlxcbisgICAgXFxcIlxcXCJcXFwiV3JpdGUgdmFsIHRvIGEgZmlsZS5cXFwiXFxcIlxcXCJcXG4rICAgIHdpdGggb3BlbihwYXRoLCBcXFwid1xcXCIsIGVuY29kaW5nPVxcXCJ1dGYtOFxcXCIpIGFzIGZwOlxcbisgICAgICAgIGZwLndyaXRlKHN0cih2YWwpKVxcbitcXG4rXFxuK2RlZiBfd3JpdGVfc3lzZnMocGF0aCwgdmFsKTpcXG4rICAgIFxcXCJcXFwiXFxcIldyaXRlIHZhbCB0byBhIHN5c2ZzIGZpbGUsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb24gZXhpdC5cXFwiXFxcIlxcXCJcXG4rICAgIHdpdGggb3BlbihwYXRoLCBcXFwiclxcXCIsIGVuY29kaW5nPVxcXCJ1dGYtOFxcXCIpIGFzIGZwOlxcbisgICAgICAgIG9yaWdfdmFsID0gZnAucmVhZCgpLnN0cmlwKClcXG4rICAgIGlmIHN0cih2YWwpID09IG9yaWdfdmFsOlxcbisgICAgICAgIHJldHVyblxcbisgICAgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKVxcbisgICAgZGVmZXIoX3dyaXRlX2ZpbGUsIHBhdGgsIG9yaWdfdmFsKVxcbitcXG4rXFxuK2RlZiBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHF1ZXVlKTpcXG4rICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgcWRpc2MgYmFja2xvZyAoYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gVFggcXVldWUncyBsZWFmLlxcXCJcXFwiXFxcIlxcbisgICAgdGFyZ2V0X3BhcmVudCA9IGZcXFwie21xX2hhbmRsZX17cXVldWUgKyAxOnh9XFxcIlxcbisgICAgZm9yIHEgaW4gdGMoZlxcXCItcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cXFwiLCBqc29uPVRydWUpOlxcbisgICAgICAgIGlmIHEuZ2V0KFxcXCJwYXJlbnRcXFwiLCBcXFwiXFxcIikgPT0gdGFyZ2V0X3BhcmVudDpcXG4rICAgICAgICAgICAgcmV0dXJuIHEuZ2V0KFxcXCJiYWNrbG9nXFxcIikgb3IgMFxcbisgICAgcmV0dXJuIDBcXG4rXFxuK1xcbitkZWYgX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwgZmxvd19saW1pdCk6XFxuKyAgICBcXFwiXFxcIlxcXCJQdXQgYW4gZnEgcWRpc2Mgb24gdGFyZ2V0X3F1ZXVlJ3MgbGVhZiBhbmQgcmV0dXJuIHRoZSBtcSBoYW5kbGUgaW4gdXNlLlxcbitcXG4rICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSdzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsXFxuKyAgICBOSUMgdGhlIHJvb3QgbXEgYWxyZWFkeSBoYXMgYW4gYWRkcmVzc2FibGUgaGFuZGxlLCBzbyB3ZSBsZWF2ZSB0aGUgcm9vdFxcbisgICAgYW5kIGV2ZXJ5IG90aGVyIHF1ZXVlIGFsb25lIGFuZCBvbmx5IHN3YXAgdGhpcyBvbmUgbGVhZiwgcmVzdG9yaW5nIGl0c1xcbisgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cXG4rXFxuKyAgICBAZmxvd19saW1pdCByYWlzZXMgZnEncyBwZXItZmxvdyBwYWNrZXQgbGltaXQgKGRlZmF1bHQgMTAwKSBzbyBhIHNpbmdsZVxcbisgICAgZmxvdyBjYW4gYmFjayB1cCBtb3JlIHBhY2tldHMgdGhhbiB0aGUgVHggcmluZyBob2xkcyBhbmQgdGh1cyBvdmVyZmxvdyBpdC5cXG4rICAgIFxcXCJcXFwiXFxcIlxcbisgICAgcWRpc2NzID0gdGMoZlxcXCJxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cXFwiLCBqc29uPVRydWUpXFxuKyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoXFxcInJvb3RcXFwiKSksIE5vbmUpXFxuK1xcbisgICAgaWYgcm9vdCBhbmQgcm9vdFtcXFwia2luZFxcXCJdID09IFxcXCJtcVxcXCIgYW5kIHJvb3RbXFxcImhhbmRsZVxcXCJdICE9IFxcXCIwOlxcXCI6XFxuKyAgICAgICAgIyBBZGRyZXNzYWJsZSBtcSAocHJldmlvdXNseS1jb25maWd1cmVkKTogdG91Y2ggb25seSB0aGUgdGFyZ2V0IHF1ZXVlJ3NcXG4rICAgICAgICAjIGxlYWYgYW5kIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXFxuKyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFtcXFwiaGFuZGxlXFxcIl1cXG4rICAgICAgICBwYXJlbnQgPSBmXFxcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cXFwiXFxuKyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFxcXCJwYXJlbnRcXFwiKSA9PSBwYXJlbnQpLCBOb25lKVxcbisgICAgICAgIG9yaWdfa2luZCA9IG9yaWdbXFxcImtpbmRcXFwiXSBpZiBvcmlnIGVsc2UgXFxcXFxcbisgICAgICAgICAgICBjbWQoXFxcInN5c2N0bCAtbiBuZXQuY29yZS5kZWZhdWx0X3FkaXNjXFxcIikuc3Rkb3V0LnN0cmlwKClcXG4rICAgICAgICBkZWZlcih0YywgZlxcXCJxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IHtvcmlnX2tpbmR9XFxcIilcXG4rICAgIGVsaWYgcm9vdCBpcyBOb25lIG9yIHJvb3RbXFxcImtpbmRcXFwiXSBpbiAoXFxcIm1xXFxcIiwgXFxcIm5vcXVldWVcXFwiKTpcXG4rICAgICAgICAjIFRoZSBhdXRvLWF0dGFjaGVkIHJvb3QgbXEgaGFzIGhhbmRsZSAwOiBvbiBhbnkgZGV2aWNlIChyZWFsIG9yIHNpbSksXFxuKyAgICAgICAgIyB3aGljaCB0aGUga2VybmVsIHJlamVjdHMgYXMgYSBxZGlzYyBwYXJlbnQuIEEgMDogaGFuZGxlIG1lYW5zIHRoZSBtcVxcbisgICAgICAgICMgaXMgdGhlIHVudG91Y2hlZCBrZXJuZWwgZGVmYXVsdCAtIG5vIGN1c3RvbSBjaGlsZCBxZGlzY3MgY2FuIGhhbmcgb2ZmXFxuKyAgICAgICAgIyBhbiB1bmFkZHJlc3NhYmxlIHBhcmVudCAtIHNvIGluc3RhbGxpbmcgYSByZWFsIGhhbmRsZSBhbmQgcmVzdG9yaW5nXFxuKyAgICAgICAgIyB0aGUgZGVmYXVsdCBtcSBvbiBleGl0IHByZXNlcnZlcyB0aGUgZGV2aWNlJ3MgZWZmZWN0aXZlIHBvbGljeS5cXG4rICAgICAgICBtcV9oYW5kbGUgPSBcXFwiMTpcXFwiXFxuKyAgICAgICAgdGMoZlxcXCJxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBoYW5kbGUge21xX2hhbmRsZX0gbXFcXFwiKVxcbisgICAgICAgIGRlZmVyKHRjLCBmXFxcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSByb290IG1xXFxcIilcXG4rICAgICAgICBwYXJlbnQgPSBmXFxcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cXFwiXFxuKyAgICBlbHNlOlxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoZlxcXCJyb290IHFkaXNjICd7cm9vdFsna2luZCddfScgaXMgbm90IG1xOyBcXFwiXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3lcXFwiKVxcbitcXG4rICAgIHRyeTpcXG4rICAgICAgICB0YyhmXFxcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0gZnEgXFxcIlxcbisgICAgICAgICAgIGZcXFwiZmxvd19saW1pdCB7Zmxvd19saW1pdH0gbGltaXQge2Zsb3dfbGltaXQgKiAyfVxcXCIpXFxuKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcXG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFxcbisgICAgICAgICAgICBmXFxcImZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cXFwiKSBmcm9tIGV4Y1xcbitcXG4rICAgIHFkaXNjX2ogPSB0YyhmXFxcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVxcXCIsIGpzb249VHJ1ZSlcXG4rICAgIGhhc19jbHNhY3QgPSBhbnkocVsna2luZCddID09ICdjbHNhY3QnIGZvciBxIGluIHFkaXNjX2opXFxuKyAgICBpZiBub3QgaGFzX2Nsc2FjdDpcXG4rICAgICAgICB0YyhmXFxcInFkaXNjIGFkZCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFxcXCIpXFxuKyAgICAgICAgZGVmZXIodGMsIGZcXFwicWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XFxcIilcXG4rXFxuKyAgICBwcm90byA9IFxcXCJpcHY2XFxcIiBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSBcXFwiaXBcXFwiXFxuKyAgICB0cnk6XFxuKyAgICAgICAgdGMoZlxcXCJmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByb3RvY29sIHtwcm90b30gXFxcIlxcbisgICAgICAgICAgIGZcXFwicHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9IFxcXCJcXG4rICAgICAgICAgICBmXFxcImFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge3RhcmdldF9xdWV1ZX1cXFwiKVxcbisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwidGMgZmxvd2VyL2FjdF9za2JlZGl0IG5vdCBhdmFpbGFibGVcXFwiKSBmcm9tIGV4Y1xcbisgICAgZGVmZXIodGMsIGZcXFwiZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDFcXFwiKVxcbitcXG4rICAgIHRjKGZcXFwiZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSBcXFwiXFxuKyAgICAgICBmXFxcIm1hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfVxcXCIpXFxuKyAgICBkZWZlcih0YywgZlxcXCJmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxXFxcIilcXG4rXFxuKyAgICByZXR1cm4gbXFfaGFuZGxlXFxuK1xcbitcXG4rZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKTpcXG4rICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIFVEUCBzb2NrZXQgd2l0aCBTT19UWFRJTUUgZW5hYmxlZCwgYm91bmQgdG8gdGhlIHRlc3QgZGV2aWNlLlxcXCJcXFwiXFxcIlxcbisgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2IGlmIGNmZy5hZGRyX2lwdmVyID09IFxcXCI2XFxcIlxcbisgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pXFxuKyAgICB0cnk6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKFxcXCJJaVxcXCIsIDEsIDApKVxcbisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOlxcbisgICAgICAgIHNvY2suY2xvc2UoKVxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcIlNPX1RYVElNRSBub3Qgc3VwcG9ydGVkXFxcIikgZnJvbSBleGNcXG4rICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSxcXG4rICAgICAgICAgICAgICAgICAgICBjZmcuaWZuYW1lLmVuY29kZSgpKVxcbisgICAgIyBEZWZlcnJlZCBjb21wbGV0aW9ucyBrZWVwIGV2ZXJ5IGluLWZsaWdodCBza2IgY2hhcmdlZCB0byB0aGUgc29ja2V0LCBzb1xcbisgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXNcXG4rICAgICMgbmV0LmNvcmUud21lbV9tYXggKHRoZSB0ZXN0IHJ1bnMgYXMgcm9vdCkuXFxuKyAgICB0cnk6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKVxcbisgICAgZXhjZXB0IE9TRXJyb3I6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fU05EQlVGLCBzbmRidWYpXFxuKyAgICByZXR1cm4gc29ja1xcbitcXG4rXFxuK2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOlxcbisgICAgXFxcIlxcXCJcXFwiU2VuZCBjb3VudCBVRFAgcGFja2V0cyBzY2hlZHVsZWQgZGVsYXlfbnMgYWhlYWQgdXNpbmcgU09fVFhUSU1FLlxcXCJcXFwiXFxcIlxcbisgICAgcGF5bG9hZCA9IGInXFxcXHgwMCcgKiBwa3Rfc2l6ZVxcbisgICAgdHh0aW1lX25zID0gdGltZS5jbG9ja19nZXR0aW1lX25zKHRpbWUuQ0xPQ0tfTU9OT1RPTklDKSArIGRlbGF5X25zXFxuK1xcbisgICAgYW5jZGF0YSA9IFsoc29ja2V0LlNPTF9TT0NLRVQsIFNPX1RYVElNRSwgc3RydWN0LnBhY2soXFxcIlFcXFwiLCB0eHRpbWVfbnMpKV1cXG4rICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcXG4rICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCwgMCwgMClcXG4rICAgIGVsc2U6XFxuKyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXFxuKyAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6XFxuKyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdClcXG4rXFxuK1xcbitkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6XFxuKyAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxcbitcXG4rICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCxcXG4rICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXFxuKyAgICAoZS5nLiBibnh0IG5lZWRzIGEgbGFyZ2UgcmluZyBmb3Igc29mdHdhcmUgVURQIHNlZ21lbnRhdGlvbiksIHNvIHJhaXNlXFxuKyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LlxcbisgICAgXFxcIlxcXCJcXFwiXFxuKyAgICBzaXplID0gTUlOX1RYX1JJTkdcXG4rICAgIHdoaWxlIHNpemUgXFx1MDAzYz0gTUFYX1RYX1JJTkc6XFxuKyAgICAgICAgdHJ5OlxcbisgICAgICAgICAgICBjZmcuZXRoLnJpbmdzX3NldChlaGRyIHwgeyd0eCc6IHNpemV9KVxcbisgICAgICAgICAgICByZXR1cm4gc2l6ZVxcbisgICAgICAgIGV4Y2VwdCBObEVycm9yOlxcbisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDJcXG4rICAgICAgICAgICAgY29udGludWVcXG4rICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcImRyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcXFwiKVxcbitcXG4rXFxuK2RlZiByZWNvbmZpZ190eF9zdGFsbChjZmcpIC1cXHUwMDNlIE5vbmU6XFxuKyAgICBcXFwiXFxcIlxcXCJUZXN0IHRoYXQgcWRpc2MgYmFja2xvZyBkcmFpbnMgYWZ0ZXIgcmluZyByZWNvbmZpZ3VyYXRpb24uXFxcIlxcXCJcXFwiXFxuKyAgICB0YXJnZXRfcXVldWUgPSAxXFxuKyAgICBvdGhlcl9xdWV1ZSA9IDBcXG4rXFxuKyAgICBlaGRyID0geydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fX1cXG4rICAgIGNoYW5zID0gY2ZnLmV0aC5jaGFubmVsc19nZXQoZWhkcilcXG4rXFxuKyAgICBpZiBcXFwiY29tYmluZWQtbWF4XFxcIiBub3QgaW4gY2hhbnM6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tYmluZWQgY2hhbm5lbHNcXFwiKVxcbisgICAgaWYgY2hhbnMuZ2V0KFxcXCJjb21iaW5lZC1tYXhcXFwiLCAwKSBcXHUwMDNjIDI6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMisgY29tYmluZWQgY2hhbm5lbHNcXFwiKVxcbisgICAgaWYgY2hhbnNbXFxcImNvbWJpbmVkLWNvdW50XFxcIl0gXFx1MDAzYyAyOlxcbisgICAgICAgIGRlZmVyKGNmZy5ldGguY2hhbm5lbHNfc2V0LFxcbisgICAgICAgICAgICAgIGVoZHIgfCB7XFxcImNvbWJpbmVkLWNvdW50XFxcIjogY2hhbnNbXFxcImNvbWJpbmVkLWNvdW50XFxcIl19KVxcbisgICAgICAgIGNmZy5ldGguY2hhbm5lbHNfc2V0KGVoZHIgfCB7XFxcImNvbWJpbmVkLWNvdW50XFxcIjogMn0pXFxuK1xcbisgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxcbisgICAgaWYgJ3J4JyBub3QgaW4gcmluZ3Mgb3IgJ3R4JyBub3QgaW4gcmluZ3M6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IGV4cG9zZSByeC90eCByaW5nIHBhcmFtc1xcXCIpXFxuKyAgICB0eF9jdXIgPSByaW5nc1sndHgnXVxcbisgICAgaWYgdHhfY3VyIFxcdTAwM2M9IE1JTl9UWF9SSU5HOlxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcInR4IHJpbmcgc2l6ZSBhbHJlYWR5IGF0IG1pbmltdW1cXFwiKVxcbisgICAgZGVmZXIoY2ZnLmV0aC5yaW5nc19zZXQsIGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcXG4rXFxuKyAgICAjIFVzZSB0aGUgc21hbGxlc3QgVHggcmluZyB0aGUgZHJpdmVyIGFjY2VwdHMgKDMyLCBncm93aW5nIHRvIDEwMjQpLlxcbisgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXFxuK1xcbisgICAgIyBTbG93IGNvbXBsZXRpb25zIHNvIHRoZSByaW5nIHN0YXlzIGZ1bGwgYWZ0ZXIgRlEgcmVsZWFzZXMgcGFja2V0c1xcbisgICAgbmFwaV9kZWZlciA9IGZcXFwiL3N5cy9jbGFzcy9uZXQve2NmZy5pZm5hbWV9L25hcGlfZGVmZXJfaGFyZF9pcnFzXFxcIlxcbisgICAgZ3JvX3RpbWVvdXQgPSBmXFxcIi9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dFxcXCJcXG4rICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAxMDApXFxuKyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDEwMDAwMDAwMDApXFxuK1xcbisgICAgcG9ydCA9IHJhbmRfcG9ydCgpXFxuKyAgICAjIEEgc2luZ2xlIGZsb3cgbXVzdCBvdmVyZmxvdyB0aGUgcmluZywgc28gc2VuZCB0d2ljZSB0aGUgcmluZyBkZXB0aCBhbmRcXG4rICAgICMgbGV0IGZxIGhvbGQgdGhhdCBtYW55IHBhY2tldHMgZm9yIHRoZSBmbG93LlxcbisgICAgcGt0X2NvdW50ID0gdHhfcmluZyAqIDJcXG4rICAgIG1xX2hhbmRsZSA9IF9zZXR1cF9mcV9xZGlzYyhjZmcsIHBvcnQsIHRhcmdldF9xdWV1ZSwgb3RoZXJfcXVldWUsXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nICogMilcXG4rXFxuKyAgICAjIFNpemUgZWFjaCBwYWNrZXQgdG8gb25lIE1UVSAobGVzcyBMMy9MNCBoZWFkZXJzIHRvIGF2b2lkIGZyYWdtZW50YXRpb24pLlxcbisgICAgcGt0X3NpemUgPSBjZmcuZGV2WydtdHUnXSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOClcXG4rXFxuKyAgICAjIEVhY2ggcXVldWVkIHNrYiBjaGFyZ2VzIHRoZSBzb2NrZXQgaXRzIHRydWVzaXplICh+MnggdGhlIHBheWxvYWQpLCBzb1xcbisgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LlxcbisgICAgc29jayA9IF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgcGt0X2NvdW50ICogcGt0X3NpemUgKiAyKVxcbisgICAgZGVmZXIoc29jay5jbG9zZSlcXG4rXFxuKyAgICBmb3IgZGVsYXlfbXMgaW4gWzEwMCwgMjAwLCA1MDBdOlxcbisgICAgICAgIF9zZW5kX3NvdHh0aW1lX2J1cnN0KGNmZywgc29jaywgcG9ydCwgcGt0X2NvdW50LFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSlcXG4rICAgICAgICBrc2Z0X3ByKGZcXFwiU2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoK3tkZWxheV9tc31tcylcXFwiKVxcbisgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICsgMC4zKVxcbitcXG4rICAgICAgICBiYWNrbG9nID0gX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCB0YXJnZXRfcXVldWUpXFxuKyAgICAgICAgaWYgYmFja2xvZzpcXG4rICAgICAgICAgICAgYnJlYWtcXG4rICAgIGVsc2U6XFxuKyAgICAgICAgIyBBIGRldmljZSB0aGF0IGNvbXBsZXRlcyBUeCBzeW5jaHJvbm91c2x5IChlLmcuIGEgc29mdHdhcmUvdmlydHVhbFxcbisgICAgICAgICMgZHJpdmVyIGxpa2UgbmV0ZGV2c2ltKSBuZXZlciBrZWVwcyB0aGUgcmluZyBmdWxsIGxvbmcgZW5vdWdoIGZvciBhXFxuKyAgICAgICAgIyBiYWNrbG9nIHRvIGZvcm0sIHNvIHRoZSB3YWtlLXZzLXN0YXJ0IGJlaGF2aW9yIGNhbid0IGJlIGV4ZXJjaXNlZC5cXG4rICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS5cXG4rICAgICAgICByYWlzZSBLc2Z0WGZhaWxFeChcXFwiY291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2dcXFwiKVxcbitcXG4rICAgIGtzZnRfcHIoZlxcXCJCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzXFxcIilcXG4rXFxuKyAgICAjIFRyaWdnZXIgcmluZyByZWNvbmZpZyDigJQgZHJpdmVyIHNob3VsZCBjYWxsIHdha2UsIG5vdCBqdXN0IHN0YXJ0LlxcbisgICAgIyBHcm93IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUgc28gdGhlIGRyaXZlciBhY3R1YWxseSBzd2l0Y2hlcyBjaGFubmVsc1xcbisgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuXFxuKyAgICBjZmcuZXRoLnJpbmdzX3NldChlaGRyIHwgeyd0eCc6IHR4X2N1cn0pXFxuK1xcbisgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxcbisgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDApXFxuKyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApXFxuK1xcbisgICAgIyBQb2xsIGZvciBiYWNrbG9nIHRvIGRyYWluXFxuKyAgICBmb3IgXyBpbiByYW5nZSgxMDApOlxcbisgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcXG4rICAgICAgICBpZiBub3QgYmFja2xvZzpcXG4rICAgICAgICAgICAgYnJlYWtcXG4rICAgICAgICB0aW1lLnNsZWVwKDAuMSlcXG4rXFxuKyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csXFxuKyAgICAgICAgICAgIGNvbW1lbnQ9ZlxcXCJxZGlzYyBiYWNrbG9nIHN0dWNrIG9uIHF1ZXVlIHt0YXJnZXRfcXVldWV9IFxcXCJcXG4rICAgICAgICAgICAgICAgICAgICBmXFxcImFmdGVyIHJpbmcgcmVjb25maWdcXFwiKVxcbitcXG4rXFxuIGRlZiBtYWluKCkgLVxcdTAwM2UgTm9uZTpcXG4gICAgIFxcXCJcXFwiXFxcIiBLc2Z0IGJvaWxlciBwbGF0ZSBtYWluIFxcXCJcXFwiXFxcIlxcbiBcXG4tICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18pIGFzIGNmZzpcXG4rICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzpcXG4gICAgICAgICBjZmcuZXRoID0gRXRodG9vbEZhbWlseSgpXFxuIFxcbiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscyxcXG4tICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtXSxcXG4rICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtLFxcbisgICAgICAgICAgICAgICAgICByZWNvbmZpZ190eF9zdGFsbF0sXFxuICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKVxcbiAgICAga3NmdF9leGl0KClcXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTAxVDExOjMwOjAwLjIzMDYxMDczNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjgzMDcyMDY2MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0IHNjcmlwdHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUga2VybmVsLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmUgY29kZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDE3ODU0YjFkMTc3MDM0MmE0OTI2ZTY4NGU0NGY4ZGE5NGFmOTA3YjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxIDExOjI5OjU4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXG5pbmRleCAyMDcwZTg5MGUwNjRlLi5mMzkzM2NmM2U2YmU2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbkBAIC00LDggKzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9blxuIENPTkZJR19JTkVUX1BTUD15XG4gQ09ORklHX0lQVjY9eVxuIENPTkZJR19NQUNTRUM9bVxuK0NPTkZJR19ORVRfQUNUX1NLQkVESVQ9bVxuIENPTkZJR19ORVRfQ0xTX0FDVD15XG4gQ09ORklHX05FVF9DTFNfQlBGPXlcbitDT05GSUdfTkVUX0NMU19GTE9XRVI9bVxuK0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cbiBDT05GSUdfTkVUQ09OU09MRT1tXG4gQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQz15XG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weVxuaW5kZXggZTRhY2YzZDgzMzNmZC4uYjFjNmY2Y2VmN2RkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbkBAIC0xMTQsMTAgKzExNCwxMSBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKTpcbiAgICAgbnNpbV92NF9wZnggPSBcIjE5Mi4wLjIuXCJcbiAgICAgbnNpbV92Nl9wZnggPSBcIjIwMDE6ZGI4OjpcIlxuIFxuLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3JjX3BhdGgsIG5zaW1fdGVzdD1Ob25lKTpcbisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XG4gICAgICAgICBzdXBlcigpLl9faW5pdF9fKHNyY19wYXRoKVxuIFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXG4rICAgICAgICBzZWxmLl9xdWV1ZV9jb3VudCA9IHF1ZXVlX2NvdW50XG4gXG4gICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveVxuICAgICAgICAgc2VsZi5yZW1vdGUgPSBOb25lXG5AQCAtMTczLDkgKzE3NCwxMyBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKTpcbiAgICAgICAgIHNlbGYuX3JlcXVpcmVkX2NtZCA9IHt9XG4gXG4gICAgIGRlZiBjcmVhdGVfbG9jYWwoc2VsZik6XG4rICAgICAgICBuc2ltX2t3YXJncyA9IHt9XG4rICAgICAgICBpZiBzZWxmLl9xdWV1ZV9jb3VudDpcbisgICAgICAgICAgICBuc2ltX2t3YXJnc1tcInF1ZXVlX2NvdW50XCJdID0gc2VsZi5fcXVldWVfY291bnRcbitcbiAgICAgICAgIHNlbGYuX25ldG5zID0gTmV0TlMoKVxuLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKVxuLSAgICAgICAgc2VsZi5fbnNfcGVlciA9IE5ldGRldlNpbURldihucz1zZWxmLl9uZXRucylcbisgICAgICAgIHNlbGYuX25zID0gTmV0ZGV2U2ltRGV2KCoqbnNpbV9rd2FyZ3MpXG4rICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zLCAqKm5zaW1fa3dhcmdzKVxuIFxuICAgICAgICAgd2l0aCBvcGVuKFwiL3Byb2Mvc2VsZi9ucy9uZXRcIikgYXMgbnNmZDAsIFxcXG4gICAgICAgICAgICAgIG9wZW4oXCIvdmFyL3J1bi9uZXRucy9cIiArIHNlbGYuX25ldG5zLm5hbWUpIGFzIG5zZmQxOlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuQEAgLTUsMTAgKzUsMjUgQEBcbiBUZXN0IGNoYW5uZWwgYW5kIHJpbmcgc2l6ZSBjb25maWd1cmF0aW9uIHZpYSBldGh0b29sICgtTCAvIC1HKS5cbiBcIlwiXCJcbiBcbitpbXBvcnQgc29ja2V0XG4raW1wb3J0IHN0cnVjdFxuK2ltcG9ydCB0aW1lXG4rXG4gZnJvbSBsaWIucHkgaW1wb3J0IGtzZnRfcnVuLCBrc2Z0X2V4aXQsIGtzZnRfcHJcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9lcVxuK2Zyb20gbGliLnB5IGltcG9ydCBLc2Z0U2tpcEV4LCBLc2Z0WGZhaWxFeFxuIGZyb20gbGliLnB5IGltcG9ydCBOZXREcnZFcEVudiwgRXRodG9vbEZhbWlseSwgR2VuZXJhdGVUcmFmZmljXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXG4rZnJvbSBsaWIucHkgaW1wb3J0IGNtZCwgZGVmZXIsIHJhbmRfcG9ydCwgdGMsIE5sRXJyb3JcbitcbisjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXG4rU09fVFhUSU1FID0gZ2V0YXR0cihzb2NrZXQsIFwiU09fVFhUSU1FXCIsIDYxKVxuK1xuKyMgTm90IGFsd2F5cyBleHBvcnRlZCBieSB0aGUgc29ja2V0IG1vZHVsZTsgYXNtLWdlbmVyaWMgdmFsdWUgKHg4Ni9BUk0vTUlQUykuXG4rU09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgXCJTT19TTkRCVUZGT1JDRVwiLCAzMilcbitcbisjIFRYIHJpbmcgc2l6ZSB0aGUgdGVzdCBzaHJpbmtzIHRvIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHkuXG4rTUlOX1RYX1JJTkcgPSAzMlxuK01BWF9UWF9SSU5HID0gMTAyNFxuIFxuIFxuIGRlZiBjaGFubmVscyhjZmcpIC1cdTAwM2UgTm9uZTpcbkBAIC0xNTEsMTQgKzE2NiwyNDggQEAgZGVmIHJpbmdwYXJhbShjZmcpIC1cdTAwM2UgTm9uZTpcbiAgICAgICAgIEdlbmVyYXRlVHJhZmZpYyhjZmcpLndhaXRfcGt0c19hbmRfc3RvcCgxMDAwMClcbiBcbiBcbitkZWYgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKTpcbisgICAgXCJcIlwiV3JpdGUgdmFsIHRvIGEgZmlsZS5cIlwiXCJcbisgICAgd2l0aCBvcGVuKHBhdGgsIFwid1wiLCBlbmNvZGluZz1cInV0Zi04XCIpIGFzIGZwOlxuKyAgICAgICAgZnAud3JpdGUoc3RyKHZhbCkpXG4rXG4rXG4rZGVmIF93cml0ZV9zeXNmcyhwYXRoLCB2YWwpOlxuKyAgICBcIlwiXCJXcml0ZSB2YWwgdG8gYSBzeXNmcyBmaWxlLCByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIG9uIGV4aXQuXCJcIlwiXG4rICAgIHdpdGggb3BlbihwYXRoLCBcInJcIiwgZW5jb2Rpbmc9XCJ1dGYtOFwiKSBhcyBmcDpcbisgICAgICAgIG9yaWdfdmFsID0gZnAucmVhZCgpLnN0cmlwKClcbisgICAgaWYgc3RyKHZhbCkgPT0gb3JpZ192YWw6XG4rICAgICAgICByZXR1cm5cbisgICAgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKVxuKyAgICBkZWZlcihfd3JpdGVfZmlsZSwgcGF0aCwgb3JpZ192YWwpXG4rXG4rXG4rZGVmIF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgcXVldWUpOlxuKyAgICBcIlwiXCJSZXR1cm4gdGhlIHFkaXNjIGJhY2tsb2cgKGJ5dGVzKSBmb3IgdGhlIGdpdmVuIFRYIHF1ZXVlJ3MgbGVhZi5cIlwiXCJcbisgICAgdGFyZ2V0X3BhcmVudCA9IGZcInttcV9oYW5kbGV9e3F1ZXVlICsgMTp4fVwiXG4rICAgIGZvciBxIGluIHRjKGZcIi1zIHFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpOlxuKyAgICAgICAgaWYgcS5nZXQoXCJwYXJlbnRcIiwgXCJcIikgPT0gdGFyZ2V0X3BhcmVudDpcbisgICAgICAgICAgICByZXR1cm4gcS5nZXQoXCJiYWNrbG9nXCIpIG9yIDBcbisgICAgcmV0dXJuIDBcbitcbitcbitkZWYgX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwgZmxvd19saW1pdCk6XG4rICAgIFwiXCJcIlB1dCBhbiBmcSBxZGlzYyBvbiB0YXJnZXRfcXVldWUncyBsZWFmIGFuZCByZXR1cm4gdGhlIG1xIGhhbmRsZSBpbiB1c2UuXG4rXG4rICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSdzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsXG4rICAgIE5JQyB0aGUgcm9vdCBtcSBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzYWJsZSBoYW5kbGUsIHNvIHdlIGxlYXZlIHRoZSByb290XG4rICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHNcbisgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cbitcbisgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJ3MgcGVyLWZsb3cgcGFja2V0IGxpbWl0IChkZWZhdWx0IDEwMCkgc28gYSBzaW5nbGVcbisgICAgZmxvdyBjYW4gYmFjayB1cCBtb3JlIHBhY2tldHMgdGhhbiB0aGUgVHggcmluZyBob2xkcyBhbmQgdGh1cyBvdmVyZmxvdyBpdC5cbisgICAgXCJcIlwiXG4rICAgIHFkaXNjcyA9IHRjKGZcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpXG4rICAgIHJvb3QgPSBuZXh0KChxIGZvciBxIGluIHFkaXNjcyBpZiBxLmdldChcInJvb3RcIikpLCBOb25lKVxuK1xuKyAgICBpZiByb290IGFuZCByb290W1wia2luZFwiXSA9PSBcIm1xXCIgYW5kIHJvb3RbXCJoYW5kbGVcIl0gIT0gXCIwOlwiOlxuKyAgICAgICAgIyBBZGRyZXNzYWJsZSBtcSAocHJldmlvdXNseS1jb25maWd1cmVkKTogdG91Y2ggb25seSB0aGUgdGFyZ2V0IHF1ZXVlJ3NcbisgICAgICAgICMgbGVhZiBhbmQgcmVzdG9yZSBpdHMgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cbisgICAgICAgIG1xX2hhbmRsZSA9IHJvb3RbXCJoYW5kbGVcIl1cbisgICAgICAgIHBhcmVudCA9IGZcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cIlxuKyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFwicGFyZW50XCIpID09IHBhcmVudCksIE5vbmUpXG4rICAgICAgICBvcmlnX2tpbmQgPSBvcmlnW1wia2luZFwiXSBpZiBvcmlnIGVsc2UgXFxcbisgICAgICAgICAgICBjbWQoXCJzeXNjdGwgLW4gbmV0LmNvcmUuZGVmYXVsdF9xZGlzY1wiKS5zdGRvdXQuc3RyaXAoKVxuKyAgICAgICAgZGVmZXIodGMsIGZcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0ge29yaWdfa2luZH1cIilcbisgICAgZWxpZiByb290IGlzIE5vbmUgb3Igcm9vdFtcImtpbmRcIl0gaW4gKFwibXFcIiwgXCJub3F1ZXVlXCIpOlxuKyAgICAgICAgIyBUaGUgYXV0by1hdHRhY2hlZCByb290IG1xIGhhcyBoYW5kbGUgMDogb24gYW55IGRldmljZSAocmVhbCBvciBzaW0pLFxuKyAgICAgICAgIyB3aGljaCB0aGUga2VybmVsIHJlamVjdHMgYXMgYSBxZGlzYyBwYXJlbnQuIEEgMDogaGFuZGxlIG1lYW5zIHRoZSBtcVxuKyAgICAgICAgIyBpcyB0aGUgdW50b3VjaGVkIGtlcm5lbCBkZWZhdWx0IC0gbm8gY3VzdG9tIGNoaWxkIHFkaXNjcyBjYW4gaGFuZyBvZmZcbisgICAgICAgICMgYW4gdW5hZGRyZXNzYWJsZSBwYXJlbnQgLSBzbyBpbnN0YWxsaW5nIGEgcmVhbCBoYW5kbGUgYW5kIHJlc3RvcmluZ1xuKyAgICAgICAgIyB0aGUgZGVmYXVsdCBtcSBvbiBleGl0IHByZXNlcnZlcyB0aGUgZGV2aWNlJ3MgZWZmZWN0aXZlIHBvbGljeS5cbisgICAgICAgIG1xX2hhbmRsZSA9IFwiMTpcIlxuKyAgICAgICAgdGMoZlwicWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgaGFuZGxlIHttcV9oYW5kbGV9IG1xXCIpXG4rICAgICAgICBkZWZlcih0YywgZlwicWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgbXFcIilcbisgICAgICAgIHBhcmVudCA9IGZcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cIlxuKyAgICBlbHNlOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChmXCJyb290IHFkaXNjICd7cm9vdFsna2luZCddfScgaXMgbm90IG1xOyBcIlxuKyAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZnVzaW5nIHRvIGRpc3R1cmIgZXhpc3RpbmcgcWRpc2MgcG9saWN5XCIpXG4rXG4rICAgIHRyeTpcbisgICAgICAgIHRjKGZcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0gZnEgXCJcbisgICAgICAgICAgIGZcImZsb3dfbGltaXQge2Zsb3dfbGltaXR9IGxpbWl0IHtmbG93X2xpbWl0ICogMn1cIilcbisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFxuKyAgICAgICAgICAgIGZcImZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cIikgZnJvbSBleGNcbitcbisgICAgcWRpc2NfaiA9IHRjKGZcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpXG4rICAgIGhhc19jbHNhY3QgPSBhbnkocVsna2luZCddID09ICdjbHNhY3QnIGZvciBxIGluIHFkaXNjX2opXG4rICAgIGlmIG5vdCBoYXNfY2xzYWN0OlxuKyAgICAgICAgdGMoZlwicWRpc2MgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XCIpXG4rICAgICAgICBkZWZlcih0YywgZlwicWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XCIpXG4rXG4rICAgIHByb3RvID0gXCJpcHY2XCIgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgXCJpcFwiXG4rICAgIHRyeTpcbisgICAgICAgIHRjKGZcImZpbHRlciBhZGQgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJvdG9jb2wge3Byb3RvfSBcIlxuKyAgICAgICAgICAgZlwicHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9IFwiXG4rICAgICAgICAgICBmXCJhY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHt0YXJnZXRfcXVldWV9XCIpXG4rICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcInRjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlXCIpIGZyb20gZXhjXG4rICAgIGRlZmVyKHRjLCBmXCJmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMVwiKVxuK1xuKyAgICB0YyhmXCJmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxIFwiXG4rICAgICAgIGZcIm1hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfVwiKVxuKyAgICBkZWZlcih0YywgZlwiZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMVwiKVxuK1xuKyAgICByZXR1cm4gbXFfaGFuZGxlXG4rXG4rXG4rZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKTpcbisgICAgXCJcIlwiQ3JlYXRlIGEgVURQIHNvY2tldCB3aXRoIFNPX1RYVElNRSBlbmFibGVkLCBib3VuZCB0byB0aGUgdGVzdCBkZXZpY2UuXCJcIlwiXG4rICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSBcIjZcIlxuKyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSlcbisgICAgdHJ5OlxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKFwiSWlcIiwgMSwgMCkpXG4rICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzpcbisgICAgICAgIHNvY2suY2xvc2UoKVxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcIlNPX1RYVElNRSBub3Qgc3VwcG9ydGVkXCIpIGZyb20gZXhjXG4rICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSxcbisgICAgICAgICAgICAgICAgICAgIGNmZy5pZm5hbWUuZW5jb2RlKCkpXG4rICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc29cbisgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXNcbisgICAgIyBuZXQuY29yZS53bWVtX21heCAodGhlIHRlc3QgcnVucyBhcyByb290KS5cbisgICAgdHJ5OlxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKVxuKyAgICBleGNlcHQgT1NFcnJvcjpcbisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKVxuKyAgICByZXR1cm4gc29ja1xuK1xuK1xuK2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOlxuKyAgICBcIlwiXCJTZW5kIGNvdW50IFVEUCBwYWNrZXRzIHNjaGVkdWxlZCBkZWxheV9ucyBhaGVhZCB1c2luZyBTT19UWFRJTUUuXCJcIlwiXG4rICAgIHBheWxvYWQgPSBiJ1xceDAwJyAqIHBrdF9zaXplXG4rICAgIHR4dGltZV9ucyA9IHRpbWUuY2xvY2tfZ2V0dGltZV9ucyh0aW1lLkNMT0NLX01PTk9UT05JQykgKyBkZWxheV9uc1xuK1xuKyAgICBhbmNkYXRhID0gWyhzb2NrZXQuU09MX1NPQ0tFVCwgU09fVFhUSU1FLCBzdHJ1Y3QucGFjayhcIlFcIiwgdHh0aW1lX25zKSldXG4rICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcbisgICAgICAgIGRlc3QgPSAoY2ZnLnJlbW90ZV9hZGRyLCBwb3J0LCAwLCAwKVxuKyAgICBlbHNlOlxuKyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXG4rICAgIGZvciBfIGluIHJhbmdlKGNvdW50KTpcbisgICAgICAgIHNvY2suc2VuZG1zZyhbcGF5bG9hZF0sIGFuY2RhdGEsIDAsIGRlc3QpXG4rXG4rXG4rZGVmIF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpOlxuKyAgICBcIlwiXCJTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxuK1xuKyAgICBTdGFydCBhdCAzMiBzbyB0aGUgcmluZyBmaWxscyBxdWlja2x5LCB0aGVuIGdyb3cgZXhwb25lbnRpYWxseSAoNjQsXG4rICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXG4rICAgIChlLmcuIGJueHQgbmVlZHMgYSBsYXJnZSByaW5nIGZvciBzb2Z0d2FyZSBVRFAgc2VnbWVudGF0aW9uKSwgc28gcmFpc2VcbisgICAgdGhlIGxvd2VyIGJvdW5kIHVudGlsIHRoZSBkcml2ZXIgYWNjZXB0cyBpdCwgZ2l2aW5nIHVwIHBhc3QgMTAyNC5cbisgICAgXCJcIlwiXG4rICAgIHNpemUgPSBNSU5fVFhfUklOR1xuKyAgICB3aGlsZSBzaXplIFx1MDAzYz0gTUFYX1RYX1JJTkc6XG4rICAgICAgICB0cnk6XG4rICAgICAgICAgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsndHgnOiBzaXplfSlcbisgICAgICAgICAgICByZXR1cm4gc2l6ZVxuKyAgICAgICAgZXhjZXB0IE5sRXJyb3I6XG4rICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyXG4rICAgICAgICAgICAgY29udGludWVcbisgICAgcmFpc2UgS3NmdFNraXBFeChcImRyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcIilcbitcbitcbitkZWYgcmVjb25maWdfdHhfc3RhbGwoY2ZnKSAtXHUwMDNlIE5vbmU6XG4rICAgIFwiXCJcIlRlc3QgdGhhdCBxZGlzYyBiYWNrbG9nIGRyYWlucyBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi5cIlwiXCJcbisgICAgdGFyZ2V0X3F1ZXVlID0gMVxuKyAgICBvdGhlcl9xdWV1ZSA9IDBcbitcbisgICAgZWhkciA9IHsnaGVhZGVyJzogeydkZXYtaW5kZXgnOiBjZmcuaWZpbmRleH19XG4rICAgIGNoYW5zID0gY2ZnLmV0aC5jaGFubmVsc19nZXQoZWhkcilcbitcbisgICAgaWYgXCJjb21iaW5lZC1tYXhcIiBub3QgaW4gY2hhbnM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tYmluZWQgY2hhbm5lbHNcIilcbisgICAgaWYgY2hhbnMuZ2V0KFwiY29tYmluZWQtbWF4XCIsIDApIFx1MDAzYyAyOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcImRldmljZSBkb2VzIG5vdCBzdXBwb3J0IDIrIGNvbWJpbmVkIGNoYW5uZWxzXCIpXG4rICAgIGlmIGNoYW5zW1wiY29tYmluZWQtY291bnRcIl0gXHUwMDNjIDI6XG4rICAgICAgICBkZWZlcihjZmcuZXRoLmNoYW5uZWxzX3NldCxcbisgICAgICAgICAgICAgIGVoZHIgfCB7XCJjb21iaW5lZC1jb3VudFwiOiBjaGFuc1tcImNvbWJpbmVkLWNvdW50XCJdfSlcbisgICAgICAgIGNmZy5ldGguY2hhbm5lbHNfc2V0KGVoZHIgfCB7XCJjb21iaW5lZC1jb3VudFwiOiAyfSlcbitcbisgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxuKyAgICBpZiAncngnIG5vdCBpbiByaW5ncyBvciAndHgnIG5vdCBpbiByaW5nczpcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCJkZXZpY2UgZG9lcyBub3QgZXhwb3NlIHJ4L3R4IHJpbmcgcGFyYW1zXCIpXG4rICAgIHR4X2N1ciA9IHJpbmdzWyd0eCddXG4rICAgIGlmIHR4X2N1ciBcdTAwM2M9IE1JTl9UWF9SSU5HOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcInR4IHJpbmcgc2l6ZSBhbHJlYWR5IGF0IG1pbmltdW1cIilcbisgICAgZGVmZXIoY2ZnLmV0aC5yaW5nc19zZXQsIGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcbitcbisgICAgIyBVc2UgdGhlIHNtYWxsZXN0IFR4IHJpbmcgdGhlIGRyaXZlciBhY2NlcHRzICgzMiwgZ3Jvd2luZyB0byAxMDI0KS5cbisgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXG4rXG4rICAgICMgU2xvdyBjb21wbGV0aW9ucyBzbyB0aGUgcmluZyBzdGF5cyBmdWxsIGFmdGVyIEZRIHJlbGVhc2VzIHBhY2tldHNcbisgICAgbmFwaV9kZWZlciA9IGZcIi9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9uYXBpX2RlZmVyX2hhcmRfaXJxc1wiXG4rICAgIGdyb190aW1lb3V0ID0gZlwiL3N5cy9jbGFzcy9uZXQve2NmZy5pZm5hbWV9L2dyb19mbHVzaF90aW1lb3V0XCJcbisgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDEwMClcbisgICAgX3dyaXRlX3N5c2ZzKGdyb190aW1lb3V0LCAxMDAwMDAwMDAwKVxuK1xuKyAgICBwb3J0ID0gcmFuZF9wb3J0KClcbisgICAgIyBBIHNpbmdsZSBmbG93IG11c3Qgb3ZlcmZsb3cgdGhlIHJpbmcsIHNvIHNlbmQgdHdpY2UgdGhlIHJpbmcgZGVwdGggYW5kXG4rICAgICMgbGV0IGZxIGhvbGQgdGhhdCBtYW55IHBhY2tldHMgZm9yIHRoZSBmbG93LlxuKyAgICBwa3RfY291bnQgPSB0eF9yaW5nICogMlxuKyAgICBtcV9oYW5kbGUgPSBfc2V0dXBfZnFfcWRpc2MoY2ZnLCBwb3J0LCB0YXJnZXRfcXVldWUsIG90aGVyX3F1ZXVlLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nICogMilcbitcbisgICAgIyBTaXplIGVhY2ggcGFja2V0IHRvIG9uZSBNVFUgKGxlc3MgTDMvTDQgaGVhZGVycyB0byBhdm9pZCBmcmFnbWVudGF0aW9uKS5cbisgICAgcGt0X3NpemUgPSBjZmcuZGV2WydtdHUnXSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOClcbitcbisgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc29cbisgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LlxuKyAgICBzb2NrID0gX2NyZWF0ZV9zb3R4dGltZV9zb2NrZXQoY2ZnLCBwa3RfY291bnQgKiBwa3Rfc2l6ZSAqIDIpXG4rICAgIGRlZmVyKHNvY2suY2xvc2UpXG4rXG4rICAgIGZvciBkZWxheV9tcyBpbiBbMTAwLCAyMDAsIDUwMF06XG4rICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSlcbisgICAgICAgIGtzZnRfcHIoZlwiU2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoK3tkZWxheV9tc31tcylcIilcbisgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICsgMC4zKVxuK1xuKyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKVxuKyAgICAgICAgaWYgYmFja2xvZzpcbisgICAgICAgICAgICBicmVha1xuKyAgICBlbHNlOlxuKyAgICAgICAgIyBBIGRldmljZSB0aGF0IGNvbXBsZXRlcyBUeCBzeW5jaHJvbm91c2x5IChlLmcuIGEgc29mdHdhcmUvdmlydHVhbFxuKyAgICAgICAgIyBkcml2ZXIgbGlrZSBuZXRkZXZzaW0pIG5ldmVyIGtlZXBzIHRoZSByaW5nIGZ1bGwgbG9uZyBlbm91Z2ggZm9yIGFcbisgICAgICAgICMgYmFja2xvZyB0byBmb3JtLCBzbyB0aGUgd2FrZS12cy1zdGFydCBiZWhhdmlvciBjYW4ndCBiZSBleGVyY2lzZWQuXG4rICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS5cbisgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KFwiY291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2dcIilcbitcbisgICAga3NmdF9wcihmXCJCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzXCIpXG4rXG4rICAgICMgVHJpZ2dlciByaW5nIHJlY29uZmlnIOKAlCBkcml2ZXIgc2hvdWxkIGNhbGwgd2FrZSwgbm90IGp1c3Qgc3RhcnQuXG4rICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHNcbisgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuXG4rICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcbitcbisgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxuKyAgICBfd3JpdGVfc3lzZnMobmFwaV9kZWZlciwgMClcbisgICAgX3dyaXRlX3N5c2ZzKGdyb190aW1lb3V0LCAwKVxuK1xuKyAgICAjIFBvbGwgZm9yIGJhY2tsb2cgdG8gZHJhaW5cbisgICAgZm9yIF8gaW4gcmFuZ2UoMTAwKTpcbisgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcbisgICAgICAgIGlmIG5vdCBiYWNrbG9nOlxuKyAgICAgICAgICAgIGJyZWFrXG4rICAgICAgICB0aW1lLnNsZWVwKDAuMSlcbitcbisgICAga3NmdF9lcSgwLCBiYWNrbG9nLFxuKyAgICAgICAgICAgIGNvbW1lbnQ9ZlwicWRpc2MgYmFja2xvZyBzdHVjayBvbiBxdWV1ZSB7dGFyZ2V0X3F1ZXVlfSBcIlxuKyAgICAgICAgICAgICAgICAgICAgZlwiYWZ0ZXIgcmluZyByZWNvbmZpZ1wiKVxuK1xuK1xuIGRlZiBtYWluKCkgLVx1MDAzZSBOb25lOlxuICAgICBcIlwiXCIgS3NmdCBib2lsZXIgcGxhdGUgbWFpbiBcIlwiXCJcbiBcbi0gICAgd2l0aCBOZXREcnZFcEVudihfX2ZpbGVfXykgYXMgY2ZnOlxuKyAgICB3aXRoIE5ldERydkVwRW52KF9fZmlsZV9fLCBxdWV1ZV9jb3VudD0yKSBhcyBjZmc6XG4gICAgICAgICBjZmcuZXRoID0gRXRodG9vbEZhbWlseSgpXG4gXG4gICAgICAgICBrc2Z0X3J1bihbY2hhbm5lbHMsXG4tICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtXSxcbisgICAgICAgICAgICAgICAgICByaW5ncGFyYW0sXG4rICAgICAgICAgICAgICAgICAgcmVjb25maWdfdHhfc3RhbGxdLFxuICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKVxuICAgICBrc2Z0X2V4aXQoKVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6MzA6MDAuMjMwNjEyMDE2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODMwNzE4MDk3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIEV2YWx1YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIFwiQWgsIGl0J3MgbWVzc2luZyB3aXRoIGEgc2VsZnRlc3QsIHNwZWNpZmljYWxseSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWBcIi4gSSBzZWUgaXQncyBhZGRpbmcgYSBuZXcgdGVzdCBmdW5jdGlvbiwgYHJlY29uZmlnX3R4X3N0YWxsYCwgdG8gY2hlY2sgcWRpc2MgYmFja2xvZyBkcmFpbmFnZSBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi4gSXQgYWxzbyB0b3VjaGVzIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weWAuIEknbSBzdGFydGluZyB0byBhc3Nlc3MgaWYgdGhpcyBuZWVkcyB0byBiZSBmdXp6ZWQuXG5cbldhaXQgYSBzZWNvbmQuLi4gaXQncyAqb25seSogbW9kaWZ5aW5nIGZpbGVzIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC4gTm8gY29yZSBrZXJuZWwgbG9naWMsIG5vIGRyaXZlcnMsIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGlzIGJlaW5nIHRvdWNoZWQuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHNheXMgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zLi4uIG1vZGlmaWNhdGlvbnMgdG8uLi4gY29kZSBjb21tZW50cy4uLlwiLiBTZWxmdGVzdHMsIGJ5IHRoZWlyIG5hdHVyZSwgYXJlIHVzZXItc3BhY2UgdGVzdHMsIG5vdCBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBTbywgbm8sIHRoaXMgZG9lcyBub3QgbG9vayBsaWtlIGl0IG5lZWRzIHRvIGJlIGZ1enplZC5cblxuSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBteSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgY29ycmVjdC4gTGV0J3MgbWFrZSBzdXJlIEknbSBub3QgbWlzc2luZyBhbnl0aGluZy4gR29pbmcgYmFjayBhbmQgcmUtZXhhbWluaW5nIHRoZSBwYXRjaCwgSSBjYW4gc2VlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBmb2xsb3dpbmcgZmlsZXM6IGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdgLCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weWAsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWAuIEFsbCBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC5cblxuT2theSwgbm8sIEknbSBjb25maWRlbnQuIFRoaXMgcGF0Y2ggb25seSBkZWFscyB3aXRoIHVzZXJzcGFjZSB0ZXN0IHNjcmlwdHMgYW5kIGNvbmZpZ3VyYXRpb24uIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZiB0aGF0IHJlcXVpcmUgZnV6emluZy5cblxuVGhlcmVmb3JlLCBJJ20gZ29pbmcgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTU1LCJPdXRwdXRUb2tlbnMiOjcxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTkyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6MzA6MDguNTM3Nzk2MDE0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTg2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowk66js[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-01 11:10:14 +0000 UTC FinishedAt: 2026-08-01 11:30:10 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "AI determined the patch has no functional impact", "targets": null, "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzAxIDExOjI5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBudWxsLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFtdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0IHNjcmlwdHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUga2VybmVsLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmUgY29kZS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6Mjk8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAxNzg1NGIxZDE3NzAzNDJhNDkyNmU2ODRlNDRmOGRhOTRhZjkwN2I2XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMSAxMToyOTo1OCAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbmluZGV4IDIwNzBlODkwZTA2NGUuLmYzOTMzY2YzZTZiZTYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZ1xuQEAgLTQsOCAmIzQzOzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9blxuIENPTkZJR19JTkVUX1BTUD15XG4gQ09ORklHX0lQVjY9eVxuIENPTkZJR19NQUNTRUM9bVxuJiM0MztDT05GSUdfTkVUX0FDVF9TS0JFRElUPW1cbiBDT05GSUdfTkVUX0NMU19BQ1Q9eVxuIENPTkZJR19ORVRfQ0xTX0JQRj15XG4mIzQzO0NPTkZJR19ORVRfQ0xTX0ZMT1dFUj1tXG4mIzQzO0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cbiBDT05GSUdfTkVUQ09OU09MRT1tXG4gQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQz15XG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weVxuaW5kZXggZTRhY2YzZDgzMzNmZC4uYjFjNmY2Y2VmN2RkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbkBAIC0xMTQsMTAgJiM0MzsxMTQsMTEgQEAgY2xhc3MgTmV0RHJ2RXBFbnYoTmV0RHJ2RW52QmFzZSk6XG4gICAgIG5zaW1fdjRfcGZ4ID0gXCYjMzQ7MTkyLjAuMi5cJiMzNDtcbiAgICAgbnNpbV92Nl9wZnggPSBcJiMzNDsyMDAxOmRiODo6XCYjMzQ7XG4gXG4tICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOlxuJiM0MzsgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XG4gICAgICAgICBzdXBlcigpLl9faW5pdF9fKHNyY19wYXRoKVxuIFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXG4mIzQzOyAgICAgICAgc2VsZi5fcXVldWVfY291bnQgPSBxdWV1ZV9jb3VudFxuIFxuICAgICAgICAgIyBUaGluZ3Mgd2UgdHJ5IHRvIGRlc3Ryb3lcbiAgICAgICAgIHNlbGYucmVtb3RlID0gTm9uZVxuQEAgLTE3Myw5ICYjNDM7MTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxuICAgICAgICAgc2VsZi5fcmVxdWlyZWRfY21kID0ge31cbiBcbiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKTpcbiYjNDM7ICAgICAgICBuc2ltX2t3YXJncyA9IHt9XG4mIzQzOyAgICAgICAgaWYgc2VsZi5fcXVldWVfY291bnQ6XG4mIzQzOyAgICAgICAgICAgIG5zaW1fa3dhcmdzW1wmIzM0O3F1ZXVlX2NvdW50XCYjMzQ7XSA9IHNlbGYuX3F1ZXVlX2NvdW50XG4mIzQzO1xuICAgICAgICAgc2VsZi5fbmV0bnMgPSBOZXROUygpXG4tICAgICAgICBzZWxmLl9ucyA9IE5ldGRldlNpbURldigpXG4tICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zKVxuJiM0MzsgICAgICAgIHNlbGYuX25zID0gTmV0ZGV2U2ltRGV2KCoqbnNpbV9rd2FyZ3MpXG4mIzQzOyAgICAgICAgc2VsZi5fbnNfcGVlciA9IE5ldGRldlNpbURldihucz1zZWxmLl9uZXRucywgKipuc2ltX2t3YXJncylcbiBcbiAgICAgICAgIHdpdGggb3BlbihcJiMzNDsvcHJvYy9zZWxmL25zL25ldFwmIzM0OykgYXMgbnNmZDAsIFxcXG4gICAgICAgICAgICAgIG9wZW4oXCYjMzQ7L3Zhci9ydW4vbmV0bnMvXCYjMzQ7ICYjNDM7IHNlbGYuX25ldG5zLm5hbWUpIGFzIG5zZmQxOlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuQEAgLTUsMTAgJiM0Mzs1LDI1IEBAXG4gVGVzdCBjaGFubmVsIGFuZCByaW5nIHNpemUgY29uZmlndXJhdGlvbiB2aWEgZXRodG9vbCAoLUwgLyAtRykuXG4gXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4gXG4mIzQzO2ltcG9ydCBzb2NrZXRcbiYjNDM7aW1wb3J0IHN0cnVjdFxuJiM0MztpbXBvcnQgdGltZVxuJiM0MztcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9ydW4sIGtzZnRfZXhpdCwga3NmdF9wclxuIGZyb20gbGliLnB5IGltcG9ydCBrc2Z0X2VxXG4mIzQzO2Zyb20gbGliLnB5IGltcG9ydCBLc2Z0U2tpcEV4LCBLc2Z0WGZhaWxFeFxuIGZyb20gbGliLnB5IGltcG9ydCBOZXREcnZFcEVudiwgRXRodG9vbEZhbWlseSwgR2VuZXJhdGVUcmFmZmljXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXG4mIzQzO2Zyb20gbGliLnB5IGltcG9ydCBjbWQsIGRlZmVyLCByYW5kX3BvcnQsIHRjLCBObEVycm9yXG4mIzQzO1xuJiM0MzsjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXG4mIzQzO1NPX1RYVElNRSA9IGdldGF0dHIoc29ja2V0LCBcJiMzNDtTT19UWFRJTUVcJiMzNDssIDYxKVxuJiM0MztcbiYjNDM7IyBOb3QgYWx3YXlzIGV4cG9ydGVkIGJ5IHRoZSBzb2NrZXQgbW9kdWxlOyBhc20tZ2VuZXJpYyB2YWx1ZSAoeDg2L0FSTS9NSVBTKS5cbiYjNDM7U09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgXCYjMzQ7U09fU05EQlVGRk9SQ0VcJiMzNDssIDMyKVxuJiM0MztcbiYjNDM7IyBUWCByaW5nIHNpemUgdGhlIHRlc3Qgc2hyaW5rcyB0byBzbyB0aGUgcmluZyBmaWxscyBxdWlja2x5LlxuJiM0MztNSU5fVFhfUklORyA9IDMyXG4mIzQzO01BWF9UWF9SSU5HID0gMTAyNFxuIFxuIFxuIGRlZiBjaGFubmVscyhjZmcpIC1cdTAwM2UgTm9uZTpcbkBAIC0xNTEsMTQgJiM0MzsxNjYsMjQ4IEBAIGRlZiByaW5ncGFyYW0oY2ZnKSAtXHUwMDNlIE5vbmU6XG4gICAgICAgICBHZW5lcmF0ZVRyYWZmaWMoY2ZnKS53YWl0X3BrdHNfYW5kX3N0b3AoMTAwMDApXG4gXG4gXG4mIzQzO2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7V3JpdGUgdmFsIHRvIGEgZmlsZS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHdpdGggb3BlbihwYXRoLCBcJiMzNDt3XCYjMzQ7LCBlbmNvZGluZz1cJiMzNDt1dGYtOFwmIzM0OykgYXMgZnA6XG4mIzQzOyAgICAgICAgZnAud3JpdGUoc3RyKHZhbCkpXG4mIzQzO1xuJiM0MztcbiYjNDM7ZGVmIF93cml0ZV9zeXNmcyhwYXRoLCB2YWwpOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7V3JpdGUgdmFsIHRvIGEgc3lzZnMgZmlsZSwgcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSBvbiBleGl0LlwmIzM0O1wmIzM0O1wmIzM0O1xuJiM0MzsgICAgd2l0aCBvcGVuKHBhdGgsIFwmIzM0O3JcJiMzNDssIGVuY29kaW5nPVwmIzM0O3V0Zi04XCYjMzQ7KSBhcyBmcDpcbiYjNDM7ICAgICAgICBvcmlnX3ZhbCA9IGZwLnJlYWQoKS5zdHJpcCgpXG4mIzQzOyAgICBpZiBzdHIodmFsKSA9PSBvcmlnX3ZhbDpcbiYjNDM7ICAgICAgICByZXR1cm5cbiYjNDM7ICAgIF93cml0ZV9maWxlKHBhdGgsIHZhbClcbiYjNDM7ICAgIGRlZmVyKF93cml0ZV9maWxlLCBwYXRoLCBvcmlnX3ZhbClcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCBxdWV1ZSk6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtSZXR1cm4gdGhlIHFkaXNjIGJhY2tsb2cgKGJ5dGVzKSBmb3IgdGhlIGdpdmVuIFRYIHF1ZXVlJiMzOTtzIGxlYWYuXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICB0YXJnZXRfcGFyZW50ID0gZlwmIzM0O3ttcV9oYW5kbGV9e3F1ZXVlICYjNDM7IDE6eH1cJiMzNDtcbiYjNDM7ICAgIGZvciBxIGluIHRjKGZcJiMzNDstcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cJiMzNDssIGpzb249VHJ1ZSk6XG4mIzQzOyAgICAgICAgaWYgcS5nZXQoXCYjMzQ7cGFyZW50XCYjMzQ7LCBcJiMzNDtcJiMzNDspID09IHRhcmdldF9wYXJlbnQ6XG4mIzQzOyAgICAgICAgICAgIHJldHVybiBxLmdldChcJiMzNDtiYWNrbG9nXCYjMzQ7KSBvciAwXG4mIzQzOyAgICByZXR1cm4gMFxuJiM0MztcbiYjNDM7XG4mIzQzO2RlZiBfc2V0dXBfZnFfcWRpc2MoY2ZnLCBwb3J0LCB0YXJnZXRfcXVldWUsIG90aGVyX3F1ZXVlLCBmbG93X2xpbWl0KTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1B1dCBhbiBmcSBxZGlzYyBvbiB0YXJnZXRfcXVldWUmIzM5O3MgbGVhZiBhbmQgcmV0dXJuIHRoZSBtcSBoYW5kbGUgaW4gdXNlLlxuJiM0MztcbiYjNDM7ICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSYjMzk7cyBleGlzdGluZyBUWC9SWCBxZGlzYyBwb2xpY3kuIE9uIGEgcmVhbFxuJiM0MzsgICAgTklDIHRoZSByb290IG1xIGFscmVhZHkgaGFzIGFuIGFkZHJlc3NhYmxlIGhhbmRsZSwgc28gd2UgbGVhdmUgdGhlIHJvb3RcbiYjNDM7ICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHNcbiYjNDM7ICAgIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXG4mIzQzO1xuJiM0MzsgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJiMzOTtzIHBlci1mbG93IHBhY2tldCBsaW1pdCAoZGVmYXVsdCAxMDApIHNvIGEgc2luZ2xlXG4mIzQzOyAgICBmbG93IGNhbiBiYWNrIHVwIG1vcmUgcGFja2V0cyB0aGFuIHRoZSBUeCByaW5nIGhvbGRzIGFuZCB0aHVzIG92ZXJmbG93IGl0LlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBxZGlzY3MgPSB0YyhmXCYjMzQ7cWRpc2Mgc2hvdyBkZXYge2NmZy5pZm5hbWV9XCYjMzQ7LCBqc29uPVRydWUpXG4mIzQzOyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoXCYjMzQ7cm9vdFwmIzM0OykpLCBOb25lKVxuJiM0MztcbiYjNDM7ICAgIGlmIHJvb3QgYW5kIHJvb3RbXCYjMzQ7a2luZFwmIzM0O10gPT0gXCYjMzQ7bXFcJiMzNDsgYW5kIHJvb3RbXCYjMzQ7aGFuZGxlXCYjMzQ7XSAhPSBcJiMzNDswOlwmIzM0OzpcbiYjNDM7ICAgICAgICAjIEFkZHJlc3NhYmxlIG1xIChwcmV2aW91c2x5LWNvbmZpZ3VyZWQpOiB0b3VjaCBvbmx5IHRoZSB0YXJnZXQgcXVldWUmIzM5O3NcbiYjNDM7ICAgICAgICAjIGxlYWYgYW5kIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXG4mIzQzOyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFtcJiMzNDtoYW5kbGVcJiMzNDtdXG4mIzQzOyAgICAgICAgcGFyZW50ID0gZlwmIzM0O3ttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSAmIzQzOyAxOnh9XCYjMzQ7XG4mIzQzOyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFwmIzM0O3BhcmVudFwmIzM0OykgPT0gcGFyZW50KSwgTm9uZSlcbiYjNDM7ICAgICAgICBvcmlnX2tpbmQgPSBvcmlnW1wmIzM0O2tpbmRcJiMzNDtdIGlmIG9yaWcgZWxzZSBcXFxuJiM0MzsgICAgICAgICAgICBjbWQoXCYjMzQ7c3lzY3RsIC1uIG5ldC5jb3JlLmRlZmF1bHRfcWRpc2NcJiMzNDspLnN0ZG91dC5zdHJpcCgpXG4mIzQzOyAgICAgICAgZGVmZXIodGMsIGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IHtvcmlnX2tpbmR9XCYjMzQ7KVxuJiM0MzsgICAgZWxpZiByb290IGlzIE5vbmUgb3Igcm9vdFtcJiMzNDtraW5kXCYjMzQ7XSBpbiAoXCYjMzQ7bXFcJiMzNDssIFwmIzM0O25vcXVldWVcJiMzNDspOlxuJiM0MzsgICAgICAgICMgVGhlIGF1dG8tYXR0YWNoZWQgcm9vdCBtcSBoYXMgaGFuZGxlIDA6IG9uIGFueSBkZXZpY2UgKHJlYWwgb3Igc2ltKSxcbiYjNDM7ICAgICAgICAjIHdoaWNoIHRoZSBrZXJuZWwgcmVqZWN0cyBhcyBhIHFkaXNjIHBhcmVudC4gQSAwOiBoYW5kbGUgbWVhbnMgdGhlIG1xXG4mIzQzOyAgICAgICAgIyBpcyB0aGUgdW50b3VjaGVkIGtlcm5lbCBkZWZhdWx0IC0gbm8gY3VzdG9tIGNoaWxkIHFkaXNjcyBjYW4gaGFuZyBvZmZcbiYjNDM7ICAgICAgICAjIGFuIHVuYWRkcmVzc2FibGUgcGFyZW50IC0gc28gaW5zdGFsbGluZyBhIHJlYWwgaGFuZGxlIGFuZCByZXN0b3JpbmdcbiYjNDM7ICAgICAgICAjIHRoZSBkZWZhdWx0IG1xIG9uIGV4aXQgcHJlc2VydmVzIHRoZSBkZXZpY2UmIzM5O3MgZWZmZWN0aXZlIHBvbGljeS5cbiYjNDM7ICAgICAgICBtcV9oYW5kbGUgPSBcJiMzNDsxOlwmIzM0O1xuJiM0MzsgICAgICAgIHRjKGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBoYW5kbGUge21xX2hhbmRsZX0gbXFcJiMzNDspXG4mIzQzOyAgICAgICAgZGVmZXIodGMsIGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBtcVwmIzM0OylcbiYjNDM7ICAgICAgICBwYXJlbnQgPSBmXCYjMzQ7e21xX2hhbmRsZX17dGFyZ2V0X3F1ZXVlICYjNDM7IDE6eH1cJiMzNDtcbiYjNDM7ICAgIGVsc2U6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChmXCYjMzQ7cm9vdCBxZGlzYyAmIzM5O3tyb290WyYjMzk7a2luZCYjMzk7XX0mIzM5OyBpcyBub3QgbXE7IFwmIzM0O1xuJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgXCYjMzQ7cmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3lcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgdHJ5OlxuJiM0MzsgICAgICAgIHRjKGZcJiMzNDtxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IGZxIFwmIzM0O1xuJiM0MzsgICAgICAgICAgIGZcJiMzNDtmbG93X2xpbWl0IHtmbG93X2xpbWl0fSBsaW1pdCB7Zmxvd19saW1pdCAqIDJ9XCYjMzQ7KVxuJiM0MzsgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcbiYjNDM7ICAgICAgICAgICAgZlwmIzM0O2ZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cJiMzNDspIGZyb20gZXhjXG4mIzQzO1xuJiM0MzsgICAgcWRpc2NfaiA9IHRjKGZcJiMzNDtxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cJiMzNDssIGpzb249VHJ1ZSlcbiYjNDM7ICAgIGhhc19jbHNhY3QgPSBhbnkocVsmIzM5O2tpbmQmIzM5O10gPT0gJiMzOTtjbHNhY3QmIzM5OyBmb3IgcSBpbiBxZGlzY19qKVxuJiM0MzsgICAgaWYgbm90IGhhc19jbHNhY3Q6XG4mIzQzOyAgICAgICAgdGMoZlwmIzM0O3FkaXNjIGFkZCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFwmIzM0OylcbiYjNDM7ICAgICAgICBkZWZlcih0YywgZlwmIzM0O3FkaXNjIGRlbCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFwmIzM0OylcbiYjNDM7XG4mIzQzOyAgICBwcm90byA9IFwmIzM0O2lwdjZcJiMzNDsgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgXCYjMzQ7aXBcJiMzNDtcbiYjNDM7ICAgIHRyeTpcbiYjNDM7ICAgICAgICB0YyhmXCYjMzQ7ZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcm90b2NvbCB7cHJvdG99IFwmIzM0O1xuJiM0MzsgICAgICAgICAgIGZcJiMzNDtwcmVmIDEgZmxvd2VyIGlwX3Byb3RvIHVkcCBkc3RfcG9ydCB7cG9ydH0gXCYjMzQ7XG4mIzQzOyAgICAgICAgICAgZlwmIzM0O2FjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge3RhcmdldF9xdWV1ZX1cJiMzNDspXG4mIzQzOyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFwmIzM0O3RjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlXCYjMzQ7KSBmcm9tIGV4Y1xuJiM0MzsgICAgZGVmZXIodGMsIGZcJiMzNDtmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMVwmIzM0OylcbiYjNDM7XG4mIzQzOyAgICB0YyhmXCYjMzQ7ZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSBcJiMzNDtcbiYjNDM7ICAgICAgIGZcJiMzNDttYXRjaGFsbCBhY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHtvdGhlcl9xdWV1ZX1cJiMzNDspXG4mIzQzOyAgICBkZWZlcih0YywgZlwmIzM0O2ZpbHRlciBkZWwgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJlZiAxMDFcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgcmV0dXJuIG1xX2hhbmRsZVxuJiM0MztcbiYjNDM7XG4mIzQzO2RlZiBfY3JlYXRlX3NvdHh0aW1lX3NvY2tldChjZmcsIHNuZGJ1Zik6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtDcmVhdGUgYSBVRFAgc29ja2V0IHdpdGggU09fVFhUSU1FIGVuYWJsZWQsIGJvdW5kIHRvIHRoZSB0ZXN0IGRldmljZS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSBcJiMzNDs2XCYjMzQ7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSlcbiYjNDM7ICAgIHRyeTpcbiYjNDM7ICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIFNPX1RYVElNRSwgc3RydWN0LnBhY2soXCYjMzQ7SWlcJiMzNDssIDEsIDApKVxuJiM0MzsgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOlxuJiM0MzsgICAgICAgIHNvY2suY2xvc2UoKVxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7U09fVFhUSU1FIG5vdCBzdXBwb3J0ZWRcJiMzNDspIGZyb20gZXhjXG4mIzQzOyAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19CSU5EVE9ERVZJQ0UsXG4mIzQzOyAgICAgICAgICAgICAgICAgICAgY2ZnLmlmbmFtZS5lbmNvZGUoKSlcbiYjNDM7ICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc29cbiYjNDM7ICAgICMgc2l6ZSB0aGUgc2VuZCBidWZmZXIgdG8gaG9sZCB0aGUgd2hvbGUgYnVyc3QuIFNPX1NOREJVRkZPUkNFIGJ5cGFzc2VzXG4mIzQzOyAgICAjIG5ldC5jb3JlLndtZW1fbWF4ICh0aGUgdGVzdCBydW5zIGFzIHJvb3QpLlxuJiM0MzsgICAgdHJ5OlxuJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgU09fU05EQlVGRk9SQ0UsIHNuZGJ1ZilcbiYjNDM7ICAgIGV4Y2VwdCBPU0Vycm9yOlxuJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKVxuJiM0MzsgICAgcmV0dXJuIHNvY2tcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX3NlbmRfc290eHRpbWVfYnVyc3QoY2ZnLCBzb2NrLCBwb3J0LCBjb3VudCwgZGVsYXlfbnMsIHBrdF9zaXplKTpcbiYjNDM7ICAgIFwmIzM0O1wmIzM0O1wmIzM0O1NlbmQgY291bnQgVURQIHBhY2tldHMgc2NoZWR1bGVkIGRlbGF5X25zIGFoZWFkIHVzaW5nIFNPX1RYVElNRS5cJiMzNDtcJiMzNDtcJiMzNDtcbiYjNDM7ICAgIHBheWxvYWQgPSBiJiMzOTtcXHgwMCYjMzk7ICogcGt0X3NpemVcbiYjNDM7ICAgIHR4dGltZV9ucyA9IHRpbWUuY2xvY2tfZ2V0dGltZV9ucyh0aW1lLkNMT0NLX01PTk9UT05JQykgJiM0MzsgZGVsYXlfbnNcbiYjNDM7XG4mIzQzOyAgICBhbmNkYXRhID0gWyhzb2NrZXQuU09MX1NPQ0tFVCwgU09fVFhUSU1FLCBzdHJ1Y3QucGFjayhcJiMzNDtRXCYjMzQ7LCB0eHRpbWVfbnMpKV1cbiYjNDM7ICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcbiYjNDM7ICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCwgMCwgMClcbiYjNDM7ICAgIGVsc2U6XG4mIzQzOyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXG4mIzQzOyAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6XG4mIzQzOyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdClcbiYjNDM7XG4mIzQzO1xuJiM0MztkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6XG4mIzQzOyAgICBcJiMzNDtcJiMzNDtcJiMzNDtTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxuJiM0MztcbiYjNDM7ICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCxcbiYjNDM7ICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXG4mIzQzOyAgICAoZS5nLiBibnh0IG5lZWRzIGEgbGFyZ2UgcmluZyBmb3Igc29mdHdhcmUgVURQIHNlZ21lbnRhdGlvbiksIHNvIHJhaXNlXG4mIzQzOyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4mIzQzOyAgICBzaXplID0gTUlOX1RYX1JJTkdcbiYjNDM7ICAgIHdoaWxlIHNpemUgXHUwMDNjPSBNQVhfVFhfUklORzpcbiYjNDM7ICAgICAgICB0cnk6XG4mIzQzOyAgICAgICAgICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7JiMzOTt0eCYjMzk7OiBzaXplfSlcbiYjNDM7ICAgICAgICAgICAgcmV0dXJuIHNpemVcbiYjNDM7ICAgICAgICBleGNlcHQgTmxFcnJvcjpcbiYjNDM7ICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyXG4mIzQzOyAgICAgICAgICAgIGNvbnRpbnVlXG4mIzQzOyAgICByYWlzZSBLc2Z0U2tpcEV4KFwmIzM0O2RyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcJiMzNDspXG4mIzQzO1xuJiM0MztcbiYjNDM7ZGVmIHJlY29uZmlnX3R4X3N0YWxsKGNmZykgLVx1MDAzZSBOb25lOlxuJiM0MzsgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7VGVzdCB0aGF0IHFkaXNjIGJhY2tsb2cgZHJhaW5zIGFmdGVyIHJpbmcgcmVjb25maWd1cmF0aW9uLlwmIzM0O1wmIzM0O1wmIzM0O1xuJiM0MzsgICAgdGFyZ2V0X3F1ZXVlID0gMVxuJiM0MzsgICAgb3RoZXJfcXVldWUgPSAwXG4mIzQzO1xuJiM0MzsgICAgZWhkciA9IHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fVxuJiM0MzsgICAgY2hhbnMgPSBjZmcuZXRoLmNoYW5uZWxzX2dldChlaGRyKVxuJiM0MztcbiYjNDM7ICAgIGlmIFwmIzM0O2NvbWJpbmVkLW1heFwmIzM0OyBub3QgaW4gY2hhbnM6XG4mIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcJiMzNDtkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb21iaW5lZCBjaGFubmVsc1wmIzM0OylcbiYjNDM7ICAgIGlmIGNoYW5zLmdldChcJiMzNDtjb21iaW5lZC1tYXhcJiMzNDssIDApIFx1MDAzYyAyOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7ZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMiYjNDM7IGNvbWJpbmVkIGNoYW5uZWxzXCYjMzQ7KVxuJiM0MzsgICAgaWYgY2hhbnNbXCYjMzQ7Y29tYmluZWQtY291bnRcJiMzNDtdIFx1MDAzYyAyOlxuJiM0MzsgICAgICAgIGRlZmVyKGNmZy5ldGguY2hhbm5lbHNfc2V0LFxuJiM0MzsgICAgICAgICAgICAgIGVoZHIgfCB7XCYjMzQ7Y29tYmluZWQtY291bnRcJiMzNDs6IGNoYW5zW1wmIzM0O2NvbWJpbmVkLWNvdW50XCYjMzQ7XX0pXG4mIzQzOyAgICAgICAgY2ZnLmV0aC5jaGFubmVsc19zZXQoZWhkciB8IHtcJiMzNDtjb21iaW5lZC1jb3VudFwmIzM0OzogMn0pXG4mIzQzO1xuJiM0MzsgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxuJiM0MzsgICAgaWYgJiMzOTtyeCYjMzk7IG5vdCBpbiByaW5ncyBvciAmIzM5O3R4JiMzOTsgbm90IGluIHJpbmdzOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7ZGV2aWNlIGRvZXMgbm90IGV4cG9zZSByeC90eCByaW5nIHBhcmFtc1wmIzM0OylcbiYjNDM7ICAgIHR4X2N1ciA9IHJpbmdzWyYjMzk7dHgmIzM5O11cbiYjNDM7ICAgIGlmIHR4X2N1ciBcdTAwM2M9IE1JTl9UWF9SSU5HOlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCYjMzQ7dHggcmluZyBzaXplIGFscmVhZHkgYXQgbWluaW11bVwmIzM0OylcbiYjNDM7ICAgIGRlZmVyKGNmZy5ldGgucmluZ3Nfc2V0LCBlaGRyIHwgeyYjMzk7dHgmIzM5OzogdHhfY3VyfSlcbiYjNDM7XG4mIzQzOyAgICAjIFVzZSB0aGUgc21hbGxlc3QgVHggcmluZyB0aGUgZHJpdmVyIGFjY2VwdHMgKDMyLCBncm93aW5nIHRvIDEwMjQpLlxuJiM0MzsgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXG4mIzQzO1xuJiM0MzsgICAgIyBTbG93IGNvbXBsZXRpb25zIHNvIHRoZSByaW5nIHN0YXlzIGZ1bGwgYWZ0ZXIgRlEgcmVsZWFzZXMgcGFja2V0c1xuJiM0MzsgICAgbmFwaV9kZWZlciA9IGZcJiMzNDsvc3lzL2NsYXNzL25ldC97Y2ZnLmlmbmFtZX0vbmFwaV9kZWZlcl9oYXJkX2lycXNcJiMzNDtcbiYjNDM7ICAgIGdyb190aW1lb3V0ID0gZlwmIzM0Oy9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dFwmIzM0O1xuJiM0MzsgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDEwMClcbiYjNDM7ICAgIF93cml0ZV9zeXNmcyhncm9fdGltZW91dCwgMTAwMDAwMDAwMClcbiYjNDM7XG4mIzQzOyAgICBwb3J0ID0gcmFuZF9wb3J0KClcbiYjNDM7ICAgICMgQSBzaW5nbGUgZmxvdyBtdXN0IG92ZXJmbG93IHRoZSByaW5nLCBzbyBzZW5kIHR3aWNlIHRoZSByaW5nIGRlcHRoIGFuZFxuJiM0MzsgICAgIyBsZXQgZnEgaG9sZCB0aGF0IG1hbnkgcGFja2V0cyBmb3IgdGhlIGZsb3cuXG4mIzQzOyAgICBwa3RfY291bnQgPSB0eF9yaW5nICogMlxuJiM0MzsgICAgbXFfaGFuZGxlID0gX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSxcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3JpbmcgKiAyKVxuJiM0MztcbiYjNDM7ICAgICMgU2l6ZSBlYWNoIHBhY2tldCB0byBvbmUgTVRVIChsZXNzIEwzL0w0IGhlYWRlcnMgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbikuXG4mIzQzOyAgICBwa3Rfc2l6ZSA9IGNmZy5kZXZbJiMzOTttdHUmIzM5O10gLSAoNDggaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgMjgpXG4mIzQzO1xuJiM0MzsgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc29cbiYjNDM7ICAgICMgYnVkZ2V0IHRoZSBzZW5kIGJ1ZmZlciBmb3IgdGhlIHdob2xlIGluLWZsaWdodCBidXJzdC5cbiYjNDM7ICAgIHNvY2sgPSBfY3JlYXRlX3NvdHh0aW1lX3NvY2tldChjZmcsIHBrdF9jb3VudCAqIHBrdF9zaXplICogMilcbiYjNDM7ICAgIGRlZmVyKHNvY2suY2xvc2UpXG4mIzQzO1xuJiM0MzsgICAgZm9yIGRlbGF5X21zIGluIFsxMDAsIDIwMCwgNTAwXTpcbiYjNDM7ICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCxcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9tcyAqIDFfMDAwXzAwMCwgcGt0X3NpemUpXG4mIzQzOyAgICAgICAga3NmdF9wcihmXCYjMzQ7U2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoJiM0Mzt7ZGVsYXlfbXN9bXMpXCYjMzQ7KVxuJiM0MzsgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICYjNDM7IDAuMylcbiYjNDM7XG4mIzQzOyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKVxuJiM0MzsgICAgICAgIGlmIGJhY2tsb2c6XG4mIzQzOyAgICAgICAgICAgIGJyZWFrXG4mIzQzOyAgICBlbHNlOlxuJiM0MzsgICAgICAgICMgQSBkZXZpY2UgdGhhdCBjb21wbGV0ZXMgVHggc3luY2hyb25vdXNseSAoZS5nLiBhIHNvZnR3YXJlL3ZpcnR1YWxcbiYjNDM7ICAgICAgICAjIGRyaXZlciBsaWtlIG5ldGRldnNpbSkgbmV2ZXIga2VlcHMgdGhlIHJpbmcgZnVsbCBsb25nIGVub3VnaCBmb3IgYVxuJiM0MzsgICAgICAgICMgYmFja2xvZyB0byBmb3JtLCBzbyB0aGUgd2FrZS12cy1zdGFydCBiZWhhdmlvciBjYW4mIzM5O3QgYmUgZXhlcmNpc2VkLlxuJiM0MzsgICAgICAgICMgVHJlYXQgdGhhdCBhcyBhbiBleHBlY3RlZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgaGFyZCBmYWlsdXJlLlxuJiM0MzsgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KFwmIzM0O2NvdWxkIG5vdCBidWlsZCBxZGlzYyBiYWNrbG9nXCYjMzQ7KVxuJiM0MztcbiYjNDM7ICAgIGtzZnRfcHIoZlwmIzM0O0JhY2tsb2cgYmVmb3JlIHJlY29uZmlnOiB7YmFja2xvZ30gYnl0ZXNcJiMzNDspXG4mIzQzO1xuJiM0MzsgICAgIyBUcmlnZ2VyIHJpbmcgcmVjb25maWcg4oCUIGRyaXZlciBzaG91bGQgY2FsbCB3YWtlLCBub3QganVzdCBzdGFydC5cbiYjNDM7ICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHNcbiYjNDM7ICAgICMgKHNldHRpbmcgdGhlIGN1cnJlbnQgc2l6ZSBpcyBhIG5vLW9wIHRoZSBkcml2ZXIgc2hvcnQtY2lyY3VpdHMpLlxuJiM0MzsgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsmIzM5O3R4JiMzOTs6IHR4X2N1cn0pXG4mIzQzO1xuJiM0MzsgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxuJiM0MzsgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDApXG4mIzQzOyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApXG4mIzQzO1xuJiM0MzsgICAgIyBQb2xsIGZvciBiYWNrbG9nIHRvIGRyYWluXG4mIzQzOyAgICBmb3IgXyBpbiByYW5nZSgxMDApOlxuJiM0MzsgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcbiYjNDM7ICAgICAgICBpZiBub3QgYmFja2xvZzpcbiYjNDM7ICAgICAgICAgICAgYnJlYWtcbiYjNDM7ICAgICAgICB0aW1lLnNsZWVwKDAuMSlcbiYjNDM7XG4mIzQzOyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csXG4mIzQzOyAgICAgICAgICAgIGNvbW1lbnQ9ZlwmIzM0O3FkaXNjIGJhY2tsb2cgc3R1Y2sgb24gcXVldWUge3RhcmdldF9xdWV1ZX0gXCYjMzQ7XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgZlwmIzM0O2FmdGVyIHJpbmcgcmVjb25maWdcJiMzNDspXG4mIzQzO1xuJiM0MztcbiBkZWYgbWFpbigpIC1cdTAwM2UgTm9uZTpcbiAgICAgXCYjMzQ7XCYjMzQ7XCYjMzQ7IEtzZnQgYm9pbGVyIHBsYXRlIG1haW4gXCYjMzQ7XCYjMzQ7XCYjMzQ7XG4gXG4tICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18pIGFzIGNmZzpcbiYjNDM7ICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzpcbiAgICAgICAgIGNmZy5ldGggPSBFdGh0b29sRmFtaWx5KClcbiBcbiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscyxcbi0gICAgICAgICAgICAgICAgICByaW5ncGFyYW1dLFxuJiM0MzsgICAgICAgICAgICAgICAgICByaW5ncGFyYW0sXG4mIzQzOyAgICAgICAgICAgICAgICAgIHJlY29uZmlnX3R4X3N0YWxsXSxcbiAgICAgICAgICAgICAgICAgIGFyZ3M9KGNmZywgKSlcbiAgICAga3NmdF9leGl0KClcbiBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wMSAxMTozMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IG51bGwsCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogW10sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3Qgc2NyaXB0cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBrZXJuZWwsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZSBjb2RlLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDE3ODU0YjFkMTc3MDM0MmE0OTI2ZTY4NGU0NGY4ZGE5NGFmOTA3YjYKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAxIDExOjI5OjU4IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnCmluZGV4IDIwNzBlODkwZTA2NGUuLmYzOTMzY2YzZTZiZTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2NvbmZpZwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWcKQEAgLTQsOCAmIzQzOzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9bgogQ09ORklHX0lORVRfUFNQPXkKIENPTkZJR19JUFY2PXkKIENPTkZJR19NQUNTRUM9bQomIzQzO0NPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9DTFNfQUNUPXkKIENPTkZJR19ORVRfQ0xTX0JQRj15CiYjNDM7Q09ORklHX05FVF9DTFNfRkxPV0VSPW0KJiM0MztDT05GSUdfTkVUX0NMU19NQVRDSEFMTD1tCiBDT05GSUdfTkVUQ09OU09MRT1tCiBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDPXkKIENPTkZJR19ORVRDT05TT0xFX0VYVEVOREVEX0xPRz15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weQppbmRleCBlNGFjZjNkODMzM2ZkLi5iMWM2ZjZjZWY3ZGQyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHkKQEAgLTExNCwxMCAmIzQzOzExNCwxMSBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKToKICAgICBuc2ltX3Y0X3BmeCA9ICYjMzQ7MTkyLjAuMi4mIzM0OwogICAgIG5zaW1fdjZfcGZ4ID0gJiMzNDsyMDAxOmRiODo6JiMzNDsKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOgomIzQzOyAgICBkZWYgX19pbml0X18oc2VsZiwgc3JjX3BhdGgsIG5zaW1fdGVzdD1Ob25lLCBxdWV1ZV9jb3VudD1Ob25lKToKICAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhzcmNfcGF0aCkKIAogICAgICAgICBzZWxmLl9zdGF0c19zZXR0bGVfdGltZSA9IE5vbmUKJiM0MzsgICAgICAgIHNlbGYuX3F1ZXVlX2NvdW50ID0gcXVldWVfY291bnQKIAogICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveQogICAgICAgICBzZWxmLnJlbW90ZSA9IE5vbmUKQEAgLTE3Myw5ICYjNDM7MTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOgogICAgICAgICBzZWxmLl9yZXF1aXJlZF9jbWQgPSB7fQogCiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKToKJiM0MzsgICAgICAgIG5zaW1fa3dhcmdzID0ge30KJiM0MzsgICAgICAgIGlmIHNlbGYuX3F1ZXVlX2NvdW50OgomIzQzOyAgICAgICAgICAgIG5zaW1fa3dhcmdzWyYjMzQ7cXVldWVfY291bnQmIzM0O10gPSBzZWxmLl9xdWV1ZV9jb3VudAomIzQzOwogICAgICAgICBzZWxmLl9uZXRucyA9IE5ldE5TKCkKLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKQotICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zKQomIzQzOyAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKipuc2ltX2t3YXJncykKJiM0MzsgICAgICAgIHNlbGYuX25zX3BlZXIgPSBOZXRkZXZTaW1EZXYobnM9c2VsZi5fbmV0bnMsICoqbnNpbV9rd2FyZ3MpCiAKICAgICAgICAgd2l0aCBvcGVuKCYjMzQ7L3Byb2Mvc2VsZi9ucy9uZXQmIzM0OykgYXMgbnNmZDAsIFwKICAgICAgICAgICAgICBvcGVuKCYjMzQ7L3Zhci9ydW4vbmV0bnMvJiMzNDsgJiM0Mzsgc2VsZi5fbmV0bnMubmFtZSkgYXMgbnNmZDE6CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weQppbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5CiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkKQEAgLTUsMTAgJiM0Mzs1LDI1IEBACiBUZXN0IGNoYW5uZWwgYW5kIHJpbmcgc2l6ZSBjb25maWd1cmF0aW9uIHZpYSBldGh0b29sICgtTCAvIC1HKS4KICYjMzQ7JiMzNDsmIzM0OwogCiYjNDM7aW1wb3J0IHNvY2tldAomIzQzO2ltcG9ydCBzdHJ1Y3QKJiM0MztpbXBvcnQgdGltZQomIzQzOwogZnJvbSBsaWIucHkgaW1wb3J0IGtzZnRfcnVuLCBrc2Z0X2V4aXQsIGtzZnRfcHIKIGZyb20gbGliLnB5IGltcG9ydCBrc2Z0X2VxCiYjNDM7ZnJvbSBsaWIucHkgaW1wb3J0IEtzZnRTa2lwRXgsIEtzZnRYZmFpbEV4CiBmcm9tIGxpYi5weSBpbXBvcnQgTmV0RHJ2RXBFbnYsIEV0aHRvb2xGYW1pbHksIEdlbmVyYXRlVHJhZmZpYwotZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yCiYjNDM7ZnJvbSBsaWIucHkgaW1wb3J0IGNtZCwgZGVmZXIsIHJhbmRfcG9ydCwgdGMsIE5sRXJyb3IKJiM0MzsKJiM0MzsjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTCiYjNDM7U09fVFhUSU1FID0gZ2V0YXR0cihzb2NrZXQsICYjMzQ7U09fVFhUSU1FJiMzNDssIDYxKQomIzQzOwomIzQzOyMgTm90IGFsd2F5cyBleHBvcnRlZCBieSB0aGUgc29ja2V0IG1vZHVsZTsgYXNtLWdlbmVyaWMgdmFsdWUgKHg4Ni9BUk0vTUlQUykuCiYjNDM7U09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgJiMzNDtTT19TTkRCVUZGT1JDRSYjMzQ7LCAzMikKJiM0MzsKJiM0MzsjIFRYIHJpbmcgc2l6ZSB0aGUgdGVzdCBzaHJpbmtzIHRvIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHkuCiYjNDM7TUlOX1RYX1JJTkcgPSAzMgomIzQzO01BWF9UWF9SSU5HID0gMTAyNAogCiAKIGRlZiBjaGFubmVscyhjZmcpIC0mZ3Q7IE5vbmU6CkBAIC0xNTEsMTQgJiM0MzsxNjYsMjQ4IEBAIGRlZiByaW5ncGFyYW0oY2ZnKSAtJmd0OyBOb25lOgogICAgICAgICBHZW5lcmF0ZVRyYWZmaWMoY2ZnKS53YWl0X3BrdHNfYW5kX3N0b3AoMTAwMDApCiAKIAomIzQzO2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtXcml0ZSB2YWwgdG8gYSBmaWxlLiYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICB3aXRoIG9wZW4ocGF0aCwgJiMzNDt3JiMzNDssIGVuY29kaW5nPSYjMzQ7dXRmLTgmIzM0OykgYXMgZnA6CiYjNDM7ICAgICAgICBmcC53cml0ZShzdHIodmFsKSkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX3dyaXRlX3N5c2ZzKHBhdGgsIHZhbCk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1dyaXRlIHZhbCB0byBhIHN5c2ZzIGZpbGUsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb24gZXhpdC4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgd2l0aCBvcGVuKHBhdGgsICYjMzQ7ciYjMzQ7LCBlbmNvZGluZz0mIzM0O3V0Zi04JiMzNDspIGFzIGZwOgomIzQzOyAgICAgICAgb3JpZ192YWwgPSBmcC5yZWFkKCkuc3RyaXAoKQomIzQzOyAgICBpZiBzdHIodmFsKSA9PSBvcmlnX3ZhbDoKJiM0MzsgICAgICAgIHJldHVybgomIzQzOyAgICBfd3JpdGVfZmlsZShwYXRoLCB2YWwpCiYjNDM7ICAgIGRlZmVyKF93cml0ZV9maWxlLCBwYXRoLCBvcmlnX3ZhbCkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCBxdWV1ZSk6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1JldHVybiB0aGUgcWRpc2MgYmFja2xvZyAoYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gVFggcXVldWUmIzM5O3MgbGVhZi4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgdGFyZ2V0X3BhcmVudCA9IGYmIzM0O3ttcV9oYW5kbGV9e3F1ZXVlICYjNDM7IDE6eH0mIzM0OwomIzQzOyAgICBmb3IgcSBpbiB0YyhmJiMzNDstcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX0mIzM0OywganNvbj1UcnVlKToKJiM0MzsgICAgICAgIGlmIHEuZ2V0KCYjMzQ7cGFyZW50JiMzNDssICYjMzQ7JiMzNDspID09IHRhcmdldF9wYXJlbnQ6CiYjNDM7ICAgICAgICAgICAgcmV0dXJuIHEuZ2V0KCYjMzQ7YmFja2xvZyYjMzQ7KSBvciAwCiYjNDM7ICAgIHJldHVybiAwCiYjNDM7CiYjNDM7CiYjNDM7ZGVmIF9zZXR1cF9mcV9xZGlzYyhjZmcsIHBvcnQsIHRhcmdldF9xdWV1ZSwgb3RoZXJfcXVldWUsIGZsb3dfbGltaXQpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtQdXQgYW4gZnEgcWRpc2Mgb24gdGFyZ2V0X3F1ZXVlJiMzOTtzIGxlYWYgYW5kIHJldHVybiB0aGUgbXEgaGFuZGxlIGluIHVzZS4KJiM0MzsKJiM0MzsgICAgV2UgbXVzdCBub3QgZGlzdHVyYiB0aGUgZGV2aWNlJiMzOTtzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsCiYjNDM7ICAgIE5JQyB0aGUgcm9vdCBtcSBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzYWJsZSBoYW5kbGUsIHNvIHdlIGxlYXZlIHRoZSByb290CiYjNDM7ICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHMKJiM0MzsgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy4KJiM0MzsKJiM0MzsgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJiMzOTtzIHBlci1mbG93IHBhY2tldCBsaW1pdCAoZGVmYXVsdCAxMDApIHNvIGEgc2luZ2xlCiYjNDM7ICAgIGZsb3cgY2FuIGJhY2sgdXAgbW9yZSBwYWNrZXRzIHRoYW4gdGhlIFR4IHJpbmcgaG9sZHMgYW5kIHRodXMgb3ZlcmZsb3cgaXQuCiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0OwomIzQzOyAgICBxZGlzY3MgPSB0YyhmJiMzNDtxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX0mIzM0OywganNvbj1UcnVlKQomIzQzOyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoJiMzNDtyb290JiMzNDspKSwgTm9uZSkKJiM0MzsKJiM0MzsgICAgaWYgcm9vdCBhbmQgcm9vdFsmIzM0O2tpbmQmIzM0O10gPT0gJiMzNDttcSYjMzQ7IGFuZCByb290WyYjMzQ7aGFuZGxlJiMzNDtdICE9ICYjMzQ7MDomIzM0OzoKJiM0MzsgICAgICAgICMgQWRkcmVzc2FibGUgbXEgKHByZXZpb3VzbHktY29uZmlndXJlZCk6IHRvdWNoIG9ubHkgdGhlIHRhcmdldCBxdWV1ZSYjMzk7cwomIzQzOyAgICAgICAgIyBsZWFmIGFuZCByZXN0b3JlIGl0cyBvcmlnaW5hbCBxZGlzYyBhZnRlcndhcmRzLgomIzQzOyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFsmIzM0O2hhbmRsZSYjMzQ7XQomIzQzOyAgICAgICAgcGFyZW50ID0gZiYjMzQ7e21xX2hhbmRsZX17dGFyZ2V0X3F1ZXVlICYjNDM7IDE6eH0mIzM0OwomIzQzOyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KCYjMzQ7cGFyZW50JiMzNDspID09IHBhcmVudCksIE5vbmUpCiYjNDM7ICAgICAgICBvcmlnX2tpbmQgPSBvcmlnWyYjMzQ7a2luZCYjMzQ7XSBpZiBvcmlnIGVsc2UgXAomIzQzOyAgICAgICAgICAgIGNtZCgmIzM0O3N5c2N0bCAtbiBuZXQuY29yZS5kZWZhdWx0X3FkaXNjJiMzNDspLnN0ZG91dC5zdHJpcCgpCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHBhcmVudCB7cGFyZW50fSB7b3JpZ19raW5kfSYjMzQ7KQomIzQzOyAgICBlbGlmIHJvb3QgaXMgTm9uZSBvciByb290WyYjMzQ7a2luZCYjMzQ7XSBpbiAoJiMzNDttcSYjMzQ7LCAmIzM0O25vcXVldWUmIzM0Oyk6CiYjNDM7ICAgICAgICAjIFRoZSBhdXRvLWF0dGFjaGVkIHJvb3QgbXEgaGFzIGhhbmRsZSAwOiBvbiBhbnkgZGV2aWNlIChyZWFsIG9yIHNpbSksCiYjNDM7ICAgICAgICAjIHdoaWNoIHRoZSBrZXJuZWwgcmVqZWN0cyBhcyBhIHFkaXNjIHBhcmVudC4gQSAwOiBoYW5kbGUgbWVhbnMgdGhlIG1xCiYjNDM7ICAgICAgICAjIGlzIHRoZSB1bnRvdWNoZWQga2VybmVsIGRlZmF1bHQgLSBubyBjdXN0b20gY2hpbGQgcWRpc2NzIGNhbiBoYW5nIG9mZgomIzQzOyAgICAgICAgIyBhbiB1bmFkZHJlc3NhYmxlIHBhcmVudCAtIHNvIGluc3RhbGxpbmcgYSByZWFsIGhhbmRsZSBhbmQgcmVzdG9yaW5nCiYjNDM7ICAgICAgICAjIHRoZSBkZWZhdWx0IG1xIG9uIGV4aXQgcHJlc2VydmVzIHRoZSBkZXZpY2UmIzM5O3MgZWZmZWN0aXZlIHBvbGljeS4KJiM0MzsgICAgICAgIG1xX2hhbmRsZSA9ICYjMzQ7MTomIzM0OwomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgaGFuZGxlIHttcV9oYW5kbGV9IG1xJiMzNDspCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgbXEmIzM0OykKJiM0MzsgICAgICAgIHBhcmVudCA9IGYmIzM0O3ttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSAmIzQzOyAxOnh9JiMzNDsKJiM0MzsgICAgZWxzZToKJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoZiYjMzQ7cm9vdCBxZGlzYyAmIzM5O3tyb290WyYjMzk7a2luZCYjMzk7XX0mIzM5OyBpcyBub3QgbXE7ICYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICYjMzQ7cmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3kmIzM0OykKJiM0MzsKJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHBhcmVudCB7cGFyZW50fSBmcSAmIzM0OwomIzQzOyAgICAgICAgICAgZiYjMzQ7Zmxvd19saW1pdCB7Zmxvd19saW1pdH0gbGltaXQge2Zsb3dfbGltaXQgKiAyfSYjMzQ7KQomIzQzOyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKJiM0MzsgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoCiYjNDM7ICAgICAgICAgICAgZiYjMzQ7ZnEgbm90IGF2YWlsYWJsZSAoQ09ORklHX05FVF9TQ0hfRlEpOiB7ZXhjfSYjMzQ7KSBmcm9tIGV4YwomIzQzOwomIzQzOyAgICBxZGlzY19qID0gdGMoZiYjMzQ7cWRpc2Mgc2hvdyBkZXYge2NmZy5pZm5hbWV9JiMzNDssIGpzb249VHJ1ZSkKJiM0MzsgICAgaGFzX2Nsc2FjdCA9IGFueShxWyYjMzk7a2luZCYjMzk7XSA9PSAmIzM5O2Nsc2FjdCYjMzk7IGZvciBxIGluIHFkaXNjX2opCiYjNDM7ICAgIGlmIG5vdCBoYXNfY2xzYWN0OgomIzQzOyAgICAgICAgdGMoZiYjMzQ7cWRpc2MgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0JiMzNDspCiYjNDM7ICAgICAgICBkZWZlcih0YywgZiYjMzQ7cWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0JiMzNDspCiYjNDM7CiYjNDM7ICAgIHByb3RvID0gJiMzNDtpcHY2JiMzNDsgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgJiMzNDtpcCYjMzQ7CiYjNDM7ICAgIHRyeToKJiM0MzsgICAgICAgIHRjKGYmIzM0O2ZpbHRlciBhZGQgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJvdG9jb2wge3Byb3RvfSAmIzM0OwomIzQzOyAgICAgICAgICAgZiYjMzQ7cHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9ICYjMzQ7CiYjNDM7ICAgICAgICAgICBmJiMzNDthY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHt0YXJnZXRfcXVldWV9JiMzNDspCiYjNDM7ICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O3RjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlJiMzNDspIGZyb20gZXhjCiYjNDM7ICAgIGRlZmVyKHRjLCBmJiMzNDtmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMSYjMzQ7KQomIzQzOwomIzQzOyAgICB0YyhmJiMzNDtmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxICYjMzQ7CiYjNDM7ICAgICAgIGYmIzM0O21hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfSYjMzQ7KQomIzQzOyAgICBkZWZlcih0YywgZiYjMzQ7ZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSYjMzQ7KQomIzQzOwomIzQzOyAgICByZXR1cm4gbXFfaGFuZGxlCiYjNDM7CiYjNDM7CiYjNDM7ZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKToKJiM0MzsgICAgJiMzNDsmIzM0OyYjMzQ7Q3JlYXRlIGEgVURQIHNvY2tldCB3aXRoIFNPX1RYVElNRSBlbmFibGVkLCBib3VuZCB0byB0aGUgdGVzdCBkZXZpY2UuJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSAmIzM0OzYmIzM0OwomIzQzOyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKCYjMzQ7SWkmIzM0OywgMSwgMCkpCiYjNDM7ICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKJiM0MzsgICAgICAgIHNvY2suY2xvc2UoKQomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O1NPX1RYVElNRSBub3Qgc3VwcG9ydGVkJiMzNDspIGZyb20gZXhjCiYjNDM7ICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSwKJiM0MzsgICAgICAgICAgICAgICAgICAgIGNmZy5pZm5hbWUuZW5jb2RlKCkpCiYjNDM7ICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc28KJiM0MzsgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXMKJiM0MzsgICAgIyBuZXQuY29yZS53bWVtX21heCAodGhlIHRlc3QgcnVucyBhcyByb290KS4KJiM0MzsgICAgdHJ5OgomIzQzOyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKQomIzQzOyAgICBleGNlcHQgT1NFcnJvcjoKJiM0MzsgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKQomIzQzOyAgICByZXR1cm4gc29jawomIzQzOwomIzQzOwomIzQzO2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDtTZW5kIGNvdW50IFVEUCBwYWNrZXRzIHNjaGVkdWxlZCBkZWxheV9ucyBhaGVhZCB1c2luZyBTT19UWFRJTUUuJiMzNDsmIzM0OyYjMzQ7CiYjNDM7ICAgIHBheWxvYWQgPSBiJiMzOTtceDAwJiMzOTsgKiBwa3Rfc2l6ZQomIzQzOyAgICB0eHRpbWVfbnMgPSB0aW1lLmNsb2NrX2dldHRpbWVfbnModGltZS5DTE9DS19NT05PVE9OSUMpICYjNDM7IGRlbGF5X25zCiYjNDM7CiYjNDM7ICAgIGFuY2RhdGEgPSBbKHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKCYjMzQ7USYjMzQ7LCB0eHRpbWVfbnMpKV0KJiM0MzsgICAgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2OgomIzQzOyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQsIDAsIDApCiYjNDM7ICAgIGVsc2U6CiYjNDM7ICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCkKJiM0MzsgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgomIzQzOyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdCkKJiM0MzsKJiM0MzsKJiM0MztkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1NldCB0aGUgVHggcmluZyB0byB0aGUgc21hbGxlc3Qgc2l6ZSB0aGUgZHJpdmVyIGFjY2VwdHMuCiYjNDM7CiYjNDM7ICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCwKJiM0MzsgICAgMTI4LCAyNTYsIC4uLikgdXAgdG8gMTAyNC4gU29tZSBkcml2ZXJzIGVuZm9yY2UgYSBtaW5pbXVtIHdlbGwgYWJvdmUgMzIKJiM0MzsgICAgKGUuZy4gYm54dCBuZWVkcyBhIGxhcmdlIHJpbmcgZm9yIHNvZnR3YXJlIFVEUCBzZWdtZW50YXRpb24pLCBzbyByYWlzZQomIzQzOyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LgomIzQzOyAgICAmIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgc2l6ZSA9IE1JTl9UWF9SSU5HCiYjNDM7ICAgIHdoaWxlIHNpemUgJmx0Oz0gTUFYX1RYX1JJTkc6CiYjNDM7ICAgICAgICB0cnk6CiYjNDM7ICAgICAgICAgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsmIzM5O3R4JiMzOTs6IHNpemV9KQomIzQzOyAgICAgICAgICAgIHJldHVybiBzaXplCiYjNDM7ICAgICAgICBleGNlcHQgTmxFcnJvcjoKJiM0MzsgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDIKJiM0MzsgICAgICAgICAgICBjb250aW51ZQomIzQzOyAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7ZHJpdmVyIHJlamVjdHMgYWxsIHR4IHJpbmcgc2l6ZXMgdXAgdG8gMTAyNCYjMzQ7KQomIzQzOwomIzQzOwomIzQzO2RlZiByZWNvbmZpZ190eF9zdGFsbChjZmcpIC0mZ3Q7IE5vbmU6CiYjNDM7ICAgICYjMzQ7JiMzNDsmIzM0O1Rlc3QgdGhhdCBxZGlzYyBiYWNrbG9nIGRyYWlucyBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi4mIzM0OyYjMzQ7JiMzNDsKJiM0MzsgICAgdGFyZ2V0X3F1ZXVlID0gMQomIzQzOyAgICBvdGhlcl9xdWV1ZSA9IDAKJiM0MzsKJiM0MzsgICAgZWhkciA9IHsmIzM5O2hlYWRlciYjMzk7OiB7JiMzOTtkZXYtaW5kZXgmIzM5OzogY2ZnLmlmaW5kZXh9fQomIzQzOyAgICBjaGFucyA9IGNmZy5ldGguY2hhbm5lbHNfZ2V0KGVoZHIpCiYjNDM7CiYjNDM7ICAgIGlmICYjMzQ7Y29tYmluZWQtbWF4JiMzNDsgbm90IGluIGNoYW5zOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O2RldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNvbWJpbmVkIGNoYW5uZWxzJiMzNDspCiYjNDM7ICAgIGlmIGNoYW5zLmdldCgmIzM0O2NvbWJpbmVkLW1heCYjMzQ7LCAwKSAmbHQ7IDI6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7ZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMiYjNDM7IGNvbWJpbmVkIGNoYW5uZWxzJiMzNDspCiYjNDM7ICAgIGlmIGNoYW5zWyYjMzQ7Y29tYmluZWQtY291bnQmIzM0O10gJmx0OyAyOgomIzQzOyAgICAgICAgZGVmZXIoY2ZnLmV0aC5jaGFubmVsc19zZXQsCiYjNDM7ICAgICAgICAgICAgICBlaGRyIHwgeyYjMzQ7Y29tYmluZWQtY291bnQmIzM0OzogY2hhbnNbJiMzNDtjb21iaW5lZC1jb3VudCYjMzQ7XX0pCiYjNDM7ICAgICAgICBjZmcuZXRoLmNoYW5uZWxzX3NldChlaGRyIHwgeyYjMzQ7Y29tYmluZWQtY291bnQmIzM0OzogMn0pCiYjNDM7CiYjNDM7ICAgIHJpbmdzID0gY2ZnLmV0aC5yaW5nc19nZXQoZWhkcikKJiM0MzsgICAgaWYgJiMzOTtyeCYjMzk7IG5vdCBpbiByaW5ncyBvciAmIzM5O3R4JiMzOTsgbm90IGluIHJpbmdzOgomIzQzOyAgICAgICAgcmFpc2UgS3NmdFNraXBFeCgmIzM0O2RldmljZSBkb2VzIG5vdCBleHBvc2UgcngvdHggcmluZyBwYXJhbXMmIzM0OykKJiM0MzsgICAgdHhfY3VyID0gcmluZ3NbJiMzOTt0eCYjMzk7XQomIzQzOyAgICBpZiB0eF9jdXIgJmx0Oz0gTUlOX1RYX1JJTkc6CiYjNDM7ICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KCYjMzQ7dHggcmluZyBzaXplIGFscmVhZHkgYXQgbWluaW11bSYjMzQ7KQomIzQzOyAgICBkZWZlcihjZmcuZXRoLnJpbmdzX3NldCwgZWhkciB8IHsmIzM5O3R4JiMzOTs6IHR4X2N1cn0pCiYjNDM7CiYjNDM7ICAgICMgVXNlIHRoZSBzbWFsbGVzdCBUeCByaW5nIHRoZSBkcml2ZXIgYWNjZXB0cyAoMzIsIGdyb3dpbmcgdG8gMTAyNCkuCiYjNDM7ICAgIHR4X3JpbmcgPSBfc2V0X3NtYWxsX3R4X3JpbmcoY2ZnLCBlaGRyKQomIzQzOwomIzQzOyAgICAjIFNsb3cgY29tcGxldGlvbnMgc28gdGhlIHJpbmcgc3RheXMgZnVsbCBhZnRlciBGUSByZWxlYXNlcyBwYWNrZXRzCiYjNDM7ICAgIG5hcGlfZGVmZXIgPSBmJiMzNDsvc3lzL2NsYXNzL25ldC97Y2ZnLmlmbmFtZX0vbmFwaV9kZWZlcl9oYXJkX2lycXMmIzM0OwomIzQzOyAgICBncm9fdGltZW91dCA9IGYmIzM0Oy9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dCYjMzQ7CiYjNDM7ICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAxMDApCiYjNDM7ICAgIF93cml0ZV9zeXNmcyhncm9fdGltZW91dCwgMTAwMDAwMDAwMCkKJiM0MzsKJiM0MzsgICAgcG9ydCA9IHJhbmRfcG9ydCgpCiYjNDM7ICAgICMgQSBzaW5nbGUgZmxvdyBtdXN0IG92ZXJmbG93IHRoZSByaW5nLCBzbyBzZW5kIHR3aWNlIHRoZSByaW5nIGRlcHRoIGFuZAomIzQzOyAgICAjIGxldCBmcSBob2xkIHRoYXQgbWFueSBwYWNrZXRzIGZvciB0aGUgZmxvdy4KJiM0MzsgICAgcGt0X2NvdW50ID0gdHhfcmluZyAqIDIKJiM0MzsgICAgbXFfaGFuZGxlID0gX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfcmluZyAqIDIpCiYjNDM7CiYjNDM7ICAgICMgU2l6ZSBlYWNoIHBhY2tldCB0byBvbmUgTVRVIChsZXNzIEwzL0w0IGhlYWRlcnMgdG8gYXZvaWQgZnJhZ21lbnRhdGlvbikuCiYjNDM7ICAgIHBrdF9zaXplID0gY2ZnLmRldlsmIzM5O210dSYjMzk7XSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOCkKJiM0MzsKJiM0MzsgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc28KJiM0MzsgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LgomIzQzOyAgICBzb2NrID0gX2NyZWF0ZV9zb3R4dGltZV9zb2NrZXQoY2ZnLCBwa3RfY291bnQgKiBwa3Rfc2l6ZSAqIDIpCiYjNDM7ICAgIGRlZmVyKHNvY2suY2xvc2UpCiYjNDM7CiYjNDM7ICAgIGZvciBkZWxheV9tcyBpbiBbMTAwLCAyMDAsIDUwMF06CiYjNDM7ICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCwKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSkKJiM0MzsgICAgICAgIGtzZnRfcHIoZiYjMzQ7U2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoJiM0Mzt7ZGVsYXlfbXN9bXMpJiMzNDspCiYjNDM7ICAgICAgICB0aW1lLnNsZWVwKGRlbGF5X21zIC8gMTAwMCAmIzQzOyAwLjMpCiYjNDM7CiYjNDM7ICAgICAgICBiYWNrbG9nID0gX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCB0YXJnZXRfcXVldWUpCiYjNDM7ICAgICAgICBpZiBiYWNrbG9nOgomIzQzOyAgICAgICAgICAgIGJyZWFrCiYjNDM7ICAgIGVsc2U6CiYjNDM7ICAgICAgICAjIEEgZGV2aWNlIHRoYXQgY29tcGxldGVzIFR4IHN5bmNocm9ub3VzbHkgKGUuZy4gYSBzb2Z0d2FyZS92aXJ0dWFsCiYjNDM7ICAgICAgICAjIGRyaXZlciBsaWtlIG5ldGRldnNpbSkgbmV2ZXIga2VlcHMgdGhlIHJpbmcgZnVsbCBsb25nIGVub3VnaCBmb3IgYQomIzQzOyAgICAgICAgIyBiYWNrbG9nIHRvIGZvcm0sIHNvIHRoZSB3YWtlLXZzLXN0YXJ0IGJlaGF2aW9yIGNhbiYjMzk7dCBiZSBleGVyY2lzZWQuCiYjNDM7ICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS4KJiM0MzsgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KCYjMzQ7Y291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2cmIzM0OykKJiM0MzsKJiM0MzsgICAga3NmdF9wcihmJiMzNDtCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzJiMzNDspCiYjNDM7CiYjNDM7ICAgICMgVHJpZ2dlciByaW5nIHJlY29uZmlnIOKAlCBkcml2ZXIgc2hvdWxkIGNhbGwgd2FrZSwgbm90IGp1c3Qgc3RhcnQuCiYjNDM7ICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHMKJiM0MzsgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuCiYjNDM7ICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7JiMzOTt0eCYjMzk7OiB0eF9jdXJ9KQomIzQzOwomIzQzOyAgICAjIExldCBjb21wbGV0aW9ucyBwcm9jZWVkIG5vcm1hbGx5CiYjNDM7ICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAwKQomIzQzOyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApCiYjNDM7CiYjNDM7ICAgICMgUG9sbCBmb3IgYmFja2xvZyB0byBkcmFpbgomIzQzOyAgICBmb3IgXyBpbiByYW5nZSgxMDApOgomIzQzOyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKQomIzQzOyAgICAgICAgaWYgbm90IGJhY2tsb2c6CiYjNDM7ICAgICAgICAgICAgYnJlYWsKJiM0MzsgICAgICAgIHRpbWUuc2xlZXAoMC4xKQomIzQzOwomIzQzOyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csCiYjNDM7ICAgICAgICAgICAgY29tbWVudD1mJiMzNDtxZGlzYyBiYWNrbG9nIHN0dWNrIG9uIHF1ZXVlIHt0YXJnZXRfcXVldWV9ICYjMzQ7CiYjNDM7ICAgICAgICAgICAgICAgICAgICBmJiMzNDthZnRlciByaW5nIHJlY29uZmlnJiMzNDspCiYjNDM7CiYjNDM7CiBkZWYgbWFpbigpIC0mZ3Q7IE5vbmU6CiAgICAgJiMzNDsmIzM0OyYjMzQ7IEtzZnQgYm9pbGVyIHBsYXRlIG1haW4gJiMzNDsmIzM0OyYjMzQ7CiAKLSAgICB3aXRoIE5ldERydkVwRW52KF9fZmlsZV9fKSBhcyBjZmc6CiYjNDM7ICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzoKICAgICAgICAgY2ZnLmV0aCA9IEV0aHRvb2xGYW1pbHkoKQogCiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscywKLSAgICAgICAgICAgICAgICAgIHJpbmdwYXJhbV0sCiYjNDM7ICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtLAomIzQzOyAgICAgICAgICAgICAgICAgIHJlY29uZmlnX3R4X3N0YWxsXSwKICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKQogICAgIGtzZnRfZXhpdCgpCiAKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjU1NQoJCQkJCQkJb3V0cHV0OiA3MQoJCQkJCQkJdGhvdWdodHM6IDU5MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIEV2YWx1YXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgJiMzNDtBaCwgaXQmIzM5O3MgbWVzc2luZyB3aXRoIGEgc2VsZnRlc3QsIHNwZWNpZmljYWxseSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWAmIzM0Oy4gSSBzZWUgaXQmIzM5O3MgYWRkaW5nIGEgbmV3IHRlc3QgZnVuY3Rpb24sIGByZWNvbmZpZ190eF9zdGFsbGAsIHRvIGNoZWNrIHFkaXNjIGJhY2tsb2cgZHJhaW5hZ2UgYWZ0ZXIgcmluZyByZWNvbmZpZ3VyYXRpb24uIEl0IGFsc28gdG91Y2hlcyBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnYCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlgLiBJJiMzOTttIHN0YXJ0aW5nIHRvIGFzc2VzcyBpZiB0aGlzIG5lZWRzIHRvIGJlIGZ1enplZC4KCldhaXQgYSBzZWNvbmQuLi4gaXQmIzM5O3MgKm9ubHkqIG1vZGlmeWluZyBmaWxlcyB3aXRoaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuIE5vIGNvcmUga2VybmVsIGxvZ2ljLCBubyBkcml2ZXJzLCBubyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBpcyBiZWluZyB0b3VjaGVkLiBUaGUgcHJvbXB0IHNwZWNpZmljYWxseSBzYXlzICYjMzQ7UmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWlucy4uLiBtb2RpZmljYXRpb25zIHRvLi4uIGNvZGUgY29tbWVudHMuLi4mIzM0Oy4gU2VsZnRlc3RzLCBieSB0aGVpciBuYXR1cmUsIGFyZSB1c2VyLXNwYWNlIHRlc3RzLCBub3QgY29yZSBrZXJuZWwgY29tcG9uZW50cy4gU28sIG5vLCB0aGlzIGRvZXMgbm90IGxvb2sgbGlrZSBpdCBuZWVkcyB0byBiZSBmdXp6ZWQuCgpJIG5lZWQgdG8gY29uZmlybSB0aGF0IG15IGluaXRpYWwgYXNzZXNzbWVudCBpcyBjb3JyZWN0LiBMZXQmIzM5O3MgbWFrZSBzdXJlIEkmIzM5O20gbm90IG1pc3NpbmcgYW55dGhpbmcuIEdvaW5nIGJhY2sgYW5kIHJlLWV4YW1pbmluZyB0aGUgcGF0Y2gsIEkgY2FuIHNlZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBjb25maW5lZCB0byB0aGUgZm9sbG93aW5nIGZpbGVzOiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnYCwgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlgLCBhbmQgYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlgLiBBbGwgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2AuCgpPa2F5LCBubywgSSYjMzk7bSBjb25maWRlbnQuIFRoaXMgcGF0Y2ggb25seSBkZWFscyB3aXRoIHVzZXJzcGFjZSB0ZXN0IHNjcmlwdHMgYW5kIGNvbmZpZ3VyYXRpb24uIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZiB0aGF0IHJlcXVpcmUgZnV6emluZy4KClRoZXJlZm9yZSwgSSYjMzk7bSBnb2luZyB0byByZXR1cm4gYFdvcnRoRnV6emluZz1mYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDEgMTE6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogbnVsbCwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6Mjk6NTkuNzc5MDc3MzM0WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODc1ODc0NTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBudWxsLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb25seSBtb2RpZmllcyB1c2Vyc3BhY2Ugc2VsZnRlc3Qgc2NyaXB0cyBhbmQgdGhlaXIgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy8uIEl0IGRvZXMgbm90IG1ha2UgYW55IGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUgY29yZSBrZXJuZWwsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZSBjb2RlLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6Mjk6NTkuNzc5MDg3NjE0WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NTA3NjU2NTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAxNzg1NGIxZDE3NzAzNDJhNDkyNmU2ODRlNDRmOGRhOTRhZjkwN2I2XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBTYXQgQXVnIDEgMTE6Mjk6NTggMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXFxuaW5kZXggMjA3MGU4OTBlMDY0ZS4uZjM5MzNjZjNlNmJlNiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcXG5AQCAtNCw4ICs0LDExIEBAIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTPW5cXG4gQ09ORklHX0lORVRfUFNQPXlcXG4gQ09ORklHX0lQVjY9eVxcbiBDT05GSUdfTUFDU0VDPW1cXG4rQ09ORklHX05FVF9BQ1RfU0tCRURJVD1tXFxuIENPTkZJR19ORVRfQ0xTX0FDVD15XFxuIENPTkZJR19ORVRfQ0xTX0JQRj15XFxuK0NPTkZJR19ORVRfQ0xTX0ZMT1dFUj1tXFxuK0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cXG4gQ09ORklHX05FVENPTlNPTEU9bVxcbiBDT05GSUdfTkVUQ09OU09MRV9EWU5BTUlDPXlcXG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcXG5pbmRleCBlNGFjZjNkODMzM2ZkLi5iMWM2ZjZjZWY3ZGQyIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5XFxuQEAgLTExNCwxMCArMTE0LDExIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxcbiAgICAgbnNpbV92NF9wZnggPSBcXFwiMTkyLjAuMi5cXFwiXFxuICAgICBuc2ltX3Y2X3BmeCA9IFxcXCIyMDAxOmRiODo6XFxcIlxcbiBcXG4tICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcmNfcGF0aCwgbnNpbV90ZXN0PU5vbmUpOlxcbisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XFxuICAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhzcmNfcGF0aClcXG4gXFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXFxuKyAgICAgICAgc2VsZi5fcXVldWVfY291bnQgPSBxdWV1ZV9jb3VudFxcbiBcXG4gICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveVxcbiAgICAgICAgIHNlbGYucmVtb3RlID0gTm9uZVxcbkBAIC0xNzMsOSArMTc0LDEzIEBAIGNsYXNzIE5ldERydkVwRW52KE5ldERydkVudkJhc2UpOlxcbiAgICAgICAgIHNlbGYuX3JlcXVpcmVkX2NtZCA9IHt9XFxuIFxcbiAgICAgZGVmIGNyZWF0ZV9sb2NhbChzZWxmKTpcXG4rICAgICAgICBuc2ltX2t3YXJncyA9IHt9XFxuKyAgICAgICAgaWYgc2VsZi5fcXVldWVfY291bnQ6XFxuKyAgICAgICAgICAgIG5zaW1fa3dhcmdzW1xcXCJxdWV1ZV9jb3VudFxcXCJdID0gc2VsZi5fcXVldWVfY291bnRcXG4rXFxuICAgICAgICAgc2VsZi5fbmV0bnMgPSBOZXROUygpXFxuLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKVxcbi0gICAgICAgIHNlbGYuX25zX3BlZXIgPSBOZXRkZXZTaW1EZXYobnM9c2VsZi5fbmV0bnMpXFxuKyAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKipuc2ltX2t3YXJncylcXG4rICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zLCAqKm5zaW1fa3dhcmdzKVxcbiBcXG4gICAgICAgICB3aXRoIG9wZW4oXFxcIi9wcm9jL3NlbGYvbnMvbmV0XFxcIikgYXMgbnNmZDAsIFxcXFxcXG4gICAgICAgICAgICAgIG9wZW4oXFxcIi92YXIvcnVuL25ldG5zL1xcXCIgKyBzZWxmLl9uZXRucy5uYW1lKSBhcyBuc2ZkMTpcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlcXG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHlcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XFxuQEAgLTUsMTAgKzUsMjUgQEBcXG4gVGVzdCBjaGFubmVsIGFuZCByaW5nIHNpemUgY29uZmlndXJhdGlvbiB2aWEgZXRodG9vbCAoLUwgLyAtRykuXFxuIFxcXCJcXFwiXFxcIlxcbiBcXG4raW1wb3J0IHNvY2tldFxcbitpbXBvcnQgc3RydWN0XFxuK2ltcG9ydCB0aW1lXFxuK1xcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9ydW4sIGtzZnRfZXhpdCwga3NmdF9wclxcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9lcVxcbitmcm9tIGxpYi5weSBpbXBvcnQgS3NmdFNraXBFeCwgS3NmdFhmYWlsRXhcXG4gZnJvbSBsaWIucHkgaW1wb3J0IE5ldERydkVwRW52LCBFdGh0b29sRmFtaWx5LCBHZW5lcmF0ZVRyYWZmaWNcXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXFxuK2Zyb20gbGliLnB5IGltcG9ydCBjbWQsIGRlZmVyLCByYW5kX3BvcnQsIHRjLCBObEVycm9yXFxuK1xcbisjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXFxuK1NPX1RYVElNRSA9IGdldGF0dHIoc29ja2V0LCBcXFwiU09fVFhUSU1FXFxcIiwgNjEpXFxuK1xcbisjIE5vdCBhbHdheXMgZXhwb3J0ZWQgYnkgdGhlIHNvY2tldCBtb2R1bGU7IGFzbS1nZW5lcmljIHZhbHVlICh4ODYvQVJNL01JUFMpLlxcbitTT19TTkRCVUZGT1JDRSA9IGdldGF0dHIoc29ja2V0LCBcXFwiU09fU05EQlVGRk9SQ0VcXFwiLCAzMilcXG4rXFxuKyMgVFggcmluZyBzaXplIHRoZSB0ZXN0IHNocmlua3MgdG8gc28gdGhlIHJpbmcgZmlsbHMgcXVpY2tseS5cXG4rTUlOX1RYX1JJTkcgPSAzMlxcbitNQVhfVFhfUklORyA9IDEwMjRcXG4gXFxuIFxcbiBkZWYgY2hhbm5lbHMoY2ZnKSAtXFx1MDAzZSBOb25lOlxcbkBAIC0xNTEsMTQgKzE2NiwyNDggQEAgZGVmIHJpbmdwYXJhbShjZmcpIC1cXHUwMDNlIE5vbmU6XFxuICAgICAgICAgR2VuZXJhdGVUcmFmZmljKGNmZykud2FpdF9wa3RzX2FuZF9zdG9wKDEwMDAwKVxcbiBcXG4gXFxuK2RlZiBfd3JpdGVfZmlsZShwYXRoLCB2YWwpOlxcbisgICAgXFxcIlxcXCJcXFwiV3JpdGUgdmFsIHRvIGEgZmlsZS5cXFwiXFxcIlxcXCJcXG4rICAgIHdpdGggb3BlbihwYXRoLCBcXFwid1xcXCIsIGVuY29kaW5nPVxcXCJ1dGYtOFxcXCIpIGFzIGZwOlxcbisgICAgICAgIGZwLndyaXRlKHN0cih2YWwpKVxcbitcXG4rXFxuK2RlZiBfd3JpdGVfc3lzZnMocGF0aCwgdmFsKTpcXG4rICAgIFxcXCJcXFwiXFxcIldyaXRlIHZhbCB0byBhIHN5c2ZzIGZpbGUsIHJlc3RvcmluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb24gZXhpdC5cXFwiXFxcIlxcXCJcXG4rICAgIHdpdGggb3BlbihwYXRoLCBcXFwiclxcXCIsIGVuY29kaW5nPVxcXCJ1dGYtOFxcXCIpIGFzIGZwOlxcbisgICAgICAgIG9yaWdfdmFsID0gZnAucmVhZCgpLnN0cmlwKClcXG4rICAgIGlmIHN0cih2YWwpID09IG9yaWdfdmFsOlxcbisgICAgICAgIHJldHVyblxcbisgICAgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKVxcbisgICAgZGVmZXIoX3dyaXRlX2ZpbGUsIHBhdGgsIG9yaWdfdmFsKVxcbitcXG4rXFxuK2RlZiBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHF1ZXVlKTpcXG4rICAgIFxcXCJcXFwiXFxcIlJldHVybiB0aGUgcWRpc2MgYmFja2xvZyAoYnl0ZXMpIGZvciB0aGUgZ2l2ZW4gVFggcXVldWUncyBsZWFmLlxcXCJcXFwiXFxcIlxcbisgICAgdGFyZ2V0X3BhcmVudCA9IGZcXFwie21xX2hhbmRsZX17cXVldWUgKyAxOnh9XFxcIlxcbisgICAgZm9yIHEgaW4gdGMoZlxcXCItcyBxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cXFwiLCBqc29uPVRydWUpOlxcbisgICAgICAgIGlmIHEuZ2V0KFxcXCJwYXJlbnRcXFwiLCBcXFwiXFxcIikgPT0gdGFyZ2V0X3BhcmVudDpcXG4rICAgICAgICAgICAgcmV0dXJuIHEuZ2V0KFxcXCJiYWNrbG9nXFxcIikgb3IgMFxcbisgICAgcmV0dXJuIDBcXG4rXFxuK1xcbitkZWYgX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwgZmxvd19saW1pdCk6XFxuKyAgICBcXFwiXFxcIlxcXCJQdXQgYW4gZnEgcWRpc2Mgb24gdGFyZ2V0X3F1ZXVlJ3MgbGVhZiBhbmQgcmV0dXJuIHRoZSBtcSBoYW5kbGUgaW4gdXNlLlxcbitcXG4rICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSdzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsXFxuKyAgICBOSUMgdGhlIHJvb3QgbXEgYWxyZWFkeSBoYXMgYW4gYWRkcmVzc2FibGUgaGFuZGxlLCBzbyB3ZSBsZWF2ZSB0aGUgcm9vdFxcbisgICAgYW5kIGV2ZXJ5IG90aGVyIHF1ZXVlIGFsb25lIGFuZCBvbmx5IHN3YXAgdGhpcyBvbmUgbGVhZiwgcmVzdG9yaW5nIGl0c1xcbisgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cXG4rXFxuKyAgICBAZmxvd19saW1pdCByYWlzZXMgZnEncyBwZXItZmxvdyBwYWNrZXQgbGltaXQgKGRlZmF1bHQgMTAwKSBzbyBhIHNpbmdsZVxcbisgICAgZmxvdyBjYW4gYmFjayB1cCBtb3JlIHBhY2tldHMgdGhhbiB0aGUgVHggcmluZyBob2xkcyBhbmQgdGh1cyBvdmVyZmxvdyBpdC5cXG4rICAgIFxcXCJcXFwiXFxcIlxcbisgICAgcWRpc2NzID0gdGMoZlxcXCJxZGlzYyBzaG93IGRldiB7Y2ZnLmlmbmFtZX1cXFwiLCBqc29uPVRydWUpXFxuKyAgICByb290ID0gbmV4dCgocSBmb3IgcSBpbiBxZGlzY3MgaWYgcS5nZXQoXFxcInJvb3RcXFwiKSksIE5vbmUpXFxuK1xcbisgICAgaWYgcm9vdCBhbmQgcm9vdFtcXFwia2luZFxcXCJdID09IFxcXCJtcVxcXCIgYW5kIHJvb3RbXFxcImhhbmRsZVxcXCJdICE9IFxcXCIwOlxcXCI6XFxuKyAgICAgICAgIyBBZGRyZXNzYWJsZSBtcSAocHJldmlvdXNseS1jb25maWd1cmVkKTogdG91Y2ggb25seSB0aGUgdGFyZ2V0IHF1ZXVlJ3NcXG4rICAgICAgICAjIGxlYWYgYW5kIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHFkaXNjIGFmdGVyd2FyZHMuXFxuKyAgICAgICAgbXFfaGFuZGxlID0gcm9vdFtcXFwiaGFuZGxlXFxcIl1cXG4rICAgICAgICBwYXJlbnQgPSBmXFxcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cXFwiXFxuKyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFxcXCJwYXJlbnRcXFwiKSA9PSBwYXJlbnQpLCBOb25lKVxcbisgICAgICAgIG9yaWdfa2luZCA9IG9yaWdbXFxcImtpbmRcXFwiXSBpZiBvcmlnIGVsc2UgXFxcXFxcbisgICAgICAgICAgICBjbWQoXFxcInN5c2N0bCAtbiBuZXQuY29yZS5kZWZhdWx0X3FkaXNjXFxcIikuc3Rkb3V0LnN0cmlwKClcXG4rICAgICAgICBkZWZlcih0YywgZlxcXCJxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcGFyZW50IHtwYXJlbnR9IHtvcmlnX2tpbmR9XFxcIilcXG4rICAgIGVsaWYgcm9vdCBpcyBOb25lIG9yIHJvb3RbXFxcImtpbmRcXFwiXSBpbiAoXFxcIm1xXFxcIiwgXFxcIm5vcXVldWVcXFwiKTpcXG4rICAgICAgICAjIFRoZSBhdXRvLWF0dGFjaGVkIHJvb3QgbXEgaGFzIGhhbmRsZSAwOiBvbiBhbnkgZGV2aWNlIChyZWFsIG9yIHNpbSksXFxuKyAgICAgICAgIyB3aGljaCB0aGUga2VybmVsIHJlamVjdHMgYXMgYSBxZGlzYyBwYXJlbnQuIEEgMDogaGFuZGxlIG1lYW5zIHRoZSBtcVxcbisgICAgICAgICMgaXMgdGhlIHVudG91Y2hlZCBrZXJuZWwgZGVmYXVsdCAtIG5vIGN1c3RvbSBjaGlsZCBxZGlzY3MgY2FuIGhhbmcgb2ZmXFxuKyAgICAgICAgIyBhbiB1bmFkZHJlc3NhYmxlIHBhcmVudCAtIHNvIGluc3RhbGxpbmcgYSByZWFsIGhhbmRsZSBhbmQgcmVzdG9yaW5nXFxuKyAgICAgICAgIyB0aGUgZGVmYXVsdCBtcSBvbiBleGl0IHByZXNlcnZlcyB0aGUgZGV2aWNlJ3MgZWZmZWN0aXZlIHBvbGljeS5cXG4rICAgICAgICBtcV9oYW5kbGUgPSBcXFwiMTpcXFwiXFxuKyAgICAgICAgdGMoZlxcXCJxZGlzYyByZXBsYWNlIGRldiB7Y2ZnLmlmbmFtZX0gcm9vdCBoYW5kbGUge21xX2hhbmRsZX0gbXFcXFwiKVxcbisgICAgICAgIGRlZmVyKHRjLCBmXFxcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSByb290IG1xXFxcIilcXG4rICAgICAgICBwYXJlbnQgPSBmXFxcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cXFwiXFxuKyAgICBlbHNlOlxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoZlxcXCJyb290IHFkaXNjICd7cm9vdFsna2luZCddfScgaXMgbm90IG1xOyBcXFwiXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicmVmdXNpbmcgdG8gZGlzdHVyYiBleGlzdGluZyBxZGlzYyBwb2xpY3lcXFwiKVxcbitcXG4rICAgIHRyeTpcXG4rICAgICAgICB0YyhmXFxcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0gZnEgXFxcIlxcbisgICAgICAgICAgIGZcXFwiZmxvd19saW1pdCB7Zmxvd19saW1pdH0gbGltaXQge2Zsb3dfbGltaXQgKiAyfVxcXCIpXFxuKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcXG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFxcbisgICAgICAgICAgICBmXFxcImZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cXFwiKSBmcm9tIGV4Y1xcbitcXG4rICAgIHFkaXNjX2ogPSB0YyhmXFxcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVxcXCIsIGpzb249VHJ1ZSlcXG4rICAgIGhhc19jbHNhY3QgPSBhbnkocVsna2luZCddID09ICdjbHNhY3QnIGZvciBxIGluIHFkaXNjX2opXFxuKyAgICBpZiBub3QgaGFzX2Nsc2FjdDpcXG4rICAgICAgICB0YyhmXFxcInFkaXNjIGFkZCBkZXYge2NmZy5pZm5hbWV9IGNsc2FjdFxcXCIpXFxuKyAgICAgICAgZGVmZXIodGMsIGZcXFwicWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XFxcIilcXG4rXFxuKyAgICBwcm90byA9IFxcXCJpcHY2XFxcIiBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSBcXFwiaXBcXFwiXFxuKyAgICB0cnk6XFxuKyAgICAgICAgdGMoZlxcXCJmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByb3RvY29sIHtwcm90b30gXFxcIlxcbisgICAgICAgICAgIGZcXFwicHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9IFxcXCJcXG4rICAgICAgICAgICBmXFxcImFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge3RhcmdldF9xdWV1ZX1cXFwiKVxcbisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwidGMgZmxvd2VyL2FjdF9za2JlZGl0IG5vdCBhdmFpbGFibGVcXFwiKSBmcm9tIGV4Y1xcbisgICAgZGVmZXIodGMsIGZcXFwiZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDFcXFwiKVxcbitcXG4rICAgIHRjKGZcXFwiZmlsdGVyIGFkZCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMSBcXFwiXFxuKyAgICAgICBmXFxcIm1hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfVxcXCIpXFxuKyAgICBkZWZlcih0YywgZlxcXCJmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxXFxcIilcXG4rXFxuKyAgICByZXR1cm4gbXFfaGFuZGxlXFxuK1xcbitcXG4rZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKTpcXG4rICAgIFxcXCJcXFwiXFxcIkNyZWF0ZSBhIFVEUCBzb2NrZXQgd2l0aCBTT19UWFRJTUUgZW5hYmxlZCwgYm91bmQgdG8gdGhlIHRlc3QgZGV2aWNlLlxcXCJcXFwiXFxcIlxcbisgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2IGlmIGNmZy5hZGRyX2lwdmVyID09IFxcXCI2XFxcIlxcbisgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pXFxuKyAgICB0cnk6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKFxcXCJJaVxcXCIsIDEsIDApKVxcbisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOlxcbisgICAgICAgIHNvY2suY2xvc2UoKVxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcIlNPX1RYVElNRSBub3Qgc3VwcG9ydGVkXFxcIikgZnJvbSBleGNcXG4rICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSxcXG4rICAgICAgICAgICAgICAgICAgICBjZmcuaWZuYW1lLmVuY29kZSgpKVxcbisgICAgIyBEZWZlcnJlZCBjb21wbGV0aW9ucyBrZWVwIGV2ZXJ5IGluLWZsaWdodCBza2IgY2hhcmdlZCB0byB0aGUgc29ja2V0LCBzb1xcbisgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXNcXG4rICAgICMgbmV0LmNvcmUud21lbV9tYXggKHRoZSB0ZXN0IHJ1bnMgYXMgcm9vdCkuXFxuKyAgICB0cnk6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKVxcbisgICAgZXhjZXB0IE9TRXJyb3I6XFxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fU05EQlVGLCBzbmRidWYpXFxuKyAgICByZXR1cm4gc29ja1xcbitcXG4rXFxuK2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOlxcbisgICAgXFxcIlxcXCJcXFwiU2VuZCBjb3VudCBVRFAgcGFja2V0cyBzY2hlZHVsZWQgZGVsYXlfbnMgYWhlYWQgdXNpbmcgU09fVFhUSU1FLlxcXCJcXFwiXFxcIlxcbisgICAgcGF5bG9hZCA9IGInXFxcXHgwMCcgKiBwa3Rfc2l6ZVxcbisgICAgdHh0aW1lX25zID0gdGltZS5jbG9ja19nZXR0aW1lX25zKHRpbWUuQ0xPQ0tfTU9OT1RPTklDKSArIGRlbGF5X25zXFxuK1xcbisgICAgYW5jZGF0YSA9IFsoc29ja2V0LlNPTF9TT0NLRVQsIFNPX1RYVElNRSwgc3RydWN0LnBhY2soXFxcIlFcXFwiLCB0eHRpbWVfbnMpKV1cXG4rICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcXG4rICAgICAgICBkZXN0ID0gKGNmZy5yZW1vdGVfYWRkciwgcG9ydCwgMCwgMClcXG4rICAgIGVsc2U6XFxuKyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXFxuKyAgICBmb3IgXyBpbiByYW5nZShjb3VudCk6XFxuKyAgICAgICAgc29jay5zZW5kbXNnKFtwYXlsb2FkXSwgYW5jZGF0YSwgMCwgZGVzdClcXG4rXFxuK1xcbitkZWYgX3NldF9zbWFsbF90eF9yaW5nKGNmZywgZWhkcik6XFxuKyAgICBcXFwiXFxcIlxcXCJTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxcbitcXG4rICAgIFN0YXJ0IGF0IDMyIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHksIHRoZW4gZ3JvdyBleHBvbmVudGlhbGx5ICg2NCxcXG4rICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXFxuKyAgICAoZS5nLiBibnh0IG5lZWRzIGEgbGFyZ2UgcmluZyBmb3Igc29mdHdhcmUgVURQIHNlZ21lbnRhdGlvbiksIHNvIHJhaXNlXFxuKyAgICB0aGUgbG93ZXIgYm91bmQgdW50aWwgdGhlIGRyaXZlciBhY2NlcHRzIGl0LCBnaXZpbmcgdXAgcGFzdCAxMDI0LlxcbisgICAgXFxcIlxcXCJcXFwiXFxuKyAgICBzaXplID0gTUlOX1RYX1JJTkdcXG4rICAgIHdoaWxlIHNpemUgXFx1MDAzYz0gTUFYX1RYX1JJTkc6XFxuKyAgICAgICAgdHJ5OlxcbisgICAgICAgICAgICBjZmcuZXRoLnJpbmdzX3NldChlaGRyIHwgeyd0eCc6IHNpemV9KVxcbisgICAgICAgICAgICByZXR1cm4gc2l6ZVxcbisgICAgICAgIGV4Y2VwdCBObEVycm9yOlxcbisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDJcXG4rICAgICAgICAgICAgY29udGludWVcXG4rICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcImRyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcXFwiKVxcbitcXG4rXFxuK2RlZiByZWNvbmZpZ190eF9zdGFsbChjZmcpIC1cXHUwMDNlIE5vbmU6XFxuKyAgICBcXFwiXFxcIlxcXCJUZXN0IHRoYXQgcWRpc2MgYmFja2xvZyBkcmFpbnMgYWZ0ZXIgcmluZyByZWNvbmZpZ3VyYXRpb24uXFxcIlxcXCJcXFwiXFxuKyAgICB0YXJnZXRfcXVldWUgPSAxXFxuKyAgICBvdGhlcl9xdWV1ZSA9IDBcXG4rXFxuKyAgICBlaGRyID0geydoZWFkZXInOiB7J2Rldi1pbmRleCc6IGNmZy5pZmluZGV4fX1cXG4rICAgIGNoYW5zID0gY2ZnLmV0aC5jaGFubmVsc19nZXQoZWhkcilcXG4rXFxuKyAgICBpZiBcXFwiY29tYmluZWQtbWF4XFxcIiBub3QgaW4gY2hhbnM6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tYmluZWQgY2hhbm5lbHNcXFwiKVxcbisgICAgaWYgY2hhbnMuZ2V0KFxcXCJjb21iaW5lZC1tYXhcXFwiLCAwKSBcXHUwMDNjIDI6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgMisgY29tYmluZWQgY2hhbm5lbHNcXFwiKVxcbisgICAgaWYgY2hhbnNbXFxcImNvbWJpbmVkLWNvdW50XFxcIl0gXFx1MDAzYyAyOlxcbisgICAgICAgIGRlZmVyKGNmZy5ldGguY2hhbm5lbHNfc2V0LFxcbisgICAgICAgICAgICAgIGVoZHIgfCB7XFxcImNvbWJpbmVkLWNvdW50XFxcIjogY2hhbnNbXFxcImNvbWJpbmVkLWNvdW50XFxcIl19KVxcbisgICAgICAgIGNmZy5ldGguY2hhbm5lbHNfc2V0KGVoZHIgfCB7XFxcImNvbWJpbmVkLWNvdW50XFxcIjogMn0pXFxuK1xcbisgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxcbisgICAgaWYgJ3J4JyBub3QgaW4gcmluZ3Mgb3IgJ3R4JyBub3QgaW4gcmluZ3M6XFxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcXFwiZGV2aWNlIGRvZXMgbm90IGV4cG9zZSByeC90eCByaW5nIHBhcmFtc1xcXCIpXFxuKyAgICB0eF9jdXIgPSByaW5nc1sndHgnXVxcbisgICAgaWYgdHhfY3VyIFxcdTAwM2M9IE1JTl9UWF9SSU5HOlxcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXFxcInR4IHJpbmcgc2l6ZSBhbHJlYWR5IGF0IG1pbmltdW1cXFwiKVxcbisgICAgZGVmZXIoY2ZnLmV0aC5yaW5nc19zZXQsIGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcXG4rXFxuKyAgICAjIFVzZSB0aGUgc21hbGxlc3QgVHggcmluZyB0aGUgZHJpdmVyIGFjY2VwdHMgKDMyLCBncm93aW5nIHRvIDEwMjQpLlxcbisgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXFxuK1xcbisgICAgIyBTbG93IGNvbXBsZXRpb25zIHNvIHRoZSByaW5nIHN0YXlzIGZ1bGwgYWZ0ZXIgRlEgcmVsZWFzZXMgcGFja2V0c1xcbisgICAgbmFwaV9kZWZlciA9IGZcXFwiL3N5cy9jbGFzcy9uZXQve2NmZy5pZm5hbWV9L25hcGlfZGVmZXJfaGFyZF9pcnFzXFxcIlxcbisgICAgZ3JvX3RpbWVvdXQgPSBmXFxcIi9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9ncm9fZmx1c2hfdGltZW91dFxcXCJcXG4rICAgIF93cml0ZV9zeXNmcyhuYXBpX2RlZmVyLCAxMDApXFxuKyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDEwMDAwMDAwMDApXFxuK1xcbisgICAgcG9ydCA9IHJhbmRfcG9ydCgpXFxuKyAgICAjIEEgc2luZ2xlIGZsb3cgbXVzdCBvdmVyZmxvdyB0aGUgcmluZywgc28gc2VuZCB0d2ljZSB0aGUgcmluZyBkZXB0aCBhbmRcXG4rICAgICMgbGV0IGZxIGhvbGQgdGhhdCBtYW55IHBhY2tldHMgZm9yIHRoZSBmbG93LlxcbisgICAgcGt0X2NvdW50ID0gdHhfcmluZyAqIDJcXG4rICAgIG1xX2hhbmRsZSA9IF9zZXR1cF9mcV9xZGlzYyhjZmcsIHBvcnQsIHRhcmdldF9xdWV1ZSwgb3RoZXJfcXVldWUsXFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nICogMilcXG4rXFxuKyAgICAjIFNpemUgZWFjaCBwYWNrZXQgdG8gb25lIE1UVSAobGVzcyBMMy9MNCBoZWFkZXJzIHRvIGF2b2lkIGZyYWdtZW50YXRpb24pLlxcbisgICAgcGt0X3NpemUgPSBjZmcuZGV2WydtdHUnXSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOClcXG4rXFxuKyAgICAjIEVhY2ggcXVldWVkIHNrYiBjaGFyZ2VzIHRoZSBzb2NrZXQgaXRzIHRydWVzaXplICh+MnggdGhlIHBheWxvYWQpLCBzb1xcbisgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LlxcbisgICAgc29jayA9IF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgcGt0X2NvdW50ICogcGt0X3NpemUgKiAyKVxcbisgICAgZGVmZXIoc29jay5jbG9zZSlcXG4rXFxuKyAgICBmb3IgZGVsYXlfbXMgaW4gWzEwMCwgMjAwLCA1MDBdOlxcbisgICAgICAgIF9zZW5kX3NvdHh0aW1lX2J1cnN0KGNmZywgc29jaywgcG9ydCwgcGt0X2NvdW50LFxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSlcXG4rICAgICAgICBrc2Z0X3ByKGZcXFwiU2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoK3tkZWxheV9tc31tcylcXFwiKVxcbisgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICsgMC4zKVxcbitcXG4rICAgICAgICBiYWNrbG9nID0gX2dldF9xZGlzY19iYWNrbG9nKGNmZywgbXFfaGFuZGxlLCB0YXJnZXRfcXVldWUpXFxuKyAgICAgICAgaWYgYmFja2xvZzpcXG4rICAgICAgICAgICAgYnJlYWtcXG4rICAgIGVsc2U6XFxuKyAgICAgICAgIyBBIGRldmljZSB0aGF0IGNvbXBsZXRlcyBUeCBzeW5jaHJvbm91c2x5IChlLmcuIGEgc29mdHdhcmUvdmlydHVhbFxcbisgICAgICAgICMgZHJpdmVyIGxpa2UgbmV0ZGV2c2ltKSBuZXZlciBrZWVwcyB0aGUgcmluZyBmdWxsIGxvbmcgZW5vdWdoIGZvciBhXFxuKyAgICAgICAgIyBiYWNrbG9nIHRvIGZvcm0sIHNvIHRoZSB3YWtlLXZzLXN0YXJ0IGJlaGF2aW9yIGNhbid0IGJlIGV4ZXJjaXNlZC5cXG4rICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS5cXG4rICAgICAgICByYWlzZSBLc2Z0WGZhaWxFeChcXFwiY291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2dcXFwiKVxcbitcXG4rICAgIGtzZnRfcHIoZlxcXCJCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzXFxcIilcXG4rXFxuKyAgICAjIFRyaWdnZXIgcmluZyByZWNvbmZpZyDigJQgZHJpdmVyIHNob3VsZCBjYWxsIHdha2UsIG5vdCBqdXN0IHN0YXJ0LlxcbisgICAgIyBHcm93IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUgc28gdGhlIGRyaXZlciBhY3R1YWxseSBzd2l0Y2hlcyBjaGFubmVsc1xcbisgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuXFxuKyAgICBjZmcuZXRoLnJpbmdzX3NldChlaGRyIHwgeyd0eCc6IHR4X2N1cn0pXFxuK1xcbisgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxcbisgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDApXFxuKyAgICBfd3JpdGVfc3lzZnMoZ3JvX3RpbWVvdXQsIDApXFxuK1xcbisgICAgIyBQb2xsIGZvciBiYWNrbG9nIHRvIGRyYWluXFxuKyAgICBmb3IgXyBpbiByYW5nZSgxMDApOlxcbisgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcXG4rICAgICAgICBpZiBub3QgYmFja2xvZzpcXG4rICAgICAgICAgICAgYnJlYWtcXG4rICAgICAgICB0aW1lLnNsZWVwKDAuMSlcXG4rXFxuKyAgICBrc2Z0X2VxKDAsIGJhY2tsb2csXFxuKyAgICAgICAgICAgIGNvbW1lbnQ9ZlxcXCJxZGlzYyBiYWNrbG9nIHN0dWNrIG9uIHF1ZXVlIHt0YXJnZXRfcXVldWV9IFxcXCJcXG4rICAgICAgICAgICAgICAgICAgICBmXFxcImFmdGVyIHJpbmcgcmVjb25maWdcXFwiKVxcbitcXG4rXFxuIGRlZiBtYWluKCkgLVxcdTAwM2UgTm9uZTpcXG4gICAgIFxcXCJcXFwiXFxcIiBLc2Z0IGJvaWxlciBwbGF0ZSBtYWluIFxcXCJcXFwiXFxcIlxcbiBcXG4tICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18pIGFzIGNmZzpcXG4rICAgIHdpdGggTmV0RHJ2RXBFbnYoX19maWxlX18sIHF1ZXVlX2NvdW50PTIpIGFzIGNmZzpcXG4gICAgICAgICBjZmcuZXRoID0gRXRodG9vbEZhbWlseSgpXFxuIFxcbiAgICAgICAgIGtzZnRfcnVuKFtjaGFubmVscyxcXG4tICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtXSxcXG4rICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtLFxcbisgICAgICAgICAgICAgICAgICByZWNvbmZpZ190eF9zdGFsbF0sXFxuICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKVxcbiAgICAga3NmdF9leGl0KClcXG4gXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTAxVDExOjMwOjAwLjIzMDYxMDczNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjgzMDcyMDY2MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogbnVsbCxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW10sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9ubHkgbW9kaWZpZXMgdXNlcnNwYWNlIHNlbGZ0ZXN0IHNjcmlwdHMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvLiBJdCBkb2VzIG5vdCBtYWtlIGFueSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGNvcmUga2VybmVsLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmUgY29kZS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDE3ODU0YjFkMTc3MDM0MmE0OTI2ZTY4NGU0NGY4ZGE5NGFmOTA3YjZcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAxIDExOjI5OjU4IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXG5pbmRleCAyMDcwZTg5MGUwNjRlLi5mMzkzM2NmM2U2YmU2IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdcbkBAIC00LDggKzQsMTEgQEAgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVM9blxuIENPTkZJR19JTkVUX1BTUD15XG4gQ09ORklHX0lQVjY9eVxuIENPTkZJR19NQUNTRUM9bVxuK0NPTkZJR19ORVRfQUNUX1NLQkVESVQ9bVxuIENPTkZJR19ORVRfQ0xTX0FDVD15XG4gQ09ORklHX05FVF9DTFNfQlBGPXlcbitDT05GSUdfTkVUX0NMU19GTE9XRVI9bVxuK0NPTkZJR19ORVRfQ0xTX01BVENIQUxMPW1cbiBDT05GSUdfTkVUQ09OU09MRT1tXG4gQ09ORklHX05FVENPTlNPTEVfRFlOQU1JQz15XG4gQ09ORklHX05FVENPTlNPTEVfRVhURU5ERURfTE9HPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9saWIvcHkvZW52LnB5IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weVxuaW5kZXggZTRhY2YzZDgzMzNmZC4uYjFjNmY2Y2VmN2RkMiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L2xpYi9weS9lbnYucHlcbkBAIC0xMTQsMTAgKzExNCwxMSBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKTpcbiAgICAgbnNpbV92NF9wZnggPSBcIjE5Mi4wLjIuXCJcbiAgICAgbnNpbV92Nl9wZnggPSBcIjIwMDE6ZGI4OjpcIlxuIFxuLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3JjX3BhdGgsIG5zaW1fdGVzdD1Ob25lKTpcbisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNyY19wYXRoLCBuc2ltX3Rlc3Q9Tm9uZSwgcXVldWVfY291bnQ9Tm9uZSk6XG4gICAgICAgICBzdXBlcigpLl9faW5pdF9fKHNyY19wYXRoKVxuIFxuICAgICAgICAgc2VsZi5fc3RhdHNfc2V0dGxlX3RpbWUgPSBOb25lXG4rICAgICAgICBzZWxmLl9xdWV1ZV9jb3VudCA9IHF1ZXVlX2NvdW50XG4gXG4gICAgICAgICAjIFRoaW5ncyB3ZSB0cnkgdG8gZGVzdHJveVxuICAgICAgICAgc2VsZi5yZW1vdGUgPSBOb25lXG5AQCAtMTczLDkgKzE3NCwxMyBAQCBjbGFzcyBOZXREcnZFcEVudihOZXREcnZFbnZCYXNlKTpcbiAgICAgICAgIHNlbGYuX3JlcXVpcmVkX2NtZCA9IHt9XG4gXG4gICAgIGRlZiBjcmVhdGVfbG9jYWwoc2VsZik6XG4rICAgICAgICBuc2ltX2t3YXJncyA9IHt9XG4rICAgICAgICBpZiBzZWxmLl9xdWV1ZV9jb3VudDpcbisgICAgICAgICAgICBuc2ltX2t3YXJnc1tcInF1ZXVlX2NvdW50XCJdID0gc2VsZi5fcXVldWVfY291bnRcbitcbiAgICAgICAgIHNlbGYuX25ldG5zID0gTmV0TlMoKVxuLSAgICAgICAgc2VsZi5fbnMgPSBOZXRkZXZTaW1EZXYoKVxuLSAgICAgICAgc2VsZi5fbnNfcGVlciA9IE5ldGRldlNpbURldihucz1zZWxmLl9uZXRucylcbisgICAgICAgIHNlbGYuX25zID0gTmV0ZGV2U2ltRGV2KCoqbnNpbV9rd2FyZ3MpXG4rICAgICAgICBzZWxmLl9uc19wZWVyID0gTmV0ZGV2U2ltRGV2KG5zPXNlbGYuX25ldG5zLCAqKm5zaW1fa3dhcmdzKVxuIFxuICAgICAgICAgd2l0aCBvcGVuKFwiL3Byb2Mvc2VsZi9ucy9uZXRcIikgYXMgbnNmZDAsIFxcXG4gICAgICAgICAgICAgIG9wZW4oXCIvdmFyL3J1bi9uZXRucy9cIiArIHNlbGYuX25ldG5zLm5hbWUpIGFzIG5zZmQxOlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2RyaXZlcnMvbmV0L3JpbmdfcmVjb25maWcucHkgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9yaW5nX3JlY29uZmlnLnB5XG5pbmRleCBmOTUzMGE4YjA4NTY3Li4yYmMzMjliNzcxMzQwIDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weVxuQEAgLTUsMTAgKzUsMjUgQEBcbiBUZXN0IGNoYW5uZWwgYW5kIHJpbmcgc2l6ZSBjb25maWd1cmF0aW9uIHZpYSBldGh0b29sICgtTCAvIC1HKS5cbiBcIlwiXCJcbiBcbitpbXBvcnQgc29ja2V0XG4raW1wb3J0IHN0cnVjdFxuK2ltcG9ydCB0aW1lXG4rXG4gZnJvbSBsaWIucHkgaW1wb3J0IGtzZnRfcnVuLCBrc2Z0X2V4aXQsIGtzZnRfcHJcbiBmcm9tIGxpYi5weSBpbXBvcnQga3NmdF9lcVxuK2Zyb20gbGliLnB5IGltcG9ydCBLc2Z0U2tpcEV4LCBLc2Z0WGZhaWxFeFxuIGZyb20gbGliLnB5IGltcG9ydCBOZXREcnZFcEVudiwgRXRodG9vbEZhbWlseSwgR2VuZXJhdGVUcmFmZmljXG4tZnJvbSBsaWIucHkgaW1wb3J0IGRlZmVyLCBObEVycm9yXG4rZnJvbSBsaWIucHkgaW1wb3J0IGNtZCwgZGVmZXIsIHJhbmRfcG9ydCwgdGMsIE5sRXJyb3JcbitcbisjIEFkZGVkIGluIFB5dGhvbiAzLjEzOyBmYWxsYmFjayB0byA2MSBmb3IgeDg2L0FSTS9NSVBTXG4rU09fVFhUSU1FID0gZ2V0YXR0cihzb2NrZXQsIFwiU09fVFhUSU1FXCIsIDYxKVxuK1xuKyMgTm90IGFsd2F5cyBleHBvcnRlZCBieSB0aGUgc29ja2V0IG1vZHVsZTsgYXNtLWdlbmVyaWMgdmFsdWUgKHg4Ni9BUk0vTUlQUykuXG4rU09fU05EQlVGRk9SQ0UgPSBnZXRhdHRyKHNvY2tldCwgXCJTT19TTkRCVUZGT1JDRVwiLCAzMilcbitcbisjIFRYIHJpbmcgc2l6ZSB0aGUgdGVzdCBzaHJpbmtzIHRvIHNvIHRoZSByaW5nIGZpbGxzIHF1aWNrbHkuXG4rTUlOX1RYX1JJTkcgPSAzMlxuK01BWF9UWF9SSU5HID0gMTAyNFxuIFxuIFxuIGRlZiBjaGFubmVscyhjZmcpIC1cdTAwM2UgTm9uZTpcbkBAIC0xNTEsMTQgKzE2NiwyNDggQEAgZGVmIHJpbmdwYXJhbShjZmcpIC1cdTAwM2UgTm9uZTpcbiAgICAgICAgIEdlbmVyYXRlVHJhZmZpYyhjZmcpLndhaXRfcGt0c19hbmRfc3RvcCgxMDAwMClcbiBcbiBcbitkZWYgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKTpcbisgICAgXCJcIlwiV3JpdGUgdmFsIHRvIGEgZmlsZS5cIlwiXCJcbisgICAgd2l0aCBvcGVuKHBhdGgsIFwid1wiLCBlbmNvZGluZz1cInV0Zi04XCIpIGFzIGZwOlxuKyAgICAgICAgZnAud3JpdGUoc3RyKHZhbCkpXG4rXG4rXG4rZGVmIF93cml0ZV9zeXNmcyhwYXRoLCB2YWwpOlxuKyAgICBcIlwiXCJXcml0ZSB2YWwgdG8gYSBzeXNmcyBmaWxlLCByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIHZhbHVlIG9uIGV4aXQuXCJcIlwiXG4rICAgIHdpdGggb3BlbihwYXRoLCBcInJcIiwgZW5jb2Rpbmc9XCJ1dGYtOFwiKSBhcyBmcDpcbisgICAgICAgIG9yaWdfdmFsID0gZnAucmVhZCgpLnN0cmlwKClcbisgICAgaWYgc3RyKHZhbCkgPT0gb3JpZ192YWw6XG4rICAgICAgICByZXR1cm5cbisgICAgX3dyaXRlX2ZpbGUocGF0aCwgdmFsKVxuKyAgICBkZWZlcihfd3JpdGVfZmlsZSwgcGF0aCwgb3JpZ192YWwpXG4rXG4rXG4rZGVmIF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgcXVldWUpOlxuKyAgICBcIlwiXCJSZXR1cm4gdGhlIHFkaXNjIGJhY2tsb2cgKGJ5dGVzKSBmb3IgdGhlIGdpdmVuIFRYIHF1ZXVlJ3MgbGVhZi5cIlwiXCJcbisgICAgdGFyZ2V0X3BhcmVudCA9IGZcInttcV9oYW5kbGV9e3F1ZXVlICsgMTp4fVwiXG4rICAgIGZvciBxIGluIHRjKGZcIi1zIHFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpOlxuKyAgICAgICAgaWYgcS5nZXQoXCJwYXJlbnRcIiwgXCJcIikgPT0gdGFyZ2V0X3BhcmVudDpcbisgICAgICAgICAgICByZXR1cm4gcS5nZXQoXCJiYWNrbG9nXCIpIG9yIDBcbisgICAgcmV0dXJuIDBcbitcbitcbitkZWYgX3NldHVwX2ZxX3FkaXNjKGNmZywgcG9ydCwgdGFyZ2V0X3F1ZXVlLCBvdGhlcl9xdWV1ZSwgZmxvd19saW1pdCk6XG4rICAgIFwiXCJcIlB1dCBhbiBmcSBxZGlzYyBvbiB0YXJnZXRfcXVldWUncyBsZWFmIGFuZCByZXR1cm4gdGhlIG1xIGhhbmRsZSBpbiB1c2UuXG4rXG4rICAgIFdlIG11c3Qgbm90IGRpc3R1cmIgdGhlIGRldmljZSdzIGV4aXN0aW5nIFRYL1JYIHFkaXNjIHBvbGljeS4gT24gYSByZWFsXG4rICAgIE5JQyB0aGUgcm9vdCBtcSBhbHJlYWR5IGhhcyBhbiBhZGRyZXNzYWJsZSBoYW5kbGUsIHNvIHdlIGxlYXZlIHRoZSByb290XG4rICAgIGFuZCBldmVyeSBvdGhlciBxdWV1ZSBhbG9uZSBhbmQgb25seSBzd2FwIHRoaXMgb25lIGxlYWYsIHJlc3RvcmluZyBpdHNcbisgICAgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cbitcbisgICAgQGZsb3dfbGltaXQgcmFpc2VzIGZxJ3MgcGVyLWZsb3cgcGFja2V0IGxpbWl0IChkZWZhdWx0IDEwMCkgc28gYSBzaW5nbGVcbisgICAgZmxvdyBjYW4gYmFjayB1cCBtb3JlIHBhY2tldHMgdGhhbiB0aGUgVHggcmluZyBob2xkcyBhbmQgdGh1cyBvdmVyZmxvdyBpdC5cbisgICAgXCJcIlwiXG4rICAgIHFkaXNjcyA9IHRjKGZcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpXG4rICAgIHJvb3QgPSBuZXh0KChxIGZvciBxIGluIHFkaXNjcyBpZiBxLmdldChcInJvb3RcIikpLCBOb25lKVxuK1xuKyAgICBpZiByb290IGFuZCByb290W1wia2luZFwiXSA9PSBcIm1xXCIgYW5kIHJvb3RbXCJoYW5kbGVcIl0gIT0gXCIwOlwiOlxuKyAgICAgICAgIyBBZGRyZXNzYWJsZSBtcSAocHJldmlvdXNseS1jb25maWd1cmVkKTogdG91Y2ggb25seSB0aGUgdGFyZ2V0IHF1ZXVlJ3NcbisgICAgICAgICMgbGVhZiBhbmQgcmVzdG9yZSBpdHMgb3JpZ2luYWwgcWRpc2MgYWZ0ZXJ3YXJkcy5cbisgICAgICAgIG1xX2hhbmRsZSA9IHJvb3RbXCJoYW5kbGVcIl1cbisgICAgICAgIHBhcmVudCA9IGZcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cIlxuKyAgICAgICAgb3JpZyA9IG5leHQoKHEgZm9yIHEgaW4gcWRpc2NzIGlmIHEuZ2V0KFwicGFyZW50XCIpID09IHBhcmVudCksIE5vbmUpXG4rICAgICAgICBvcmlnX2tpbmQgPSBvcmlnW1wia2luZFwiXSBpZiBvcmlnIGVsc2UgXFxcbisgICAgICAgICAgICBjbWQoXCJzeXNjdGwgLW4gbmV0LmNvcmUuZGVmYXVsdF9xZGlzY1wiKS5zdGRvdXQuc3RyaXAoKVxuKyAgICAgICAgZGVmZXIodGMsIGZcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0ge29yaWdfa2luZH1cIilcbisgICAgZWxpZiByb290IGlzIE5vbmUgb3Igcm9vdFtcImtpbmRcIl0gaW4gKFwibXFcIiwgXCJub3F1ZXVlXCIpOlxuKyAgICAgICAgIyBUaGUgYXV0by1hdHRhY2hlZCByb290IG1xIGhhcyBoYW5kbGUgMDogb24gYW55IGRldmljZSAocmVhbCBvciBzaW0pLFxuKyAgICAgICAgIyB3aGljaCB0aGUga2VybmVsIHJlamVjdHMgYXMgYSBxZGlzYyBwYXJlbnQuIEEgMDogaGFuZGxlIG1lYW5zIHRoZSBtcVxuKyAgICAgICAgIyBpcyB0aGUgdW50b3VjaGVkIGtlcm5lbCBkZWZhdWx0IC0gbm8gY3VzdG9tIGNoaWxkIHFkaXNjcyBjYW4gaGFuZyBvZmZcbisgICAgICAgICMgYW4gdW5hZGRyZXNzYWJsZSBwYXJlbnQgLSBzbyBpbnN0YWxsaW5nIGEgcmVhbCBoYW5kbGUgYW5kIHJlc3RvcmluZ1xuKyAgICAgICAgIyB0aGUgZGVmYXVsdCBtcSBvbiBleGl0IHByZXNlcnZlcyB0aGUgZGV2aWNlJ3MgZWZmZWN0aXZlIHBvbGljeS5cbisgICAgICAgIG1xX2hhbmRsZSA9IFwiMTpcIlxuKyAgICAgICAgdGMoZlwicWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgaGFuZGxlIHttcV9oYW5kbGV9IG1xXCIpXG4rICAgICAgICBkZWZlcih0YywgZlwicWRpc2MgcmVwbGFjZSBkZXYge2NmZy5pZm5hbWV9IHJvb3QgbXFcIilcbisgICAgICAgIHBhcmVudCA9IGZcInttcV9oYW5kbGV9e3RhcmdldF9xdWV1ZSArIDE6eH1cIlxuKyAgICBlbHNlOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChmXCJyb290IHFkaXNjICd7cm9vdFsna2luZCddfScgaXMgbm90IG1xOyBcIlxuKyAgICAgICAgICAgICAgICAgICAgICAgICBcInJlZnVzaW5nIHRvIGRpc3R1cmIgZXhpc3RpbmcgcWRpc2MgcG9saWN5XCIpXG4rXG4rICAgIHRyeTpcbisgICAgICAgIHRjKGZcInFkaXNjIHJlcGxhY2UgZGV2IHtjZmcuaWZuYW1lfSBwYXJlbnQge3BhcmVudH0gZnEgXCJcbisgICAgICAgICAgIGZcImZsb3dfbGltaXQge2Zsb3dfbGltaXR9IGxpbWl0IHtmbG93X2xpbWl0ICogMn1cIilcbisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFxuKyAgICAgICAgICAgIGZcImZxIG5vdCBhdmFpbGFibGUgKENPTkZJR19ORVRfU0NIX0ZRKToge2V4Y31cIikgZnJvbSBleGNcbitcbisgICAgcWRpc2NfaiA9IHRjKGZcInFkaXNjIHNob3cgZGV2IHtjZmcuaWZuYW1lfVwiLCBqc29uPVRydWUpXG4rICAgIGhhc19jbHNhY3QgPSBhbnkocVsna2luZCddID09ICdjbHNhY3QnIGZvciBxIGluIHFkaXNjX2opXG4rICAgIGlmIG5vdCBoYXNfY2xzYWN0OlxuKyAgICAgICAgdGMoZlwicWRpc2MgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XCIpXG4rICAgICAgICBkZWZlcih0YywgZlwicWRpc2MgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gY2xzYWN0XCIpXG4rXG4rICAgIHByb3RvID0gXCJpcHY2XCIgaWYgaW50KGNmZy5hZGRyX2lwdmVyKSA9PSA2IGVsc2UgXCJpcFwiXG4rICAgIHRyeTpcbisgICAgICAgIHRjKGZcImZpbHRlciBhZGQgZGV2IHtjZmcuaWZuYW1lfSBlZ3Jlc3MgcHJvdG9jb2wge3Byb3RvfSBcIlxuKyAgICAgICAgICAgZlwicHJlZiAxIGZsb3dlciBpcF9wcm90byB1ZHAgZHN0X3BvcnQge3BvcnR9IFwiXG4rICAgICAgICAgICBmXCJhY3Rpb24gc2tiZWRpdCBxdWV1ZV9tYXBwaW5nIHt0YXJnZXRfcXVldWV9XCIpXG4rICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcInRjIGZsb3dlci9hY3Rfc2tiZWRpdCBub3QgYXZhaWxhYmxlXCIpIGZyb20gZXhjXG4rICAgIGRlZmVyKHRjLCBmXCJmaWx0ZXIgZGVsIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMVwiKVxuK1xuKyAgICB0YyhmXCJmaWx0ZXIgYWRkIGRldiB7Y2ZnLmlmbmFtZX0gZWdyZXNzIHByZWYgMTAxIFwiXG4rICAgICAgIGZcIm1hdGNoYWxsIGFjdGlvbiBza2JlZGl0IHF1ZXVlX21hcHBpbmcge290aGVyX3F1ZXVlfVwiKVxuKyAgICBkZWZlcih0YywgZlwiZmlsdGVyIGRlbCBkZXYge2NmZy5pZm5hbWV9IGVncmVzcyBwcmVmIDEwMVwiKVxuK1xuKyAgICByZXR1cm4gbXFfaGFuZGxlXG4rXG4rXG4rZGVmIF9jcmVhdGVfc290eHRpbWVfc29ja2V0KGNmZywgc25kYnVmKTpcbisgICAgXCJcIlwiQ3JlYXRlIGEgVURQIHNvY2tldCB3aXRoIFNPX1RYVElNRSBlbmFibGVkLCBib3VuZCB0byB0aGUgdGVzdCBkZXZpY2UuXCJcIlwiXG4rICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiBpZiBjZmcuYWRkcl9pcHZlciA9PSBcIjZcIlxuKyAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSlcbisgICAgdHJ5OlxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19UWFRJTUUsIHN0cnVjdC5wYWNrKFwiSWlcIiwgMSwgMCkpXG4rICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzpcbisgICAgICAgIHNvY2suY2xvc2UoKVxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcIlNPX1RYVElNRSBub3Qgc3VwcG9ydGVkXCIpIGZyb20gZXhjXG4rICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0JJTkRUT0RFVklDRSxcbisgICAgICAgICAgICAgICAgICAgIGNmZy5pZm5hbWUuZW5jb2RlKCkpXG4rICAgICMgRGVmZXJyZWQgY29tcGxldGlvbnMga2VlcCBldmVyeSBpbi1mbGlnaHQgc2tiIGNoYXJnZWQgdG8gdGhlIHNvY2tldCwgc29cbisgICAgIyBzaXplIHRoZSBzZW5kIGJ1ZmZlciB0byBob2xkIHRoZSB3aG9sZSBidXJzdC4gU09fU05EQlVGRk9SQ0UgYnlwYXNzZXNcbisgICAgIyBuZXQuY29yZS53bWVtX21heCAodGhlIHRlc3QgcnVucyBhcyByb290KS5cbisgICAgdHJ5OlxuKyAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBTT19TTkRCVUZGT1JDRSwgc25kYnVmKVxuKyAgICBleGNlcHQgT1NFcnJvcjpcbisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1NOREJVRiwgc25kYnVmKVxuKyAgICByZXR1cm4gc29ja1xuK1xuK1xuK2RlZiBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIGNvdW50LCBkZWxheV9ucywgcGt0X3NpemUpOlxuKyAgICBcIlwiXCJTZW5kIGNvdW50IFVEUCBwYWNrZXRzIHNjaGVkdWxlZCBkZWxheV9ucyBhaGVhZCB1c2luZyBTT19UWFRJTUUuXCJcIlwiXG4rICAgIHBheWxvYWQgPSBiJ1xceDAwJyAqIHBrdF9zaXplXG4rICAgIHR4dGltZV9ucyA9IHRpbWUuY2xvY2tfZ2V0dGltZV9ucyh0aW1lLkNMT0NLX01PTk9UT05JQykgKyBkZWxheV9uc1xuK1xuKyAgICBhbmNkYXRhID0gWyhzb2NrZXQuU09MX1NPQ0tFVCwgU09fVFhUSU1FLCBzdHJ1Y3QucGFjayhcIlFcIiwgdHh0aW1lX25zKSldXG4rICAgIGlmIGludChjZmcuYWRkcl9pcHZlcikgPT0gNjpcbisgICAgICAgIGRlc3QgPSAoY2ZnLnJlbW90ZV9hZGRyLCBwb3J0LCAwLCAwKVxuKyAgICBlbHNlOlxuKyAgICAgICAgZGVzdCA9IChjZmcucmVtb3RlX2FkZHIsIHBvcnQpXG4rICAgIGZvciBfIGluIHJhbmdlKGNvdW50KTpcbisgICAgICAgIHNvY2suc2VuZG1zZyhbcGF5bG9hZF0sIGFuY2RhdGEsIDAsIGRlc3QpXG4rXG4rXG4rZGVmIF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpOlxuKyAgICBcIlwiXCJTZXQgdGhlIFR4IHJpbmcgdG8gdGhlIHNtYWxsZXN0IHNpemUgdGhlIGRyaXZlciBhY2NlcHRzLlxuK1xuKyAgICBTdGFydCBhdCAzMiBzbyB0aGUgcmluZyBmaWxscyBxdWlja2x5LCB0aGVuIGdyb3cgZXhwb25lbnRpYWxseSAoNjQsXG4rICAgIDEyOCwgMjU2LCAuLi4pIHVwIHRvIDEwMjQuIFNvbWUgZHJpdmVycyBlbmZvcmNlIGEgbWluaW11bSB3ZWxsIGFib3ZlIDMyXG4rICAgIChlLmcuIGJueHQgbmVlZHMgYSBsYXJnZSByaW5nIGZvciBzb2Z0d2FyZSBVRFAgc2VnbWVudGF0aW9uKSwgc28gcmFpc2VcbisgICAgdGhlIGxvd2VyIGJvdW5kIHVudGlsIHRoZSBkcml2ZXIgYWNjZXB0cyBpdCwgZ2l2aW5nIHVwIHBhc3QgMTAyNC5cbisgICAgXCJcIlwiXG4rICAgIHNpemUgPSBNSU5fVFhfUklOR1xuKyAgICB3aGlsZSBzaXplIFx1MDAzYz0gTUFYX1RYX1JJTkc6XG4rICAgICAgICB0cnk6XG4rICAgICAgICAgICAgY2ZnLmV0aC5yaW5nc19zZXQoZWhkciB8IHsndHgnOiBzaXplfSlcbisgICAgICAgICAgICByZXR1cm4gc2l6ZVxuKyAgICAgICAgZXhjZXB0IE5sRXJyb3I6XG4rICAgICAgICAgICAgc2l6ZSA9IHNpemUgKiAyXG4rICAgICAgICAgICAgY29udGludWVcbisgICAgcmFpc2UgS3NmdFNraXBFeChcImRyaXZlciByZWplY3RzIGFsbCB0eCByaW5nIHNpemVzIHVwIHRvIDEwMjRcIilcbitcbitcbitkZWYgcmVjb25maWdfdHhfc3RhbGwoY2ZnKSAtXHUwMDNlIE5vbmU6XG4rICAgIFwiXCJcIlRlc3QgdGhhdCBxZGlzYyBiYWNrbG9nIGRyYWlucyBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi5cIlwiXCJcbisgICAgdGFyZ2V0X3F1ZXVlID0gMVxuKyAgICBvdGhlcl9xdWV1ZSA9IDBcbitcbisgICAgZWhkciA9IHsnaGVhZGVyJzogeydkZXYtaW5kZXgnOiBjZmcuaWZpbmRleH19XG4rICAgIGNoYW5zID0gY2ZnLmV0aC5jaGFubmVsc19nZXQoZWhkcilcbitcbisgICAgaWYgXCJjb21iaW5lZC1tYXhcIiBub3QgaW4gY2hhbnM6XG4rICAgICAgICByYWlzZSBLc2Z0U2tpcEV4KFwiZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tYmluZWQgY2hhbm5lbHNcIilcbisgICAgaWYgY2hhbnMuZ2V0KFwiY29tYmluZWQtbWF4XCIsIDApIFx1MDAzYyAyOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcImRldmljZSBkb2VzIG5vdCBzdXBwb3J0IDIrIGNvbWJpbmVkIGNoYW5uZWxzXCIpXG4rICAgIGlmIGNoYW5zW1wiY29tYmluZWQtY291bnRcIl0gXHUwMDNjIDI6XG4rICAgICAgICBkZWZlcihjZmcuZXRoLmNoYW5uZWxzX3NldCxcbisgICAgICAgICAgICAgIGVoZHIgfCB7XCJjb21iaW5lZC1jb3VudFwiOiBjaGFuc1tcImNvbWJpbmVkLWNvdW50XCJdfSlcbisgICAgICAgIGNmZy5ldGguY2hhbm5lbHNfc2V0KGVoZHIgfCB7XCJjb21iaW5lZC1jb3VudFwiOiAyfSlcbitcbisgICAgcmluZ3MgPSBjZmcuZXRoLnJpbmdzX2dldChlaGRyKVxuKyAgICBpZiAncngnIG5vdCBpbiByaW5ncyBvciAndHgnIG5vdCBpbiByaW5nczpcbisgICAgICAgIHJhaXNlIEtzZnRTa2lwRXgoXCJkZXZpY2UgZG9lcyBub3QgZXhwb3NlIHJ4L3R4IHJpbmcgcGFyYW1zXCIpXG4rICAgIHR4X2N1ciA9IHJpbmdzWyd0eCddXG4rICAgIGlmIHR4X2N1ciBcdTAwM2M9IE1JTl9UWF9SSU5HOlxuKyAgICAgICAgcmFpc2UgS3NmdFNraXBFeChcInR4IHJpbmcgc2l6ZSBhbHJlYWR5IGF0IG1pbmltdW1cIilcbisgICAgZGVmZXIoY2ZnLmV0aC5yaW5nc19zZXQsIGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcbitcbisgICAgIyBVc2UgdGhlIHNtYWxsZXN0IFR4IHJpbmcgdGhlIGRyaXZlciBhY2NlcHRzICgzMiwgZ3Jvd2luZyB0byAxMDI0KS5cbisgICAgdHhfcmluZyA9IF9zZXRfc21hbGxfdHhfcmluZyhjZmcsIGVoZHIpXG4rXG4rICAgICMgU2xvdyBjb21wbGV0aW9ucyBzbyB0aGUgcmluZyBzdGF5cyBmdWxsIGFmdGVyIEZRIHJlbGVhc2VzIHBhY2tldHNcbisgICAgbmFwaV9kZWZlciA9IGZcIi9zeXMvY2xhc3MvbmV0L3tjZmcuaWZuYW1lfS9uYXBpX2RlZmVyX2hhcmRfaXJxc1wiXG4rICAgIGdyb190aW1lb3V0ID0gZlwiL3N5cy9jbGFzcy9uZXQve2NmZy5pZm5hbWV9L2dyb19mbHVzaF90aW1lb3V0XCJcbisgICAgX3dyaXRlX3N5c2ZzKG5hcGlfZGVmZXIsIDEwMClcbisgICAgX3dyaXRlX3N5c2ZzKGdyb190aW1lb3V0LCAxMDAwMDAwMDAwKVxuK1xuKyAgICBwb3J0ID0gcmFuZF9wb3J0KClcbisgICAgIyBBIHNpbmdsZSBmbG93IG11c3Qgb3ZlcmZsb3cgdGhlIHJpbmcsIHNvIHNlbmQgdHdpY2UgdGhlIHJpbmcgZGVwdGggYW5kXG4rICAgICMgbGV0IGZxIGhvbGQgdGhhdCBtYW55IHBhY2tldHMgZm9yIHRoZSBmbG93LlxuKyAgICBwa3RfY291bnQgPSB0eF9yaW5nICogMlxuKyAgICBtcV9oYW5kbGUgPSBfc2V0dXBfZnFfcWRpc2MoY2ZnLCBwb3J0LCB0YXJnZXRfcXVldWUsIG90aGVyX3F1ZXVlLFxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eF9yaW5nICogMilcbitcbisgICAgIyBTaXplIGVhY2ggcGFja2V0IHRvIG9uZSBNVFUgKGxlc3MgTDMvTDQgaGVhZGVycyB0byBhdm9pZCBmcmFnbWVudGF0aW9uKS5cbisgICAgcGt0X3NpemUgPSBjZmcuZGV2WydtdHUnXSAtICg0OCBpZiBpbnQoY2ZnLmFkZHJfaXB2ZXIpID09IDYgZWxzZSAyOClcbitcbisgICAgIyBFYWNoIHF1ZXVlZCBza2IgY2hhcmdlcyB0aGUgc29ja2V0IGl0cyB0cnVlc2l6ZSAofjJ4IHRoZSBwYXlsb2FkKSwgc29cbisgICAgIyBidWRnZXQgdGhlIHNlbmQgYnVmZmVyIGZvciB0aGUgd2hvbGUgaW4tZmxpZ2h0IGJ1cnN0LlxuKyAgICBzb2NrID0gX2NyZWF0ZV9zb3R4dGltZV9zb2NrZXQoY2ZnLCBwa3RfY291bnQgKiBwa3Rfc2l6ZSAqIDIpXG4rICAgIGRlZmVyKHNvY2suY2xvc2UpXG4rXG4rICAgIGZvciBkZWxheV9tcyBpbiBbMTAwLCAyMDAsIDUwMF06XG4rICAgICAgICBfc2VuZF9zb3R4dGltZV9idXJzdChjZmcsIHNvY2ssIHBvcnQsIHBrdF9jb3VudCxcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X21zICogMV8wMDBfMDAwLCBwa3Rfc2l6ZSlcbisgICAgICAgIGtzZnRfcHIoZlwiU2VudCB7cGt0X2NvdW50fSBTT19UWFRJTUUgcGFja2V0cyAoK3tkZWxheV9tc31tcylcIilcbisgICAgICAgIHRpbWUuc2xlZXAoZGVsYXlfbXMgLyAxMDAwICsgMC4zKVxuK1xuKyAgICAgICAgYmFja2xvZyA9IF9nZXRfcWRpc2NfYmFja2xvZyhjZmcsIG1xX2hhbmRsZSwgdGFyZ2V0X3F1ZXVlKVxuKyAgICAgICAgaWYgYmFja2xvZzpcbisgICAgICAgICAgICBicmVha1xuKyAgICBlbHNlOlxuKyAgICAgICAgIyBBIGRldmljZSB0aGF0IGNvbXBsZXRlcyBUeCBzeW5jaHJvbm91c2x5IChlLmcuIGEgc29mdHdhcmUvdmlydHVhbFxuKyAgICAgICAgIyBkcml2ZXIgbGlrZSBuZXRkZXZzaW0pIG5ldmVyIGtlZXBzIHRoZSByaW5nIGZ1bGwgbG9uZyBlbm91Z2ggZm9yIGFcbisgICAgICAgICMgYmFja2xvZyB0byBmb3JtLCBzbyB0aGUgd2FrZS12cy1zdGFydCBiZWhhdmlvciBjYW4ndCBiZSBleGVyY2lzZWQuXG4rICAgICAgICAjIFRyZWF0IHRoYXQgYXMgYW4gZXhwZWN0ZWQgZmFpbHVyZSByYXRoZXIgdGhhbiBhIGhhcmQgZmFpbHVyZS5cbisgICAgICAgIHJhaXNlIEtzZnRYZmFpbEV4KFwiY291bGQgbm90IGJ1aWxkIHFkaXNjIGJhY2tsb2dcIilcbitcbisgICAga3NmdF9wcihmXCJCYWNrbG9nIGJlZm9yZSByZWNvbmZpZzoge2JhY2tsb2d9IGJ5dGVzXCIpXG4rXG4rICAgICMgVHJpZ2dlciByaW5nIHJlY29uZmlnIOKAlCBkcml2ZXIgc2hvdWxkIGNhbGwgd2FrZSwgbm90IGp1c3Qgc3RhcnQuXG4rICAgICMgR3JvdyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplIHNvIHRoZSBkcml2ZXIgYWN0dWFsbHkgc3dpdGNoZXMgY2hhbm5lbHNcbisgICAgIyAoc2V0dGluZyB0aGUgY3VycmVudCBzaXplIGlzIGEgbm8tb3AgdGhlIGRyaXZlciBzaG9ydC1jaXJjdWl0cykuXG4rICAgIGNmZy5ldGgucmluZ3Nfc2V0KGVoZHIgfCB7J3R4JzogdHhfY3VyfSlcbitcbisgICAgIyBMZXQgY29tcGxldGlvbnMgcHJvY2VlZCBub3JtYWxseVxuKyAgICBfd3JpdGVfc3lzZnMobmFwaV9kZWZlciwgMClcbisgICAgX3dyaXRlX3N5c2ZzKGdyb190aW1lb3V0LCAwKVxuK1xuKyAgICAjIFBvbGwgZm9yIGJhY2tsb2cgdG8gZHJhaW5cbisgICAgZm9yIF8gaW4gcmFuZ2UoMTAwKTpcbisgICAgICAgIGJhY2tsb2cgPSBfZ2V0X3FkaXNjX2JhY2tsb2coY2ZnLCBtcV9oYW5kbGUsIHRhcmdldF9xdWV1ZSlcbisgICAgICAgIGlmIG5vdCBiYWNrbG9nOlxuKyAgICAgICAgICAgIGJyZWFrXG4rICAgICAgICB0aW1lLnNsZWVwKDAuMSlcbitcbisgICAga3NmdF9lcSgwLCBiYWNrbG9nLFxuKyAgICAgICAgICAgIGNvbW1lbnQ9ZlwicWRpc2MgYmFja2xvZyBzdHVjayBvbiBxdWV1ZSB7dGFyZ2V0X3F1ZXVlfSBcIlxuKyAgICAgICAgICAgICAgICAgICAgZlwiYWZ0ZXIgcmluZyByZWNvbmZpZ1wiKVxuK1xuK1xuIGRlZiBtYWluKCkgLVx1MDAzZSBOb25lOlxuICAgICBcIlwiXCIgS3NmdCBib2lsZXIgcGxhdGUgbWFpbiBcIlwiXCJcbiBcbi0gICAgd2l0aCBOZXREcnZFcEVudihfX2ZpbGVfXykgYXMgY2ZnOlxuKyAgICB3aXRoIE5ldERydkVwRW52KF9fZmlsZV9fLCBxdWV1ZV9jb3VudD0yKSBhcyBjZmc6XG4gICAgICAgICBjZmcuZXRoID0gRXRodG9vbEZhbWlseSgpXG4gXG4gICAgICAgICBrc2Z0X3J1bihbY2hhbm5lbHMsXG4tICAgICAgICAgICAgICAgICAgcmluZ3BhcmFtXSxcbisgICAgICAgICAgICAgICAgICByaW5ncGFyYW0sXG4rICAgICAgICAgICAgICAgICAgcmVjb25maWdfdHhfc3RhbGxdLFxuICAgICAgICAgICAgICAgICAgYXJncz0oY2ZnLCApKVxuICAgICBrc2Z0X2V4aXQoKVxuIFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6MzA6MDAuMjMwNjEyMDE2WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6ODMwNzE4MDk3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipQYXRjaCBBbmFseXNpczogV29ydGhGdXp6aW5nIEV2YWx1YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIFwiQWgsIGl0J3MgbWVzc2luZyB3aXRoIGEgc2VsZnRlc3QsIHNwZWNpZmljYWxseSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWBcIi4gSSBzZWUgaXQncyBhZGRpbmcgYSBuZXcgdGVzdCBmdW5jdGlvbiwgYHJlY29uZmlnX3R4X3N0YWxsYCwgdG8gY2hlY2sgcWRpc2MgYmFja2xvZyBkcmFpbmFnZSBhZnRlciByaW5nIHJlY29uZmlndXJhdGlvbi4gSXQgYWxzbyB0b3VjaGVzIGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdgIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weWAuIEknbSBzdGFydGluZyB0byBhc3Nlc3MgaWYgdGhpcyBuZWVkcyB0byBiZSBmdXp6ZWQuXG5cbldhaXQgYSBzZWNvbmQuLi4gaXQncyAqb25seSogbW9kaWZ5aW5nIGZpbGVzIHdpdGhpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC4gTm8gY29yZSBrZXJuZWwgbG9naWMsIG5vIGRyaXZlcnMsIG5vIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlIGlzIGJlaW5nIHRvdWNoZWQuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHNheXMgXCJSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zLi4uIG1vZGlmaWNhdGlvbnMgdG8uLi4gY29kZSBjb21tZW50cy4uLlwiLiBTZWxmdGVzdHMsIGJ5IHRoZWlyIG5hdHVyZSwgYXJlIHVzZXItc3BhY2UgdGVzdHMsIG5vdCBjb3JlIGtlcm5lbCBjb21wb25lbnRzLiBTbywgbm8sIHRoaXMgZG9lcyBub3QgbG9vayBsaWtlIGl0IG5lZWRzIHRvIGJlIGZ1enplZC5cblxuSSBuZWVkIHRvIGNvbmZpcm0gdGhhdCBteSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgY29ycmVjdC4gTGV0J3MgbWFrZSBzdXJlIEknbSBub3QgbWlzc2luZyBhbnl0aGluZy4gR29pbmcgYmFjayBhbmQgcmUtZXhhbWluaW5nIHRoZSBwYXRjaCwgSSBjYW4gc2VlIHRoYXQgdGhlIGNoYW5nZXMgYXJlIGNvbmZpbmVkIHRvIHRoZSBmb2xsb3dpbmcgZmlsZXM6IGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9kcml2ZXJzL25ldC9jb25maWdgLCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvbGliL3B5L2Vudi5weWAsIGFuZCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZHJpdmVycy9uZXQvcmluZ19yZWNvbmZpZy5weWAuIEFsbCBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYC5cblxuT2theSwgbm8sIEknbSBjb25maWRlbnQuIFRoaXMgcGF0Y2ggb25seSBkZWFscyB3aXRoIHVzZXJzcGFjZSB0ZXN0IHNjcmlwdHMgYW5kIGNvbmZpZ3VyYXRpb24uIEl0IGRvZXMgKm5vdCogaW50cm9kdWNlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIGl0c2VsZiB0aGF0IHJlcXVpcmUgZnV6emluZy5cblxuVGhlcmVmb3JlLCBJJ20gZ29pbmcgdG8gcmV0dXJuIGBXb3J0aEZ1enppbmc9ZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTU1LCJPdXRwdXRUb2tlbnMiOjcxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTkyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDFUMTE6MzA6MDguNTM3Nzk2MDE0WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxOTg2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW10sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IG51bGwsXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBvbmx5IG1vZGlmaWVzIHVzZXJzcGFjZSBzZWxmdGVzdCBzY3JpcHRzIGFuZCB0aGVpciBjb25maWd1cmF0aW9uIGZpbGVzIGluIHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4gSXQgZG9lcyBub3QgbWFrZSBhbnkgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBjb3JlIGtlcm5lbCwgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlIGNvZGUuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowk66js[1] Phase: Running StartedAt: 2026-08-01 11:30:40 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowk66js[1].abort-on-skip-outcome Phase: Failed StartedAt: 2026-08-01 11:30:40 +0000 UTC FinishedAt: 2026-08-01 11:30:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:code,Default:nil,Value:*1,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*1,}